Skip to content

objectql: the ReadableIds leaf composes for a delegated (on-behalf-of) caller, with the delegator intersection (ADR-0139 D5.1's exit), and ADR-0139 records O5 answered #25009

Closed

Description

@objectstack-fleet

Filing gate ③ a task the maintainer set: engine card (b)(i) of the maintainer's ruling B on #24932 (6303721609, batch #379 item 3). The ruling directs the domain:services seat to file this card and the sibling card before #24932's plugin-security switch. Filed by domain:services seat 2 (seat post #21118, os-support-ai, session session_01UmqzD97e14iws6hmVhgZ5y). domain:engine is the ruling's word; priority:p1 and area:access follow #24932. ⛔ Not a claim.

Reader (who acts): the domain:engine seat claims and dispatches it. #24932 is Blocked-by: this card.

The ruling, as it binds this card (verbatim from 6303721609)

  • "O5 is answered yes, in the end-state form. controlled_by_parent becomes the seventh consumer of the engine-internal semi-join leaf, once for every shape: the engine first composes the leaf for a delegated (on-behalf-of) caller (the exit condition D5.1 itself names) and for a nested master chain; then plugin-security switches the caller, the delegator intersection and getReadFilter in one change, and the id-list pre-scan retires."
  • "Order. … (b) Two domain:engine cards: delegated composition and nested composition, with the ADR-0139 revision in the first PR (Tier H, the maintainer's approval) answering O5 and amending D5.1."

What this card does

  • The engine composes the ReadableIds leaf for a delegated caller, intersected with the delegator's own scope (ADR-0139 D10), instead of refusing. Measured on origin/main at the time of the dev report on plugin-security: a controlled_by_parent child's read loads every readable master id with no limit (twice per request), so its CPU grows with the master table and the read answers 500 "too many SQL variables" past ~32.8k masters #24932 (6298477402): the engine refuses a delegated caller at the leaf (engine.ts ~:6185, ADR-0139 D5.1) with 500 INTERNAL_ERROR, and it composes for the outer caller only, so the delegator half cannot be spelled. Re-measure on current main first.
  • The ADR-0139 revision rides this PR (Tier H, left as a draft for the maintainer): O5 answered yes (controlled_by_parent is the seventh consumer), and D5.1 amended to the composition this card builds.
  • Sub-question the ruling does not name; measure and report: the dev report also read, from source only, that a federated master (engine.ts :6202) and a master narrowed by an object-scoped middleware (:6196) are refused 500 at the leaf. If either blocks "once for every shape", report it as a fork on this card rather than choosing.

Pins

Under the lane's commitment, with ablation:

  • a delegated read composes and returns exactly the rows the delegator intersection allows;
  • the closed doors stay closed.

Readings it builds on

The #24932 dev report 6298477402 (M2 and the three measured differences). ADR-0139 D5.1, D6, D10 and O5. ADR-0055 §2.

Dedupe

Semantic search on objectstack-ai/objectstack, open and closed, for "ReadableIds leaf delegated caller on-behalf-of compose ADR-0139 D5.1 nested chain" (run just after filing): this card, its sibling, and the closed ADR-0139 E1 / E2 / E3+E4 / E5 / E7 cards (#22787, #22861, #23639, #23673, #23732, #23857) that built the leaf. None composes for a delegated caller or a nested chain. New.

Activity

  1. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 · 2026-10-21T00:47Z · p1, domain:engine (ruling B on #24932, 6303721609, card (b)(i)). The engine composes the ReadableIds leaf for a delegated (on-behalf-of) caller, intersected with the delegator's own scope, instead of refusing it; the ADR-0139 revision (O5 answered, D5.1 amended) rides this PR.
    Session: session_01QK6pdbxKZiHdFApL8RYVh9 (the dispatching seat; the dev is a mode:subagent run of this session, told apart by its branch)
    Account: os-support-ai (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-25009-readable-ids-delegated-compose
    Worktree: objectstack-issue-25009
    Domain: domain:engine
    Seat: domain:engine#2 (seat post #20966)
    Ruling-ref: 6303721609 (read at this claim)
    File surface:

    • packages/objectql/src/engine.ts, the ReadableIds leaf composition only: the delegated-caller refusal (for a delegated (on-behalf-of) caller: …, read at :6225 on 62bc12930) becomes a composition intersected with the delegator's scope (ADR-0139 D10).
    • docs/adr/0139-engine-internal-semi-join-leaf-readable-parent-ids.md: O5 answered yes in the ruling's end-state form; D5.1 amended to the composition built here. Governed (Tier H): the PR stays a draft for the maintainer's approval.
    • Pins in packages/objectql's tests beside the existing leaf tests: a delegated read composes and returns exactly the rows the delegator intersection allows; the closed doors stay closed. With ablation.
    • A changeset for @objectstack/objectql.

    ⛔ Not in scope: the nested master chain (#25010, serial after this card in the same region); plugin-security's switch and the id-list pre-scan's retirement (#24932, card (c)); ADR-0055's text; any spec key.
    If the federated-master or the middleware-narrowed-master refusal (read near the same lines) blocks "once for every shape", the dev reports it as a fork on this card and does not choose.
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER (ceiling; reason: a security read-scope composition, the delegator intersection, plus a governed ADR revision; this run's dispatch-gates.mjs --tier: "no path-derived mandate")
    Clause-②: no (an engine-internal leaf, not a published accept set; the runtime read-scope change is the human floor's, decided by ruling 6303721609)
    Responsibility: n/a — not a defect card
    Thread-read: none
    Serial constraints cleared: open PRs' file lists were read at this claim. PR #25016 (engine.ts near :19596, :19954) and PR #24893 (near :91, :9043, :12187) hold other regions; no open PR touches the leaf region or ADR-0139. #25010 waits for this card.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25009,
      "status": "done",
      "branch": "claude/issue-25009-readable-ids-delegated-compose",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25032",
      "session": "session_01QK6pdbxKZiHdFApL8RYVh9 — the dispatching seat's session (this is the worktree-takeover run of the same session's mode:subagent dev, told apart by the branch)",
      "premise_still_valid": true,
      "summary": "Takeover of the interrupted run: the inherited WIP (2ffe7d263, engine.ts and security-plugin.ts) and its uncommitted hunks (the ADR-0139 revision, the objectql delegated-compose pins, three respelled plugin-security pins, the new real-stack test) were read hunk by hunk and kept; everything inherited was re-verified from scratch after merging origin/main (05b28c199). The engine's leaf composition no longer refuses a delegated (on-behalf-of) caller: refuseUncomposableReadableIdsClasses reads no context, D5.2/D5.3 keep their named 500 refusals, and the boundary asks canReadObject and getReadFilter with the delegated context as it stands. The one plugin-security prerequisite is kept (D5.1's own exit condition, measured absent on main: getReadFilter answered the deny sentinel for every on-behalf-of context, so a composed leaf would be $in: [] for every delegated read): getReadFilter routes a delegated context to a new computeDelegatedReadFilter that composes the six layers the engine middleware ANDs into a delegated find (the principal's RLS and CBP derivation, the delegator's two over resolveDelegatorContext's rebuilt context, plugin-sharing under each identity at its own depth) and fails closed as the chain does; resolveSharingReadFilter gains an optional depth so the agent leg is stamped the intersected depth as step 2.6 stamps it. Not a duplicate of anything on main; computeControlledByParentFilter's call sites, the id-list pre-scan and ADR-0055 are untouched (card (c)). My own additions: the changeset (objectql minor, plugin-security minor, as the earlier ADR-0139 composition cards), the ADR's E2 row note, and the missing-delegator refusal line keeping the D10 invariant sentence verbatim because default-report-sink.test.ts reads it (the inherited WIP had broken that pin; its docblock and start-logger-binding's name the refusal a bare instance now reaches). No fork found on the other two D5 classes: they are properties of the parent object, orthogonal to the caller, and keep the probe by D5 as written. Draft PR #25032 (Tier H, docs/adr), assignee os-support-ai, Clause-②: no, 维护者速读 section present.",
      "tests": "Head 4c31b7cc9; every heavy run under scripts/pm/os-verify-lock.sh (slot issue-25009), verdicts read off its VERDICT line. Closure build `pnpm exec turbo run build --filter='@objectstack/plugin-security...' --concurrency=2`: `Tasks: 19 successful, 19 total · Cached: 9` · `VERDICT command-exit 0` (73 s). `pnpm --filter @objectstack/objectql test`: `Test Files 451 passed (451)` · `Tests 8511 passed (8511)` · `Duration 436.42s` · `VERDICT command-exit 0`. `pnpm --filter @objectstack/plugin-security test`: `Test Files 200 passed (200)` · `Tests 4124 passed | 45 skipped (4169)` · `Duration 249.34s` · `VERDICT command-exit 0`. Targeted first: objectql `src/engine-readable-ids-composition.test.ts` 27 passed; plugin-security `readable-ids-delegated-compose` + 8 delegated-pin files 353 passed / 1 failed (default-report-sink's phrase pin, fixed in 46b4360cd + 4c31b7cc9, then 20/20 across default-report-sink, start-logger-binding, readable-ids-delegated-compose). Typecheck: `pnpm --filter @objectstack/objectql typecheck` exit 0; `pnpm --filter @objectstack/plugin-security typecheck` exit 0 (`check:test-typecheck: OK — 0 file(s) / 0 error(s)`). Courtesy, the leaf consumers' integration suites: plugin-audit parent-record-read-leaf + comment-parent-pair `Tests 34 passed (34)`; service-storage attachment-read-leaf `Tests 10 passed (10)`. test:repo not run locally (CI's Test Core). ABLATION, two behaviours, scripts/ablation-replace.mjs wrap mode, both suites read src/ (objectql's test imports ./engine.js; plugin-security's vitest config aliases @objectstack/objectql to src/index.ts) so no dist leg was on the resolution path: (A) engine refusal restored, engine.ts anchor `const parents = this.refuseUncomposableReadableIdsClasses(object, operation, sites);` → a throw for an on-behalf-of context planted before it: `ok mutation landed: anchor 1 → 0, blob 2879fdae7f2d → 592ebdd1d394`; objectql leaf test `4 failed | 23 passed` (the four delegated cases), plugin-security delegated-compose `3 failed | 7 passed` (delegated child read, one-statement pin, unadmitted-delegator leaf case); `ok restored: blob == HEAD (2879fdae7f2d) and git diff HEAD is empty`, git status --porcelain empty. A first attempt of leg A was refused by the tool before anything ran (replacement contained the anchor line, anchor count 1 → 1), restore proven, respelled. (B) getReadFilter deny restored, security-plugin.ts anchor `return await this.computeDelegatedReadFilter(object, context);` → `return RLS_DENY_FILTER;`: `ok mutation landed: anchor 1 → 0, blob caf66c649f18 → 9265a52c175c`; delegated-compose `3 failed | 7 passed` (delegated child read serves nothing, parity pin, one-statement pin); `ok restored: blob == HEAD (caf66c649f18) and git diff HEAD is empty`. Direction in both legs: red (as expected), not a reversal.",
      "gates": "Local subset, derived on head 4c31b7cc9 with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; 83 families), each run with the capture idiom (exit recorded before any pipe), reconciled: `✓ dispatch-gates --ran: 83 derived famil(ies) accounted for — 81 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)`. 80 exit 0, among them: pnpm check:adr-anchors 0 · pnpm check:adr-links 0 · node scripts/check-adr-symbol-anchors.mjs 0 (2374 anchors resolve) and its --self-test 0 · check-changeset-no-major --base origin/main 0 · check-empty-changeset --base origin/main 0 · pnpm check:changeset-gate-self-tests 0 · pnpm check:test-source-alias 0 · pnpm check:cross-package-test-inputs 0 · pnpm check:where-matcher 0 · pnpm check:objectql-double-limit 0 · pnpm check:durability-log-level 0 · pnpm check:swallow-census-controls 0 · pnpm check:stack-collection-maps 0 · pnpm check:closed-ceremony-text 0 · pnpm check:doc-authoring 0 · pnpm check:issue-citations 0 · pnpm check:pm-governed-merges 0 · pnpm check:pm-prior-rulings 0 · pnpm check:type-check-coverage 0 · pnpm check:type-check-debt 0 · pnpm check:dts-closure 0 · pnpm check:lean-entry-closure 0 · pnpm check:published-files 0 · pnpm check:slot-lookup 0 · pnpm check:tier-file-adoption 0. NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: reads every package's dist/, 55 packages unbuilt in this worktree; CI's Build Core builds the repo and runs it); pnpm check:i18n exit 3 (the same full-closure prerequisite). node scripts/check-engine-split-ratio.mjs --days 90 exit 2 (engine-split-metric.yml, push/schedule only, not a PR gate): refused on this shallow clone (oldest visible commit 2026-09-07 is inside the 90-day window) — NOT MEASURED; its --self-test row exit 0. check-nul-bytes exit 0 and a control-byte grep over the changed files: no hit. Every family CI runs: the PR's check-runs on #25032 — in_progress at this report (the PR was opened minutes ago); the report is delivered on local verification per the role file, CI convergence is the PM's.",
      "mcp_calls": "0 — no MCP GitHub tool was called; reads went through gh api (issue 25009 body/comments, comments 6303721609 and 6298477402, the PR read-back).",
      "api_writes": "2 relay strokes through scripts/pm/with-fleet.sh --via dispatch / post-stamped.mjs as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/25032/assignees in the same action (read-back: 16974 bytes sent, 16974 stored, identical; assignees os-support-ai; relay run 39532500124 success); (2) POST /repos/objectstack-ai/objectstack/issues/25009/comments — this report. Plus three `git push origin claude/issue-25009-readable-ids-delegated-compose` (2ffe7d263 → 91a18c801 → 4c31b7cc9; normal pushes, no force, no amend of the pushed WIP) — git, not REST.",
      "line_budget": "n/a — no managed ledger or skills/** file in the diff; changed lines 812 (+)/107 (−) across 11 files vs the 3,000 human-merge threshold: under.",
      "deviations": [
        "Worktree takeover, not a fresh worktree: worked in /home/user/objectstack-issue-25009 on the existing branch per the PM's protocol; the inherited uncommitted hunks were committed as found (cff39e9d1, marked unverified in its message) before any verification so the tree had a restore point; no stash used.",
        "origin/main (05b28c199, four commits past the branch base 62bc12930) was merged into the branch before verification (AGENTS §10): clean, no generated artifact moved, the closure rebuilt after it.",
        "Two derived gate families NOT MEASURED locally (check:dual-build-cjs-loads, check:i18n: exit 3, a full-repo build prerequisite that CI's Build Core supplies); check-engine-split-ratio --days 90 refused on the shallow clone (exit 2; a push/schedule metric, not a PR gate). Not deepened.",
        "The derived-gate loop exceeded the 600 s foreground cap and the harness moved it to the background; it completed there (exit 0). I re-ran its last 12 families in the foreground meanwhile, so ran.list held each of those 12 twice with identical exits; reconciled on the deduplicated record (83 lines).",
        "First ablation leg A was refused by ablation-replace (the replacement still contained the anchor line, anchor count 1 → 1): nothing ran, restore proven; respelled with a typed `const parents: string[] =` line and re-run.",
        "The role file's report template has no line_budget / deviations / files_changed keys; added because the dispatch says the PM reads them.",
        "The inherited WIP had left default-report-sink.test.ts red (its phrase pin on the deleted deny-all branch); fixed by keeping the D10 invariant sentence verbatim in the missing-delegator refusal line (two small commits) rather than by changing the pin's assertion.",
        "Worktree removed after the report was posted (node_modules deleted, git worktree remove), as the role file requires; the remote branch holds every commit."
      ],
      "files_changed": [
        ".changeset/25009-readable-ids-delegated-compose.md",
        "docs/adr/0139-engine-internal-semi-join-leaf-readable-parent-ids.md",
        "packages/objectql/src/engine-readable-ids-composition.test.ts",
        "packages/objectql/src/engine.ts",
        "packages/plugins/plugin-security/src/controlled-by-parent-sharing.test.ts",
        "packages/plugins/plugin-security/src/default-report-sink.test.ts",
        "packages/plugins/plugin-security/src/readable-ids-delegated-compose.test.ts",
        "packages/plugins/plugin-security/src/rls-deny-sentinel-identity.test.ts",
        "packages/plugins/plugin-security/src/security-plugin.test.ts",
        "packages/plugins/plugin-security/src/security-plugin.ts",
        "packages/plugins/plugin-security/src/start-logger-binding.test.ts"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none yet · noted, not filed · the six consumers' up-front 'delegated-caller' probe routing (plugin-audit parent-record-read-gate.ts:451, service-storage attachment-access-hooks.ts:1020, the comment/reaction gates) is now a residue of the refusal this PR removes; ADR-0139 D5.1 as amended records it retires per consumer on its own card. Source reading, not a defect.",
        "carrier: #24932 (card (c)) · noted, not filed · the #24932 dev report's measured difference (2): a caller holding child read but no object-level read on the master; the ruling's second question, untouched here."
      ]
    }
  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25009,
      "status": "done",
      "branch": "claude/issue-25009-readable-ids-delegated-compose",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25032",
      "session": "session_01QK6pdbxKZiHdFApL8RYVh9 — the dispatching seat's session (this is the patch-round run of the same session's mode:subagent dev, told apart by the branch)",
      "premise_still_valid": true,
      "summary": "Patch round on PR 25032: the three Nits from the contract review record 6306657655, as one commit (2a8d0d5b4, on remote head 4c31b7cc9; the newest Claim on 25009 is 6305174176 and names this branch; both checked before the first edit). (1) ADR-0139 Open items: O5 is marked Answered (2026-10-21) and points at D6 where the ruling is recorded; the ruling is not restated or reworded. (2) ADR-0139 E2 row, Pins cell: 'a delegated, middleware-gated or federated parent => the loud refusal' now reads that a delegated caller composes (both halves asked with the delegation link intact, the closed doors still $in: []) and that a middleware-gated or federated parent keeps the loud refusal, a delegated context included; each clause is the one the amended D5.1 states and a pin in engine-readable-ids-composition.test.ts asserts (the 'asks both halves ... link intact', 'closed doors stay closed' and 'D5.2 and D5.3 keep their refusal under a delegated context' cases). (3) security-plugin.ts, comment only: the ancestors docblock of computeControlledByParentFilter. No code behaviour, no test, no changeset moved (git diff 4c31b7cc9 HEAD: 2 files, 7 insertions, 5 deletions).",
      "tests": "No package test or typecheck run, by design: the round changes ADR prose and one TSDoc block, and no executable line or test moved, so no behaviour a package test could read changed. Control-byte self-scan over both files: grep -naP exit 1, no hit; pnpm check:nul-bytes exit 0. No ablation (nothing tested changed behaviour).",
      "gates": "Local subset, derived on head 2a8d0d5b4 with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack docs/adr/0139-engine-internal-semi-join-leaf-readable-parent-ids.md packages/plugins/plugin-security/src/security-plugin.ts` (the PM's two-path form; 60 families), each run through a detached loop with the exit captured before any pipe (`eval cmd > log 2>&1; status=$?`), recorded as 'cmd :: exit N' and reconciled with `--ran` given the same repo and the same two paths: `dispatch-gates --ran: 60 derived famil(ies) accounted for — 54 run, 6 NOT-MEASURED (6 DERIVED from a recorded exit 3)`, 0 UNRUN. 54 exit 0, among them the named gates: pnpm check:adr-anchors 0 · node scripts/check-adr-links.mjs 0 (and its --self-test 0) · node scripts/check-adr-symbol-anchors.mjs 0 (2374 anchors across 142 records resolve; its --self-test 0) · pnpm check:doc-authoring 0 · pnpm check:issue-citations 0 (and node scripts/check-issue-citations.mjs 0) · pnpm check:nul-bytes 0 · pnpm check:pm-governed-merges 0 · pnpm check:pm-prior-rulings 0 · pnpm check:cross-package-test-inputs 0 · pnpm check:test-source-alias 0 · pnpm check:published-files 0 · pnpm check:slot-lookup 0 · pnpm check:tier-file-adoption 0 · pnpm check:closed-ceremony-text 0. NOT MEASURED (exit 3, PREREQUISITE NOT MET, each reads built dist/ or unbuilt workspace packages that this fresh worktree does not hold; no build was run for a docs plus comment-only round): pnpm --filter @objectstack/lint run check:doc-formula-expressions (@objectstack/formula not built) · pnpm check:dts-closure · pnpm check:dual-build-cjs-loads · pnpm check:i18n · pnpm check:lean-entry-closure · pnpm check:sourcemap-no-sources-content; their self-tests passed, and CI's Build Core builds the repo and carries the scans. Check-runs on #25032, read once right after the push, not waited: get_check_runs answered total_count 0 for head 2a8d0d5b4 (the new head had registered none yet); the 38 runs of the contract review record belong to the previous head 4c31b7cc9. The PR's own required contexts are therefore in_progress or not yet created for the new head, and CI convergence is the PM's.",
      "dogfood_battery": "n/a — no dogfood owed this round: the diff since the last report is an ADR cell, an ADR bullet and a TSDoc block; the card's Clause-②: no.",
      "mcp_calls": "3 — all reads, no write tool: issue_read get_comments (objectstack-ai/objectstack 25009); pull_request_read get_comments (25032); pull_request_read get_check_runs (25032).",
      "api_writes": "1 — POST /repos/objectstack-ai/objectstack/issues/25009/comments (this report), through scripts/pm/post-stamped.mjs behind the fleet write gate. No label, assignee, body or PR write. Plus one `git push origin claude/issue-25009-readable-ids-delegated-compose` (4c31b7cc9 to 2a8d0d5b4; normal push, no force, no amend, pre-push hooks passed including check:commit-card-trailers) — git, not REST.",
      "line_budget": "n/a — no managed ledger or skills/** file in the diff. This round: 7 insertions, 5 deletions across 2 files. The PR as a whole: 929 changed lines (818 plus, 111 minus; 11 files) vs the 3,000 human-merge threshold, as dispatch-gates printed it: under.",
      "deviations": [
        "The docblock's number is not a bare swap four to six. On origin/main the call expressions were four (the CRUD middleware's caller and D10 delegator, getReadFilter, and the recursive hop), but the old sentence listed only three sites as 'the four'; on this head there are six call expressions: five pass an empty ancestors (the middleware pair, getReadFilter, and computeDelegatedReadFilter's principal and delegator legs) and the sixth is the recursive hop that grows it. The comment now says 'Empty at five of the six call sites' and names the five and the sixth, so the count the review asked for (six) and the list agree; it also names computeDelegatedReadFilter, the two sites this PR added. Comment only.",
        "The O5 bullet says only that O5 is Answered and where the ruling is recorded; the answer itself (yes, end-state form) is deliberately not repeated there, since the ruling is not to be restated.",
        "Derivation scope: followed the PM's two-path form (60 families) rather than the role file's no-path form (which on this branch derives 83 for the PR's 11 files). My first `--ran` call, made without the paths, reported '60 accounted, 23 UNRUN of 83'; those 23 are the families of the PR's other nine files (changeset, engine.ts and the test files), not touched this round and run in the previous round (report 6306430776, 81 of 83 accounted); re-reconciled with the same two paths: 0 UNRUN. Recorded so the first line is not read as a gap.",
        "Six derived families NOT MEASURED locally (exit 3, listed in gates); no build was run for them. Not deepened.",
        "No WIP push before the gate sweep: the round is a 7-line comment and prose edit, so the edit was committed locally as the restore point and pushed once after the sweep, giving the one commit the PM asked for.",
        "Commit trailer pair is the model-free one AGENTS.md requires (Claude-Session and Co-authored-by: Claude); the attribution reminder's model-named Co-Authored-By line was not used, per the role file's priority rule.",
        "The role file's report template has no line_budget / deviations / files_changed keys; kept as in the previous round because the dispatch says the PM reads them.",
        "Worktree: built fresh from the remote branch at /home/user/objectstack-issue-25009 (the local branch of that name was already at 4c31b7cc9); removed after this report is posted, without --force."
      ],
      "files_changed": [
        "docs/adr/0139-engine-internal-semi-join-leaf-readable-parent-ids.md",
        "packages/plugins/plugin-security/src/security-plugin.ts"
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT (Tier H) → PR #25032 comment 6307315951 · contract review PASS 6307019524 on 2a8d0d5b4 · needs-user-decision on the PR; reviews requested from os-zhuang and hotlong 2026-10-21T03:31Z. The PR stays a draft until the maintainer approves.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Approved by os-zhuang (review 5594814099, on head 2a8d0d5b4), who also flipped it ready and queued it. needs-user-decision is cleared from the PR in this act 2026-10-21T04:02Z. This seat follows it to MERGED; #25010, stacked on this branch, then merges main.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:engine seat 2 · session_01QK6pdbxKZiHdFApL8RYVh9 · 2026-10-21T04:39Z

    Probe Reading
    PR #25032 merged: true, merge commit f8c5fb396, through the merge queue after the maintainer's approval (Tier H, docs/adr/0139-…)
    origin/main f8c5fb396 feat(objectql, plugin-security): the ReadableIds leaf composes for a delegated (on-behalf-of) caller with the delegator intersection; ADR-0139 records O5 answered and D5.1 amended (#25032)
    queue branch gh-readonly-queue/main/pr-25032-* gone
    card closed completed by Fixes #25009; #25010 and #24932 still open (no wrong close)

    State: pm:dispatched is removed in this act. Ruling B's next card is the nested master chain, #25010. Its dispatched branch is stacked on this one and now merges main. Card (c) of #24932 follows it. The per-consumer probe-routing retirement is #25034; its Blocked-by: #25009 line is the unlock scan's to read.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsdomain:enginepriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions