Skip to content

Why each field exists

The schema is the merge of two drafts. This records what each side contributed and what the merge is defending against, so a future change does not quietly undo a deliberate constraint.

What the estate draft contributed

changes.ownership_delta is the strongest field in the receipt. It makes Net-Negative Ownership mechanically checkable per run rather than assessable in a quarterly audit. Nothing else in the estate does this.

work.existing_work_searched and work.duplicate_work_created enforce curate-before-create at the moment of work creation, which is the only moment it is cheap.

The factory block has no equivalent anywhere else. private_todo_remaining catches an agent keeping state in its head rather than in Beads. polling_used catches manual terminal polling that events and orders already replace. unsupported_internal_hack_used catches reaching into Gas City internals rather than composing on documented primitives. temporary_artifacts_remaining catches exhaust.

routing models the real handoff (mail, sling, return_condition, wait_state, next_bead) rather than a vague recommendation. wait_state matters because an event-driven city needs to know whether an agent is blocked on a dependency, an event, an order, mail, or genuinely has nothing to do.

terminal.durable_transition_established generalizes "work on disk is not done" into a single checkable assertion that covers every terminal state, not just completion.

verification.criteria[].falsification_condition is the best epistemic field in either draft. Expected versus observed is easy to write after the fact. Stating what would disprove the claim is not.

evidence as a top-level array with capture_method per claim, and classifications drawn from the BluCity-Docs vocabulary rather than a parallel scale.

What the second draft contributed

economics, without which a receipt cannot feed the recurring model. Cost per accepted outcome is the number the business rests on, and human review minutes is the number that answers the capacity question.

factory.secrets_referenced and human_gate.auth_blocked, without which the Authentication and Secrets Constitution had nowhere to live and was unenforceable.

authority.mode, granted_for and policy_decision, without which the earned-authority ladder could not be checked and an OBSERVE agent could report an applied change.

actions[], which makes the mechanism ladder visible. Without it there is no way to see a deterministic task being run on a strong model, which is the most common quiet cost defect.

customer_visible, so ContextControl renders customer language the agent wrote rather than deriving it from internal fields and leaking vocabulary.

run identity and timestamps, so receipts can be correlated and runs timed.

changes.artifacts, because a list of file paths is not a change record. Whether something is a merge request, whether it was applied, whether it was reviewable and whether rollback is proven are the questions an operator actually asks.

The four holes the merge closed

The first draft allowed verification.criteria: [] with overall: PASS, which is precisely the hole the three-word verdict vocabulary exists to close. INV-02 closes it.

It allowed result.status: PASS alongside requested_effect_achieved: false and alongside verification.overall: UNKNOWN, with four status fields and no precedence. INV-01 fixes the precedence and the skill states it once.

duplicate_work_created: true had no consequence, and the three anti-pattern booleans had no teeth. INV-08 and gate rules G-05 through G-07 give them consequences.

terminal.receipt_complete was the receipt certifying its own completeness. The validator now stamps it and agents emit false.

Naming

HISTORICAL became HISTORICAL_SUPERSEDED to match the Evidence State table already used by the product-definition skill. Two vocabularies for one concept is exactly the drift the context curation skill exists to find, and it is cheaper to align now than after receipts exist.

Migration

v1 to v2 is not backward compatible. Newly required: run, actions, economics, customer_visible, authority.mode, authority.granted_for, authority.policy_decision, work.acceptance_criteria, changes.artifacts, factory.secrets_referenced, human_gate.auth_blocked. For an estate this size that is cheaper before the first pilot receipts exist than after.

The rule for changing this schema

Every invariant proves it rejects a violation, in scripts/conformance_test.py. An invariant with no rejection test is a comment with extra syntax. A new field that nothing gates on is a field that will be filled in with whatever is convenient.