The signed decision also binds the answer
The detached signature protected response metadata but not the answer value an agent would act on. Changing hold to ship could leave verification successful.
v0.3 added a digest of the delivered response and state to the signed context. The receiver reconstructs it. Follow-up work added version negotiation and numeric canonicalization fixtures.
PR #8 records the hold-to-ship tamper failing specifically with signature mismatch, with an honest-payload control first. Current signing tests cover value, actor, comment, edited and state tampering. PRs #11 and #12 carry the negotiation and numeric interoperability follow-ups.
Keep retries available until directive work is complete
A human-to-agent leg needs durable delivery semantics, correct addressee binding and a way to retry work that was received but not durably completed. Committing deduplication before the work would lose that retry.
The v0.4 work added a mailbox and signed directives. Review changed directive handling to reserve the ID while work is in flight, then commit after durable processing or release it for retry. Receipt and presence primitives followed in a stacked PR.
The public discussion records commit fdb0f20 moving deduplication to a caller commit and 38ebdf8 adding reservation/release. Current tests name overlapping delivery, release-and-retry, restart before commit, addressee rejection and unsigned-field stripping. The reference remains in-memory; persistence across an actual Hub restart is a downstream obligation.
An accepted message is not a delivered message
Agents need to distinguish queue acceptance, reachability, delivery and failure; one undifferentiated success label can hide a lost message.
v0.5 introduced session-addressed envelopes, explicit queued/open acknowledgments, reachability snapshots, bounce/expiry semantics and three signed entry kinds. The work was split into spec, conformance, implementation and skills.
Issue #24 led to issues #25–#28, delivered by PRs #29/#31/#33/#35. PR #31 explicitly recorded 64 vector passes and 19 skips before sibling wiring; skipped obligations were not claimed as proof. Current conformance inventory is 79 schema vectors, 29 downstream-proof vectors and two prose audits.
One shared client contract instead of drifting copies
Two real consumers had duplicated version selection, wire validation and error interpretation. Each copy could diverge from the protocol.
PR #51 extracted shared keyed and keyless client layers, made feature-to-minimum-version rules and error classification explicit, and preserved existing exports.
The PR records all 290 pre-existing tests passing with no edits to those test files, 310 total with new coverage, and unchanged signed bytes pinned by fixtures. The public export paths and shared modules remain in current main. Those are change-specific historical checks, not today’s full-suite result.
Refuse impossible questions before they reach a person
The old ask contract admitted input schemas no object answer could satisfy, duplicate option values and underspecified edit permission. The first v0.6 implementation then stripped the old-version edit field, which could corrupt retry identity.
v0.6 made answerability and option uniqueness explicit. A follow-up moved version gating to the point where the permission is used and retained the original envelope unchanged.
PR #66 records the real implementation mistake, a new regression that the old-version allow_edit field survives storage, and 349 tests passing at that change. Current ask-contract tests verify both verbatim storage and refusal of off-menu answers for version 0.5. The v0.6 correction does not add another messaging leg.