You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ActionSchema documents "newTabUrl is only valid together with opensInNewTab" but no refine enforces the pair (observation) #11842
Found while measuring #11519 (PR #11841); filed unassigned, observation class.
ActionSchema.newTabUrl's doc (packages/spec/src/ui/action.zod.ts) states: "Only valid together with opensInNewTab." Nothing on the refine chain enforces it: an action declaring newTabUrl WITHOUT opensInNewTab parses clean, and no renderer path reads newTabUrl outside the pre-opened-tab flow — so the declaration is silently inert, the ADR-0078 declared-but-unenforced shape, arriving through a documented co-constraint rather than a missing key.
Measured while partitioning #11519's static knowability: the doubled-channel refine landed on onSuccess + opensInNewTab: true and deliberately did not widen to this adjacent constraint (different defect, different message). Corpus reading at that time: zero newTabUrl producers in this repo's examples and platform metadata (the known producers are cloud SSO actions, which declare the pair correctly).
Remedy shape, if taken up: a refine rejecting newTabUrl without opensInNewTab: true, with a message naming the pre-opened-tab contract — plus byte-identity pins for the legal pair. Zero measured producers of the illegal shape, so nothing legal breaks.
Concentrated triage batch: finding → pm:queue + domain:spec, Bug, S — documented co-constraint with no refine: newTabUrl without opensInNewTab parses clean while the doc says "only valid together" (re-verified on origin/main, action.zod.ts:1304 describe-text carries the constraint, no refine on the chain). Remedy per the card: a refine rejecting the lone key, message naming both fields. Corpus reading at filing: zero lone producers (known producers declare the pair). Clause-②: yes (accept-set narrowing) — claim declares it, contract-review tier; re-run the corpus sweep at claim before landing.
{
"issue": 11842,
"status": "done",
"branch": "claude/issue-11842-newtaburl-refine",
"pr": "https://github.com/objectstack-ai/objectstack/pull/12108",
"premise_still_valid": true,
"summary": "ActionSchema now rejects newTabUrl whenever opensInNewTab !== true (refine after the #11519 rule, issue located on path ['newTabUrl'], message naming the pre-opened-tab contract and both remedies). opensInNewTab: false beside newTabUrl is refused too (the key has no meaning outside the pre-opened flow); legal pairings pinned byte-identically. Corpus re-swept at claim: zero lone producers in this repo, objectui (consumer-only; read point requires the pair), and per the issue's measurement of record for cloud. No ADR-0087 registry entry: gate-validated not-required (no-migration-prescription), mirroring the adjacent #11519 narrowing — so no registry.ts overlap with batch siblings.",
"tests": "spec full suite 426 files / 11329 tests passed (pre-merge tree 1b3c10d; merge brought zero packages/spec paths); targeted re-run at final head a9e2a0f: 3 files / 164 tests passed. spec typecheck green (test-typecheck ledger unchanged 55/263). check:generated: all 14 artifacts up to date; api-surface regenerated byte-identically after rebuild (mtime-only staleness from the ablation churn). Ablation: fix committed first, trap-guarded; mutation proven on disk by grep -c '11842' 2->0, mutated leg 5 refusal tests red | 3 legal pins green, restored from HEAD (marker 2, clean porcelain), 8/8 green; no dist leg applies (in-package relative source import, no exports-resolved dist path).",
"gates": {
"derivation": "scripts/pm/dispatch-gates.mjs, stderr stamp 'objectstack-ai/objectstack' at a9e2a0f; list unchanged vs pre-merge derivation at 1b3c10d",
"green_at_a9e2a0f": ["changeset-gate-self-tests", "objectui-changeset", "check-changeset-no-major", "check-empty-changeset", "release-rehearsal-clone --self-test", "merge-driver", "published-files", "slot-lookup", "spec-parsed-alias", "test-source-alias", "type-source-resolution", "query-options-erasure", "engine-double-contract", "where-matcher", "cross-package-test-inputs", "check-ci-filter-parity", "check-plugin-teardown-shape", "nul-bytes", "doc-formula-expressions", "spec check:empty-state", "spec check:liveness", "spec check:strictness-ledger", "spec check:variant-docs", "check-adr-0087-registration", "type-check-coverage", "docs-audit check-affected-docs", "docs-audit check-drift-comment", "spec check:generated (14/14)"],
"not_measured_locally_declared": ["check:dev-prereqs (66/67 sibling dists absent — workspace-state precondition; CI builds fresh)", "check:type-check-debt --re-measure (needs built closure; compensating: spec check:test-typecheck green over the only test-layer change)"],
"ci": "in_progress — report delivered at draft-PR time per standing rule"
},
"line_budget": "n/a — no skills/** diff",
"files_changed": ["packages/spec/src/ui/action.zod.ts (+36 refine block)", "packages/spec/src/ui/action-newtaburl-pair.test.ts (new, 8 tests)", ".changeset/action-newtaburl-requires-opensinnewtab.md (new, minor, BREAKING-declared, adr-0087 not-required no-migration-prescription)", "merge commit of origin/main 8d5c724 (no unique files)"],
"deviations": [
"PM assumption 1 confirmed at BASE f7b25c5 (bare z.string().optional(), no refine).",
"PM assumption 2 confirmed and extended: docs/fixture occurrences are the legal pair or prose already stating the constraint; objectui swept locally (consumer-only); cloud repo not present in this container — issue measurement stands unre-measured for cloud.",
"PM assumption 3 resolved NO ENTRY: check-adr-0087-registration validates the not-required (no-migration-prescription) disposition green; mirrors #11519 (same schema, same narrowing class, landed 2026-08-24). Registry parallel-waiver discipline therefore unused (no registry.ts edit).",
"Full spec suite ran at pre-merge tree 1b3c10d; merge to a9e2a0f brought zero packages/spec paths (content-identical spec tree); targeted action tests re-run green at a9e2a0f.",
"Session's curl REST channel refused ('GitHub access is not enabled for this session') — reads/writes done via git + MCP single-issue tools; no MCP list/search family used.",
"Ablation script's second grep anchor spanned a string-concat line break and read 0 on both legs (inert); the grep -c '11842' anchor (2->0->2) is the operative on-disk proof.",
"First ablation script run hit the 590s bash cap during the restored-leg lock wait; trap held, tree verified clean (empty porcelain), restored leg re-run separately 8/8 green."
],
"open_questions": [],
"out_of_scope_findings": []
}
os-dev-report (authoritative copy — the previous comment's HTML-comment marker was eaten by the body sanitizer, as the standing rule predicts; same JSON, no comment-edit channel available in this session)
{
"issue": 11842,
"status": "done",
"branch": "claude/issue-11842-newtaburl-refine",
"pr": "https://github.com/objectstack-ai/objectstack/pull/12108",
"premise_still_valid": true,
"summary": "ActionSchema now rejects newTabUrl whenever opensInNewTab !== true (refine after the #11519 rule, issue located on path ['newTabUrl'], message naming the pre-opened-tab contract and both remedies). opensInNewTab: false beside newTabUrl is refused too (the key has no meaning outside the pre-opened flow); legal pairings pinned byte-identically. Corpus re-swept at claim: zero lone producers in this repo, objectui (consumer-only; read point requires the pair), and per the issue's measurement of record for cloud. No ADR-0087 registry entry: gate-validated not-required (no-migration-prescription), mirroring the adjacent #11519 narrowing — so no registry.ts overlap with batch siblings.",
"tests": "spec full suite 426 files / 11329 tests passed (pre-merge tree 1b3c10d; merge brought zero packages/spec paths); targeted re-run at final head a9e2a0f: 3 files / 164 tests passed. spec typecheck green (test-typecheck ledger unchanged 55/263). check:generated: all 14 artifacts up to date; api-surface regenerated byte-identically after rebuild (mtime-only staleness from the ablation churn). Ablation: fix committed first, trap-guarded; mutation proven on disk by grep -c '11842' 2->0, mutated leg 5 refusal tests red | 3 legal pins green, restored from HEAD (marker 2, clean porcelain), 8/8 green; no dist leg applies (in-package relative source import, no exports-resolved dist path).",
"gates": {
"derivation": "scripts/pm/dispatch-gates.mjs, stderr stamp 'objectstack-ai/objectstack' at a9e2a0f; list unchanged vs pre-merge derivation at 1b3c10d",
"green_at_a9e2a0f": ["changeset-gate-self-tests", "objectui-changeset", "check-changeset-no-major", "check-empty-changeset", "release-rehearsal-clone --self-test", "merge-driver", "published-files", "slot-lookup", "spec-parsed-alias", "test-source-alias", "type-source-resolution", "query-options-erasure", "engine-double-contract", "where-matcher", "cross-package-test-inputs", "check-ci-filter-parity", "check-plugin-teardown-shape", "nul-bytes", "doc-formula-expressions", "spec check:empty-state", "spec check:liveness", "spec check:strictness-ledger", "spec check:variant-docs", "check-adr-0087-registration", "type-check-coverage", "docs-audit check-affected-docs", "docs-audit check-drift-comment", "spec check:generated (14/14)"],
"not_measured_locally_declared": ["check:dev-prereqs (66/67 sibling dists absent — workspace-state precondition; CI builds fresh)", "check:type-check-debt --re-measure (needs built closure; compensating: spec check:test-typecheck green over the only test-layer change)"],
"ci": "in_progress — report delivered at draft-PR time per standing rule"
},
"line_budget": "n/a — no skills/** diff",
"files_changed": ["packages/spec/src/ui/action.zod.ts (+36 refine block)", "packages/spec/src/ui/action-newtaburl-pair.test.ts (new, 8 tests)", ".changeset/action-newtaburl-requires-opensinnewtab.md (new, minor, BREAKING-declared, adr-0087 not-required no-migration-prescription)", "merge commit of origin/main 8d5c724 (no unique files)"],
"deviations": [
"PM assumption 1 confirmed at BASE f7b25c5 (bare z.string().optional(), no refine).",
"PM assumption 2 confirmed and extended: docs/fixture occurrences are the legal pair or prose already stating the constraint; objectui swept locally (consumer-only); cloud repo not present in this container — issue measurement stands unre-measured for cloud.",
"PM assumption 3 resolved NO ENTRY: check-adr-0087-registration validates the not-required (no-migration-prescription) disposition green; mirrors #11519 (same schema, same narrowing class, landed 2026-08-24). Registry parallel-waiver discipline therefore unused (no registry.ts edit).",
"Full spec suite ran at pre-merge tree 1b3c10d; merge to a9e2a0f brought zero packages/spec paths (content-identical spec tree); targeted action tests re-run green at a9e2a0f.",
"Session's curl REST channel refused ('GitHub access is not enabled for this session') — reads/writes done via git + MCP single-issue tools; no MCP list/search family used.",
"Ablation script's second grep anchor spanned a string-concat line break and read 0 on both legs (inert); the grep -c '11842' anchor (2->0->2) is the operative on-disk proof.",
"First ablation script run hit the 590s bash cap during the restored-leg lock wait; trap held, tree verified clean (empty porcelain), restored leg re-run separately 8/8 green."
],
"open_questions": [],
"out_of_scope_findings": []
}
Checklist conclusion (verified against GitHub + local git diff of the branch): draft ✓ · base main ✓ · Fixes #11842 first line ✓ · 3 files +209 = refine (+33 in action.zod.ts) + refusal/pin test file (+140) + minor changeset ✓ · no migrations touch (ADR-0087 disposition not-required (no-migration-prescription) validated green by the gate, mirroring the adjacent #11519 narrowing) — so the batch's registry.ts contention dissolves for this card ✓ · no governed path ✓.
Spot readings: refine sits after the #11519 rule and before lowerRequiresFeature, rejects exactly {newTabUrl present ∧ opensInNewTab !== true} on path: ['newTabUrl'] with both remedies named; the opensInNewTab: false refusal is deliberate and correctly distinguished from #11519's scope in the comment; issue-id in the message string matches the file's pervasive message idiom (10 distinct ids already in this file's messages — not a defect here; corpus-wide convention question tracked separately). Rejection-case evidence: reverse verification with on-disk mutation proof — 5 refusal tests red on revert, 3 legal pins stayed green, 8/8 after restore. Corpus re-sweep at claim confirmed zero lone producers (this repo, objectui read point consoleServerAction.ts:188 reads only behind the pair, cloud per the issue's measurement of record).
Contract review (clause-② content leg: accept-set narrowing): fuse reading get_session.external_metadata.last_served_model = claude-fable-5 = CONTRACT_REVIEW_TIER (this seat, self-dispatched-card path). Verdict: PASS — the narrowing restores declared=enforced on a documented co-constraint; measured affected population zero in every corpus; legal pairings pinned byte-identically; breaking-narrowing declared in the changeset per launch-window convention. Clearing needs:contract-review both carriers in this write batch.
Next: ready + merge-queue once EVERY check on the PR is green (CI started 09:09Z, in progress at review time — flip rides the next check-in).
Activity
claude commentedon Aug 25, 2026
Concentrated triage batch:
finding→pm:queue+domain:spec, Bug, S — documented co-constraint with no refine:newTabUrlwithoutopensInNewTabparses clean while the doc says "only valid together" (re-verified onorigin/main,action.zod.ts:1304describe-text carries the constraint, no refine on the chain). Remedy per the card: a refine rejecting the lone key, message naming both fields. Corpus reading at filing: zero lone producers (known producers declare the pair). Clause-②: yes (accept-set narrowing) — claim declares it, contract-review tier; re-run the corpus sweep at claim before landing.Generated by Claude Code
os-litant commentedon Aug 25, 2026
Claim: PM loop round R6
Session:
session_01NDGG54XF5gbTLdQzCtnaVVBranch:
claude/issue-11842-newtaburl-refineWorktree:
objectstack-issue-11842Domain:
domain:specFile surface:
packages/spec/src/ui/action.zod.ts(newTabUrl region) + action tests + changeset; conditionallypackages/spec/src/migrations/(registry tail-append region only, if the ADR-0087 gate demands it) (stop on breach; explain in the report)Container & model: S (non-mechanical, treated as M),
mode:subagent,model: claude-fable-5— dispatch-gates 2026-08-25 @0b04839: "no path-derived mandate … The tier stays the PM's per-card judgment call (floor sonnet · default opus · ceiling fable) … a card changing contract accept/reject behaviour or widening the public surface is claude-fable-5"; clause-② content leg ⇒ fable mandatoryClause-②: yes
Serial constraints cleared: registry.ts tail-append shared with batch siblings #12039 (certain) and #11832 (conditional) — same-file serial WAIVED this batch by maintainer instruction (2026-08-25, chat, verbatim: 「并行5个子任务,加快进度」) under the 4-point substitute discipline (region-level surface / merge main before PR / re-merge after sibling lands / merge-queue arbitrates). Prior registry writer PR #12001 MERGED 06:35Z. #11950 (same file) queues behind this wave. No pin assertions on sibling behavior.
Generated by Claude Code
os-litant commentedon Aug 25, 2026
{ "issue": 11842, "status": "done", "branch": "claude/issue-11842-newtaburl-refine", "pr": "https://github.com/objectstack-ai/objectstack/pull/12108", "premise_still_valid": true, "summary": "ActionSchema now rejects newTabUrl whenever opensInNewTab !== true (refine after the #11519 rule, issue located on path ['newTabUrl'], message naming the pre-opened-tab contract and both remedies). opensInNewTab: false beside newTabUrl is refused too (the key has no meaning outside the pre-opened flow); legal pairings pinned byte-identically. Corpus re-swept at claim: zero lone producers in this repo, objectui (consumer-only; read point requires the pair), and per the issue's measurement of record for cloud. No ADR-0087 registry entry: gate-validated not-required (no-migration-prescription), mirroring the adjacent #11519 narrowing — so no registry.ts overlap with batch siblings.", "tests": "spec full suite 426 files / 11329 tests passed (pre-merge tree 1b3c10d; merge brought zero packages/spec paths); targeted re-run at final head a9e2a0f: 3 files / 164 tests passed. spec typecheck green (test-typecheck ledger unchanged 55/263). check:generated: all 14 artifacts up to date; api-surface regenerated byte-identically after rebuild (mtime-only staleness from the ablation churn). Ablation: fix committed first, trap-guarded; mutation proven on disk by grep -c '11842' 2->0, mutated leg 5 refusal tests red | 3 legal pins green, restored from HEAD (marker 2, clean porcelain), 8/8 green; no dist leg applies (in-package relative source import, no exports-resolved dist path).", "gates": { "derivation": "scripts/pm/dispatch-gates.mjs, stderr stamp 'objectstack-ai/objectstack' at a9e2a0f; list unchanged vs pre-merge derivation at 1b3c10d", "green_at_a9e2a0f": ["changeset-gate-self-tests", "objectui-changeset", "check-changeset-no-major", "check-empty-changeset", "release-rehearsal-clone --self-test", "merge-driver", "published-files", "slot-lookup", "spec-parsed-alias", "test-source-alias", "type-source-resolution", "query-options-erasure", "engine-double-contract", "where-matcher", "cross-package-test-inputs", "check-ci-filter-parity", "check-plugin-teardown-shape", "nul-bytes", "doc-formula-expressions", "spec check:empty-state", "spec check:liveness", "spec check:strictness-ledger", "spec check:variant-docs", "check-adr-0087-registration", "type-check-coverage", "docs-audit check-affected-docs", "docs-audit check-drift-comment", "spec check:generated (14/14)"], "not_measured_locally_declared": ["check:dev-prereqs (66/67 sibling dists absent — workspace-state precondition; CI builds fresh)", "check:type-check-debt --re-measure (needs built closure; compensating: spec check:test-typecheck green over the only test-layer change)"], "ci": "in_progress — report delivered at draft-PR time per standing rule" }, "line_budget": "n/a — no skills/** diff", "files_changed": ["packages/spec/src/ui/action.zod.ts (+36 refine block)", "packages/spec/src/ui/action-newtaburl-pair.test.ts (new, 8 tests)", ".changeset/action-newtaburl-requires-opensinnewtab.md (new, minor, BREAKING-declared, adr-0087 not-required no-migration-prescription)", "merge commit of origin/main 8d5c724 (no unique files)"], "deviations": [ "PM assumption 1 confirmed at BASE f7b25c5 (bare z.string().optional(), no refine).", "PM assumption 2 confirmed and extended: docs/fixture occurrences are the legal pair or prose already stating the constraint; objectui swept locally (consumer-only); cloud repo not present in this container — issue measurement stands unre-measured for cloud.", "PM assumption 3 resolved NO ENTRY: check-adr-0087-registration validates the not-required (no-migration-prescription) disposition green; mirrors #11519 (same schema, same narrowing class, landed 2026-08-24). Registry parallel-waiver discipline therefore unused (no registry.ts edit).", "Full spec suite ran at pre-merge tree 1b3c10d; merge to a9e2a0f brought zero packages/spec paths (content-identical spec tree); targeted action tests re-run green at a9e2a0f.", "Session's curl REST channel refused ('GitHub access is not enabled for this session') — reads/writes done via git + MCP single-issue tools; no MCP list/search family used.", "Ablation script's second grep anchor spanned a string-concat line break and read 0 on both legs (inert); the grep -c '11842' anchor (2->0->2) is the operative on-disk proof.", "First ablation script run hit the 590s bash cap during the restored-leg lock wait; trap held, tree verified clean (empty porcelain), restored leg re-run separately 8/8 green." ], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-litant commentedon Aug 25, 2026
os-dev-report (authoritative copy — the previous comment's HTML-comment marker was eaten by the body sanitizer, as the standing rule predicts; same JSON, no comment-edit channel available in this session)
{ "issue": 11842, "status": "done", "branch": "claude/issue-11842-newtaburl-refine", "pr": "https://github.com/objectstack-ai/objectstack/pull/12108", "premise_still_valid": true, "summary": "ActionSchema now rejects newTabUrl whenever opensInNewTab !== true (refine after the #11519 rule, issue located on path ['newTabUrl'], message naming the pre-opened-tab contract and both remedies). opensInNewTab: false beside newTabUrl is refused too (the key has no meaning outside the pre-opened flow); legal pairings pinned byte-identically. Corpus re-swept at claim: zero lone producers in this repo, objectui (consumer-only; read point requires the pair), and per the issue's measurement of record for cloud. No ADR-0087 registry entry: gate-validated not-required (no-migration-prescription), mirroring the adjacent #11519 narrowing — so no registry.ts overlap with batch siblings.", "tests": "spec full suite 426 files / 11329 tests passed (pre-merge tree 1b3c10d; merge brought zero packages/spec paths); targeted re-run at final head a9e2a0f: 3 files / 164 tests passed. spec typecheck green (test-typecheck ledger unchanged 55/263). check:generated: all 14 artifacts up to date; api-surface regenerated byte-identically after rebuild (mtime-only staleness from the ablation churn). Ablation: fix committed first, trap-guarded; mutation proven on disk by grep -c '11842' 2->0, mutated leg 5 refusal tests red | 3 legal pins green, restored from HEAD (marker 2, clean porcelain), 8/8 green; no dist leg applies (in-package relative source import, no exports-resolved dist path).", "gates": { "derivation": "scripts/pm/dispatch-gates.mjs, stderr stamp 'objectstack-ai/objectstack' at a9e2a0f; list unchanged vs pre-merge derivation at 1b3c10d", "green_at_a9e2a0f": ["changeset-gate-self-tests", "objectui-changeset", "check-changeset-no-major", "check-empty-changeset", "release-rehearsal-clone --self-test", "merge-driver", "published-files", "slot-lookup", "spec-parsed-alias", "test-source-alias", "type-source-resolution", "query-options-erasure", "engine-double-contract", "where-matcher", "cross-package-test-inputs", "check-ci-filter-parity", "check-plugin-teardown-shape", "nul-bytes", "doc-formula-expressions", "spec check:empty-state", "spec check:liveness", "spec check:strictness-ledger", "spec check:variant-docs", "check-adr-0087-registration", "type-check-coverage", "docs-audit check-affected-docs", "docs-audit check-drift-comment", "spec check:generated (14/14)"], "not_measured_locally_declared": ["check:dev-prereqs (66/67 sibling dists absent — workspace-state precondition; CI builds fresh)", "check:type-check-debt --re-measure (needs built closure; compensating: spec check:test-typecheck green over the only test-layer change)"], "ci": "in_progress — report delivered at draft-PR time per standing rule" }, "line_budget": "n/a — no skills/** diff", "files_changed": ["packages/spec/src/ui/action.zod.ts (+36 refine block)", "packages/spec/src/ui/action-newtaburl-pair.test.ts (new, 8 tests)", ".changeset/action-newtaburl-requires-opensinnewtab.md (new, minor, BREAKING-declared, adr-0087 not-required no-migration-prescription)", "merge commit of origin/main 8d5c724 (no unique files)"], "deviations": [ "PM assumption 1 confirmed at BASE f7b25c5 (bare z.string().optional(), no refine).", "PM assumption 2 confirmed and extended: docs/fixture occurrences are the legal pair or prose already stating the constraint; objectui swept locally (consumer-only); cloud repo not present in this container — issue measurement stands unre-measured for cloud.", "PM assumption 3 resolved NO ENTRY: check-adr-0087-registration validates the not-required (no-migration-prescription) disposition green; mirrors #11519 (same schema, same narrowing class, landed 2026-08-24). Registry parallel-waiver discipline therefore unused (no registry.ts edit).", "Full spec suite ran at pre-merge tree 1b3c10d; merge to a9e2a0f brought zero packages/spec paths (content-identical spec tree); targeted action tests re-run green at a9e2a0f.", "Session's curl REST channel refused ('GitHub access is not enabled for this session') — reads/writes done via git + MCP single-issue tools; no MCP list/search family used.", "Ablation script's second grep anchor spanned a string-concat line break and read 0 on both legs (inert); the grep -c '11842' anchor (2->0->2) is the operative on-disk proof.", "First ablation script run hit the 590s bash cap during the restored-leg lock wait; trap held, tree verified clean (empty porcelain), restored leg re-run separately 8/8 green." ], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-litant commentedon Aug 25, 2026
ACCEPT — PR #12108 (R6, reviewer of record: spec seat, session
session_01NDGG54XF5gbTLdQzCtnaVV).Checklist conclusion (verified against GitHub + local git diff of the branch): draft ✓ · base
main✓ ·Fixes #11842first line ✓ · 3 files +209 = refine (+33 in action.zod.ts) + refusal/pin test file (+140) + minor changeset ✓ · no migrations touch (ADR-0087 dispositionnot-required (no-migration-prescription)validated green by the gate, mirroring the adjacent #11519 narrowing) — so the batch's registry.ts contention dissolves for this card ✓ · no governed path ✓.Spot readings: refine sits after the #11519 rule and before
lowerRequiresFeature, rejects exactly {newTabUrlpresent ∧opensInNewTab !== true} onpath: ['newTabUrl']with both remedies named; theopensInNewTab: falserefusal is deliberate and correctly distinguished from #11519's scope in the comment; issue-id in the message string matches the file's pervasive message idiom (10 distinct ids already in this file's messages — not a defect here; corpus-wide convention question tracked separately). Rejection-case evidence: reverse verification with on-disk mutation proof — 5 refusal tests red on revert, 3 legal pins stayed green, 8/8 after restore. Corpus re-sweep at claim confirmed zero lone producers (this repo, objectui read pointconsoleServerAction.ts:188reads only behind the pair, cloud per the issue's measurement of record).Contract review (clause-② content leg: accept-set narrowing): fuse reading
get_session.external_metadata.last_served_model = claude-fable-5=CONTRACT_REVIEW_TIER(this seat, self-dispatched-card path). Verdict: PASS — the narrowing restores declared=enforced on a documented co-constraint; measured affected population zero in every corpus; legal pairings pinned byte-identically; breaking-narrowing declared in the changeset per launch-window convention. Clearingneeds:contract-reviewboth carriers in this write batch.Next: ready + merge-queue once EVERY check on the PR is green (CI started 09:09Z, in progress at review time — flip rides the next check-in).
Generated by Claude Code
docs(spec): adr-0087 disposition marker; re-anchor system-context cen…
fix(spec): require a non-empty reference on lookup/master_detail fiel…
test(spec): the first ui/ file group's test titles state each cited d…