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
tooling: a structural gate that refuses any method body in a facade file once protocol.ts and engine.ts land in facade form (ruling 6624258595) #30019
Filing gate: ruling 6624258595 on #29465 item (3). The maintainer named this gate and asked for it as its own tooling card. ⛔ Not a claim. No grade: triage sets it.
Ruling-ref: 6624258595
Business reason: the large-file programme turns ObjectStackProtocolImplementation (packages/metadata-protocol/src/protocol.ts, #29985) and ObjectQL (packages/objectql/src/engine.ts, #29986) into thin facades. Every public method becomes a one-line delegation to a facet class in its own module. Without a gate, the next feature lands its body back in the facade, and the file starts growing again. The ruling makes this gate the bar for these files, replacing the 13,000-line bar.
Reader who acts: domain:server or domain:devx, under scripts/ beside the existing repo gates, wired into the lint workflow.
Dedupe (open and closed): facade gate, method body facade, 29465 gate. The nearest are #29465 (the programme), #29985 and #29986 (the files), and #29520 (the pilot). None is this gate. New.
What to build
A gate that reads each file registered as a facade (first protocol.ts and engine.ts, after each lands in facade form) and refuses any class member whose body is more than a delegation to its facet. The ruling's definition of a delegation is a one-line forwarding call. Spell the exact accepted shapes from what the codemod generates, such as return this.#facet.m(...args) or its typed equivalent, constructor wiring, and field declarations.
It refuses with the file, the member and a fix line ("move the body into its facet module and delegate"), and it reads a registry of facade files so the next split adds one row.
Pins: the generated facades pass, a member with an inline body is refused, and a self-test runs over a fixture. Ablate once.
Order: build it in the same window that lands the facades, or immediately after. Until it lands, the facades have no guard.
Exception list (ruling 6624345766, added 2026-11-04)
Ruling-ref: 6624345766. Today's facade shape keeps shared state on the facade and lets a few hot bodies stay on the class: update, insert, find and aggregate on ObjectQL, plus any others the two splits report. The gate starts with each such member as a named exception in its allow-list. Each exception row names the file, the member, and the card that will move it (the state-owning facets design card). An exception without a card reference is refused, and when a member's card lands, its row is removed and the member must become a delegation. Exceptions are read from the two splits' reports on #29985 and #29986.
Claim: PM loop · card thread · 2026-11-04T08:24Z
Session: session_01WGufzfcbZEJQm3rajN7rri (dev: os-dev card thread; seat session_01WGufzgBDcBNVmSmo7VFHpj)
Account: os-support-ai
Branch: claude/project-thread-hv5n7g (harness-pinned card-thread branch; platform exception to claude/issue-<n>-<slug>)
Worktree: the card thread's own container checkout
Domain: domain:devx
Seat: domain:devx#1
Ruling-ref: 6624258595 item 3; 6624345766 item 3 (named-exception allow-list)
File surface: a new scripts/check-*.mjs facade gate with its self-test and a facade registry data file; its CI wiring (lane config, or a minimal .github/workflows/** edit reported as Tier H). ⛔ No edit to packages/metadata-protocol/** or packages/objectql/** (those are #29985 / #29986's).
Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: the facade files produced by #29985 / #29986 stay delegation-only after they land (rulings above)
Thread-read: 6624652906
Premise: holds (the two facade drafts PR #29998 and PR #30012 are being regenerated to 6624345766; the gate's accepted shapes are read from their re-run heads)
Serial constraints cleared: no open PR touches the gate's files; lands in the facades' maintainer-ordered window or immediately after (card body).
Draft PR #30030 holds the gate, its self-test, an empty facade registry and its CI wiring. Both facade re-runs were read (#29998bba9d24d, #30012f48078bb) and the gate passes each with its measured exception list. The PR stays a draft.
{
"issue": 30019,
"status": "done",
"pr": 30030,
"branch": "claude/project-thread-hv5n7g",
"head_sha": "c022291d3094eeeba143287d10e236f8144d41f8",
"base_sha": "63b86b385",
"premise_still_valid": true,
"files_changed": [
"scripts/check-facade-delegation-only.mjs (new)",
"scripts/facade-delegation-registry.json (new, empty)",
"package.json (check:facade-delegation-only)",
".github/workflows/lint.yml (one step in Lint · repo & tooling gates, Tier H)"
],
"shape_table": {
"forwarding call": "ref(args) with ref a name or .-chain off a name/this (a [name|literal] link allowed); args: name, this, literal, .-chain, spread, ONE nested forwarding call (protocolHost(this)), forwarding arrow; as/!/satisfies/parens/instantiation transparent; await allowed on the returned call",
"method/accessor": "one statement: return <call> | <call>; | return <.-chain> | <.-chain> = <arg>; optionally preceded by const forwarding arrows / host object literals of forwarders (hand-series and facet .call(host, ...) stubs); a writer closure may be a one-statement block",
"constructor": "wiring only: super(...), this.x = <arg>, this.x = new Ref(<args>), forwarding calls",
"static block": "calls off a reference whose args are forwarders or object literals of forwarders (installProtocolHost(...), Object.defineProperties(ObjectQLStatics, ...))",
"field": "any declaration; a function inside an initializer must be a forwarding arrow",
"parameter default": "data only (literal, .-chain, array/object literal of data)"
},
"readings": {
"protocol_ts_bba9d24d": "334 members: 161 host-literal stubs, 94 host delegations, 20 forwarding calls, 1 constructor wiring, 1 static host factory, 27 fields, 30 exceptions (#30020); exit 0 with the rows, red on exactly 30 without",
"engine_ts_f48078bb": "ObjectQL 348 members: 217 host-literal stubs, 28 forwarding calls, 3 state writes, 2 state reads, 1 statics host, 67 fields, 30 exceptions (#30020); exit 0 with the rows, red on exactly 30 without",
"self_test": "32 cases, 32 pinned batteries (12 harm, 6 shapes, 8 exception rules, 6 anti-no-op), floor + verdict handshake",
"ablation": "judgeDelegationBody short-circuited: self-test red on 9 cases (H1-H5, H9, H11, H12, E1); restored, 32 pass (throwaway checkout, hash-object equal)",
"eslint": "exit 0 on the new script",
"dispatch_gates": "65 derived, 61 run all exit 0, 4 NOT-MEASURED exit 3 (dts-closure, dual-build-cjs-loads, lean-entry-closure, sourcemap-no-sources-content: need built dist, no package touched); entry-guard was red on the first commit (top-level loop in an exporting script), fixed in this PR, green; --ran: 0 UNRUN",
"ci": "at c022291d every required context concluded success except Test Core 1/8 and 8 Test UI shards still in progress at the reading"
},
"exceptions_vs_reports": {
"protocol": "25 of the report's 26 refused; static resetEnvWritableCache is already a forwarding call (no row); constructor and static block pass as wiring. Stricter than the report (seat to judge): applySeedBodies (host slot this.getServicesRegistry?.().get(...)), static OVERLAY_ALLOWED_TYPES, STATIC_REGISTRY_TYPES, RUNTIME_CREATE_ALLOWED_TYPES, OVERLAY_CAPABLE_TYPES (IIFE table initializers)",
"engine": "27 of the report's 31 refused; setHookMetricsRecorder, setStrictHookBinding, setWarnLegacyHandler, getHookMetricsRecorder are one-line state writes/reads (no row). Stricter than the report: constructor (|| fallback + if on env), projectHomeAmountsOntoPatch (default calls this.homeAmountServing), serveReferenceNames (host slot with a try block)"
},
"deviations": [
"Part of #30019, not Fixes: check:closing-target-claim matches only claude/issue-* branches, so a closing keyword from this thread branch would red PR-body guards",
"Registry ships EMPTY: registering either file now reds main and this PR, since neither facade is on main. Rows are in /mnt/project-files/issue-30019/registry-final-both.json (and per file); whichever PR lands second adds them",
"Card ref #30020 used on every row; its body says it retires every exception row or each gets its own ruling. Rows whose reason is not state (inferred-return-type, closed-set, erasure pins) may want a different card: seat's call",
"Scope: only the registered class is judged; top-level functions (protocol.ts: 2, 24 lines) and other classes (engine.ts: ObjectRepository, ScopedContext) are outside the ruling's 'method body'",
"No assignee/reviewer set on the PR (os-dev rule 2)"
],
"tier": "H (.github/workflows/lint.yml)",
"changeset": "none, skip-changeset label",
"mcp_calls": "GitHub MCP reads only (issue/PR/check-run reads); 0 MCP writes",
"api_writes": "2: relay pr_create #30030 (draft, label skip-changeset, no assignee); this os-dev-report via post-stamped. Pushes are git.",
"security_findings": "none",
"out_of_scope_findings": []
}
MERGED 2026-11-04T11:20Z as 17fe9217 via the merge queue (seat record on f24cb61d; contract reviews 6627146481 → 6627372576 → 6627515582 → 6628808410, all PASS; Tier H approval os-zhuang 5766734751)
State: closing this card as completed (the PR says Part of only because the harness-pinned branch can't match the closing-target check) and removing pm:dispatched. Delivered: the delegation-only gate with its registry, wired into Lint · repo & tooling gates. Remaining: the 60 exception rows belong to #30020 (the hygiene note on 40 of them is posted there). The freeze on protocol.ts and engine.ts is lifted.
Activity
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:devx·pm:queue· 2026-11-04T06:53Z⛔ Not a claim.
domain:devx, which owns code-quality gates and the [Decision] Large source files: replace the hand-cut split with a script-generated split per file, so the remaining monoliths split in days, not months #29465 programme. It readsdomain:server's two files.Generated by Claude Code
objectstack-fleet commentedon Nov 4, 2026
domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj
Claim: PM loop · card thread · 2026-11-04T08:24Z
Session:
session_01WGufzfcbZEJQm3rajN7rri(dev: os-dev card thread; seatsession_01WGufzgBDcBNVmSmo7VFHpj)Account:
os-support-aiBranch:
claude/project-thread-hv5n7g(harness-pinned card-thread branch; platform exception toclaude/issue-<n>-<slug>)Worktree: the card thread's own container checkout
Domain:
domain:devxSeat:
domain:devx#1Ruling-ref: 6624258595 item 3; 6624345766 item 3 (named-exception allow-list)
File surface: a new
scripts/check-*.mjsfacade gate with its self-test and a facade registry data file; its CI wiring (lane config, or a minimal.github/workflows/**edit reported as Tier H). ⛔ No edit topackages/metadata-protocol/**orpackages/objectql/**(those are #29985 / #29986's).Container & model:
M,mode:thread,model: TIER_DEFAULT,effort: highClause-②: no
Metadata-protocol: none
Responsibility: the facade files produced by #29985 / #29986 stay delegation-only after they land (rulings above)
Thread-read: 6624652906
Premise: holds (the two facade drafts PR #29998 and PR #30012 are being regenerated to 6624345766; the gate's accepted shapes are read from their re-run heads)
Serial constraints cleared: no open PR touches the gate's files; lands in the facades' maintainer-ordered window or immediately after (card body).
objectstack-fleet commentedon Nov 4, 2026
domain:devx#1 · os-support-ai · session_01WGufzfcbZEJQm3rajN7rri
os-dev-report
Stamp: 2026-11-04T09:10Z
Ruling-ref: 6624258595 item 3; 6624345766 item 3
Draft PR #30030 holds the gate, its self-test, an empty facade registry and its CI wiring. Both facade re-runs were read (#29998
bba9d24d, #30012f48078bb) and the gate passes each with its measured exception list. The PR stays a draft.{ "issue": 30019, "status": "done", "pr": 30030, "branch": "claude/project-thread-hv5n7g", "head_sha": "c022291d3094eeeba143287d10e236f8144d41f8", "base_sha": "63b86b385", "premise_still_valid": true, "files_changed": [ "scripts/check-facade-delegation-only.mjs (new)", "scripts/facade-delegation-registry.json (new, empty)", "package.json (check:facade-delegation-only)", ".github/workflows/lint.yml (one step in Lint · repo & tooling gates, Tier H)" ], "shape_table": { "forwarding call": "ref(args) with ref a name or .-chain off a name/this (a [name|literal] link allowed); args: name, this, literal, .-chain, spread, ONE nested forwarding call (protocolHost(this)), forwarding arrow; as/!/satisfies/parens/instantiation transparent; await allowed on the returned call", "method/accessor": "one statement: return <call> | <call>; | return <.-chain> | <.-chain> = <arg>; optionally preceded by const forwarding arrows / host object literals of forwarders (hand-series and facet .call(host, ...) stubs); a writer closure may be a one-statement block", "constructor": "wiring only: super(...), this.x = <arg>, this.x = new Ref(<args>), forwarding calls", "static block": "calls off a reference whose args are forwarders or object literals of forwarders (installProtocolHost(...), Object.defineProperties(ObjectQLStatics, ...))", "field": "any declaration; a function inside an initializer must be a forwarding arrow", "parameter default": "data only (literal, .-chain, array/object literal of data)" }, "readings": { "protocol_ts_bba9d24d": "334 members: 161 host-literal stubs, 94 host delegations, 20 forwarding calls, 1 constructor wiring, 1 static host factory, 27 fields, 30 exceptions (#30020); exit 0 with the rows, red on exactly 30 without", "engine_ts_f48078bb": "ObjectQL 348 members: 217 host-literal stubs, 28 forwarding calls, 3 state writes, 2 state reads, 1 statics host, 67 fields, 30 exceptions (#30020); exit 0 with the rows, red on exactly 30 without", "self_test": "32 cases, 32 pinned batteries (12 harm, 6 shapes, 8 exception rules, 6 anti-no-op), floor + verdict handshake", "ablation": "judgeDelegationBody short-circuited: self-test red on 9 cases (H1-H5, H9, H11, H12, E1); restored, 32 pass (throwaway checkout, hash-object equal)", "eslint": "exit 0 on the new script", "dispatch_gates": "65 derived, 61 run all exit 0, 4 NOT-MEASURED exit 3 (dts-closure, dual-build-cjs-loads, lean-entry-closure, sourcemap-no-sources-content: need built dist, no package touched); entry-guard was red on the first commit (top-level loop in an exporting script), fixed in this PR, green; --ran: 0 UNRUN", "ci": "at c022291d every required context concluded success except Test Core 1/8 and 8 Test UI shards still in progress at the reading" }, "exceptions_vs_reports": { "protocol": "25 of the report's 26 refused; static resetEnvWritableCache is already a forwarding call (no row); constructor and static block pass as wiring. Stricter than the report (seat to judge): applySeedBodies (host slot this.getServicesRegistry?.().get(...)), static OVERLAY_ALLOWED_TYPES, STATIC_REGISTRY_TYPES, RUNTIME_CREATE_ALLOWED_TYPES, OVERLAY_CAPABLE_TYPES (IIFE table initializers)", "engine": "27 of the report's 31 refused; setHookMetricsRecorder, setStrictHookBinding, setWarnLegacyHandler, getHookMetricsRecorder are one-line state writes/reads (no row). Stricter than the report: constructor (|| fallback + if on env), projectHomeAmountsOntoPatch (default calls this.homeAmountServing), serveReferenceNames (host slot with a try block)" }, "deviations": [ "Part of #30019, not Fixes: check:closing-target-claim matches only claude/issue-* branches, so a closing keyword from this thread branch would red PR-body guards", "Registry ships EMPTY: registering either file now reds main and this PR, since neither facade is on main. Rows are in /mnt/project-files/issue-30019/registry-final-both.json (and per file); whichever PR lands second adds them", "Card ref #30020 used on every row; its body says it retires every exception row or each gets its own ruling. Rows whose reason is not state (inferred-return-type, closed-set, erasure pins) may want a different card: seat's call", "Scope: only the registered class is judged; top-level functions (protocol.ts: 2, 24 lines) and other classes (engine.ts: ObjectRepository, ScopedContext) are outside the ruling's 'method body'", "No assignee/reviewer set on the PR (os-dev rule 2)" ], "tier": "H (.github/workflows/lint.yml)", "changeset": "none, skip-changeset label", "mcp_calls": "GitHub MCP reads only (issue/PR/check-run reads); 0 MCP writes", "api_writes": "2: relay pr_create #30030 (draft, label skip-changeset, no assignee); this os-dev-report via post-stamped. Pushes are git.", "security_findings": "none", "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 4, 2026
domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj
Landed ·
domain:devx#1· 2026-11-04T11:21Z17fe9217via the merge queue (seat record onf24cb61d; contract reviews 6627146481 → 6627372576 → 6627515582 → 6628808410, all PASS; Tier H approval os-zhuang 5766734751)origin/main:scripts/facade-delegation-registry.json#30020origin/mainpackages/metadata-protocol/src/protocol.ts13,647 lines (#29998),packages/objectql/src/engine.ts14,140 lines (#30012)State: closing this card as completed (the PR says
Part ofonly because the harness-pinned branch can't match the closing-target check) and removingpm:dispatched. Delivered: the delegation-only gate with its registry, wired into Lint · repo & tooling gates. Remaining: the 60 exception rows belong to #30020 (the hygiene note on 40 of them is posted there). The freeze on protocol.ts and engine.ts is lifted.