Skip to content

Commit 9083f25

Browse files
Estate audit — Wave 4: DYADT, post-action agent-claim verification (rein in LLMs) (#457)
## Context Follow-up to #453 (Waves 0–1) and #454 (Wave 3), both merged. This wave builds the piece you asked for directly — a system to **rein in LLMs**: a standard that checks, mechanically, that an agent's *claimed* outcomes actually happened. The estate already gates what an agent may do **before** it acts (gatekeeper → AGENTIC → contractiles). It had **nothing** that takes an agent's asserted outcome and confirms it after. Every false-green hole this program has fixed is a special case of one disease: *a claim was trusted instead of verified.* DYADT is the missing **Tier 4**. ## The four-tier accountability pipeline | Tier | Governs | Home | |---|---|---| | 1. Admission | must read the manifest before acting | `0-ai-gatekeeper-protocol/` | | 2. Pre-action | entropy budgets, intent, confirmation | `agentic-a2ml/` | | 3. In-session gates | contractile MUST/TRUST/… at close/push/merge | `contractiles/` | | **4. Post-action (this PR)** | **claimed X → mechanically confirm/refute X** | **`did-you-actually-do-that/`** | ## What's here **Spec set** (`did-you-actually-do-that/`): `README` (pipeline binding) · `spec/CLAIM-FORMAT.adoc` (typed claims) · `spec/VERIFICATION-PROTOCOL.adoc` (the `confirmed`/`refuted`/`unverifiable` contract — **unverifiable is loud, never green**; a verifier must *re-derive* evidence, never read back the agent's own `evidence` field) · `spec/CONSEQUENCE-LEDGER.adoc` (append-only, dual-signed, per-actor confirmation rate that Tier-3 MAY gate on) · `spec/conformance/` (6 executable vectors + runner) · `docs/NAMING-RESOLUTION.adoc` (resolves the PLASMA collision). **Executable + dogfooded:** - `scripts/verify-claims.sh` — reference verifier (local verifiers real; network/manual return `unverifiable`). - Root `CLAIMS.a2ml` — **7 claims about this very change**, re-derived from primary evidence; `dyadt-verify.yml` runs the verifier + conformance suite in CI. If a claim here were false, CI **refutes** it and fails. The spec's first conformance run is on itself. - `scripts/tests/wave4-dyadt-test.sh` (7/7) — proves a false claim is REFUTED despite an honest-sounding statement, and the incompatible-verifier + manual-only guards fire. **Registered + graded:** added to `build-registry.sh` (32 specs); honest scorecard (5/5 MUST met, 90% systems coverage — the network verifier is an honest `fail`, since only the production impl does forge/CI APIs). ## Boundary This repo is the **declaration layer**: it ships the normative spec + a reference verifier + the dogfood. The **production actuator** (continuous, in-session, wired to hypatia/gitbot-fleet with real ledger enforcement) is chartered for `hyperpolymath/did-you-actually-do-that`, built against these conformance vectors — it MUST NOT diverge from this contract. That's the parallel session you flagged. Licence/SPDX is `manual-only` end-to-end (flag-only policy — a licence claim is always `unverifiable: manual-only`). ## Coming next (same track) Wave 5 — AffineScript testing standard + template; Wave 6 — campaign issues (cross-linking #426/#451/#437/#446) + release hygiene. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- _Generated by [Claude Code](https://claude.ai/code/session_0114ps6mY5jAH4SzbGxeuYjc)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6b6e2ee commit 9083f25

31 files changed

Lines changed: 1120 additions & 6 deletions

.github/workflows/dyadt-verify.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# SPDX-License-Identifier: MPL-2.0
2+
# dyadt-verify — DYADT dogfood. Verify this repo's CLAIMS.a2ml against primary
3+
# evidence, and run the DYADT conformance vector suite. If a claim this change
4+
# makes is false, the verifier REFUTES it and this job fails loudly.
5+
name: DYADT Verify
6+
7+
on:
8+
push:
9+
branches: [ main, master ]
10+
pull_request:
11+
branches: [ main, master ]
12+
workflow_dispatch:
13+
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.ref }}
16+
cancel-in-progress: true
17+
18+
permissions:
19+
contents: read
20+
21+
jobs:
22+
verify-claims:
23+
name: Verify CLAIMS.a2ml + conformance
24+
runs-on: ubuntu-latest
25+
timeout-minutes: 10
26+
steps:
27+
- name: Checkout repository
28+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
29+
with:
30+
fetch-depth: 0 # need origin/main as the DYADT diff base
31+
32+
- name: DYADT conformance vectors
33+
run: |
34+
bash did-you-actually-do-that/spec/conformance/run-conformance.sh
35+
36+
- name: Verify this change's own claims (dogfood)
37+
env:
38+
DYADT_BASE: origin/${{ github.base_ref || 'main' }}
39+
run: |
40+
if [ -f CLAIMS.a2ml ]; then
41+
bash scripts/verify-claims.sh CLAIMS.a2ml
42+
else
43+
echo "No CLAIMS.a2ml at root — nothing to verify."
44+
fi

.machine_readable/REGISTRY.a2ml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
version = "1.0.0"
2121
generator = "scripts/build-registry.sh"
2222
hash_algorithm = "sha256(git ls-files -s <home>) # local; external: recorded pin"
23-
entry_count = 31
23+
entry_count = 32
2424

2525
[registry.streams]
2626
foundation = "A2ML format family + K9 + contractiles (Stream 1)"
@@ -228,6 +228,15 @@ canonical_doc = "session-management-standards/README.adoc"
228228
source_hash = "sha256:4b1a97d2ef91578b2c262f1af5b93577cb36d53d234c330947538f4eafc01a6c"
229229
route = "continuity / verify / handover protocols"
230230

231+
[[spec]]
232+
id = "did-you-actually-do-that"
233+
name = "DYADT — Did-You-Actually-Do-That"
234+
stream = "governance"
235+
home = "did-you-actually-do-that/"
236+
canonical_doc = "did-you-actually-do-that/README.adoc"
237+
source_hash = "sha256:445359ddcc92b56dfc8e8a3bdc16062439f1236b5fd0f42099113e7afa86d2e0"
238+
route = "post-action agent-claim verification (Tier 4 accountability)"
239+
231240
[[spec]]
232241
id = "ensaid-config"
233242
name = "ENSAID Config"
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# SPDX-License-Identifier: CC-BY-SA-4.0
2+
# did-you-actually-do-that.scorecard.a2ml
3+
# Hand-authored source. Regenerate the dashboard with: just scorecards
4+
# Schema: .machine_readable/scorecards/scorecard.schema.json
5+
6+
[scorecard]
7+
spec_id = "did-you-actually-do-that"
8+
version = "1.0.0"
9+
assessed_date = "2026-07-03"
10+
assessor = "estate-audit"
11+
12+
[[must]]
13+
id = "M1"
14+
text = "DYADT MUST define a typed, machine-checkable claim format."
15+
system = "did-you-actually-do-that/spec/CLAIM-FORMAT.adoc (normative claim classes + required fields)"
16+
status = "pass"
17+
evidence = "spec/CLAIM-FORMAT.adoc present; 7 claim classes and required-field table defined; example CLAIMS.a2ml shipped."
18+
effects = "Without a fixed claim format the parallel production verifier has no contract to build against."
19+
20+
[[must]]
21+
id = "M2"
22+
text = "DYADT MUST ship a verifier that re-derives outcomes from primary evidence and can REFUTE a false claim."
23+
system = "scripts/verify-claims.sh, exercised by scripts/tests/wave4-dyadt-test.sh"
24+
status = "pass"
25+
evidence = "wave4-dyadt-test.sh (7/7) asserts a false command is REFUTED despite an honest-sounding statement; verifier never reads back the agent's evidence field."
26+
effects = "A verifier that trusted the statement would be theatre — the whole point is mechanical refutation."
27+
28+
[[must]]
29+
id = "M3"
30+
text = "Verdicts MUST be exactly confirmed|refuted|unverifiable, and unverifiable MUST be loud (non-passing)."
31+
system = "scripts/verify-claims.sh (exit 1 on any refuted or, by default, unverifiable)"
32+
status = "pass"
33+
evidence = "wave4-dyadt-test.sh asserts refuted -> non-zero exit; all-confirmed -> exit 0; VERIFICATION-PROTOCOL.adoc fixes the three-verdict contract."
34+
effects = "Silent 'assumed pass' would reintroduce the false-green disease DYADT exists to cure."
35+
36+
[[must]]
37+
id = "M4"
38+
text = "A conformance vector suite MUST exist so any verifier can be validated against shared ground truth."
39+
system = "did-you-actually-do-that/spec/conformance/run-conformance.sh (+ 6 vector pairs)"
40+
status = "pass"
41+
evidence = "run-conformance.sh passes 6/6 vectors covering confirmed/refuted/unverifiable/incompatible-verifier/manual-only."
42+
effects = "Without shared vectors the reference and production verifiers could silently diverge."
43+
44+
[[must]]
45+
id = "M5"
46+
text = "The change introducing DYADT MUST dogfood it: a CLAIMS.a2ml verified in CI."
47+
system = ".github/workflows/dyadt-verify.yml runs scripts/verify-claims.sh CLAIMS.a2ml"
48+
status = "pass"
49+
evidence = "Root CLAIMS.a2ml ships 7 claims about this change; dyadt-verify.yml runs the verifier + conformance suite on push/PR."
50+
effects = "If a claim here were false, CI is refuted and fails loudly — the spec proves itself on itself."
51+
52+
[[should]]
53+
id = "S1"
54+
text = "DYADT SHOULD specify an append-only, dual-signed consequence ledger and a per-actor confirmation rate."
55+
system = "did-you-actually-do-that/spec/CONSEQUENCE-LEDGER.adoc + .machine_readable/ledger/ format"
56+
status = "pass"
57+
evidence = "CONSEQUENCE-LEDGER.adoc defines the entry format, the confirmation-rate formula, and how Tier 3 MAY gate on it."
58+
effects = "Verification without memory cannot escalate on a repeatedly-over-claiming actor."
59+
60+
[[should]]
61+
id = "S2"
62+
text = "The PLASMA naming collision SHOULD be resolved and recorded in canon."
63+
system = "did-you-actually-do-that/docs/NAMING-RESOLUTION.adoc + CANONICAL-NAMES.adoc entry"
64+
status = "pass"
65+
evidence = "NAMING-RESOLUTION.adoc splits DYADT (claim verification) from PLASMA (licence/exactness); a DYADT/PLASMA entry is added to CANONICAL-NAMES.adoc."
66+
effects = "Ambiguous 'grounded by PLASMA' references would keep entangling licence exactness with claim verification."
67+
68+
[[should]]
69+
id = "S3"
70+
text = "The verifier SHOULD implement the network verifiers (ci-run, issue-state, pr-state) against real forge/CI APIs."
71+
system = "none — the reference verifier returns 'unverifiable: needs-network-verifier' for network classes"
72+
status = "fail"
73+
effects = "ci-green / issue-closed / pr-merged claims cannot be confirmed by the reference impl; the production verifier in hyperpolymath/did-you-actually-do-that must implement them (chartered)."
74+
75+
[[could]]
76+
id = "C1"
77+
text = "Tier-3 contractiles COULD block pre_merge on an actor's DYADT confirmation rate."
78+
system = "none (ledger-gate.sh is illustrative in CONSEQUENCE-LEDGER.adoc, not implemented)"
79+
status = "aspirational"
80+
effects = "A live consequence gate is the end state; it depends on the production ledger writer existing first."
81+
82+
[[could]]
83+
id = "C2"
84+
text = "The ledger COULD be a central estate-wide store rather than per-repo."
85+
system = "none"
86+
status = "aspirational"
87+
effects = "Cross-repo actor reputation needs a central ledger; a reach target, not a current gap."

CANONICAL-NAMES.adoc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,23 @@ DEPRECATED NAMES — DO NOT REINTRODUCE (estate mandate 2026-06-30):
6262
mismatch of broken parts adding to the pain of the agentic experience. It is
6363
not an institution.
6464

65+
| **PLASMA**
66+
| Palimpsest licence / exactness tooling (only)
67+
| "the claim-grounder", "the DYADT engine", "agent-claim verifier"
68+
| PLASMA (`palimpsest-plasma`) is licence & exactness tooling *only* — the
69+
authority for licence identity, invariants, and equivalence. It is NOT an
70+
agent-claim verifier. Post-action verification of an agent's asserted
71+
outcomes is *DYADT* (see below), which subsumes the former "claim-grounder"
72+
concept and drops the PLASMA name. See
73+
`did-you-actually-do-that/docs/NAMING-RESOLUTION.adoc`.
74+
75+
| **DYADT**
76+
| Did-You-Actually-Do-That
77+
| "PLASMA", "the grounder"
78+
| Post-action agent-claim verification (Tier 4 of the accountability pipeline):
79+
takes an agent's asserted outcomes and mechanically confirms/refutes each
80+
against primary evidence. Home: `did-you-actually-do-that/`.
81+
6582
|===
6683

6784
== Deprecated names — do not reintroduce (MANDATE, 2026-06-30)

CLAIMS.a2ml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# SPDX-License-Identifier: CC-BY-SA-4.0
2+
# CLAIMS.a2ml — DYADT dogfood: what this change claims to have done.
3+
# Verified in CI by scripts/verify-claims.sh (did-you-actually-do-that/).
4+
# Every claim below is re-derived from primary evidence, not from this text.
5+
# Claims use content markers (not "created") so they stay true after the change
6+
# merges into the base branch — a claim must describe a durable fact.
7+
8+
[claims]
9+
schema = "dyadt/claim@1"
10+
session = "session_0114ps6mY5jAH4Sz"
11+
actor = "claude-opus-4-8"
12+
emitted_commit = "HEAD"
13+
14+
[[claim]]
15+
id = "C1"
16+
claim_class = "file-changed"
17+
statement = "the DYADT front door defines the Tier-4 accountability pipeline"
18+
target = "did-you-actually-do-that/README.adoc"
19+
expect = "contains:Post-Action Claim Verification"
20+
verifier = "git-diff"
21+
22+
[[claim]]
23+
id = "C2"
24+
claim_class = "file-changed"
25+
statement = "the claim format spec defines typed claim classes"
26+
target = "did-you-actually-do-that/spec/CLAIM-FORMAT.adoc"
27+
expect = "contains:claim_class"
28+
verifier = "git-diff"
29+
30+
[[claim]]
31+
id = "C3"
32+
claim_class = "file-changed"
33+
statement = "the verification protocol fixes the three-verdict contract"
34+
target = "did-you-actually-do-that/spec/VERIFICATION-PROTOCOL.adoc"
35+
expect = "contains:unverifiable"
36+
verifier = "git-diff"
37+
38+
[[claim]]
39+
id = "C4"
40+
claim_class = "file-changed"
41+
statement = "the consequence ledger defines a per-actor confirmation rate"
42+
target = "did-you-actually-do-that/spec/CONSEQUENCE-LEDGER.adoc"
43+
expect = "contains:confirmation rate"
44+
verifier = "git-diff"
45+
46+
[[claim]]
47+
id = "C5"
48+
claim_class = "file-changed"
49+
statement = "the reference verifier can emit an unverifiable verdict"
50+
target = "scripts/verify-claims.sh"
51+
expect = "contains:unverifiable"
52+
verifier = "git-diff"
53+
54+
[[claim]]
55+
id = "C6"
56+
claim_class = "command-ran"
57+
statement = "the DYADT conformance vector suite passes"
58+
target = "bash did-you-actually-do-that/spec/conformance/run-conformance.sh"
59+
expect = "exit==0"
60+
verifier = "command-transcript"
61+
62+
[[claim]]
63+
id = "C7"
64+
claim_class = "test-passed"
65+
statement = "the verifier refutes a false claim and confirms a true one (self-check)"
66+
target = "bash scripts/tests/wave4-dyadt-test.sh"
67+
expect = "exit==0"
68+
verifier = "command-transcript"

COMPLIANCE-DASHBOARD.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
| `toolchain-readiness-grades` | ❌ gap | 1/5 | 2/4 | 0/3 | 83% | 2026-07-03 |
4343
| `rhodium-standard-repositories` | ❌ gap | 2/3 | 1/2 | 0/1 | 50% | 2026-07-03 |
4444
| `session-management-standards` | ❌ gap | 1/5 | 1/4 | 0/3 | 41% | 2026-07-03 |
45+
| `did-you-actually-do-that` | ✅ met | 5/5 | 2/3 | 0/2 | 90% | 2026-07-03 |
4546
| `ensaid-config` | ❌ gap | 0/5 | 0/3 | 0/3 | 90% | 2026-07-03 |
4647
| `accessibility` | ❌ gap | 2/5 | 0/5 | 0/3 | 100% | 2026-07-03 |
4748
| `publication-pre-flight` | ❌ gap | 0/5 | 0/4 | 0/2 | 36% | 2026-07-03 |
@@ -51,10 +52,10 @@
5152

5253
## Estate rollup
5354

54-
- **Specs registered (local):** 28
55-
- **Specs with a scorecard:** 28 / 28
56-
- **MUST requirements:** 41 passing / 138 total (74 failing)
57-
- **Estate systems coverage:** 66% of 328 graded requirements have a mechanical check
55+
- **Specs registered (local):** 29
56+
- **Specs with a scorecard:** 29 / 29
57+
- **MUST requirements:** 46 passing / 143 total (74 failing)
58+
- **Estate systems coverage:** 67% of 338 graded requirements have a mechanical check
5859

5960
## How this dashboard stays honest
6061

Justfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ scorecards-check:
7373
scorecards-check-strict:
7474
@bash scripts/build-scorecards.sh --check --strict
7575

76+
# DYADT: verify a CLAIMS.a2ml against primary evidence (default: root CLAIMS.a2ml)
77+
verify-claims path="CLAIMS.a2ml":
78+
@bash scripts/verify-claims.sh "{{path}}"
79+
80+
# DYADT: run the conformance vector suite
81+
dyadt-conformance:
82+
@bash did-you-actually-do-that/spec/conformance/run-conformance.sh
83+
84+
# DYADT regression test (confirm/refute/unverifiable + guards)
85+
dyadt-test:
86+
@bash scripts/tests/wave4-dyadt-test.sh
87+
7688
# Aggregate compliance gate: registry drift is the HARD gate (registry-check,
7789
# a hard dep). The RSR self-audit is INFORMATIONAL — a monorepo is not expected
7890
# to score Gold — but a *broken* audit (exit 4 / unexpected) must fail loudly

TOPOLOGY.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
> It cannot freeze: every regeneration re-reads ground truth. Do not edit by hand.
1010
1111
- **Phase:** active &nbsp;|&nbsp; **Maturity:** experimental &nbsp;|&nbsp; **STATE last-updated:** 2026-06-03T00:00:00Z
12-
- **Registry entries:** 31 specs across 6 streams
12+
- **Registry entries:** 32 specs across 6 streams
1313
- **Front door:** human → [README.adoc](README.adoc); machine → [0-AI-MANIFEST.a2ml](0-AI-MANIFEST.a2ml)
1414
- **Registry:** [.machine_readable/REGISTRY.a2ml](.machine_readable/REGISTRY.a2ml) (index + source hashes) · prose: [REGISTRY.adoc](REGISTRY.adoc)
1515

@@ -55,6 +55,7 @@
5555
|---|---|---|
5656
| RSR — Rhodium Standard Repositories | [`rhodium-standard-repositories/`](rhodium-standard-repositories/) | the repository-compliance standard every repo is graded against |
5757
| Session Management Standards | [`session-management-standards/`](session-management-standards/) | continuity / verify / handover protocols |
58+
| DYADT — Did-You-Actually-Do-That | [`did-you-actually-do-that/`](did-you-actually-do-that/) | post-action agent-claim verification (Tier 4 accountability) |
5859
| ENSAID Config | [`ensaid-config/`](ensaid-config/) | the ensaid configuration standard |
5960
| Accessibility Standard | [`accessibility/`](accessibility/) | estate accessibility requirements |
6061
| Publication Pre-Flight | [`publication-pre-flight/`](publication-pre-flight/) | submission gate (HOL + Zenodo checklists) |

0 commit comments

Comments
 (0)