Skip to content

Facade codemods: retire the codemod-limit exception rows in the facade gate registry (protocol.ts, engine.ts, sql-driver.ts) #30147

Open

Description

@objectstack-fleet

domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj

Filing gate: ③ a follow-up that two reviews carried. The final contract review of PR #30030 (comment 6628808410) raised a should-fix: about 40 of the 60 exception rows in scripts/facade-delegation-registry.json cite #30020 (state-owning facets), but they are bodies because of codemod limits, not because of facet state. This seat's note on #30020 asked for an owner or a card, and none followed. The #30105 dev reports 25 more rows of the same kind for sql-driver.ts (PR #30139). ⛔ Not a claim. Suggested grade: p2. Route: domain:devx, the lane of the large-file split programme #29465.

Ruling-ref: 6624345766 (item 3: each exception row names the card that will move it)

What is wrong

A facade-gate exception row must name the card that retires it. Rows whose reason is a codemod limit point at #30020, and #30020's design (state ownership) will not remove them. So either nothing retires them, or #30020 grows past its scope.

The rows (reason → count; re-measure on main)

Wanted

Out of scope (⛔)

Dedupe (open and closed): facade exception, codemod limit, facade-delegation-registry. Nearest: #30020 (state-owning facets), #30053 (docblocks), #30019 (the gate, closed). New.

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:devx kept · pm:queue · 2026-11-04T16:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 4, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj

    Claim: PM loop · card thread · 2026-11-05T00:57Z
    Session: session_01WGufzj4B2cbnRLVdgtLcDZ (dev: os-dev card thread; seat session_01WGufzgBDcBNVmSmo7VFHpj)
    Account: os-support-ai
    Branch: claude/project-thread-6gf6xi (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: 6624345766 (item 3: each exception row names the card that will move it)
    File surface: scripts/facade-delegation-registry.json (re-point rows), scripts/codemod-split-sql-driver.mjs and the generated packages/drivers/driver-sql/src/sql-driver.ts plus its facet/host modules (sql-driver reasons only). protocol.ts / engine.ts are measure-only. ⛔ No hand edit of generated output; no edit to the gate script.
    Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: every facade-gate exception row names the card that retires it, and the sql-driver codemod-limit rows are retired where the codemod can fix them
    Thread-read: 6636629362
    Premise: holds (88 exception rows on main e826e779: 63 cite #30020, 25 cite #30147; PR #30139 merged)
    Serial constraints cleared: no open PR touches the registry or the sql-driver codemod; #30054 / #30055 (same protocol/engine rows) are unclaimed, and this card changes no protocol.ts / engine.ts code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 1 of 3 (re-point, registry only). Phases 2 and 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30194",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 1: every facade-gate exception row now names the card that retires it. 88 rows before and after, same members, files and order; only card and reason change. Before: #30020 63, #30147 25. After: #30020 17 (state-owning: engine bare-this 12, two constructors, protocol publishPackageDrafts bare this, two hand-series host slots), #30054 22 (every inferred-return-type row, 6 of them on sql-driver.ts, 3 of those with a codemod-limit half), #30055 6 (engine erasure pins), #30147 43. Head 6cc705e9; files_changed: scripts/facade-delegation-registry.json (+121/-121).",
      "tests": "No code change. node scripts/check-facade-delegation-only.mjs exit 0 (3 facades, 88 named exceptions); --self-test exit 0 (36 cases).",
      "gates": "dispatch-gates --commands at 6cc705e9: 20 derived, all run, all exit 0; --ran: 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN. Extra: check-published-list-mirrors exit 0, check-facade-delegation-only --self-test exit 0, eslint on the registry exit 0. pnpm lint (repo-wide) left to CI per os-dev.md local-scope rule. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — issue_read x6 (reads only)",
      "api_writes": "2 relay writes: pr_create (run 41946870290, read back identical 5167 bytes, label skip-changeset, no assignee) and this comment; plus git push",
      "open_questions": [
        { "question": "#30054's body names only engine.ts and protocol.ts; 6 sql-driver.ts inferred-return-type rows now point at it. Widen #30054, or a sibling card?", "options": ["A widen #30054 by the 6 sql-driver rows", "B file a sql-driver sibling card and re-point"], "recommendation": "A, because the work is the same kind (spell the return type, .d.ts equal) and the order already routes these rows there" },
        { "question": "reconcileViewExpansions (protocol.ts) reads a private static WeakMap. Filed as a codemod limit (#30147), since a statics host can reach it with the map left on the class. Keep, or send back to #30020?", "options": ["A keep on #30147", "B back to #30020"], "recommendation": "A, because the move needs no state rehome" }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzgBDcBNVmSmo7VFHpj

    Phase 1 landed · domain:devx#1 · 2026-11-05T02:10Z

    Probe Reading
    PR #30194 MERGED 2026-11-05T02:06Z as f2a9007e via the merge queue (seat record on 57a3127d)
    origin/main:scripts/facade-delegation-registry.json 88 exception rows: #30020 17, #30054 16, #30055 6, #30147 49

    State: the card stays open and pm:dispatched stays. Every exception row now names the card that retires it (ruling 6624345766 item 3).

    Next: phase 2 retires the 27 sql-driver.ts rows by extending scripts/codemod-split-sql-driver.mjs. It is split into four PRs, each under 3,000 lines with the full #30139 proof set:

    • 2a: codemod only;
    • 2b: the durability-log follower and the compile-refusal seam test;
    • 2c: the generate-* and keyed-text-bounds pins;
    • 2d: applyFilterCondition.

    Phase 3, measuring the protocol.ts / engine.ts reasons, follows. Changing those files needs the seat's call.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-support-ai · session_01WGufzj4B2cbnRLVdgtLcDZ
    os-dev-report

    Phase 2a of 2a-2d (sql-driver codemod extension). 2b, 2c, 2d and phase 3 follow on this card.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-6gf6xi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30249",
      "session": "session_01WGufzj4B2cbnRLVdgtLcDZ",
      "premise_still_valid": true,
      "summary": "Phase 2a: the sql-driver codemod learns six mechanisms (receiver-free knex calls, EXPLICIT_RETURN_TYPES, comments in parameters moved verbatim, MOVED_ACCESSORS, computed defaults written optional on the stub, MOVED_FIELD_DEFAULTS) and the tree is regenerated from 21510bba, never hand-edited. 15 sql-driver.ts registry rows deleted: 88 -> 73. By card before/after: #30020 17/17, #30054 16/16, #30055 6/6, #30147 49/34 (sql-driver.ts 27 -> 12). Five staying rows get their reason rewritten (applyFilterCondition, ensureShardTable, initObjects, get supports, static DIALECT_CONNECT_TIMEOUT). Head 34fc09d0, base f2a9007e. files_changed: 13 (codemod +484/-37, registry, check-tenant-chokepoint +1, sql-driver.ts and 8 modules, new sql-driver-schema-introspection.ts); 1,551 changed lines, under 3,000.",
      "tests": "codemod --self-test 98 cases in 6 batteries exit 0 (new battery 'codemod-limit retirements (#30147)' 31 cases, floor 5 -> 6). Base f2a9007e and head equal: driver-sql 238 files/12 skipped, 3,859 passed/216 skipped; driver-turso 97 files, 2,514/34 skipped; driver-sqlite-wasm 40/750; cli by-path 9 files/116; types 53, metadata 11, metadata-protocol 33, spec check-liveness 74; every leg os-verify-lock VERDICT command-exit 0.",
      "proofs": "--verify --base 21510bba exit 0: 171/171 bodies, 127/127 top-level identical, undo rebuilds base, 18334 -> 10717 lines. Determinism: two --write runs tree sha256 07b3a505...6454 both. Public .d.ts: dts-public.mjs exit 0 pass true, index.d.ts raw-equal (sha256 92e2cfb2... both sides); rotateShards and ensureRotation specifically read nowMs?: number at base and head, signature hashes c8bded77 / d0ab9226 equal. The four EXPLICIT_RETURN_TYPES strings were copied from the base build's dist/index.d.ts, not from hand reading. typecheck exit 0. check-tenant-chokepoint 24/21/3/4/0 at base (38 files) and head (39 files), --self-test exit 0. Facade gate exit 0 with 73 rows, --self-test 36 exit 0.",
      "gates": "dispatch-gates --commands at 34fc09d0: 67 derived, all run, all exit 0 (two first exited 3 on prerequisites: shallow clone lacked the plugin-teardown fixture commit, dual-build-cjs-loads lacked dists; fetched/built, then exit 0); --ran: 67 derived, 67 run, 0 NOT-MEASURED. Extra: check:lean-entry-closure 0, eslint on changed files 0. pnpm lint repo-wide left to CI.",
      "deviations": [
        "scripts/check-tenant-chokepoint.mjs: one DECLARED_WATCH_HINTS line for the new module (its self-test requires it); not the facade gate",
        "codemod SELF_TEST_BATTERY_FLOOR 5 -> 6 so the new battery cannot silently drop"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — pull_request_read x1, subscribe_pr_activity x1 (no GitHub MCP writes)",
      "api_writes": "2 relay writes: pr_create (run 41961803947, read back identical 8249 bytes, label skip-changeset, no assignee, draft) and this comment; plus git push (force-with-lease over my own WIP commit 84480890)",
      "open_questions": [
        { "question": "get supports (inferred object type with per-key docblocks) and static DIALECT_CONNECT_TIMEOUT (static initializer, TDZ) stay on #30147 with no 2b-2d slot. Fold into 2d, or leave for a later card?", "options": ["A fold into 2d", "B leave on #30147 after 2d and say so in the phase 3 report"], "recommendation": "B, because neither is a mechanism 2b-2d already builds, and both are small" }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  7. 11 remaining items

  8. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Claim: PM loop round 8
    Session: session_016WV4cymvo9YoyLwKCXXBNw
    Account: os-elon-musk
    Branch: claude/project-thread-to5pdz (the card thread's platform-assigned branch; a measured platform exception to claude/issue-<n>-<slug>) · card thread session session_016WV4cxm997Tr9c3JFQTKGj
    Worktree: objectstack-issue-30147
    Domain: domain:devx
    Seat: domain:devx#1
    Ruling-ref: 6624345766 (item 3: each exception row names the card that will move it)
    File surface: phase 3 of the card, resuming from the phase 3 measurement (6653253380) and the release note (6657957218): the protocol.ts codemod (scripts/codemod-split-* / scripts/host-split.mjs for packages/metadata-protocol/src/protocol.ts), with a statics forwarder and a .call(host) facet receiver ported from the sql-driver codemod. Also the engine.ts field-call row (homeAmountServing), the getDiscovery row (a hand move that keeps the typeof this.searchAll probe on the instance, 6679557390), and scripts/facade-delegation-registry.json, plus the regenerated facade and facet modules. ⛔ No hand edit of generated output, except the one hand move the getDiscovery route names.
    Container & model: M, mode:thread, model: default tier, effort: high (p2)
    Clause-②: no. This is a structure-only move, with byte-identical bodies and an equal public .d.ts.
    Metadata-protocol: none
    Responsibility: every facade-gate exception row that cites this card is either retired by the codemod or recorded with its reason as an accepted exception.
    Thread-read: 6679557390
    Premise: holds. On main 4d56914aaa, 27 rows cite #30147: protocol.ts 21, engine.ts 4, sql-driver.ts 2. The gates named in the release note have all closed (#30054, #30055, #30716, and #30838 for #30518 PR 2).
    Serial constraints: draft PR #30747 edits packages/objectql/src/engine.ts, so the engine.ts row goes in a later PR that merges main after #30747, or is measured only if #30747 is still open. No open PR touches protocol.ts, the registry or the codemod scripts (checked 2026-11-06T12:41Z). Split into PRs under 3,000 changed lines each, as phase 2 did.

  9. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cxm997Tr9c3JFQTKGj
    os-dev-report

    Phase 3a (the protocol.ts receiver forms). Phase 3b (getDiscovery, a hand move) is prepared locally and opens once this lands; phase 3c (engine.ts) is measured below, report only, because draft #30747 still edits engine.ts.

    {
      "issue": 30147,
      "status": "done",
      "branch": "claude/project-thread-to5pdz",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30954",
      "session": "session_016WV4cxm997Tr9c3JFQTKGj",
      "premise_still_valid": true,
      "summary": "codemod-split-protocol --members gains the receiver forms ported from the sql-driver codemod (.call(host) receiver, statics forwarder ObjectStackProtocolImplementationStatics, plain form, static tables to a leaf module, predicate host entries) for the stay reasons E1 cannot carry, and moves 19 protocol.ts members with it (forms: e1 2, plain 5, statics 5, receiver 3, table 4; protocol.ts 13007 -> 12577 lines). Registry 46 -> 27 exceptions; #30147 rows 27 -> 8 (protocol.ts getDiscovery and triggerAutomation, engine.ts 4, sql-driver.ts 2); triggerAutomation's reason rewritten as an accepted exception. check-durability-degradation-log-level.mjs now follows the new stub shapes. Head ae519e3e99, base 616311c126 (main). files_changed: 15; line_budget: 2,459 changed lines (+1,720 / -739) of 3,000.",
      "tests": "codemod --self-test: 112 cases in 13 batteries (85 in 10 before; new: receiver forms 10, receiver proof 10, receiver refusals 7). durability --self-test: 86 read-seam cases (81 before); ablation: the 5 new cases against the base resolver fail the 3 positive ones, the 2 negative controls pass on both. metadata-protocol vitest: base 4d56914aaa 320 files / 22,487 tests pass; head 320 files / 22,489 pass (+2 = the two new producer rows; one file first read a spec dist from before the rebase and passes 18/18 rebuilt). Three source-reading pins follow the moved bodies (bracketed-opener floors, registerItem call-site file, view-expansion forwarder read). packages/rest at 7d49cfc21: 398 files / 7,752 tests pass; discovery-search-capability-agreement 4/4 at base and head.",
      "proofs": "--members --verify --base 616311c126 exit 0: 19 moved, host-split 2/2 E1, undo rebuilds base protocol.ts, protocol-host.ts and section modules byte for byte (9 import bindings pruned). Public .d.ts: index.d.ts / index.d.cts public surface equal, not byte-equal: 14 private members' docblocks moved with their bodies (docblock ownership); stripped of docblocks identical (sha256 5cf3216a10daa533 base, 9cab7eb90040d456 head). Facade gate exit 0 (27 exceptions). typecheck 0, build 0, check:platform-checklist 0 (one citation re-pointed), spec check:liveness 0, eslint clean. Durability checker output on the tree byte-identical to base.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at ae519e3e99: 86 derived, all run, all exit 0; --ran: 86 derived, 86 run, 0 NOT-MEASURED, 0 UNRUN. First pass: check-plugin-teardown-shape --self-test, check:dual-build-cjs-loads and check:lean-entry-closure exit 3 (shallow clone / partial build), check:durability-log-level exit 1 (3 read seams via the moved rethrowUnlessMetadataStoreUnprovisioned: fixed in the checker's resolver, second commit); all four exit 0 after a full pnpm build. CI: in_progress at report time.",
      "deviations": [
        "The order's bar is an equal public .d.ts; it is equal in surface, not in bytes (14 private docblocks), as above.",
        "check-durability-degradation-log-level.mjs gained resolver support for the new stub shapes in this PR (no rule change, output byte-identical); without it the gate reds on this move.",
        "triggerAutomation is recorded as an accepted exception rather than moved: its section has no facet module, and the members pass never starts one.",
        "Commit trailers were reworded to the model-free pair before the first push (check:commit-card-trailers refused the first push); nothing was published with them."
      ],
      "files_changed": [".changeset/30147-protocol-receiver-forms.md", "docs/qa/platform-checklist/areas/platform-core.json", "packages/metadata-protocol/src/protocol-class-head.ts", "packages/metadata-protocol/src/protocol-discovery-and-bases.ts", "packages/metadata-protocol/src/protocol-host.ts", "packages/metadata-protocol/src/protocol-registry-hydration.ts", "packages/metadata-protocol/src/protocol-write-gates-tables.ts", "packages/metadata-protocol/src/protocol-write-gates.ts", "packages/metadata-protocol/src/protocol.ts", "packages/metadata-protocol/src/protocol.bracketed-refusal-opener-absence.test.ts", "packages/metadata-protocol/src/protocol.register-item-call-sites.test.ts", "packages/metadata-protocol/src/protocol.view-expansion-reconcile-call-sites.test.ts", "scripts/codemod-split-protocol.mjs", "scripts/check-durability-degradation-log-level.mjs", "scripts/facade-delegation-registry.json"],
      "server_lane_prs_on_protocol_ts": "none: no open pull request changes packages/metadata-protocol/src/protocol*.ts (all open pulls read 2026-11-06 ~13:20Z). engine.ts is changed by #30747 and #30940.",
      "phase_3b": "getDiscovery prepared locally: generated by the members pass on an intermediate where the probe reads a parameter, then hand-edited so the stub passes this.searchAll (read on the instance) and the facet keeps typeof searchAllOnInstance === 'function'. --verify against the intermediate exit 0; typecheck 0; facade gate 0 with the row removed (26); rest discovery-search-capability-agreement 4/4; metadata-protocol discovery tests 35/35. host-split.mjs's refusal is unchanged. About 1,000 changed lines; opens after this PR lands.",
      "phase_3c_measurement": "engine.ts ObjectQL: 61 instance fields, 1 called as a function: homeLocalizationResolver, called only (once, in homeAmountServing), never read as a value, written by setHomeLocalizationResolver through a host setter. homeAmountServing stays (field-call). projectHomeAmountsOntoPatch's body is already moved; only its stub's parameter default (= this.homeAmountServing(context)) computes. ScopedContext derive and [APP_AUTHORED_HOOK_API] write appAuthored on another instance (foreign-private). No engine.ts edit made: #30747 is open.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "read only: issue_read x2 (#30147 comments), list_pull_requests x1; no GitHub MCP writes",
      "api_writes": "2 relay writes: pr_create #30954 (request fw-20261106T141230Z-09e42a, run 42231863593, read back identical 10,590 bytes, assignee os-elon-musk, draft) and this comment; plus git push",
      "open_questions": [
        {
          "question": "Accepted exceptions vs ruling 6624345766 item 3 (every row names the card that moves it): triggerAutomation (here) and the two sql-driver rows (get supports, static DIALECT_CONNECT_TIMEOUT, recommended in 6657957218) would cite #30147 as accepted exceptions with no retiring card.",
          "options": ["A: the maintainer accepts terminal exceptions for these three rows; the last PR records the two sql-driver reasons and carries Fixes #30147", "B: re-point the three rows to a new card that owns the remaining exceptions; #30147 closes when 3b lands", "C: move them anyway (triggerAutomation needs a new facet module for one throw; supports needs a spelled public type, a .d.ts change; DIALECT_CONNECT_TIMEOUT reads three other statics during class evaluation)"],
          "recommendation": "A, because each move costs more than the row (a one-statement facet, a public declaration change, or a class-evaluation-order hazard) and the reasons are written on the rows"
        },
        {
          "question": "The four engine.ts rows while #30747 is open: wait, or hand them to another card?",
          "options": ["A: hold 3c until #30747 lands, then: projectHomeAmountsOntoPatch moves its default into the facet (stub passes serving through; private signature, no public .d.ts change); homeAmountServing moves by a receiver hand-move that reads homeLocalizationResolver off the instance (the only called-only field, so no general forwarding rule is needed); derive and [APP_AUTHORED_HOOK_API] become accepted exceptions", "B: re-point the four engine.ts rows to a new engine card now, so #30147 can close with 3b"],
          "recommendation": "B, because #30747 is a security-hardening draft with no landing date and the engine rows share no code with this card's protocol work; A's plan goes in the new card's body"
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  10. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Maintainer ruling · #30147 phase 3 remaining rows · 2026-11-06T14:55Z

    The maintainer chose option A on the decision card at 2026-11-06T14:55Z. The ruling has two parts.

    1. Three rows become accepted terminal exceptions: triggerAutomation, sql-driver get supports and static DIALECT_CONNECT_TIMEOUT. This is a recorded exception to ruling 6624345766 item 3 ("every row names the card that moves it"). Each of these rows keeps the reason already written on it, and names this ruling in place of an owning card.
    2. The four engine.ts rows go to a new card. They are serial behind fix(objectql)!: a non-system write may name, in a lookup or user field, only a record the caller can read #30747, which is still a draft and is editing engine.ts. A new engine follow-up card takes them. It is filed unclaimed for triage, and the four rows are re-pointed to it.

    This card closes when the 3b PR (getDiscovery, plus the registry edits above) lands after #30954.

  11. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Seat hand-off · #30147 · 2026-11-06T16:48Z

    devx seat 1 is signing off on the maintainer's order (2026-11-06T16:47Z: contract reviews still owed go to the next seat). The next devx seat picks this card up from here. pm:dispatched stays on the card.

  12. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Seat hand-off addendum · #30147 · 2026-11-06T16:50Z

    The complete phase 3b is prepared in project files. It replaces phase3b-getDiscovery.patch, which holds only the getDiscovery half.

    • Files:
      • /mnt/project-files/issue-30147/3b-commits/ holds two format-patch commits: first X (the codemod output), then the hand edits.
      • /mnt/project-files/issue-30147/phase3b-final.patch is the combined diff against bc2ee6c16.
    • Contents: the getDiscovery move, all of ruling 6687801899's registry edits, and the changeset. The three accepted rows keep card #30147 because the gate requires a #N, and their reasons are prefixed with ruling 6687801899. The four engine rows point at objectql engine.ts: retire the four facade-gate exception rows #30147 hands over #30975.
    • Measured by the dev on the combined diff:
      • --verify against X exits 0, and tsc 0.
      • The facade gate is 0 (26).
      • metadata-protocol: 320 files / 22,489 tests green. rest: 398 / 7,752. 70 cross-package readers green.
      • The negative control (handing the host closure) fails rest discovery-search 2/4, as it should.
    • Still owed: dispatch-gates on the fresh-main head.
    • To apply after feat(scripts): codemod-split-protocol --members moves the bodies E1 refuses, unedited, and retires nineteen protocol.ts facade rows #30954 lands, from fresh main:
      1. git am the two commits.
      2. Re-run --verify against X.
      3. Squash, then open the PR with Fixes #30147.
  13. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    To: domain:devx#1
    Request: progress · #30147 · idle since 2026-11-06T16:51Z (its serial partner PR #30954 merged 17:39Z)


    Generated by Claude Code

  14. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    To: domain:devx#1
    Request: progress · #30147 · idle since 2026-11-06T16:51Z (second knock; first 2026-11-06T20:04Z)


    Generated by Claude Code

  15. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8

    Claim: PM loop round 1 (sibling-seat takeover)
    Resume-from: seat hand-off 6690277174 + addendum 6690327117 (domain:devx#1, 2026-11-06T16:50Z); triage handover doorbell 6708230253 on mailbox #30515
    Session: session_017ihL2ebbZkr2QAEG1x7UC8
    Account: marchtian
    Branch: claude/issue-30147-phase3b-getdiscovery
    Worktree: objectstack-issue-30147
    Domain: domain:devx
    Seat: domain:devx#2
    File surface (phase 3b, the card's last PR, Fixes #30147):

  16. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
    os-dev-report

    Phase 3b, the card's last PR: #31177 (draft, head 56dbba9841, carries the closing line for this card).

    {
      "change": "PR https://github.com/objectstack-ai/objectstack/pull/31177, draft, no reviewers, no assignees, head 56dbba9841 (branch claude/issue-30147-phase3b-getdiscovery, merged once with main 56baf78e0c). getDiscovery's body moves from protocol.ts to ProtocolDiscoveryAndBasesFacet (protocol-discovery-and-bases.ts) by the members pass on an intermediate X, then a hand edit puts main's signature back and makes the stub hand the facet this.searchAll read on the instance. The facade registry takes ruling 6687801899's edits. Patch changeset for @objectstack/metadata-protocol: Metadata-protocol none takes patch, and the package's built JavaScript changes (the body runs from the facet module) while its public .d.ts does not. 4 files, 1,033 changed lines (+554 / -479).",
      "getdiscovery_move": {
        "recipe": "dev report 6686885545 phase_3b, rebuilt here (seat 1's patch files are not reachable from this project)",
        "commits": [
          "43df6766ff X: getDiscovery(searchAllOnInstance: unknown) and `search: typeof searchAllOnInstance === 'function'`; nothing else changed",
          "4a2e27e428 `node scripts/codemod-split-protocol.mjs --members getDiscovery --write` on X, unedited: E1 form, 460 body lines, protocol-host.ts unchanged (engine and getServicesRegistry entries already present)",
          "e87a512b0e hand edits: getDiscovery() takes no parameter (main's signature byte for byte), stub `return ProtocolDiscoveryAndBasesFacet.getDiscovery(protocolHost(this), this.searchAll);` plus a two-line why-comment after the codemod marker line; the facet keeps `typeof searchAllOnInstance === 'function'`; plus the registry edits and the changeset"
        ],
        "verify_against_X": "`--members --verify --base 43df6766ff` on the tree of 4a2e27e428: exit 0, 1 moved member, forms e1 1, host-split 1/1 E1, undo rebuilds X's protocol.ts, protocol-host.ts and section modules byte for byte (15 import bindings pruned), protocol.ts 12606 -> 12147 lines. The same command on the head exits 1 naming only the hand-edited stub and signature (expected).",
        "host_split_refusal": "unchanged"
      },
      "registry_edits": [
        "protocol.ts getDiscovery (#30147, codemod limit: closed-set ...) -> row deleted",
        "protocol.ts triggerAutomation: card #30147 kept; reason 'accepted exception (#30147 phase 3): its body is one throw ...' -> 'accepted terminal exception (ruling 6687801899): accepted exception (#30147 phase 3): its body is one throw ...'",
        "sql-driver.ts static DIALECT_CONNECT_TIMEOUT: card #30147 kept; reason 'codemod limit: a static initializer runs ...' -> 'accepted terminal exception (ruling 6687801899): codemod limit: a static initializer runs ...'",
        "sql-driver.ts get supports: card #30147 kept; reason 'codemod limit: inferred-return-type ...' -> 'accepted terminal exception (ruling 6687801899): codemod limit: inferred-return-type ...'",
        "engine.ts ObjectQL homeAmountServing: card #30147 -> #30975, reason unchanged",
        "engine.ts ObjectQL projectHomeAmountsOntoPatch: card #30147 -> #30975, reason unchanged",
        "engine.ts ScopedContext derive: card #30147 -> #30975, reason unchanged",
        "engine.ts ScopedContext [APP_AUTHORED_HOOK_API]: card #30147 -> #30975, reason unchanged",
        "facade gate at 56dbba9841: exit 0, 5 facade classes in 3 files, 16 named exceptions (17 before)"
      ],
      "public_dts": "Equal, and byte-equal. Measured by building @objectstack/metadata-protocol twice in this worktree: once with protocol.ts and protocol-discovery-and-bases.ts restored from main af3451b08b (blob hash checked), once from HEAD after restoring (git diff HEAD empty). dist/index.d.ts and dist/index.d.cts: sha256 1b94b057e16e19b5 on base, head, and a head rebuild. Stronger than 6686885545's surface-equal method, because getDiscovery is public with a written return type and no docblock, so nothing left the printed declaration.",
      "negative_control": "Stub mutated (ablation-replace --hold) to hand a host-style forwarding closure, `(request) => this.searchAll(request)`, in place of this.searchAll. metadata-protocol rebuilt; ablation-dist-preflight found the closure in dist/index.js and dist/index.cjs; rest discovery-search-capability-agreement.test.ts: 2 failed / 2 passed (a protocol that cannot search; anti-vacuity). Restored through the script's trap (head blob == disk blob, git diff HEAD empty), rebuilt, preflight --absent clean on all 24 built files and a clean tree; the test 4/4 again.",
      "tests": "At final head 56dbba9841, one locked run: metadata-protocol build 0, typecheck 0, vitest exit 0 (321 files passed, 4 skipped; 22,525 tests passed, 26 skipped); rest vitest exit 0 (398 files; 7,782 passed, 354 skipped; rest loads metadata-protocol from the dist rebuilt from this head); discovery-search-capability-agreement verbose 4/4. Same counts at e87a512b0e before the merge. eslint on the two changed sources exit 0. No test files changed.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 56dbba9841 (after a full pnpm build plus a rebuild of the five packages the main merge touched): 65 derived, 65 run, every one 'CMD :: exit 0' (codes captured before any pipe, each to its own log). --ran: 65 derived, 65 run, 0 NOT-MEASURED (a derived zero: all 65 carry an exit code), 0 UNRUN. Also: pnpm --filter @objectstack/spec check:generated exit 0, all 14 up to date (spec moved in the merge; a first run reported check:test-typecheck as tsc failing with no diagnostics on a contended box, and the gate alone and the re-run pass). CI at report time: 21 check-runs, the gate-carrying ones in_progress.",
      "files_changed": [".changeset/30147-get-discovery-facet.md", "packages/metadata-protocol/src/protocol-discovery-and-bases.ts", "packages/metadata-protocol/src/protocol.ts", "scripts/facade-delegation-registry.json"],
      "deviations": [
        "Three commits plus one merge, not two commits: --verify --base takes a git ref, so X itself is a commit (43df6766ff), then the codemod output (4a2e27e428), then the hand edits (e87a512b0e). The reviewer can see each and re-run the proof; the queue squash-merges.",
        "The registry edits and the changeset ride the hand-edit commit.",
        "main moved after the one merge (56baf78e0c -> 21c1f74850, six commits; #31151 deletes the adjacent ObjectQL constructor row from the registry). git merge-tree against 21c1f74850 is clean; not merged a second time, per the order.",
        "Commit trailers are the order's model-free pair; the harness reminder's model-named Co-Authored-By form was not used. The PR body ends with the order's footer line and carries the session URL in prose above it."
      ],
      "open_questions": [
        {
          "question": "triggerAutomation's reason now opens 'accepted terminal exception (ruling 6687801899): accepted exception (#30147 phase 3): ...', because the reason already written opened with its own label.",
          "options": ["A: keep it as ordered (prefix + the reason already written)", "B: drop the inner 'accepted exception (#30147 phase 3):' label in a seat edit before landing"],
          "recommendation": "A, because the order and the ruling say keep the written reason, and the doubling is cosmetic"
        }
      ],
      "out_of_scope_findings": [],
      "mcp_calls": "0",
      "api_writes": "2 relay or tool writes: pr_create #31177 (request fw-20261107T160455Z-3e805b, run 42389478456, conclusion success, read back 8,476 bytes sent and stored, identical, draft, assignees none, reviewers none) and this comment through post-stamped.mjs. Plus three git pushes (the empty branch, the three commits, the merge). GitHub reads through gh api only.",
      "filed_issues": "none",
      "security_findings": "none"
    }
  17. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
    os-dev-report

    Round 2 delta for #31177 (review should-fixes S1, S2 and S3). Only the changed keys; every other key stands as in comment 6709547182.

    {
      "change": "PR #31177, new head 1a84657c25 (commit 2bb03299ef for S1 + S2, then one merge of main 21c1f74850). S1: the commit 376c70f98 comment left above an unrelated import in protocol.ts now annotates the facet's import of resolveDiscoveryVersion in protocol-discovery-and-bases.ts, reworded to say 'this facet's getDiscovery()'. S2: one sentence in the header of scripts/check-facade-delegation-only.mjs under 'Exceptions': a row may instead be an accepted terminal exception whose reason opens by citing the maintainer ruling that accepted it (6687801899 for the three rows of this card), whose card is the card that recorded it, and which stays after that card closes. Comment only, no gate logic change. S3: merged main once; the triggerAutomation prefix left as it is. 5 files against main, +560 / -482.",
      "registry_edits": "unchanged by this round. On the merged tree the facade gate prints 15 named exceptions (main dropped the ObjectQL constructor row in #31151, and this PR drops getDiscovery: 16 to 15).",
      "tests": "At 1a84657c25: metadata-protocol typecheck 0, vitest exit 0 (321 files passed, 4 skipped; 22,525 tests passed, 26 skipped). check-facade-delegation-only --self-test exit 0 (37 cases), the gate itself exit 0 with 15 named exceptions. The packages the merge touched (cli, objectql, plugin-auth, plugin-security, runtime) and metadata-protocol were rebuilt first: turbo 63/63. rest not re-run: neither this round's diff nor the merge touches packages/rest or metadata-protocol code (comments only).",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 1a84657c25: 76 derived (65 before; the gate-script edit adds check-declaration-mirrors, check-self-test-wired, check-self-test-workflow-commands, check-whole-set-label-write, bare-root-worklist --self-test, check:pm-dispatch-gates, check:ratchet-remedy-authority), all 76 run, every one 'CMD :: exit 0', codes captured before any pipe. --ran: 76 derived, 76 run, 0 NOT-MEASURED (a derived zero), 0 UNRUN.",
      "files_changed": [".changeset/30147-get-discovery-facet.md", "packages/metadata-protocol/src/protocol-discovery-and-bases.ts", "packages/metadata-protocol/src/protocol.ts", "scripts/check-facade-delegation-only.mjs", "scripts/facade-delegation-registry.json"],
      "deviations": [
        "S3's PR-body patch was NOT sent. .claude/agents/os-dev.md: a dev writes the PR body only at pr_create, never PATCHes it, names the change in the report, and the seat writes it; that file prevails where the order differs. The patched body is prepared for the seat (three count lines 16 -> 15 and 17 to 16 -> 16 to 15, the facade-gate head reference 56dbba9841 -> 1a84657c25, and the signed last line appended); every other byte is the live body."
      ],
      "open_questions": [],
      "mcp_calls": "0",
      "api_writes": "1: this comment through post-stamped.mjs. Plus two git pushes (the S1/S2 commit and the merge, sent together). No PR-body write."
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3tech-debt

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions