Chio/Docs
LOGIN · JOIN

Colorado AI requirements

Assemble the signed records a Colorado automated decision-making review cites, and see which duties stay with the deployer.

Reference chio@5f63e6e

On this page

Under Colorado’s automated decision-making law, developers document what their systems do and developers and deployers keep records for at least three years. A Chio deployment hands that review signed tool declarations, decision receipts, and checkpointed archives, and the reviewer checks each one against the kernel’s public key without access to the deployment.

Mapped against Colorado SB 26-189, enacted May 14, 2026, reviewed 10 September 2026. SB 26-189 replaces SB 24-205 as Colorado's framework for automated decision-making technology (ADMT), and the review responsibilities follow SB 26-189.

Each row reads requirement, technical contribution, operator action, evidence. A signature proves who signed and binds the recorded content; the truth of a business claim and the completion of an organizational process stay with the operator. Build and verify an evidence package.

Clause coverageSelect a clause to see the record that answers it.
Colorado SB 26-189Chio controlsKept by the operatorDisclose capabilities and limitsRetain decision recordsAttributable decisionsTamper-evident storageBound to the acting entityBudget accountabilityHuman reviewImpact assessmentsConsumer noticesCovered-system applicabilityκcapabilityσDPoPτapprovalBbudgetπpolicyμmanifestρreceiptχcheckpointαretentionhoperator
Colorado SB 26-189Chio controlsKept by the operatordisclosurerecordsattributionintegrityholderbudgetreviewimpactnoticesscopeκcapabilityσDPoPτapprovalBbudgetπpolicyμmanifestρreceiptχcheckpointαretentionhoperator

Disclosure of capabilities and limitations

Evidence ToolManifest · owned by the operator

Developer documentation discloses what the system does and its material limitations. Each tool's signed definition declares its description, schemas, and has_side_effects. Answered by the tool manifest.

Operator. Author the developer documentation; the signed manifest is the declared interface it cites.

Read the mapping in Colorado SB 24-205.

The technical requirements of Colorado's automated decision-making framework joined to the Chio controls that supply evidence for them, with the deployer duties the operator keeps. Requirement names describe controls, not statutory subsection titles. Model-layer discrimination analysis is left out.

SB 26-189 replaced SB 24-205 in 2026

Colorado enacted SB 26-189, Automated Decision-Making Technology, on May 14, 2026, repealing and reenacting the provisions of SB 24-205. It applies to developers and deployers of covered automated decision-making technology (ADMT), subject to the enacted scope and exemptions. Its developer documentation requirements begin January 1, 2027, and the enacted summary sets a minimum three-year record obligation for developers and deployers. Read the enacted SB 26-189 summary and text for the current framework.

The 2024 act placed developer documentation in §6-1-1702 and deployer risk management and impact assessments in §6-1-1703. A review of an assessment made under it reads the original enrolled text. That clause numbering is not a control checklist here: the requirement names below describe Chio controls, and the 2024 act prescribed no Chio DPoP, Merkle batch interval, or capability budget.

Requirement mapping

Chio contributes signed receipts, retention and archival, Merkle checkpoints, DPoP binding, and financial metadata.

RequirementChio controlEvidence recordOwner
Disclose capabilities and limitations
Tool manifest
ToolManifest
Operator
Retain decision records, three years
Signed receipt, retention and archive
ChioReceipt, RetentionConfig archive
Chio kernel
Attributable decisions
Capability token, policy hash, signed receipt
ChioReceipt
Chio kernel
Tamper-evident storage
Merkle checkpoint, retention and archive
KernelCheckpoint
Chio kernel
Bound to the acting entity
DPoP binding
DPoP proof
Chio kernel
Budget accountability
Budget caps
FinancialReceiptMetadata
Chio kernel
Periodic tamper-evident commits
Merkle checkpoint
checkpoint_batch_size
Operator setting
Human review
Approval token
GovernedApprovalToken
Operator
Impact assessments
Deployer process
Deployer impact assessment
Operator
Consumer notices
Deployer process
Deployer notice records
Operator
Covered-system applicability
Deployer process
Deployment review record
Operator

The kernel produces the records for five rows on its own. The operator sets the checkpoint cadence and the retention period, and the remaining rows are developer and deployer work that cites these records.

Review evidence comes from one verified package

The complete evidence workflow produces three signed receipts, samples allow and deny decisions from the same recorded window, exports them with checkpoint proofs, and verifies the package. It carries the kernel host, every command, the captured results, and two deliberate refusals.

For a deployment review, substitute its receipt database and the approved tenant and time boundary. Preserve the original package, record the trusted kernel public key through an independent channel, and attach the framework owner, assessment scope, findings, and open work. A passing cryptographic check is one input to that review.

Produce, sample, and export the example receipts

Produce the receipts

Complete the project setup, then run these steps from federation-guide/ in a fresh evidence-run directory. The host and the program ship in the project download.

Terminalbash
cargo run --locked --bin evidence
Output · exit 0
two allowed calls; one out-of-scope denial; handler calls 2
three receipt signatures verified; checkpoint batch size 1
wrote evidence-run/receipts.sqlite3, window.json, and kernel-public-key.txt

Collect samples from the same window

Terminalbash
EVIDENCE_SINCE=$(jq -r .since evidence-run/window.json)
EVIDENCE_UNTIL=$(jq -r .until evidence-run/window.json)
mkdir -p samples
chio receipt list --receipt-db evidence-run/receipts.sqlite3 --admin-all \
  --since "$EVIDENCE_SINCE" --until "$EVIDENCE_UNTIL" \
  --outcome allow --limit 100 > samples/allow.jsonl
chio receipt list --receipt-db evidence-run/receipts.sqlite3 --admin-all \
  --since "$EVIDENCE_SINCE" --until "$EVIDENCE_UNTIL" \
  --outcome deny --limit 100 > samples/deny.jsonl
jq -s length samples/allow.jsonl
jq -s length samples/deny.jsonl
Output · exit 0
2
1

Export with complete checkpoint coverage

Terminalbash
EVIDENCE_SINCE=$(jq -r .since evidence-run/window.json)
EVIDENCE_UNTIL=$(jq -r .until evidence-run/window.json)
chio evidence export --receipt-db evidence-run/receipts.sqlite3 --admin-all \
  --since "$EVIDENCE_SINCE" --until "$EVIDENCE_UNTIL" \
  --require-proofs --output evidence-package
chio evidence verify --input evidence-package
Output · exit 0
evidence package verified
tool_receipts:          3
child_receipts:         0
checkpoints:            3
checkpoint_publications: 3
checkpoint_witnesses:   2
checkpoint_consistency_proofs: 2
checkpoint_equivocations: 0
capability_lineage:     1
inclusion_proofs:       3
uncheckpointed_receipts: 0
authorized_receipts:     2
trace_observations:      0
advisory_evaluations:    0
verified_files:         12
child_receipt_scope:    FullQueryWindow
transparency_preview_logs: 1
publication_state:      transparency_preview

Before a reviewer relies on a record, verify security evidence against an independently pinned kernel key.

Each kernel stage leaves a record a reviewer can cite

A governed call passes eight stages in order. The one branch is dispatch: the call reaches the tool server, or evaluation stops and the kernel signs a deny receipt.

StageWhat the kernel doesControl
Validate capability
Checks issuer, expiry, scope, and revocation first
Decision attribution
Check DPoP proof
Runs when dpop_required is set on the ToolGrant
Holder binding
Run guard pipeline
Velocity, policy, and budget guards, each able to refuse
Budget accounting
Dispatch tool call
Sends the call, or stops and signs a deny
None
Sign ChioReceipt
Allow and deny carry the same field set
Decision retention
Append to SqliteReceiptStore
The append-only log the checkpoint chain covers
Decision retention
Trigger Merkle checkpoint
Every checkpoint_batch_size receipts, signed by the kernel keypair
Checkpoint integrity and cadence
Rotate per RetentionConfig
Archives a checkpoint-aligned prefix with its checkpoint rows
Archive integrity

These are implementation controls; the stage list makes no claim of one-to-one statutory coverage. A deployment review describes them as the technical design behind its records.

Deployers decide applicability and write the assessments and notices

Whether a deployment uses covered ADMT, and which SB 26-189 obligations attach, is decided in the deployment review against the enacted text. The review then covers:

  1. Developer documentation. The developer authors it; the signed manifest is the declared interface it cites.
  2. Retention schedule. Set retention_days and the archive period to at least three years, and retain the archive for the full period.
  3. Human review. Document and staff the review process. Approval tokens record that a person approved a governed step.
  4. Impact assessments. Author and retain them; receipts are evidence they reference.
  5. Consumer notices and disclosures. Write and deliver them; Chio produces the signed evidence they cite.

The deployment review evaluates algorithmic discrimination, bias, and accuracy at the model layer, above the tool calls the kernel mediates.

Control evidence

The control list follows docs/compliance/colorado-sb-24-205.md in the Chio repository. Each entry names the record, its defaults, and the source test that exercises it.

Disclosure of capabilities and limitations

Each tool server publishes a signed ToolManifest with one ToolDefinition per tool it exposes. That declaration describes the operations an operator admits:

  • description: a human-readable statement of what the tool does.
  • input_schema and output_schema: JSON Schema for the tool’s arguments and result, so the declared interface validates programmatically.
  • has_side_effects: a boolean naming whether the tool writes files, sends network requests, or modifies state. It is the manifest’s structured limitation flag.
  • latency_hint and optional pricing: operational characteristics the deployer can surface to consumers.

The tool server’s keypair signs the manifest, so a deployer verifies that the disclosed tools match what the server exposes. sign_and_verify_manifest in crates/platform/chio-manifest/src/lib.rs exercises the round trip.

Record-keeping and retention

The governed-call path produces a signed ChioReceipt for each recorded decision, then rotates and archives receipts under RetentionConfig with the checkpoint records that keep them verifiable. RetentionConfig accepts any ceiling, so the operator sets it to the three-year schedule.

FieldDefaultBehavior
retention_days
90
Time-based rotation ceiling for the live database
max_size_bytes
10_737_418_240 (10 GiB)
Size trigger; archives aged receipts to a separate SQLite file
archive_path
receipts-archive.sqlite3
Archived receipts and the checkpoint rows that verify them
check_interval_secs
3600
How often the maintenance worker evaluates rotation

retention_rotates_at_time_boundary checks time-based rotation and retention_rotates_at_size_boundary the size trigger, both in crates/kernel/chio-kernel/tests/retention.rs. The maintenance worker runs rotation without operator polling.

An archived receipt still verifies against the Merkle checkpoint root copied into the archive database (archived_receipt_verifies_against_checkpoint). Archival copies only the checkpoint rows whose batch end sequence the archived receipts fully cover, so no partial batch leaves an orphaned proof. The watermark query is in crates/platform/chio-store-sqlite/src/receipt_store/evidence_retention.rs, and archive_preserves_checkpoint_rows in the retention test file pins it.

Install retention and verify an archive

Configure the host, produce a checkpointed receipt, and exercise the archive transfer with an explicit local cutoff.

Complete the project setup, then run the program from federation-guide/. The download includes every constructor and input.

Terminalbash
cargo run --locked --bin retention
Output on darwin/arm64 · exit 0
retention schedule: installed in kernel configuration
explicit local cutoff: 1 checkpointed receipt archived
live receipts: 0; archive receipts: 1
next: export and verify retention-run/archive.sqlite3

The 1,096-day value is an example live-store window, not a calendar-based legal retention calculator. This local exercise explicitly advances the archival cutoff; retain production archives under the approved full schedule, access controls, and backups.

Read the complete program 43 lines · complete file
src/bin/retention.rsrust
use chio_kernel::RetentionConfig;
use chio_store_sqlite::SqliteReceiptStore;
use federation_guide::{host_with_retention, now, record, request, Error};
use std::path::Path;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let directory = Path::new("retention-run");
    let archive_path = std::env::current_dir()?
        .join(directory)
        .join("archive.sqlite3");
    let config = RetentionConfig {
        retention_days: 1096,
        max_size_bytes: 50 * 1024 * 1024 * 1024,
        archive_path: archive_path.to_string_lossy().into_owned(),
        tenant_id: None,
        check_interval_secs: 3600,
        ..RetentionConfig::default()
    };
    // Install the schedule in the host, not merely in an unused local value.
    let host = host_with_retention(directory, Some(config))?;
    let response = host
        .kernel
        .evaluate_tool_call(&request(&host.capability, "retain-1"))
        .await?;
    assert_eq!(response.verdict, chio_kernel::Verdict::Allow);
    record(directory, "original", &response)?;
    drop(host);
    let live = SqliteReceiptStore::open(directory.join("receipts.sqlite3"))?;
    assert_eq!(live.tool_receipt_count()?, 1);
    // A local exercise advances the cutoff beyond this run's receipt.
    // This explicitly invokes archival; it does not simulate waiting three years.
    let archived = live.archive_receipts_before(now() + 1, archive_path.to_str().unwrap())?;
    assert_eq!(archived, 1);
    assert_eq!(live.tool_receipt_count()?, 0);
    let archive = SqliteReceiptStore::open(&archive_path)?;
    assert_eq!(archive.tool_receipt_count()?, 1);
    println!("retention schedule: installed in kernel configuration");
    println!("explicit local cutoff: 1 checkpointed receipt archived");
    println!("live receipts: 0; archive receipts: 1");
    println!("next: export and verify retention-run/archive.sqlite3");
    Ok(())
}

Open the source file. Each program asserts its expected refusals; keys, timestamps, and digests change between runs.

Export and verify the archived receipt

Terminalbash
chio evidence export --receipt-db retention-run/archive.sqlite3 --admin-all --require-proofs --output archive-package
chio evidence verify --input archive-package
Output · exit 0
evidence package verified
tool_receipts:          1
child_receipts:         0
checkpoints:            1
checkpoint_publications: 1
checkpoint_witnesses:   0
checkpoint_consistency_proofs: 0
checkpoint_equivocations: 0
capability_lineage:     1
inclusion_proofs:       1
uncheckpointed_receipts: 0
authorized_receipts:     1
trace_observations:      0
advisory_evaluations:    0
verified_files:         12
child_receipt_scope:    FullQueryWindow
transparency_preview_logs: 1
publication_state:      transparency_preview

Decision audit trail

A receipt pairs a decision with the capability_id and policy_hash that produced it, and the kernel keypair signs the whole body. The governed-call path records allow and deny decisions, and each executed call ends in exactly one terminal receipt.

The Decision enum is tagged, so a refusal carries its human-readable reason and the guard that triggered it. An investigator reading a deny receipt learns what was refused and which rule refused it. This body abbreviates its fields:

deny-receipt-body.jsonjson
{
  "id": "c0537928535dd2a1d3b9f3ca25ec166493d4bf3dbac60c1d695e31dbf921448d",
  "timestamp": 1768042512,
  "capability_id": "cap-billing-q2",
  "tool_server": "billing-api",
  "tool_name": "charge.create",
  "content_hash": "5b7f...",
  "decision": {
    "verdict": "deny",
    "reason": "grant budget exhausted",
    "guard": "budget"
  },
  "policy_hash": "a39c...",
  "kernel_key": "80f2b577...",
  "metadata": {
    "financial": {
      "cost_charged": 0,
      "currency": "USD",
      "attempted_cost": 2000,
      "settlement_status": "not_applicable"
    }
  }
}

all_calls_produce_verified_receipts in crates/kernel/chio-kernel/src/kernel/tests/receipts.rs asserts the allow-and-deny invariant, and monetary_denial_receipt_contains_financial_metadata in crates/kernel/chio-kernel/src/kernel/tests/budget.rs the financial detail on a refusal.

Tamper-evident storage

Chio commits receipt batches into a signed KernelCheckpoint carrying the Merkle root over the batch, so an auditor detects a changed record and verifies inclusion in a committed batch.

  • The checkpoint signature is Ed25519 over the canonical JSON of the checkpoint body, so an auditor checks it with public information alone. build_checkpoint_signature_verifies in crates/kernel/chio-kernel/src/checkpoint/tests.rs checks the round trip.
  • build_inclusion_proof in crates/kernel/chio-kernel/src/checkpoint.rs proves one receipt belongs to the log without re-reading the batch. inclusion_proof_verifies_for_leaf_n in the same crate’s checkpoint/tests.rs asserts the proof verifies.
  • A changed receipt fails its inclusion check against the original signed checkpoint. A root recomputed from changed bytes differs, and replacing the trusted checkpoint requires passing the checkpoint signature check.

Proof of possession

Chio’s DPoP (Demonstration of Proof-of-Possession) module binds an Ed25519 proof over capability_id + tool_server + tool_name + action_hash + nonce to the agent’s registered keypair. verify_dpop_proof_stateless in crates/kernel/chio-kernel/src/dpop.rs enforces the binding.

GuaranteeMechanismTest
Valid proof
Proof binds capability, tool, action hash, and nonce to capability.subject
dpop_valid_proof_accepted
Agent identity binding
proof.body.agent_key must equal capability.subject
dpop_wrong_agent_key_rejected
Replay prevention
action_hash is SHA-256 of the canonical arguments
dpop_wrong_action_hash_rejected
Freshness
issued_at + proof_ttl_secs (default 300 s) within max_clock_skew_secs (default 30 s)
dpop_expired_proof_rejected

A proof signed by any other key is refused before the action runs, and a proof from one invocation fails for a different one. The nonce must be unseen within the TTL window, and the expiry must lie in the future within the clock-skew allowance.

DPoP is requested per grant. When dpop_required is set on a ToolGrant, the kernel refuses any call without a valid proof, so the acting entity is provable on every sensitive invocation. The tests named here live in crates/kernel/chio-kernel/tests/dpop.rs.

Budget accountability

A receipt for a monetary grant carries FinancialReceiptMetadata. Allow receipts record the cost_charged the tool server reported, instead of the worst-case cap, with currency, budget_remaining, budget_total, and settlement_status. Deny receipts record the attempted_cost, so non-execution is itself evidenced.

The caps max_total_cost and max_cost_per_invocation are enforced atomically: the budget store opens a SQLite TransactionBehavior::Immediate transaction, so concurrent invocations cannot overspend a grant through a read-modify-write race. monetary_allow_receipt_contains_financial_metadata checks the allow-side metadata and monetary_full_pipeline_three_invocations_third_denied the exhaustion transition, both in crates/kernel/chio-kernel/src/kernel/tests/budget.rs. Budgets & Metering covers the operational view.

Checkpointing interval

checkpoint_batch_size (default 100) sets how often the kernel produces a Merkle checkpoint: automatically after every N receipts. A lower value shortens the window in which a batch sits without a checkpoint. checkpoint_triggers_at_100_receipts in crates/kernel/chio-kernel/src/kernel/tests/receipts.rs verifies the default cadence.

The cadence is a deployment setting. checkpoint_batch_size: 0 turns automatic checkpointing off (crates/kernel/chio-kernel/src/kernel/kernel_struct.rs), so a deployment that relies on automatic checkpoints keeps it above zero.

Release evidence

The release's qualification evidence names the retention, proof-of-possession, checkpoint, and budget suites that back each control, with their results. A deployment review reads them beside the recorded controls and the deployment documentation; a passing suite is implementation evidence, and the statutory review stays with the deployer.

Terminalbash
chio release verify --evidence qualification
Output
binary         /usr/local/bin/chio  chio 0.2.0  x86_64-unknown-linux-gnu
checksum       matches SHA256SUMS for v0.2.0
signed by      release.yml on backbay-labs/chio, issuer token.actions.githubusercontent.com
qualification  bound to v0.2.0
  kernel: retention and archival     pass
  kernel: proof of possession        pass
  kernel: checkpoints                pass
  kernel: monetary budgets           pass
  manifest: sign and verify          pass
verified

Next: verify the records a review cites