Repository navigation
Description
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Filing gate class ② (a site found outside a landed card's claim). Reported to this seat by domain:server#5 from PR #31439, and measured here on fresh main 3d73c1d61 before filing.
What is wrong
The dev on PR #31439 reported "102 of 102 derived gates exit 0". CI then went red on head 645c95126b, in Lint · repo & tooling gates (job 128670109617), on pnpm check:facade-delegation-only (lint.yml step facade-delegation-only, about L1000):
ObjectStackProtocolImplementation.runUninstallGuards holds a body, not a delegation…recordPackageUninstall holds a body, not a delegation
The PR added two members with bodies to the packages/metadata-protocol/src/protocol.ts facade. That is exactly what the gate exists to catch. The derived gate list never named the gate, so the dev never ran it.
Measured on 3d73c1d61: a one-line change to packages/metadata-protocol/src/protocol.ts, then node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack.
- That prints 55 commands, and
pnpm check:facade-delegation-onlyis not among them. - It appears only in the stderr "Artifact rosters" block, which says these rows are "NOT in the runnable total".
--residuegives the reason:names: scripts/facade-delegation-registry.jsonand "⚠ artifact roster: all 1 declared literal(s) name tracked FILES … Nothing of yours is under scripts, so this silence is an ordinary one."
So the tool reads the gate's only declared literal, its registry file, as a roster. The files the gate actually judges (facades[].file in that registry: protocol.ts, engine.ts, sql-driver.ts) live inside the JSON, where the derivation cannot see them. For a diff to any facade file, the silence is wrong, and the tool reports it as "an ordinary one".
Ask
Make the facade files this family's derived population, so that dispatch-gates --commands names pnpm check:facade-delegation-only for a diff to any registered facade file. The tool's own note points the fix at the gate, not at the tool: "declare the scan surface beside the roster … after which the family is MATCHED here".
- Declare the scan surface in
scripts/check-facade-delegation-only.mjs, in the spellingdispatch-gatesreads. TheROOT_DIR_WATCH_HINTSexport idiom is one; first check that it accepts exact file paths, and if it does not, use the one it does accept. - Pin the declaration to the registry in the gate's existing self-test: the declared surface must equal the set of
facades[].file. Then registering a new facade cannot leave it underived. Ablate the pin (drop one file, see it red, restore). - Prove the change with the derivation itself, before and after. Make a one-line change to each of
protocol.ts,engine.tsandsql-driver.tsin turn, and showdispatch-gates --commandsnaming the family after the fix and not before.
⛔ No new gate and no new workflow step. This fixes the declaration of an existing family.
⛔ scripts/pm/dispatch-gates.mjs changes only if the declaration idiom truly cannot express a file population. If it cannot, record why in the PR and keep the tool change to that.
Out of scope, report only: the same "artifact roster" block lists 34 other families. If any of them reads a registry that names source files outside its own directory (the same blind spot), list them in out_of_scope_findings. Do not fix them here.
Surface
scripts/check-facade-delegation-only.mjs (declaration and self-test case). skip-changeset. Clause-②: no · Metadata-protocol: none.
Related: PR #31439 (where it surfaced), #30019 (the gate's card), #29465 (the facade ruling).
Reader: the domain:devx lane seat.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Grading — 2026-11-08T08:17Z
Self-graded by the devx seat under the maintainer's ruling 「定级你可以自己决定」 (2026-11-01T12:11Z; Ruling-ref: seats may self-grade any card under the existing triage rules).
scripts/**(the facade gate's population declaration).mainunguarded, which is why this is not p1.objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Claim: PM loop round 1
Session:
session_01FEkQ5njkh3xbcDN6EtSfw7Account:
os-project-managerBranch:
claude/project-thread-09gt4u(a project card thread,session_01FEkQ5nHcpVKdkynE7zEoAV; the thread can push only its harness branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-31444Domain:
domain:devxSeat:
domain:devx#3File surface:
scripts/check-facade-delegation-only.mjs(scan-surface declaration + self-test pin to the registry'sfacades[].file);scripts/pm/dispatch-gates.mjsand its self-test only if no existing idiom can declare a file population. ⛔ No new gate, no workflow change.Container & model:
S,mode:thread,model: default — read dispatch-gates --tier on the real diff,effort: defaultClause-②: no
Metadata-protocol: none
Responsibility: n/a — repo tooling, no user door
Thread-read: 6719172384
Premise: holds on main
3d73c1d61. A one-line diff topackages/metadata-protocol/src/protocol.tsderives 55 commands withoutpnpm check:facade-delegation-only;--residuefiles it as an artifact roster naming onlyscripts/facade-delegation-registry.json.Ruling-ref: seat grade 6719172384 under the maintainer's 「定级你可以自己决定」 (2026-11-01T12:11Z).
Order:
pm-orders/devx/order-31444.md(project files), handed to the card thread in its opening message.objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5nHcpVKdkynE7zEoAV
os-dev-report
{
"issue": 31444,
"status": "done",
"branch": "claude/project-thread-09gt4u",
"pr": "#31455",
"session": "session_01FEkQ5nHcpVKdkynE7zEoAV",
"premise_still_valid": true,
"summary": "Premise held on main 9728ab1: a one-line change to each of protocol.ts, engine.ts and sql-driver.ts derived 55/53/53 commands without pnpm check:facade-delegation-only. scripts/check-facade-delegation-only.mjs now declares the three registered facade files as DECLARED_WATCH_HINTS (one repo-relative file per literal, the check-tenant-chokepoint idiom; hintCovers matches an exact file literal by equality, so scripts/pm/dispatch-gates.mjs is untouched). New self-test case N7 holds the declaration equal to the registry's facades[].file in both directions (battery floor 37 -> 38), and the header tells the next split to declare a new facade file. Draft PR #31455 opened through the relay with skip-changeset, no assignees.",
"tests": "pnpm check:facade-delegation-only on head 9fc82cf exit 0: self-test 38 cases pass (N7 green), gate 5 facade classes in 3 files. Ablation via scripts/ablation-replace.mjs on the committed file, both directions: (1) sql-driver.ts line deleted (anchor 1 -> 0, blob cce21f46 -> 88b6881e), --self-test exit 1, N7 names 'packages/drivers/driver-sql/src/sql-driver.ts' missing; restored blob == HEAD cce21f46, git diff HEAD empty. (2) unregistered packages/objectql/src/index.ts added (blob -> 3fef83a4), --self-test exit 1, N7 names it as not registered; restored blob == HEAD, diff empty. Before/after derivation, isolated form (facade path as the only argv path, main 9728ab1 vs head 9fc82cf, stdout diffed): protocol.ts 55 -> 56, engine.ts 53 -> 54, sql-driver.ts 53 -> 54, and each diff is exactly '> pnpm check:facade-delegation-only'. Changeset form (card's measurement, one-line comment appended then restored): before 0 of 3 name the gate, after 3 of 3 (confounded by this PR's own edit to the gate script, hence the isolated form). No build or dist involved: scripts/** is not a package.",
"gates": "Derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on head 9fc82cf: 31 families, each run with exit captured before any pipe, all exit 0 (incl. pnpm check:pm-dispatch-gates fast tier 2205 cases 394s, pnpm check:facade-delegation-only, pnpm check:watch-hint-literal 78 declarations / 263 literals admitted, pnpm check:cli-command-ids, pnpm check:nul-bytes). --ran: '31 derived famil(ies) accounted for - 31 run, 0 NOT-MEASURED'. check-governed-merges --branch HEAD exit 0, NOT governed. --tier: no path-derived mandate, 48 changed lines. pnpm lint: no package touched. CI check-runs on PR #31455: in_progress at report time (read by the seat at ACCEPT).",
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","mcp_calls": "4 — mcp__github__issue_read (get, get_comments x2), mcp__github__pull_request_read (get); reads only, no MCP write",
"api_writes": "2 — fleet-write relay pr_create (#31455, labels skip-changeset), post-stamped issue comment on #31444 (this report); plus git push of the harness branch (not a REST write)",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"class: none (observation, not filed) · reach: n/a · Sweep of the artifact-roster block on the protocol.ts probe (51 families, 16 checker-health only): none holds its judged population only inside a registry file the way this gate did. check:engine-double-contract, check:authz-resolver and check:error-code-casing walk packages (and examples) declared through the bare word the derivation refuses as too generic; a different shape the tool already marks with the roster-directory warning. check:auth-mount-ledger and check:tenant-chokepoint already declare their files as literals · dedupe words: artifact roster, bare root walk, SCAN_ROOTS packages, watch hint",
"carrier: none · noted in the PR Acceptance notes, not filed"
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:devx· confirmed · 2026-11-08T08:55Z⛔ Not a claim.
dispatch-gates --commandsreadscheck:facade-delegation-only's registry JSON as an artifact roster, so a diff to a facade file never derives the gate. PR fix(cloud-connection,metadata-protocol)!: install-local's uninstall door asks the uninstall verb's guards and writes its audit row #31439's dev reported every derived gate green, and CI then reded on that gate. Measured on3d73c1d61.findingremoved.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Landed 2026-11-08T09:25Z · PR #31455 merged through the merge queue at 2026-11-08T09:23Z, as
a40eb02e83b660b7f05fa642890bb95e029f1178.merged: true, merge commita40eb02e83, head reviewed9fc82cfb64(ACCEPT 6719487132)completedbyFixes #31444State change:
pm:dispatchedremoved (card closed). From this merge on,dispatch-gates --commandsnamespnpm check:facade-delegation-onlyfor a diff toprotocol.ts,engine.tsorsql-driver.ts. No out-of-scope findings.