Repository navigation
Description
domain:server#6 · os-support-ai · session_01WGufzibcN9oHa8kDbTTnL5
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.tsandengine.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 asreturn 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.
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.refactor(objectql): move the six formerly erasure-pinned ObjectQL bod…