…ents
PR #476 removed the comments from the files #475 touched and kept
what they said in its commit body. Some of those sentences were not
implementation notes but behaviours a user or a later build observes,
each already witnessed by a named e2e scenario that no requirement
cited. Those become requirements here: 42 across eleven areas, seven
of them new (change-detection, configure, group-references,
record-write, scoped-builds, tupfile-evaluation, variant-builds) and
four extended (command-record, dep-scan, record-read, reset).
Every discharge names a test that exists and asserts the sentence, and
every sentence forbids an implementation; claims whose only test could
not fail on them were cut rather than cited: the edge kind of a group
written in the inputs section, a multi-rule depfile (the fixture splits
on `&&` into two single-rule scans), the words a derived scan drops, an
env-driven branch flip whose command text also changes, the branch a
phi-node output is recorded against, the plain-reference arm of
demand-driven group parsing, and a variant-build routing sentence that
belonged to command-record. A different-model review of the drafts
found those plus two upstream citations naming a symbol that does not
exist (`variant_check`) and one misplaced assignment (`tf.variant` is
set in `parse`, not `parse_tupfile`), all corrected. Nineteen
candidates restated a requirement that already exists and were
dropped; four of them instead join existing requirements as further
discharges. The pass-ordering and arithmetic-width notes stay in
#476's body as mechanism.
Conformance was read, not guessed: a `tup-conformant` reference names
an upstream symbol that was opened, and two behaviours found to
diverge are recorded as deliberate deviations for the first time --
putup treats an imported env var that later vanishes as unchanged
against the recorded value where tup's env_cb takes NULL as a
mismatch, and putup includes a file once per guard context where
parser_include_file re-parses on every include.
Ref: #476
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Follow-up to #476, as agreed: the behaviours the deleted comments described, written as EARS requirements.
What is added. 42 requirements across 11 areas: 7 new area files (
change-detection,configure,group-references,record-write,scoped-builds,tupfile-evaluation,variant-builds) and 4 extended (command-record,dep-scan,record-read,reset), plus 4 furtherdischarge:lines on existing requirements. Every discharge names an e2e scenario that exists;spec-checkpasses at 195 requirements, 0 gaps.What was cut. Of the 82 candidates recovered from the comments, 19 restated an existing requirement and were dropped (4 became extra discharges), and 7 claims whose only test could not fail on them were not written: the edge kind of a group in the inputs section, a multi-rule depfile, the words a derived scan drops, an env-driven branch flip whose command text also changes, which branch a phi-node output is recorded against, the plain-reference arm of demand-driven group parsing, and a variant-build routing sentence that belongs to command-record.
Review. Drafted by one planner and eleven per-area writers on Opus, then reviewed by a separate Opus agent on six grounds (vacuity, discharge fidelity, conformance honesty, truth against the binary, README form, duplication). It returned 17 findings; all are fixed in the commit, including two
referencelines that named an upstream symbol that does not exist (variant_check) and one that placedtf.variantin the wrong function. Five nits about weak but true witnesses (a[shell]-tagged discharge Windows CI skips, two scenarios that self-disable under root, two that assert only "not a no-op") are left as they are and are the natural next tests to strengthen.Conformance. Two deviations from tup are recorded for the first time: an imported env var that later vanishes is treated as unchanged against the recorded value (tup's
env_cbtakes NULL as a mismatch), and a file is included once per guard context (tup'sparser_include_filere-parses every include).🤖 Generated with Claude Code
https://claude.ai/code/session_01StgwMENEyfBnEoe4pvAdtQ