Skip to content

V7: convert every remaining keyword occurrence (155 provisions, zero unbound) - #45

Open
afogel wants to merge 4 commits into
ir/v6from
ir/v7
Open

afogel wants to merge 4 commits into
ir/v6from
ir/v7

Conversation

@afogel

@afogel afogel commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Seventh slice of the normative IR, stacked on #44 (V6). Scope per docs/shaping/normative-ir-slices.md §V7; slice README at ir/slices/v7/README.md.

What this does

  • Zero unbound occurrences. The census binds 163 of the corpus's 208 RFC 2119 occurrences to provisions and excludes the other 45 with a reason. 127 new records and overlay entries on top of V2's 28: 148 Requirements, 2 Definitions, 4 Invariants, 1 Exclusion.
  • Authored exclusions (E8.2), ir/census/exclusions.yaml. The occurrence count turned out to be an upper bound on provisions, not a count: the spec restates rules inside their own parentheticals and describes roadmap intent in normative sources. 34 occurrences are excluded by verbatim quote with a reason from a closed set (restatement_of a named provision, mention, roadmap, rationale). A quote that does not resolve, resolves twice, or covers two occurrences fails the census, so an exclusion cannot cover a second obligation unnoticed. Spec-lint and the impact comment read the same file, so a keyword with neither a marker nor an exclusion is still a failure.
  • Vocabulary grows from 42 relations to 76. The normalizer, the external facts and the trace generator carry the new wire, guardian-state, external and deployment relations.
  • Compile status across 155 provisions: 69 compiled, 39 permissions, 25 non-testable, 12 inexpressible (each with the missing relation named, per R3.6), 7 with no predicate, 3 aliases.
  • Both engines still agree. The conformant fixture now satisfies the profile-scoped provisions too (an agbom/snapshot before its hooks, both ACS-Crypto algorithms, full ContextEntry and decision-log fields). The violating fixture breaches six V7 provisions deliberately; expected.tsv lists the 33 tuples both engines derive.
  • The clean envelope log meets all 58 active acs-core obligations; the 23 ACS-Audit, ACS-Inspect and ACS-Crypto provisions report not-activated for a session that did not negotiate them.

Decisions

  • Non-testable records carry predicate: null with the reason in the note, since the compiler refuses a predicate on a non-testable provision.
  • Four allocated IDs (ACS-REQ-0042, 0049, 0085, 0115) are unused gaps: allocated during the conversion for occurrences that turned out to be restatements. The counter is monotonic and they were never marked, so they are not tombstones.
  • ACS-REQ-0060 was narrowed so the ACS-Audit MUST and the previous_hash rule inside the same list item are separate provisions rather than nested spans.
  • The exclusions file defaults to the one beside sources.yaml, so a test corpus never reads the real catalog's.

Findings for upstream (added to the slices doc)

  • hooks.md uses MAY NOT, which is not an RFC 2119 term.
  • §10 does not say whether the handshake request is signed; the per-session key is derived from the session_id the handshake establishes.

Verified

bun run typecheck, bun test ir (173 pass), census --check, extract --check, render --check, compile --check, lint (0 failures), differential with Soufflé 2.5 (conformant 0/0/0, violating 33/33/33), and verify over the generated clean trace (exit 0). The full-repo bun test still has the same 28 local-only failures as earlier slices (no trash binary, no network), unrelated to ir/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm

V7 of the normative IR. The census now binds 163 of the corpus's 208
RFC 2119 occurrences to provisions and excludes the other 45 with a
reason, leaving none unbound.

- 127 new records and overlay entries on top of V2's 28; four allocated
  IDs (ACS-REQ-0042, 0049, 0085, 0115) are unused gaps
- ir/census/exclusions.yaml (E8.2): 34 occurrences that restate a
  provision carried elsewhere, describe roadmap intent, or repeat a
  keyword in rationale, each by verbatim quote; a quote that does not
  resolve, resolves twice, or covers two occurrences fails the census.
  Read by the census, the lint, and the impact comment
- the vocabulary grows from 42 to 76 relations; the normalizer, the
  external facts and the trace generator carry the new wire,
  guardian-state, external and deployment relations
- 69 provisions compile, 39 are permissions, 25 non-testable, 12 are
  flagged inexpressible with the missing relation named
- the conformant fixture now satisfies the profile-scoped provisions
  too; the violating fixture breaches six V7 provisions on purpose and
  expected.tsv lists the 33 tuples both engines derive
- exclusions default to the file beside sources.yaml, so a test corpus
  never reads the real catalog's
- slice README, IR README, CLI usage and the slices doc updated; two
  findings for upstream recorded (MAY NOT in hooks.md; whether the
  handshake is signed)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
@github-actions

Copy link
Copy Markdown

Normative impact (ACS 0.1.2 at 6fce2a0)

No failures, nothing to review.

Changed provisions and their tests (U22)

None.

Added provisions with no conformance test (U23)

  • ACS-INV-0002
  • ACS-INV-0003
  • ACS-INV-0004
  • ACS-REQ-0025
  • ACS-REQ-0026
  • ACS-REQ-0028
  • ACS-REQ-0029
  • ACS-REQ-0030
  • ACS-REQ-0031
  • ACS-REQ-0032
  • ACS-REQ-0033
  • ACS-REQ-0034
  • ACS-REQ-0035
  • ACS-REQ-0036
  • ACS-REQ-0037
  • ACS-REQ-0038
  • ACS-REQ-0039
  • ACS-REQ-0040
  • ACS-REQ-0041
  • ACS-REQ-0043
  • ACS-REQ-0044
  • ACS-REQ-0045
  • ACS-REQ-0046
  • ACS-REQ-0047
  • ACS-REQ-0048
  • ACS-REQ-0050
  • ACS-REQ-0051
  • ACS-REQ-0052
  • ACS-REQ-0053
  • ACS-REQ-0054
  • ACS-REQ-0055
  • ACS-REQ-0056
  • ACS-REQ-0057
  • ACS-REQ-0058
  • ACS-REQ-0059
  • ACS-REQ-0061
  • ACS-REQ-0063
  • ACS-REQ-0064
  • ACS-REQ-0065
  • ACS-REQ-0066
  • ACS-REQ-0067
  • ACS-REQ-0068
  • ACS-REQ-0069
  • ACS-REQ-0070
  • ACS-REQ-0071
  • ACS-REQ-0072
  • ACS-REQ-0073
  • ACS-REQ-0074
  • ACS-REQ-0075
  • ACS-REQ-0076
  • ACS-REQ-0077
  • ACS-REQ-0078
  • ACS-REQ-0079
  • ACS-REQ-0080
  • ACS-REQ-0081
  • ACS-REQ-0082
  • ACS-REQ-0083
  • ACS-REQ-0084
  • ACS-REQ-0086
  • ACS-REQ-0087
  • ACS-REQ-0088
  • ACS-REQ-0089
  • ACS-REQ-0090
  • ACS-REQ-0091
  • ACS-REQ-0093
  • ACS-REQ-0094
  • ACS-REQ-0095
  • ACS-REQ-0096
  • ACS-REQ-0097
  • ACS-REQ-0098
  • ACS-REQ-0099
  • ACS-REQ-0100
  • ACS-REQ-0101
  • ACS-REQ-0102
  • ACS-REQ-0103
  • ACS-REQ-0104
  • ACS-REQ-0105
  • ACS-REQ-0106
  • ACS-REQ-0107
  • ACS-REQ-0108
  • ACS-REQ-0109
  • ACS-REQ-0110
  • ACS-REQ-0111
  • ACS-REQ-0112
  • ACS-REQ-0113
  • ACS-REQ-0114
  • ACS-REQ-0116
  • ACS-REQ-0117
  • ACS-REQ-0118
  • ACS-REQ-0119
  • ACS-REQ-0120
  • ACS-REQ-0121
  • ACS-REQ-0122
  • ACS-REQ-0123
  • ACS-REQ-0124
  • ACS-REQ-0125
  • ACS-REQ-0126
  • ACS-REQ-0127
  • ACS-REQ-0128
  • ACS-REQ-0129
  • ACS-REQ-0130
  • ACS-REQ-0131
  • ACS-REQ-0132
  • ACS-REQ-0133
  • ACS-REQ-0135
  • ACS-REQ-0136
  • ACS-REQ-0137
  • ACS-REQ-0139
  • ACS-REQ-0140
  • ACS-REQ-0141
  • ACS-REQ-0142
  • ACS-REQ-0143
  • ACS-REQ-0144
  • ACS-REQ-0145
  • ACS-REQ-0146
  • ACS-REQ-0147
  • ACS-REQ-0148
  • ACS-REQ-0149
  • ACS-REQ-0150
  • ACS-REQ-0151
  • ACS-REQ-0152

Removed provisions missing a tombstone (U24)

None.

Unmarked normative statements (U25)

None.

The repository's .gitignore excludes every dist/ directory, so
ir/dist/provision-index.md (and rules.dl from V5 on) never reached git
even though `render --check` and `compile --check` require the committed
copy. Re-include ir/dist/ and commit the files the checks compare against.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants