Repository navigation
[decision] Should flow-trigger-unroutable widen to the absent-triggerType (omission) shape — #7041 item 2, decide together with #6041 #7215
Description
Carrier card for the undecided half of #7041, filed because that card auto-closed when PR #7172 landed its item 1 (the stale provenance comment) — leaving item 2 with no open, queryable tracker. A pending maintainer decision living only in a closed card's comment thread is the prose-is-not-a-state-machine failure this seat keeps cleaning up, so it gets its own card.
The question
flow-trigger-unroutable (#6637) currently fires only on the contradiction shape: config.triggerType is present and routes nowhere. Should it also fire on the omission shape: type: 'record_change' with no triggerType at all? Both are equally dead at runtime; they differ only in how the author got there.
Why it is decidable now (what changed since #6637 deferred it)
- The measured objection at A non-
record--prefixed flowtriggerTypesilently degrades the flow to manual — no lint, no runtime signal (spun out of #5957) #6637 time: the rule would have gated a shipped example app (examples/app-todo'sTaskCompletionFlow, a live omission instance) on a guess about that app's intended semantics. - fix(example-todo): arm
task_completion— it bound to nothing and gated on a key nothing reads (#6882) #7039 made, implemented, and pinned that guess —TaskCompletionFlownow declarestriggerType: 'record-after-update'. There is no live omission instance in the tree (verified in lint:validate-flow-trigger-readinesscites a live example-app instance that #6882 just removed — plus the deferred question of whether the wider absent-triggerTypecriterion should now ship #7041's filing and re-pinned by PR fix(lint): correct stale provenance comment in validate-flow-trigger-readiness.test.ts #7172's durable comment). - So the wider rule would ship green on the whole tree: no baseline entry, no example-app churn, no new vocabulary, no new configuration surface (it reads a key the engine already reads).
Why it still needs a decision rather than a default
It is a rule with zero current hits. Under the startup-focus principle a zero-hit rule is not urgent, and "declared = enforced" is a principle, not a schedule.
⛔ The pairing constraint (why this is not the devx seat's call)
#6041 is the structurally identical question about a different key — whether app.defaultAgent's value gets a lint (platform-roster-outside ⇒ warning), filed after #5985 measured the gate structurally blind to that defect class. It sits in this same decision box. Two identical questions must get one decider and one principle; deciding them separately on different days invites two contradictory precedents for every future card of this class.
The three dispositions (all defensible)
- Take both now — ship the wider criterion while the tree is green for it, and the
app.defaultAgentwarning under the same principle. The window argument: if an omission instance appears later, shipping then costs a fix-first or a baseline entry; the price only goes up. (The seat's lean, previously stated.) - Defer both with restart conditions written on the cards — e.g. first real omission-shaped instance / first roster-outside
defaultAgentfound in a real app. - Decline both on the zero-hit reading.
Mechanical note for whichever way it goes: the scope-boundary pin in validate-flow-trigger-readiness.test.ts states in its own text that widening "is a deliberate edit that has to delete this test, not a side effect" — the machinery already expects this decision and will resist an accidental one.
Refs: #7041 (item 2's origin, closed), #6637 (the rule and the original deferral), #7039 (the repair that opened the window), #6041 (the sibling decision), #5985, PR #7172.
Activity
os-project-manager commentedon Aug 10, 2026
RULED — disposition 1 (take it now), by maintainer delegation. On 2026-08-10 the maintainer asked this seat for the multi-dimensional analysis of this card paired with #6041 and directed it to proceed per its own recommendation (「帮我多维度综合分析,按照你的建议继续」). #6041, on re-reading its thread, was already ruled by the maintainer (2026-08-07, option A, reaffirmed 2026-08-09) — so the pairing constraint resolves cleanly: this card follows the same principle that ruling already established.
The principle, stated once for both cards and for every future zero-hit-rule decision that cites them: a zero-hit rule ships when the defect class has a measured real instance (the tuition was already paid), the oracle is closed (membership is enumerable), the tree is currently green for it (corpus-count = 0, so landing costs no churn), and the severity matches the hazard. All four hold here:
TaskCompletionFlowwas a live omission-shaped dead flow until fix(example-todo): armtask_completion— it bound to nothing and gated on a key nothing reads (#6882) #7039 repaired it.record_changetrigger types is enumerable; "routes nowhere" is a fact, not a guess.validate-flow-trigger-readinesscites a live example-app instance that #6882 just removed — plus the deferred question of whether the wider absent-triggerTypecriterion should now ship #7041's filing, re-pinned by PR fix(lint): correct stale provenance comment in validate-flow-trigger-readiness.test.ts #7172). This is the window argument — land now and the widening is free; land after the next instance appears and it costs a fix-first or a baseline entry.The startup-focus counterweight is acknowledged, not ignored: nothing here blocks a release. The reason to act now rather than defer is that the green window is open today and deferral's only effect is to let it close.
Claim — devx PM seat, session
session_01F8q5J1MQyocgtNspb15fSn, branchclaude/issue-7215-widen-flow-trigger-unroutable. Dispatching toos-dev(sonnet). Mechanical notes carried into the dispatch: the scope-boundary pin invalidate-flow-trigger-readiness.test.tssays in its own text that widening must be a deliberate edit that deletes that test — so its deletion is part of the deliverable, not collateral; corpus re-verified at branch time before enforcing.If an earlier claim comment with a different session ID exists above this one, that claim wins.
Generated by Claude Code
feat(lint): widen flow-trigger-unroutable to the omission shape (obje…