Build the T08 domain core with the engine behind a seam
approval-engine APPROVAL-WP-0002-T01 is still progress and its namespace has no pods, so the live end-to-end proof cannot run. Built everything that does not depend on it, with the engine behind a Protocol plus a fake carrying its real refusal semantics, so its arrival is a wiring change rather than a build. - memo.py: the Decision Memo, versions, binding document. Principal, Scope, Awareness and Hat are dataclasses rather than dicts because the canonicalizer requires a shape and a missing key should fail at construction rather than deep inside hashing — which is exactly how it failed twice while building this. Field names follow the governed canonicalizer (item_id, severity, locator): the published vectors are the contract, so the object was aligned to them rather than the reverse. - presentation.py: the sole writer of view_hash. One writer, one canonicalizer, one place to audit. Acknowledgment is an explicit method call and nothing infers it from scroll, dwell or focus. - disposition.py: verbs and guards G_NOAGENT, G_STEP, G_PRES, G_ACK, G_REASONS, G_SEALED. accept is ABSENT from weak steps rather than present-and-disabled, because a greyed-out accept still teaches the wrong model. Only accept reaches the engine; a memo return is not represented there at all. - provenance.py: claim routes per A-16. assert_human_control_dischargeable refuses a registration-supplied human, so PR-11's limitation fires at the point of use instead of sitting in a document. - evidence.py: local outbox, commitment-only records carrying the GH-DEC-2026-014 §4 existence assertion, per-class reconciliation counts, and a custody-locator guard that rejects credentialed URLs (PR-12). - approval_client.py: 409 duplicate_approver is success, 409 conflict terminal, 503 fail-closed, approval:consume refused before a token is requested. 87 tests pass, including every negative case in the Use Case Catalog and that a fail-closed outcome is recorded as a stance application with no verb field — never as a decline, because the human did not make one. T08 stays progress: the live proof is the remainder. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3W1dQG7GFFM9d94jFx7iR Assistant: claude-code Assistant-Model: opus Assistant-Process: 1565372@bnt-lap001 Assistant-Session: 16bb2f25-b34c-49ef-8e94-5fec3567a568
This commit is contained in:
parent
4379576abd
commit
9e1f77e32b
18 changed files with 1503 additions and 10 deletions
27
SCOPE.md
27
SCOPE.md
|
|
@ -6,15 +6,28 @@
|
|||
|
||||
## Status — 2026-09-09
|
||||
|
||||
**Specification and declaration are complete; no service is deployed.**
|
||||
**Specification, declaration and the domain core are complete. No service is
|
||||
deployed.**
|
||||
|
||||
What exists and is tested: the layer and stance declarations (`layer.yaml`,
|
||||
`pep-stance.yaml`, `informed_decision/stance.py`), the governed canonicalizer
|
||||
and schema, and the four specs under `docs/specs/`. 46 tests pass.
|
||||
What exists and is tested (87 tests):
|
||||
|
||||
What does not exist: any HTTP surface, any storage, any UI, any deployment. The
|
||||
walking skeleton is `INFD-WP-0001-T08` and is gated on an external decision
|
||||
(§"Open" below).
|
||||
- layer and stance declarations — `layer.yaml`, `pep-stance.yaml`,
|
||||
`informed_decision/stance.py`, with published-equals-shipped asserted;
|
||||
- the governed canonicalizer and schema, with the three published vectors
|
||||
reproducing byte for byte and all four isolation properties pinned;
|
||||
- the **domain core**: `memo.py` (the Decision Memo, its versions and the
|
||||
binding document), `presentation.py` (the sole writer of `view_hash`),
|
||||
`disposition.py` (the verb vocabulary and guards `G_NOAGENT`, `G_STEP`,
|
||||
`G_PRES`, `G_ACK`, `G_REASONS`, `G_SEALED`), `provenance.py` (claim routes,
|
||||
A-16), `evidence.py` (the local outbox and commitment records);
|
||||
- `approval_client.py` — the seam to `approval-engine` plus a fake carrying its
|
||||
actual refusal semantics.
|
||||
|
||||
What does not exist: any HTTP surface, any persistence, any UI, any deployment.
|
||||
The origin `decisions.coulomb.social` is live but serves an nginx placeholder.
|
||||
|
||||
`INFD-WP-0001-T08` remains open for the live end-to-end proof, which is gated on
|
||||
`APPROVAL-WP-0002-T01` and a deployed `approval-engine`.
|
||||
|
||||
## One-liner
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue