Repository navigation
Make every sg_report call outside its grammar a caller bug (issue #211) - #233
Conversation
Trevor decided issue #211 on 2026-10-08: each of these is a caller bug, recorded at user.warning per ADR-0033 as amended by issue #189: - a long-form state outside expensive|covered|unmounted; - a reasserted marker after any state but expensive; - six or more arguments, no longer read as the short form; - fewer than two arguments, which now write a caller-bug record instead of aborting the caller under set -u. No caller makes any of these calls; none changes. docs/operating.md now describes the caller-bug record. examples/payload rebuilt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
auto-review round 1 on PR #233 found two things: - The sg_report header and docs/operating.md said a marker after any state but `expensive` is a caller bug. That holds only for the long form: `coverage_change unwrapped-N reasserted` is valid and is re-asserted (ADR-0031). Both now say so. - `[ $# -lt 2 ]` changed no outcome: a missing action or state reads as empty through `${1-}`/`${2-}`, and the character check already refuses an empty one. Removing it passed every test. It is gone, and the comment names the check that does the work. The fewer-than-two tests remain the oracle: reading `$1` or `$2` bare fails them. examples/payload rebuilt. Full suite: 3606 passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
auto-review round 1Reviewed PR #233 at 7c4b3e9 against its body (issue #211's four caller-bug cases, the header comment, operating.md, tests). Confirmed and fixed (in scope)
Filed, not fixed (out of scope)
Refuted
Unverified
Architect ruling
3 findings, 3 confirmed, 0 refuted. Every isolated revert of the remaining guards fails the new tests (probe-verified). Valid forms are byte-identical to main under dash and bash (20 lines compared). |
auto-review round 2Reviewed PR #233 at c2d1d3e, round 1's fix first: the header comment, the operating.md paragraph, the PR body, the commit messages, and the payload. Confirmed and fixed (in scope)
Filed, not fixed (out of scope)
Refuted
Unverified
Architect ruling
1 finding, 1 confirmed, 0 refuted. The probe confirmed four things under dash and bash: every header sentence matches the code; operating.md lists exactly the paths that set |
auto-review round 3Reviewed PR #233 at c2d1d3e (code unchanged since round 2; the body was edited) on a dimension not yet spent: semantics against ADR-0030, ADR-0031, ADR-0033 and the issue #211 decision, plus the edited body. Confirmed and fixed (in scope)
Filed, not fixed (out of scope)
Refuted
Unverified
Architect ruling
Round 3 found nothing. The probe ran a matrix of 33 calls under dash and bash with |
auto-review round 4Confirming round. Reviewed PR #233 at c2d1d3e, unchanged since round 3, on a dimension not yet spent: grammar/divergence between Confirmed and fixed (in scope)
Filed, not fixed (out of scope)
Refuted
Unverified
Architect ruling
1 finding, 1 confirmed, 0 refuted, 0 in scope. Every valid shape the census pins matches what |
auto-review summary — 4 rounds
Fixed in this PR: the marker rule in the header comment, operating.md and the PR body is scoped to the long form ( |
…ing (issue #234) (#241) * Record a short-form uncovered_mount call as a caller bug at user.warning (issue #234) As Trevor decided on issue #234, uncovered_mount takes the long form only, in both directions. PR #215 (issue #189) made a long-form call naming any other action a caller bug; the converse was never checked, so `sg_report uncovered_mount expensive` wrote an uncovered_mount record with no mount or fstype, at user.warning, a priority the action never otherwise has. sg_report in node/shim/install.sh now writes the caller-bug record at user.warning for a two- or three-argument uncovered_mount call, the shape PR #233 (issue #211) gave every other misuse. The check is one [ test; nothing forks. No caller changes: every uncovered_mount call in install.sh already uses the long form. docs/operating.md names the short form among the conditions that produce a caller-bug record. ADR-0033 already says the long form is uncovered_mount's alone and that uncovered_mount records are at notice, so it needs no line. Closes #234 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Name uncovered_mount's exclusion in sg_report's short-form grammar line (issue #234) auto-review round 1 on PR #241 found that the grammar at the head of sg_report still listed `sg_report ACTION STATE` for any action, while the new branch makes a short-form uncovered_mount call a caller bug. Verified by reading the comment block. Comment only; examples/payload rebuilt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * State uncovered_mount's exclusion for both short forms in sg_report's grammar (issue #234) auto-review round 2 on PR #241 found that round 1's qualifier sat on the two-argument grammar line only, while a three-argument `uncovered_mount STATE reasserted` call is a caller bug too (the `expensive-reasserted` case of the new test). The exclusion is now one sentence under the grammar, covering both short forms. Comment only; examples/payload rebuilt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Ruling
Trevor decided issue #211 on 2026-10-08: each case below is a caller bug, recorded at
user.warningas ADR-0033 (amended by issue #189) sets for every caller-bug record. A call with fewer than two arguments writes acaller-bugrecord and does not abort underset -u.What changed
node/shim/install.sh:sg_reportwritescaller-bugforexpensive,coveredorunmounted;reassertedmarker after any state butexpensive. The short form's marker is unchanged:coverage_change unwrapped-N reassertedstays valid;$1and$2are read as${1-}and${2-}, so no path reads an unset one, and the existing character check refuses the empty action or state.These follow PR Make long-form misuse of sg_report a caller bug, and every caller bug a warning (issue #189) #215's path:
_rep_bug=1, then the existing reset to thecaller-bugrecord at warning. The header comment lists the new cases.sg_reportis the reconcile's sink ininstall.sh, not the guard's audit path. The checks arecaseand[only, so it gains no fork.docs/operating.md: the journal section now describes thecaller-bugrecord: what it means, its priority, and that it is a defect to report.tests/test_install.py, under dash and bash:set -eu;coverage_changekeeps its record and priority. The existing tests already pin the valid short and long forms, unchanged.examples/payloadrebuilt.No caller changes. ADR-0030, ADR-0031 and ADR-0033 stay true as written: none says the long form accepts any other state, a marker after another state, or another argument count. So no ADR amendment is needed.
Tested
install.sh, all 24 new grammar cases fail. Dropping the count check fails 6 (the six-or-more cases). Dropping the state checks fails 12.walk-blocker build --check, shellcheck on the payload shims,dash -n, pymarkdown, pyflakes ondeploy.py, and the IP gate (--require-terms, 0 findings) all pass.Closes #211
🤖 Generated with Claude Code