Skip to content

V8: cut the overlay into the upstream marker patches, and draft the governance texts - #46

Open
afogel wants to merge 2 commits into
ir/v7from
ir/v8
Open

afogel wants to merge 2 commits into
ir/v7from
ir/v8

Conversation

@afogel

@afogel afogel commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Eighth and last slice of the normative IR, stacked on #45 (V7). Scope per docs/shaping/normative-ir-slices.md §V8; slice README at ir/slices/v8/README.md. This ships the tooling and the drafts; posting to the spec repository is the maintainer's step, under the afogel identity with no tool attribution (shaping doc D-f).

What this does

  • acs-ir markers patch (U8, N60). The overlay as a unified diff against the spec repository root: ir/dist/markers.patch (155 provisions, 14 files, 746 lines) and, with --ids, ir/dist/markers-poc.patch (the five worked provisions, 2 files). Every hunk is a one-line replacement, because a marker never contains a line break. Both files are committed and --checked in CI.
  • E3.3 proven before the patch is sent. A test copies the pinned corpus, applies the bulk patch with git apply, and extracts provisions from the patched tree with no overlay involved; the text hashes equal the committed manifest's. A second test runs git apply --check against the submodule.
  • Two placement rules the resolver now enforces. An anchor must not precede a list, quote, table or heading marker on its line, since inline HTML there pushes the marker off the line start. The bulk patch had one such case, ACS-REQ-0060, whose quote now starts inside the list item. And an overlay entry whose anchor the corpus already carries is refused rather than applied twice, which is how the overlay retires entry by entry as markers are merged upstream.
  • The governance texts, drafted under ir/slices/v8/: the Discussion with five worked provisions from different families (ACS-REQ-0007, ACS-REQ-0010, ACS-REQ-0013, ACS-INV-0001, ACS-EXC-0001) showing prose, ID, predicate, rule and tests; the proof-of-concept PR text; the bulk PR text with per-file anchor counts and the procedure if the proof of concept merges first.

Second commit: prose and fixture readability

A review pass over every slice README, the V8 drafts, the IR README, the shipped notes in the slices doc, and the comments and test names under ir/, replacing metaphor and flourish with the literal statement. No meaning, number, identifier, command or code changed. The conformance fixtures now read without the vocabulary open: every .facts file starts with comment lines naming its columns and source (the reader skips them; Soufflé always runs on a copy without them), and the opaque values (s1, hX, fA, p9) are named for what they are (session-violating, hash-claimed, fingerprint-a, prov-unknown), with a legend at the end of each fixture README.

Verified

  • bun run typecheck, bun test ir (183 pass, with ACS_IR_REQUIRE_SOUFFLE=1 and Soufflé 2.5 present), every --check including the two new patch checks, lint (0 failures), differential (both fixtures agree), and verify over the clean trace (exit 0).
  • On a checkout of ACS v0.1.2 with the bulk patch applied: the spec repository's full guard suite passes (uv run pytest, 203 passed), and uv run mkdocs build renders the pages with <a id="acs-req-0007"></a> in the HTML, the closing comments preserved as comments, and no marker text visible after stripping tags and comments. The checkout was reverted afterwards; nothing in spec/acs changed.

Also in this stack today

CI on #40 to #45 was red for two reasons that are now fixed on their branches and merged upward: the repository's .gitignore excludes every dist/ directory, so ir/dist/provision-index.md and rules.dl had never been committed and the --check steps failed on a fresh checkout (fixed on ir/v2, re-including ir/dist/); and the Soufflé-presence test asserted on CI, which GitHub sets in every job including the one without Soufflé (fixed on ir/v5: the requirement is opt-in through ACS_IR_REQUIRE_SOUFFLE, set by the differential job, which now also runs the differential tests). All six are green.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm

…nance texts

V8 of the normative IR, up to the posting.

- `acs-ir markers patch` (N60): the overlay as a unified diff against
  the spec repository, ir/dist/markers.patch (155 provisions, 14 files)
  and, with --ids, ir/dist/markers-poc.patch (the five worked
  provisions). Both are committed and --check'ed in CI
- tests prove both apply to the pinned checkout with git apply, and that
  extracting from the patched tree yields the committed manifest, which
  is the E3.3 retirement proven before the patch is sent
- the resolver refuses an anchor that would precede a list, quote, table
  or heading marker on its line (the bulk patch had one: ACS-REQ-0060's
  quote now starts inside the list item), and refuses an entry whose
  marker the corpus already carries, so the overlay retires entry by
  entry as markers land upstream
- ir/slices/v8/: the Discussion draft with five worked provisions, the
  proof-of-concept PR text and the bulk PR text, for the maintainer to
  post; verified locally that the spec repository's own guards pass on
  the patched tree and that MkDocs renders the anchors invisibly

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)

None.

Removed provisions missing a tombstone (U24)

None.

Unmarked normative statements (U25)

None.

…ixtures readable

A review pass over every slice README, the V8 drafts, the IR README,
the shipped notes in the slices doc, and the comments and test names
under ir/: metaphor and flourish replaced by the literal statement
("burn-down" -> "the number every later slice reduces", "vouch for" ->
"declared basis", "the day X merges" -> "when X merges", and so on).
No meaning, number, identifier, command or code changed.

The conformance fixtures now read without the vocabulary open:

- every .facts file starts with comment lines naming the relation's
  columns and source, copied from relations.yaml; readFacts() skips
  them and Soufflé is always run on a copy without them
- the opaque values are named for what they are: session-violating,
  entry-1, prov-user-input, prov-agent, prov-unknown, hash-claimed,
  hash-recomputed, head-20, req-2, fingerprint-a; expected.tsv, the
  fixture READMEs and the Discussion draft use the same names, and
  each fixture README ends with a legend
- listFixtures() ignores dot-directories, so a stray .acs/ written next
  to the fixtures is not run as one

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
@afogel
afogel added this pull request to stack #48 September 14, 2026 14:18
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