Unblocks: #19544 (its PR #19573 changes the exact constant this blind spot hides).
Filed by the domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) on 2026-09-21, from the out_of_scope_findings of the dev delivering #19544. ⛔ Filed unassigned, ⛔ no priority:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim.
The defect
scripts/pm/check-clause2-carriers.mjs imports CONTRACT_REVIEW_TIER from scripts/pm/dispatch-gates.mjs, so a diff that changes that constant moves that gate's verdict. Yet dispatch-gates.mjs --commands on a diff touching its own file does not derive the clause2 family at all — so the gate whose answer the change moves is never scheduled to run.
⏱️ Measured by this seat before filing, ⛔ not adopted from the dev's report
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack scripts/pm/dispatch-gates.mjs
| reading |
value |
| exit |
0 |
derived families naming clause2 |
0 ⇐ the finding |
| ⭐ control, same run: families derived in total |
29 — so the derivation fired and had plenty to say |
⇒ the zero is a real absence, ⛔ not a dead instrument.
The shape, and why it is worth a card rather than a shrug
⭐ An import specifier is not a discoverable watch hint. The derivation cannot see that one script consumes another's constant, so the dependency is invisible to it. This is the same blind spot check-dispatch-gates.mjs has already had to fix twice for itself, both times by declaring the module as an explicit constant (SURFACE_MODULE, FRAME_MODULE) rather than relying on the import graph.
⚠️ It qualifies under the charter's 「只有护产品落地或用户可见契约的门禁才立修复卡」 on the first arm: --commands decides which gates a PR runs, so a hole in it means a PR can land without running a gate its own change moved. That is a product-landing guard, ⛔ not an instrument's cosmetics.
What a fix looks like
Declare the dependency the way the file's own precedent does — an explicit constant naming the consuming module — and pin it with a case that fails if a consumer is added without a declaration. ⛔ Widening the derivation to follow imports generally is not prescribed here: that is a design choice with its own blast radius, and this card asks for the narrow, already-precedented fix.
⚠️ On #19573 the family was run by hand and is green, so ⛔ nothing is broken today; what is missing is that it would have been run automatically.
查重词
clause2-carriers watch hint not derived · import specifier watch hint blind spot · CONTRACT_REVIEW_TIER consumer derives nothing · declared watch hint constant · SURFACE_MODULE FRAME_MODULE precedent
Generated by Claude Code
Unblocks: #19544 (its PR #19573 changes the exact constant this blind spot hides).
Filed by the
domain:specseat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) on 2026-09-21, from theout_of_scope_findingsof the dev delivering #19544. ⛔ Filed unassigned, ⛔ nopriority:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim.The defect
scripts/pm/check-clause2-carriers.mjsimportsCONTRACT_REVIEW_TIERfromscripts/pm/dispatch-gates.mjs, so a diff that changes that constant moves that gate's verdict. Yetdispatch-gates.mjs --commandson a diff touching its own file does not derive the clause2 family at all — so the gate whose answer the change moves is never scheduled to run.⏱️ Measured by this seat before filing, ⛔ not adopted from the dev's report
clause2⇒ the zero is a real absence, ⛔ not a dead instrument.
The shape, and why it is worth a card rather than a shrug
⭐ An import specifier is not a discoverable watch hint. The derivation cannot see that one script consumes another's constant, so the dependency is invisible to it. This is the same blind spot
check-dispatch-gates.mjshas already had to fix twice for itself, both times by declaring the module as an explicit constant (SURFACE_MODULE,FRAME_MODULE) rather than relying on the import graph.--commandsdecides which gates a PR runs, so a hole in it means a PR can land without running a gate its own change moved. That is a product-landing guard, ⛔ not an instrument's cosmetics.What a fix looks like
Declare the dependency the way the file's own precedent does — an explicit constant naming the consuming module — and pin it with a case that fails if a consumer is added without a declaration. ⛔ Widening the derivation to follow imports generally is not prescribed here: that is a design choice with its own blast radius, and this card asks for the narrow, already-precedented fix.
查重词
clause2-carriers watch hint not derived·import specifier watch hint blind spot·CONTRACT_REVIEW_TIER consumer derives nothing·declared watch hint constant·SURFACE_MODULE FRAME_MODULE precedentGenerated by Claude Code