Skip to content

ci: a spec that parsed must not stop parsing - #4277

Merged
gHashTag merged 2 commits into
masterfrom
ci/spec-parse-gate
Sep 19, 2026
Merged

gHashTag merged 2 commits into
masterfrom
ci/spec-parse-gate

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Closes #4276

Adds Spec Parse Ratchet: for every changed .t27, compare t27c spec-status at the base with the head and fail when a file that parsed stops parsing. Already-broken specs (65 of them) are not its business; a new file cannot regress; a compiler that cannot run exits 2 rather than passing.

Verified with the real compiler before landing: breaking specs/tri/sort/tim_sort.t27 exits 1 and names Expected LBrace, got RParen (')') at line 28:14; an unrelated change exits 0; no compiler exits 2. --self-test covers seven shapes including already-broken and repaired files.

Measured motivation: NOPARSE went 68 (09-14) -> 90 (09-17) while the required checks (validate, check-linked-issue) never run the compiler over a changed spec.

This gate is worth making required — that is a ruleset change, separate from this PR.

🤖 Generated with Claude Code

`t27c spec-status` over the corpus: 68 NOPARSE on 2026-09-14, 68 on 09-16, 90
on 09-17. A spec that does not parse generates nothing, so the tests it carries
stop running; #4272 repaired fourteen of them only by taking back the version
the bee had written.

Nothing caught them. The required checks are validate and check-linked-issue,
and neither runs the compiler over a changed spec.

This gate asks one question over the files a change touches: did a spec that
parsed at the base stop parsing? Already-broken specs are not its business and
a new file cannot regress. A compiler that cannot be run exits 2 - could not
run, not a pass.

Closes #4276

Gates: python3 tools/ci/check_specs_still_parse.py --self-test -> ok (7 shapes);
against the real t27c, a branch that breaks specs/tri/sort/tim_sort.t27 exits 1
naming the parse error, an unrelated change exits 0, a missing compiler exits 2;
python3 scripts/ci/check_pr_branch_filters.py exits 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-19 14:59:33 UTC

Summary

Status Count
Total Open PRs 39
PRs with Failing Checks 18
PRs with All Checks Green 21
READY 20
FAILING 18
PENDING 0
NO CHECKS YET 0

These columns do not partition: 20 + 18 + 0 + 0 = 38, and there are 39 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=403499176a5d != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

`check_pr_branch_filters.py` keeps a ceiling on workflows in neither of its
lists, and it moves down only. The population had crept back to 27 because
`oracle-nightly.yml` landed in #4234 unclassified - exactly the slack the
ceiling refuses - and this branch's `spec-parse-ratchet.yml` made 28.

Three are classified here: the parse ratchet and `l1-traceability.yml` as
merge-critical (a branch filter would hide either on a stacked pull request),
`oracle-nightly.yml` as not (it measures the corpus nightly, it does not gate a
merge). Population 25, ceiling follows to 25.

Refs #4276

Gates: python3 scripts/ci/check_pr_branch_filters.py -> exit 0, 23 + 5 + 25 =
53; --self-test -> exit 0 ("one new unclassified workflow fails").

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-19 15:01:11 UTC

Summary

Status Count
Total Open PRs 39
PRs with Failing Checks 18
PRs with All Checks Green 21
READY 20
FAILING 18
PENDING 0
NO CHECKS YET 0

These columns do not partition: 20 + 18 + 0 + 0 = 38, and there are 39 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=403499176a5d != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit 30b4804 into master Sep 19, 2026
26 of 29 checks passed
gHashTag added a commit that referenced this pull request Sep 20, 2026
… path (#4304)

Three checks are red on master. Two are this loop's.

CENSUS. tools/census/quiet.txt pinned `workflow files read 51`; the tree holds
57. The six added since the pin are #4277, #4279, #4281, #4283, #4291 and
#4300, all merged by this loop, and cli-tri has been red since 2026-09-17.
What moved, explicitly: quiet 51 -> 57 workflow files and 123 -> 135 "named a
path but not quiet"; shell 51 -> 57 files, 72 -> 78 jobs, 249 -> 267 run-steps,
228 -> 246 steps the runner runs with `bash -eo pipefail`. The gates did not
change; the population grew.

HOME PATH. feed_defects.py carries a comment explaining that an absolute
`/Users/<name>/t27/target/release/t27c` once went into 137 open issues -- and
spells it out to say so, which is what the scan catches. It now reads
`.../t27/target/release/t27c`, same meaning, no home directory.

WORKTREES. That gate also failed in every worktree on a path no commit
contains: it excludes the `.git` DIRECTORY, and a worktree's `.git` is a FILE
holding `gitdir: /Users/...`. `--exclude=.git` joins `--exclude-dir=.git`. The
reviewer measures in a detached worktree and every bee works in one.

NOT FIXED HERE: `coverage` reports 544 stale seals and has no successful run in
its last 60 on master, reaching back past 2026-09-18. Re-sealing 544 specs
records what the compiler now produces -- a decision about the ledger, not a
repair.

Closes #4303

Co-authored-by: Claude <noreply@anthropic.com>
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.

Nothing stops a pull request from making a spec stop parsing

1 participant