Conversation
The fourth slice of the Normative IR (V4 in docs/shaping/normative-ir-slices.md), stacked on V3. `acs-ir lint` is now spec-lint (E9): one pass over the marked corpus, the records, the allocation files, the conformance tests and the pinned schemas, judged against a baseline, the committed manifest and census, or with --baseline the base branch's copies, so a pull request is judged by what it changed rather than by what its author regenerated. Failures: unpaired, mismatched or nested markers; an RFC 2119 occurrence that is unbound now and was not unbound in the baseline; a provision gone from the corpus, or a withdrawn record, with no tombstone; a tombstoned ID back in use; a duplicate or never-allocated ID; a test citing an ID that is neither live nor tombstoned; a schema ref whose pointer does not resolve or that pins no hash. Needs-review: a moved subschema, alongside V3's changed text, dependency and restatement. Both exit 1; a failure is fixed in the tree, needs-review is cleared by classifying the change and updating the record. The baseline is what makes "new unmarked keyword" mean something while 174 occurrences are still unbound by design. An occurrence's identity across edits is its source, keyword and context window, so a reflow elsewhere does not make it new and an edit to its own sentence does. The census the lint runs reads the marked corpus with the markers stripped and the spans re-based, so its context windows equal the committed census's. Schema refs now pin the SHA-256 of the canonicalized subschema (R2.8); the seven records with refs carry eight pins. spec-lint.yml lints each pull request against its base branch and posts one impact comment, updated in place; it is the only workflow with write access, and only to pull-request comments. The demo runs as a test on the marked corpus: an unmarked MUST and a deleted provision both fail, named with file:line and ID in the terminal report and in the comment. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm
Normative impact (ACS 0.1.2 at
|
afogel
added this pull request to stack #48
September 14, 2026 14:18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fourth slice of the Normative IR (
docs/shaping/normative-ir-slices.md§V4), stacked on #41.Demo: on a copy of the marked corpus, add a sentence containing
MUSTwith no marker and delete a marked provision without tombstoning its ID.bun run ir lintfails and the comment it writes lists both: the unmarked statement withfile:line, and the ID that needs a tombstone. Captured output is inir/slices/v4/README.md;ir/test/spec-lint.test.tsperforms the same edits.What it delivers
specLint()(N20) against a baseline. The committed manifest and census, or with--baseline <dir>the base branch's copies, so a PR is judged by what it changed rather than by what its author regenerated. That is what makes "new unmarked keyword" a meaningful check while 174 occurrences are still unbound by design.pinnedis the SHA-256 of the canonicalized subschema at the JSON Pointer. The seven records with refs carry eight pins.unmark()strips markers and re-bases spans, so lint-time context windows equal the committed census's and an occurrence's identity survives a reflow elsewhere.checks.ymlrunsbun run ir lintwith the tree as its own baseline. Newspec-lint.ymlruns per PR and weekly, materializes the base branch's manifest and census withgit show, lints against them, and posts one normative-impact comment updated in place. It is the only workflow with write access, and only to PR comments; fork PRs get the log and the red check.Verification
bun run typecheckpasses;bun test ir: 132 tests pass.bun run ir linton the tree: no failures, nothing to review, exit 0.🤖 Generated with Claude Code
https://claude.ai/code/session_01BX56nQPAsqYihopWfWy1xm