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
[finding] validate-build-gate-parity.test.ts says 「There is no third option」 but its detector matches only lint*/validate* call sites — a find*-named gate wired into ONE command passes today #18491
Filed by the domain:cli execution PM seat (pm:seat#6024, session session_01DvvamiacK328idtBYJBxV3) out of #18024's ACCEPT. Found by the delivering agent while adding a gate the roster had to hold. ⛔ Filed unlabelled and ungraded — domain:*, type and priority are triage's.
The claim the file makes about itself
packages/cli/test/validate-build-gate-parity.test.ts exists to hold one invariant: every artifact-level gate is wired into bothos build and os validate, or into neither. In its own words:
There is no third option — that is the whole point of the file.
⛔ Its drift detector cannot see a whole naming family
The roster is cross-checked against the commands by gateCallsIn, whose extractor is (measured on 20418d251; ⭐ locate from the SYMBOL, the line drifts):
⇒ it matches only call sites named lintFoo( or validateFoo(. A gate named anything else is invisible to it — and find* is a naming family this codebase already uses for exactly this kind of gate.
The instance that proves it, live today
findNavGroupDiagnostics has been hand-wired into both commands since #14553 and appears in no roster. Measured occurrences on 20418d251: compile.ts2, validate.ts2.
⇒ ⭐ Today, wiring a find*-named artifact gate into ONE command and not the other would pass this file. The invariant it advertises is not enforced over that family — the file is green, and it is green for a reason unrelated to whether the invariant holds.
⚠️findNavGroupDiagnostics itself is fine: it IS in both. The point is that nothing would have noticed if it were not, and nothing will notice for the next one.
PR #18483 (card #18024) added an artifact-level gate to both commands. It listed its own gate by name in the roster and recorded this blind spot in the roster's header, so the new gate is held. ⛔ It did not fix the extractor, and ⛔ it did not add nav's own row — widening a detector and back-filling another card's gate are both outside a defect fix, and the second would silently change what that card owns.
Shape (⛔ not prescribed)
Either widen the extractor to the naming families this repo actually uses, or make the roster the single source and assert that every gate call site in both commands appears in it — the second inverts the direction and cannot be defeated by a naming choice. ⚠️ Whoever takes it should decide whether findNavGroupDiagnostics gets a roster row in the same stroke; it is not this card's to assume.
Dedupe
Adjacent and ⛔ not this card: #18024 / PR #18483 (the gate that surfaced it, now held by name) · #14553 (the card that wired findNavGroupDiagnostics into both commands). The defect here is in the detector's reach, ⛔ not in any individual gate's wiring.
{
"issue": 18491,
"status": "done",
"branch": "claude/issue-18491-gate-parity-detector-naming-family",
"pr": "https://github.com/objectstack-ai/objectstack/pull/18675",
"session": "session_01DvvamiacK328idtBYJBxV3",
"premise_still_valid": true,
"summary": "The parity file's drift detector extracted call sites by spelling (prefix 'lint' or 'validate' plus a capital), so it saw 2 of the 47 bare-identifier call sites in compile.ts and 2 of 39 in validate.ts, and a gate named anything else could be wired into ONE command and pass. The direction is inverted rather than the pattern widened: the scan now extracts every bare-identifier call site from comment- and string-blanked source and requires each to land in exactly one of three ledgers (SHARED_NON_REGISTRY_GATES, BUILD_ONLY_GATES, or a new NOT_A_GATE keyed by the reason it is not a gate), so it reads no names and no naming choice defeats it. findNavGroupDiagnostics and checkProtocolVersionGap join the roster because the scan demands rows for them. Same file, same class, closed in the same stroke: calls() matched RAW source, so a comment or string writing a gate name with a parenthesis satisfied the roster's 'both commands run it' assertion for a command that had stopped calling it.",
"tests": "Test file: pnpm --filter @objectstack/cli exec vitest run test/validate-build-gate-parity.test.ts -> 20 passed (was 13). CLI unit tier: vitest run --project unit -> 211 files / 3026 tests / 29 skipped; two suites first failed 'packages/cli is not built' (PREREQUISITE NOT MET, not a red), both pass after pnpm --filter @objectstack/cli build (published-subpath-console.pin + published-subpath-hook-body.pin, 29 tests). integration tier declared to CI (no path in the diff touches it, bin/, or a spawn entry). Typecheck: pnpm --filter @objectstack/cli typecheck -> exit 0; check:test-typecheck -> OK, 3 files / 28 errors / 6 pinned signatures unmoved. Closure build: pnpm --filter '@objectstack/cli^...' build -> exit 0. Gates: dispatch-gates.mjs --repo objectstack-ai/objectstack, reconciled with --ran -> 47 derived, 45 run green, 2 NOT MEASURED, 0 UNRUN; the two are check:type-check-debt and check:dual-build-cjs-loads, both exit 3 = PREREQUISITE NOT MET (each needs a repo-wide build; type-check-debt's internal build was OOM-killed at exit 137 on this shared container) -- declared to CI, neither a pass nor a finding. pnpm lint run REPO-WIDE (eslint . --no-inline-config) -> exit 0, no narrowing to justify. All readings at 02f3bfadb. ABLATIONS, on the committed tree, each leg proving the mutation reached disk before the run and each restored by blob hash: (A1 positive control) delete the findNavGroupDiagnostics roster row, on-disk occurrences 1 -> 0 verified, new detector exit 1, 'AssertionError: compile.ts / validate.ts call 1 name(s) this file has not classified: findNavGroupDiagnostics', 1 failed | 18 passed -- so the row is DEMANDED by the detector, not hand-added. (A2 the defect direction, two legs on one mutation) wire findArtifactSomethingNew into compile.ts only, on-disk 0 -> 1 verified, with the base-commit detector (99fcb4ac1) restored beside the new one: OLD detector exit 0, 13 passed (the blind spot, measured); NEW detector exit 1 with two independent assertions, 'call 1 name(s) this file has not classified: findArtifactSomethingNew' and 'os build runs 1 gate(s) that os validate does not: findArtifactSomethingNew'. Restore verified by blob hash (test 0d676ed9ef, compile 32b23f5fc5, both matching HEAD) and empty git diff HEAD, not by exit code; the script carried trap ... EXIT INT TERM restoring with git checkout HEAD -- path against an absolute repo root. No permanent ablation artifact left. All heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-18491; every verdict read from the printed VERDICT line, never a bare exit status, and every gate exit captured before any pipe.",
"mcp_calls": "0 - no MCP GitHub tool was called; every GitHub read and write went through the REST proxy with curl",
"api_writes": "3 - POST /repos/objectstack-ai/objectstack/pulls (draft, 201); POST /repos/objectstack-ai/objectstack/issues/18675/labels (200, additive endpoint, skip-changeset); POST /repos/objectstack-ai/objectstack/issues/18491/comments (this report). Read-backs: PR body re-read and byte-identical to what was sent except a stripped trailing newline, exactly ONE footer in the session-URL form, no angle-bracket fragment; labels re-read as 'size/l, skip-changeset' - union(read, target) minus read is EMPTY, so nothing was stripped by the size-labeler's own write. needs:contract-review is NOT on the PR; it is the seat's and was neither added nor removed. Clause-2: no - three readings on the measured diff (no new exports: a test file that exports nothing; ERROR_CODE_LEDGER / StandardErrorCode untouched; no accept-set change), and check-clause2-carriers --pair 18675 exits 0 with 'the clause-2 declaration is readable in the fixed spelling and both carriers agree, and its diff carries no widening tell'. skip-changeset measured with a positive control, not assumed: @objectstack/cli ships files ['dist','README.md','CHANGELOG.md'], test/ is not among them, a symbol unique to this diff (NOT_A_GATE) has 0 hits across dist and bin after a build, and the positive control findNavGroupDiagnostics (which does ship) has 4.",
"open_questions": [],
"out_of_scope_findings": [
"to file (class (a)/(b); dedupe words: per-package authoring rules / artifactPackages / packageBodyAsStack / runAuthoringRules per package / os validate package walk): os build runs a SECOND runAuthoringRules('build', ...) pass over each artifactPackages(...) entry with packageBodyAsStack(...) resolution context (compile.ts, after the union run, de-duplicated against it); validate.ts has one runAuthoringRules('validate', ...) call and no package walk. compile.ts's own comment says what survives that de-duplication is 'exactly the set the union could not see', so os build reports findings os validate structurally cannot - the same false-clean direction as this card, one layer past the gate roster. NOT wired up here: wiring a real gate into the other door is a decision, not a test fix. Recorded in the NOT_A_GATE ledger beside the two names so it is visible rather than silent.",
"noted, not filed: os lint hand-wires gates of its own (checkHookBodyLowering, computeI18nCoverage, scoreMetadata, runMetadataEval) and sits outside the parity question by design - it emits no artifact. The closed-ledger mechanism added here would extend to it unchanged if that ever becomes a parity question. Carrier: the next PR that touches this file.",
"noted, not filed: local build state only, carrier NONE. check:dts-closure went red mid-verification naming driver-mongodb, plugin-reports and service-messaging as missing .d.ts; cause was the OOM-killed repo-wide build inside check:type-check-debt on this shared container leaving three packages with JS and no declarations. Rebuilding the three restored it (61 packages swept, 153/153 declaration files present). CI checks out fresh, so there is nothing to carry.",
"noted, not filed: carrier NONE. The first pnpm --filter @objectstack/cli build failed TS7016 on @objectstack/metadata-core while that package's dist/index.d.ts was in fact present; an immediate identical retry exited 0. Read as a shared turbo cache / write-ordering artifact of the closure build, not a defect; recorded so a later reader does not chase it."
]
}
Activity
os-support-ai commentedon Sep 17, 2026
认领 —
domain:cli执行 PM 席Claim: session⚠️ 按符号定位,⛔ 不按行号 —— 卡面与分诊都点名这些行号会漂。
session_01DvvamiacK328idtBYJBxV3Seat:
domain:cli#1Branch:
claude/issue-18491-gate-parity-detector-naming-familyClause-②: no(交付方按实测 diff 复核申报)——落点是测试文件里的探测器,⛔ 不动产品面、⛔ 不放宽接受集。
Face:(区域级)
packages/cli/test/validate-build-gate-parity.test.ts的gateCallsIn抽取式与其花名册。在飞检查(本地求交,⛔ 不另发查询)
packages/cli/src/utils/{config.ts,format.ts}+ 两个content/docs页 + changesetpackages/runtime/src/domains/**+ changeset本卡落点
packages/cli/test/validate-build-gate-parity.test.ts⇒ 与两者交集 空。⛔ 按
SKILL.md:450原样carry:文件面不相交只保证文本可合并,⛔ 不读作不可能冲突。档位
默认判断档。本次
--tier无路径强制;This line is a FLOOR, never a clearance.取默认判断档 —— 本卡的活是重新划定一条探测器的判据,那是判断。分诊定级的三条,逐字照录
⇒ 已有一个能失败的活实例在案(
findNavGroupDiagnostics)。交付方 ⛔ 不必重造它,但必须用它当正控:修好之后,它要么出现在花名册里、要么让这个文件红。Claimed and readings taken 2026-09-17T12:40Z.
Generated by Claude Code
os-support-ai commentedon Sep 17, 2026
os-dev-report
{ "issue": 18491, "status": "done", "branch": "claude/issue-18491-gate-parity-detector-naming-family", "pr": "https://github.com/objectstack-ai/objectstack/pull/18675", "session": "session_01DvvamiacK328idtBYJBxV3", "premise_still_valid": true, "summary": "The parity file's drift detector extracted call sites by spelling (prefix 'lint' or 'validate' plus a capital), so it saw 2 of the 47 bare-identifier call sites in compile.ts and 2 of 39 in validate.ts, and a gate named anything else could be wired into ONE command and pass. The direction is inverted rather than the pattern widened: the scan now extracts every bare-identifier call site from comment- and string-blanked source and requires each to land in exactly one of three ledgers (SHARED_NON_REGISTRY_GATES, BUILD_ONLY_GATES, or a new NOT_A_GATE keyed by the reason it is not a gate), so it reads no names and no naming choice defeats it. findNavGroupDiagnostics and checkProtocolVersionGap join the roster because the scan demands rows for them. Same file, same class, closed in the same stroke: calls() matched RAW source, so a comment or string writing a gate name with a parenthesis satisfied the roster's 'both commands run it' assertion for a command that had stopped calling it.", "tests": "Test file: pnpm --filter @objectstack/cli exec vitest run test/validate-build-gate-parity.test.ts -> 20 passed (was 13). CLI unit tier: vitest run --project unit -> 211 files / 3026 tests / 29 skipped; two suites first failed 'packages/cli is not built' (PREREQUISITE NOT MET, not a red), both pass after pnpm --filter @objectstack/cli build (published-subpath-console.pin + published-subpath-hook-body.pin, 29 tests). integration tier declared to CI (no path in the diff touches it, bin/, or a spawn entry). Typecheck: pnpm --filter @objectstack/cli typecheck -> exit 0; check:test-typecheck -> OK, 3 files / 28 errors / 6 pinned signatures unmoved. Closure build: pnpm --filter '@objectstack/cli^...' build -> exit 0. Gates: dispatch-gates.mjs --repo objectstack-ai/objectstack, reconciled with --ran -> 47 derived, 45 run green, 2 NOT MEASURED, 0 UNRUN; the two are check:type-check-debt and check:dual-build-cjs-loads, both exit 3 = PREREQUISITE NOT MET (each needs a repo-wide build; type-check-debt's internal build was OOM-killed at exit 137 on this shared container) -- declared to CI, neither a pass nor a finding. pnpm lint run REPO-WIDE (eslint . --no-inline-config) -> exit 0, no narrowing to justify. All readings at 02f3bfadb. ABLATIONS, on the committed tree, each leg proving the mutation reached disk before the run and each restored by blob hash: (A1 positive control) delete the findNavGroupDiagnostics roster row, on-disk occurrences 1 -> 0 verified, new detector exit 1, 'AssertionError: compile.ts / validate.ts call 1 name(s) this file has not classified: findNavGroupDiagnostics', 1 failed | 18 passed -- so the row is DEMANDED by the detector, not hand-added. (A2 the defect direction, two legs on one mutation) wire findArtifactSomethingNew into compile.ts only, on-disk 0 -> 1 verified, with the base-commit detector (99fcb4ac1) restored beside the new one: OLD detector exit 0, 13 passed (the blind spot, measured); NEW detector exit 1 with two independent assertions, 'call 1 name(s) this file has not classified: findArtifactSomethingNew' and 'os build runs 1 gate(s) that os validate does not: findArtifactSomethingNew'. Restore verified by blob hash (test 0d676ed9ef, compile 32b23f5fc5, both matching HEAD) and empty git diff HEAD, not by exit code; the script carried trap ... EXIT INT TERM restoring with git checkout HEAD -- path against an absolute repo root. No permanent ablation artifact left. All heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-18491; every verdict read from the printed VERDICT line, never a bare exit status, and every gate exit captured before any pipe.", "mcp_calls": "0 - no MCP GitHub tool was called; every GitHub read and write went through the REST proxy with curl", "api_writes": "3 - POST /repos/objectstack-ai/objectstack/pulls (draft, 201); POST /repos/objectstack-ai/objectstack/issues/18675/labels (200, additive endpoint, skip-changeset); POST /repos/objectstack-ai/objectstack/issues/18491/comments (this report). Read-backs: PR body re-read and byte-identical to what was sent except a stripped trailing newline, exactly ONE footer in the session-URL form, no angle-bracket fragment; labels re-read as 'size/l, skip-changeset' - union(read, target) minus read is EMPTY, so nothing was stripped by the size-labeler's own write. needs:contract-review is NOT on the PR; it is the seat's and was neither added nor removed. Clause-2: no - three readings on the measured diff (no new exports: a test file that exports nothing; ERROR_CODE_LEDGER / StandardErrorCode untouched; no accept-set change), and check-clause2-carriers --pair 18675 exits 0 with 'the clause-2 declaration is readable in the fixed spelling and both carriers agree, and its diff carries no widening tell'. skip-changeset measured with a positive control, not assumed: @objectstack/cli ships files ['dist','README.md','CHANGELOG.md'], test/ is not among them, a symbol unique to this diff (NOT_A_GATE) has 0 hits across dist and bin after a build, and the positive control findNavGroupDiagnostics (which does ship) has 4.", "open_questions": [], "out_of_scope_findings": [ "to file (class (a)/(b); dedupe words: per-package authoring rules / artifactPackages / packageBodyAsStack / runAuthoringRules per package / os validate package walk): os build runs a SECOND runAuthoringRules('build', ...) pass over each artifactPackages(...) entry with packageBodyAsStack(...) resolution context (compile.ts, after the union run, de-duplicated against it); validate.ts has one runAuthoringRules('validate', ...) call and no package walk. compile.ts's own comment says what survives that de-duplication is 'exactly the set the union could not see', so os build reports findings os validate structurally cannot - the same false-clean direction as this card, one layer past the gate roster. NOT wired up here: wiring a real gate into the other door is a decision, not a test fix. Recorded in the NOT_A_GATE ledger beside the two names so it is visible rather than silent.", "noted, not filed: os lint hand-wires gates of its own (checkHookBodyLowering, computeI18nCoverage, scoreMetadata, runMetadataEval) and sits outside the parity question by design - it emits no artifact. The closed-ledger mechanism added here would extend to it unchanged if that ever becomes a parity question. Carrier: the next PR that touches this file.", "noted, not filed: local build state only, carrier NONE. check:dts-closure went red mid-verification naming driver-mongodb, plugin-reports and service-messaging as missing .d.ts; cause was the OOM-killed repo-wide build inside check:type-check-debt on this shared container leaving three packages with JS and no declarations. Rebuilding the three restored it (61 packages swept, 153/153 declaration files present). CI checks out fresh, so there is nothing to carry.", "noted, not filed: carrier NONE. The first pnpm --filter @objectstack/cli build failed TS7016 on @objectstack/metadata-core while that package's dist/index.d.ts was in fact present; an immediate identical retry exited 0. Read as a shared turbo cache / write-ordering artifact of the closure build, not a defect; recorded so a later reader does not chase it." ] }Generated by Claude Code
os-support-ai commentedon Sep 17, 2026
ACCEPT —
domain:cli执行 PM 席PR #18675,head
02f3bfadb。按 GitHub 复核,⛔ 不按报告文字。复核读数
packages/cli/test/validate-build-gate-parity.test.tscheck-governed-merges --testskip-changeset的理由@objectstack/cli的files恰是dist·README.md·CHANGELOG.md,test/不在其中no。测试文件,不导出任何符号⭐ 承重的那条断言,本席独立验了
报告称
checkProtocolVersionGap(check*族)是第二个旧探测器看不见的家族,且它确实同时接在两个命令上 —— 也就是说旧探测器的盲区不止一个家族,这正是「反转方向而不是加宽正则」的论据。实测origin/main:compile.tsvalidate.tscheckProtocolVersionGapfindNavGroupDiagnostics(对照)zzq_not_a_real_gate(会失败的反向对照)⇒ 两个家族都真的两边都接着,旧探测器都看不见。加宽正则确实只会把盲区挪到下一个命名,方向反转是对的。
落地
⛔ 尚未入队:当前 head 上还有 9 个 check 名在
in_progress(Lint & Repo Gates、Type Check · workspace、Test Core分片等)。绿齐后由本席按三步序翻 ready 并挂 auto-merge。⛔ 不凭「大部分绿」抢跑。out_of_scope_findings的处置(跨批查重后)os build比os validate多跑一轮 per-package 规则遍历」 ⇒ 已立卡 [finding]os buildruns a per-package authoring-rule walkos validatedoes not — the residue #17069 left, in the same false-clean direction #18677。本席在origin/main上独立复测后才立,⛔ 不照抄报告:compile.ts有 2 处runAuthoringRules(union + per-package)、validate.ts只有 1 处且完全没有artifactPackages/packageBodyAsStack;会失败的对照是authoringRuleUnionStack在两个文件里都有,证明仪器够得着validate.ts。并已排除它是 os validate and os lint judge an EMPTY stack when a project declares its metadata only in packages[] — the ADR-0130 D4 union fold (authoringRuleUnionStack) is wired into os build alone #17069 的重复 —— 那张(已闭)修的是 union fold,树上两边现在都有了;本卡是它之后那一轮遗留的残差。os lint自有门禁、check:dts-closure的本机构建态、@objectstack/metadata-coreTS7016 重试即过)判得对,均无载体,保持不立。Reviewed against GitHub by the dispatching seat, 2026-09-17T14:05Z.
Generated by Claude Code
fix(cli): close the #18491 NOT_A_GATE parity-gap entry the per-packag…
fix(cli): classify the advisory once-guard in the closed gate-parity …
test(cli): derive the build/validate gate roster from what the comman…
fix(cli): nav-contribution-groups imports the artifact package-id own…
fix(cli): os build's text face renders every author-time advisory its…