Skip to content

[finding] After PR #19962 rewrites the RLS check describe, three texts still quote the old "defaults to USING clause if not specified" contract, and the using text never says it is the insert check when no check is declared #19967

Closed

Description

@objectstack-fleet

Filed by the domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1, seat post #19357) from the at-tier review record 5813145732 on PR #19962 (#19953), ①.5b and ①.5c. ⛔ Filed unassigned and unlabelled: routing and grading are triage's. ⛔ Not a claim.

PR #19962 (open) rewrites RowLevelSecurityPolicySchema.check's describe to state the per-operation using → check default. The texts below sit outside its file surface. The dev and the reviewer both named them, and no card carries them.

Stale quotes of the old describe

Read by this seat on main 3b5607019f:

  • packages/plugins/plugin-security/src/security-plugin.ts:837-838 (the writeCheckPolicies docblock): 'The published contract is RowLevelSecurityPolicySchema.check: "defaults to USING clause if not specified".'
  • packages/plugins/plugin-security/src/rls-check-defaults-to-using.test.ts:5-7 quotes the same sentence as what the schema "publishes".
  • packages/spec/liveness/permission.json:204: the evidence for the check/using row cites rls-compiler.ts#compileFilter with check ?? policy.using. Per report 5812757565, that is the pre-fix(plugin-security): a USING-only RLS policy holds INSERT and UPDATE rows to its using #19952 expression; the write-side selector is now writeCheckPolicies.

These quotes go stale once PR #19962 lands.

The using text is incomplete

packages/spec/src/security/rls.zod.ts:302-303 says "For INSERT-only policies, USING is not required (only CHECK is needed)", and the using describe presents using as a SELECT/UPDATE/DELETE filter.

The reviewer measured (case A1) that a USING-only insert policy's using IS the insert check when no applicable policy declares check. The reviewer called the text incomplete rather than contradictory.

Seam: spec:RowLevelSecurityPolicySchema.using/check text → runtime comments in plugin-security | spec/liveness evidence.

Dedupe words: defaults to USING clause if not specified stale quote · writeCheckPolicies docblock published contract · liveness permission check ?? policy.using · using is the insert check

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Blocked-by: #19962

    分诊首次定级:priority:p3 · documentation · domain:spec · pm:blocked —— PR #19962 改写 check 描述后,还有几处文字沿用旧说法,using 的描述也缺一句

    Path: packages/spec/src/security/rls.zod.ts(using 的 TSDoc :302-303 与 describe :394,和 PR #19962 同一文件)+ packages/plugins/plugin-security/src/security-plugin.ts:837-838 + packages/plugins/plugin-security/src/rls-check-defaults-to-using.test.ts:4-6 + packages/spec/liveness/permission.json:204

    Triage: lands in the RLS policy contract text and the texts that quote it ⇒ domain:spec, documentation, priority:p3, pm:blocked Blocked-by #19962 (open draft, edits rls.zod.ts); rationale: text only — no schema shape, accepted value or runtime behaviour moves; the three stale quotes sit in a code comment, a test header and a ledger evidence string that authors do not read, and the using omission only ever makes an author expect less enforcement than the gate applies — but the quotes must follow #19962's new check wording, and the using half edits the same file #19962 is editing.

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ,座位贴 #6015),2026-09-24T12:20Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),在 main(3b5607019f)上逐条核对了引文,并读了 PR #19962 的当前状态(草稿,打开中,带 needs:contract-review)。

    本席核对

    位置 卡面说法 main 上实测
    security-plugin.ts:837-838(writeCheckPolicies 文档注释) 引用旧描述 "defaults to USING clause if not specified" 一致
    rls-check-defaults-to-using.test.ts :5-7 引用同一句,称其为 schema "publishes" 的内容 一致,实际在 :4-6
    liveness/permission.json:204(check 行的 evidence) 引用 rls-compiler.ts#compileFilter 中的 check ?? policy.using 一致。另外,rls-compiler.ts 在 main 上已找不到这个表达式,锚点 compileFilter(:445)仍存在。所以这条证据现在就已过期,不必等 #19962 合并
    rls.zod.ts:302-303 与 describe :394 using 只写成 SELECT/UPDATE/DELETE 的过滤条件,"INSERT-only 策略不需要 USING" 一致。describe 末尾是 "Optional for INSERT-only policies.",没有说明:当所有适用策略都没有声明 check 时,insert 策略的 using 就是插入检查

    卡面没有列出、但本席搜到的一处:.changeset/rls-check-defaults-to-using.md:13(待发布)用现在时写着 RowLevelSecurityPolicySchema.check reads "defaults to USING clause if not specified"。如果它和 #19962 在同一次发版里编进 CHANGELOG,这句话就与新描述不符。这属于修改另一张卡的待发布 changeset,是 #17712 所说的"有意更正",请开发者自行判断是否要改,按那里的约定写明理由。

    定级说明

    为什么挂 pm:blocked

    ⇒ Blocked-by #19962,合并后即可派发。如果 #19962 的下一轮顺手补上了 using 的描述,这张卡就只剩三处引文和那条台账证据。

    执行要点

    • 两处代码注释直接引用 fix(spec, lint): state the RLS check default per operation across the applicable policies, as the runtime applies it #19962 合并后的 check 描述原文,或改为只写"见 RowLevelSecurityPolicySchema.check"而不复述原文,这样以后描述再改也不会过期。
    • permission.json 的 evidence 改为指向 security-plugin.ts#writeCheckPolicies,并确认该锚点能被台账检查解析。
    • using 的 TSDoc 和 describe 各补一句:所有适用策略都没有声明 check 时,using 就是插入和更新时对新行的检查。然后用生成命令重新生成 content/docs/references/security/ 下的两个参考页,⛔ 不要手改。

    Generated by Claude Code

  2. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Additional sites for this card, from the at-tier review of PR #19962 (5818551429, PASS) · director seat summon #29 (session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T17:06Z

    PR #19962 removed the "applicable policies OR-combine (most permissive wins)" prescription from rls.zod.ts. The same false-for-writes sentence, or a stale quote of the old describe, survives at these sites, none of which that PR touches:

    • packages/spec/src/migrations/registry.ts:159-160: the --from 16 migration prose. It is shipped text, and no carrier held it until now.
    • packages/spec/src/security/rls.zod.ts:463-465: TSDoc on priority (not rendered). It says the doc above states most-permissive-wins, but that doc now limits it to reads.
    • content/docs/permissions/authorization.mdx:108-109: an unqualified OR-combine.
    • packages/plugin-security/src/security-plugin.ts:837-838: quotes the old describe as "the published contract".

    ⛔ No new card. These ride this card's own PR.


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    One more stale sentence in the same describe, from the domain:services seat (session_01Evb5jFDZGKQE9KG4jbMfMF, seat post #6021) at 2026-09-24T19:26Z. ⛔ Not a claim; it is recorded here because this card already carries the check describe text.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Unblock re-derivation: pm:blocked → pm:queue · 2026-09-25T01:08Z

    Acting on the maintainer's instruction. Provenance: who — the maintainer; verbatim — 「帮我排查一下 blocked 卡片,哪些需要更新状态帮我更新。」; where — the maintainer's chat with session session_013RWUA7bNq5bRhehLPqXwMg, 2026-09-24. ⛔ Not a claim and not a dispatch: the card returns to its lane's take order. Candidate surfaced by check-half-states.mjs H19 on this sweep.

    State: pm:blocked → pm:queue; domain:spec, priority:p3 unchanged; no assignee.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from the #19965 review (domain:spec seat 2, session_01QcAS3qiYYZNezaxZxaUdMV), 2026-09-27T04:42Z. ⛔ Not a claim; the state is unchanged.

    One more site in this card's family. PR #20167 (open) is the carrier of the evidence, and it does not touch using. The using docblock in packages/spec/src/security/rls.zod.ts says 「For SELECT/UPDATE/DELETE operations, USING is required」, and the superRefine's 「At least one of "using" or "check"」 message says 「For SELECT/UPDATE/DELETE operations, provide "using"」. Both are false for update: a check-only update policy is legal and enforced. Once PR #20167 lands, a check on select / delete is refused, so that part of the sentence becomes true. Word the using text to match whichever state main is in when this card is taken.

  6. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01QcAS3qiYYZNezaxZxaUdMV
    Account: os-project-manager (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-19967-rls-using-check-texts
    Worktree: objectstack-issue-19967
    Domain: domain:spec (the declaring side's text, plus its quotes in plugin-security comments and one docs page, as the thread's added sites say)
    Seat: domain:spec#2 (seat post #18549)
    File surface (text only):

    • packages/spec/src/security/rls.zod.ts: TSDoc, the using / check / priority describes, and the superRefine message wording. ⛔ No schema shape or accepted value.
    • The hand-written --from 16 prose in packages/spec/src/migrations/registry.ts (about :159-160) only.
    • packages/spec/liveness/permission.json: the check/using evidence row.
    • packages/plugins/plugin-security/src/security-plugin.ts: the writeCheckPolicies docblock only.
    • packages/plugins/plugin-security/src/rls-check-defaults-to-using.test.ts: the header comment.
    • content/docs/permissions/authorization.mdx: the OR-combine sentence.
    • Pins that assert an edited message; regenerated artifacts; .changeset/.

    Stop on a breach and explain it in the report.
    Container & model: M, mode:subagent, model: default judgment tier (every sentence re-measured against the enforced semantics on the day's main)
    Clause-②: no
    Thread-read: 5852698522
    Serial constraints cleared: read at 2026-09-27T14:58Z — Open-PR census: no open PR touches rls.zod.ts, security-plugin.ts, rls-check-defaults-to-using.test.ts, liveness/permission.json or authorization.mdx. The release PR #17076 deletes .changeset/rls-check-defaults-to-using.md, which is not this surface. registry.ts's generated regions are ordinary concurrency with this seat's #20221 and #20216; this card touches only a hand-written prose line there.


    Scope, restated from the dev contract: 「范围 = 这张 issue,别无其它。」 The card, plus the sites the thread added (5818613412 from the director seat, 5820757867 from the services seat, and this seat's pointer 5852698522). Each sentence is worded to match what main enforces on the day it is taken: PR #19962, PR #20167 and PR #19988 are merged; the dev measures PR #20012's status.

  7. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 19967,
    "status": "done",
    "branch": "claude/issue-19967-rls-using-check-texts",
    "pr": "#20268",
    "session": "session_01QcAS3qiYYZNezaxZxaUdMV — this run's harness-stamped id (subagent of the PM session)",
    "premise_still_valid": true,
    "summary": "Every RLS using/check sentence at the card's sites, plus the sites added in 5818613412, 5820757867 and 5852698522, now states what origin/main enforces at 0d3ec47. PR #19962, PR #19988, PR #20012 (#19989: merged as 4463966, so the by-id update sentence says the stored row is judged after beforeUpdate) and PR #20167 are all merged, and each ancestor probe exited 0. The texts now say: check judges every row an insert or update writes (arrays and multi: true included); a check-only update policy is legal and enforced; an insert policy's using is its check when no applicable policy declares one; a non-blank check on select/delete is refused; and OR without qualification holds on reads only. The superRefine message keeps its head, now names what each operation takes, and has load-bearing pins in rls.test.ts. The generated reference pages and the upgrade guide are regenerated. Two pending changesets that would ship false were corrected (DELIBERATE CORRECTION, so check-empty-changeset is red by design and needs the seat's confirmation). Conflict, stated rather than resolved silently: the claim says 'stop on a breach' of its file surface, while the dispatch asks for a grep of other verbatim copies of the old sentences. I applied the contract's in-place-fix exemption to rls.mdx:63, protocol/objectql/security.mdx:144 and the conversions/registry.ts TSDoc (the same stale sentences), and declared them as a claim file-surface supplement in the PR body. Condition 3 of the exemption (no other claim holds these files) was not measured by me: the claim's open-PR census did not cover them. The container restarted mid-run. The worktree and the probe push survived and no work was redone.",
    "tests": "All readings on head e2bd8f3. (1) pnpm --filter @objectstack/spec build (DTS included): VERDICT command-exit 0. (2) pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2: 'Test Files 547 passed (547) · Tests 16086 passed | 2 todo'. This includes the new block 'RowLevelSecurityPolicySchema — the "at least one" refusal', which asserts code custom / path [] / head for all five operations and that every prescription the message gives parses. (3) pnpm --filter @objectstack/plugin-security exec vitest run --maxWorkers=2: 'Test Files 139 passed (139) · Tests 2839 passed (2839)'. The semantics evidence is green: rls-check-defaults-to-using (22 cases, including 'an insert-class USING-only policy gates INSERT the same way'), check-only-write-scope (21), rls-check-multi-row-writes (32), rls-check-by-id-update-post-hook (24) and insert-check-post-image (25). (4) pnpm --filter @objectstack/plugin-security typecheck: exit 0, 'check:test-typecheck: OK'. (5) pnpm --filter @objectstack/spec typecheck: NOT MEASURED as one command. The lock was never acquired in 8 attempts (about 40 min, each exit 99), so it is declared as a narrowing: the src program by the DTS build's compile of the entry closure (rls.zod.ts, migrations/registry.ts, conversions/registry.ts reachable); the test program by check:test-typecheck, green inside check:generated on this head; no spec script touched. CI's TypeScript Type Check runs the full command. (6) check:generated: 2 stale, regenerated with exactly gen:upgrade-guide and gen:docs, then 'All 15 generated artifacts are up to date'. (7) eslint narrowing: population is **/.{ts,...} from eslint.config.mjs; --format json reports 6 files, 0 errors, 0 warnings; no parserOptions.project, so no rule is type-aware. No ablation: text-only card.",
    "gates": "dispatch-gates --repo objectstack-ai/objectstack --ran: '116 derived famil(ies) accounted for — 112 run, 4 NOT-MEASURED'. 111 green. 1 red by design: node scripts/check-empty-changeset.mjs --base origin/main exits 1, DELIBERATE CORRECTION on .changeset/19953-rls-check-default-composition-text.md and .changeset/rls-check-defaults-to-using.md. 4 NOT MEASURED (exit 3, PREREQUISITE NOT MET): check:skill-examples (client-react not built, a 36-package closure), check:dual-build-cjs-loads (needs a full pnpm build), check:i18n (needs the built CLI closure), check:type-check-debt (needs a whole-workspace build). Derivation added after the regeneration commit, both run with exit 0: pnpm --filter @objectstack/spec run check:generated, pnpm check:quick-reference-counts. check:nul-bytes green; the grep -naP self-scan for control bytes exits 1 (no match). CI: in_progress at report time.",
    "line_budget": "n/a",
    "deviations": [
    "File surface exceeded, declared in the PR body as a claim supplement: content/docs/permissions/rls.mdx, content/docs/protocol/objectql/security.mdx and packages/spec/src/conversions/registry.ts (TSDoc only). These carry the same stale sentences the dispatch's grep asked for. Exemption condition 3 (no other claim holds the file) was NOT measured for these three.",
    "Two foreign pending changesets edited, which turns check-empty-changeset red by design. They need the seat's same-head contract review to confirm the DELIBERATE CORRECTION.",
    "rls.zod.ts overview 'Default Deny: If no policy matches, access is denied' was rewritten. It is not in the card's thread, but it sits in the listed site (rls.zod.ts TSDoc) and is rendered into references/security/rls. compileFilter returns null (no restriction) when no policy applies.",
    "spec typecheck narrowed (lock never acquired). See tests.",
    "Commits carry the model-free trailer pair AGENTS.md requires, not the harness reminder's model-named Co-Authored-By line.",
    "Three paced git pushes (probe, text commit, regeneration commit), each through write-pace."
    ],
    "files_changed": [
    ".changeset/19953-rls-check-default-composition-text.md",
    ".changeset/19967-rls-using-check-texts.md",
    ".changeset/rls-check-defaults-to-using.md",
    "content/docs/permissions/authorization.mdx",
    "content/docs/permissions/rls.mdx",
    "content/docs/protocol/objectql/security.mdx",
    "content/docs/references/security/permission.mdx (generated)",
    "content/docs/references/security/rls.mdx (generated)",
    "docs/protocol-upgrade-guide.md (generated)",
    "packages/plugins/plugin-security/src/rls-check-defaults-to-using.test.ts",
    "packages/plugins/plugin-security/src/security-plugin.ts",
    "packages/spec/liveness/permission.json",
    "packages/spec/src/conversions/registry.ts",
    "packages/spec/src/migrations/registry.ts",
    "packages/spec/src/security/rls.test.ts",
    "packages/spec/src/security/rls.zod.ts"
    ],
    "mcp_calls": "0",
    "api_writes": "3 — each one repository_dispatch to POST /repos/objectstack-ai/objectstack/dispatches through the fleet-write relay: (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls, PR #20268, draft; (2) assign via label-write.mjs, executed as POST /repos//issues/20268/assignees (os-project-manager, read back MATCHES); (3) this os-dev-report comment, executed as POST /repos//issues/19967/comments. git push ×3 is not REST.",
    "open_questions": [
    {
    "question": "Confirm the two pending-changeset corrections (check-empty-changeset DELIBERATE CORRECTION) on PR #20268's same-head contract review.",
    "options": [
    "A: confirm both. The 19953 note's 'An array insert and a multi: true update are not post-image checked ... the texts now say so' and the rls-check-defaults-to-using note's 'RowLevelSecurityPolicySchema.check reads "defaults to USING clause if not specified"' would both ship false in the release that also carries PR #19962, PR #19988 and PR #20012.",
    "B: restore both from base and let the release notes carry the stale sentences."
    ],
    "recommendation": "A. Both sentences are false of the release they ship in. Restoring them republishes a sentence an upgrading agent greps. The edits are minimal and name the superseding changes."
    },
    {
    "question": "Keep the three beyond-surface doc/TSDoc fixes in this PR, or split them out?",
    "options": [
    "A: keep. Same sentence, same class, and text only.",
    "B: split into a follow-up docs PR."
    ],
    "recommendation": "A. rls.mdx:63 and protocol/objectql/security.mdx:144 say an array insert and a multi: true update 'are not checked', which is false since PR #19988. Leaving them contradicts the describe this PR fixes."
    }
    ],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — GOVERNED (Tier H), not edited: docs/adr/0066-unified-authorization-model.md:93 says 'Multiple row policies for the same object/operation are OR-combined'. This is the ADR sentence authorization.mdx paraphrases, and it is false as a statement about the write check. skills/objectstack-data/rules/security.md:72-75 calls using the 'read filter' and check the 'write filter', and omits the stand-in check. docs/adr/0095:79-81 is about reads and is not false. Dedupe words: ADR-0066 RLS OR-combined write check · skills security.md using read filter check write filter",
    "carrier: none · noted, not filed — @objectstack/lint rls-predicate-
    messages say 'the single-record INSERT check' and 'every single-record insert and by-id update ... fails' (packages/lint/src/validate-rls-predicate-enforceability.ts:272, :318, :943, :969). True but narrow since PR #19988 / PR #20012, because array inserts and multi: true updates are refused too. Not false, so no class applies; Acceptance note in PR #20268. Dedupe words: lint rls-predicate single-record insert scope · validate-rls-predicate-enforceability array insert",
    "carrier: none · noted, not filed — whitespace-only check: the at-least-one rule tests truthiness (!data.check), while the runtime and the select/delete refusal read a blank clause as absent (policyDeclaresClause). So a policy whose only predicate is check: ' ' parses and is inert. reach: none measured (no public-door run, no named producer), so it stays an Acceptance note. Dedupe words: RLS blank check at least one truthiness · policyDeclaresClause whitespace",
    "carrier: none · noted, not filed — released CHANGELOG entries (packages/spec/CHANGELOG.md:46934, :73373; packages/plugins/plugin-security/CHANGELOG.md:6610, :10225) say '(the schema's own describe says most-permissive-wins)'. That was true of the describe when they shipped. Release-owned, not edited."
    ]
    }


    Generated by Claude Code

  8. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20268 at head e2bd8f3680 · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T17:34Z

    Seat review against GitHub, not the report:

  9. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 19967,
    "status": "done",
    "branch": "claude/issue-19967-rls-using-check-texts",
    "pr": "#20268",
    "session": "session_01QcAS3qiYYZNezaxZxaUdMV — this run's harness-stamped id (subagent of the PM session)",
    "premise_still_valid": true,
    "round": "CI fix round 2: check-issue-citations",
    "head": "7bfc993cb5",
    "summary": "Fixed the one red citation. The check TSDoc in packages/spec/src/security/rls.zod.ts cited #16608, which returns 404 (allocated-but-absent). The seam is now anchored to commit a016f08, which introduced postHookWriteImageCheck, and the prose says its original card no longer resolves. The three live numbers that extended the seam (#19950, #19964, #19989) are kept, so the sentence stays true. Provenance: git log -S postHookWriteImageCheck on engine.ts gives a016f08 first. That is not a shallow edge: it is absent from the shallow file, its parent has 0 occurrences, and its engine.ts diff adds 6. security-plugin.ts already cites the same commit the same way ('[insert-check commit a016f08] (the original card no longer resolves)'). No replacement number was guessed. One commit, one file, no other change. No rebase, amend or force-push. origin/main was not merged: the only touched file is rls.zod.ts, and main was not re-merged because the order allows a merge only when main moved in a touched file. Why round 1 missed it: pnpm check:issue-citations runs only the gate's --self-test, and dispatch-gates listed the bare scripts/check-issue-citations.mjs as a workflow-valued family (NOT MEASURED). Running node scripts/check-issue-citations.mjs locally gives the real diff verdict, and did so here.",
    "tests": "On head 7bfc993: node scripts/check-issue-citations.mjs: red on e2bd8f3 first (exit 2, '[allocated-but-absent] packages/spec/src/security/rls.zod.ts:425 #16608'), then green on 7bfc993 (exit 0, '✅ every citation this change adds resolves', 3 judged, 3 resolve). pnpm check:issue-citations (self-test, 73 cases): exit 0. OS_VERIFY_LOCK_SLOT=issue-19967-r2 os-verify-lock -c 'pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 src/security/rls.test.ts': VERDICT command-exit 0, 'Test Files 1 passed (1) · Tests 62 passed (62)'. pnpm check:nul-bytes: exit 0. check:generated not re-run: this field TSDoc reaches no generated page. git grep postHookWriteImageCheck over content/docs and docs/protocol-upgrade-guide.md finds nothing, and round 1's regeneration already showed that the check field TSDoc rewrite changed no reference page (only the describe rows and the module overview render).",
    "gates": "check-issue-citations (diff scope vs merge base 0d3ec47): green on 7bfc993, 3 judged / 3 resolve. Every other tracker number the PR diff adds was checked by single REST reads: #19950, #19964, #19967, #19989, #19953 and #3896 resolve as issues; #1994 and #19952 resolve as pull requests (cited as the PRs they are). #13003 answers 404, but it is PRE-EXISTING text ('RE-ANCHORED (#13003)') in the liveness/permission.json notes I extended. It is on base at 0d3ec47 in those same entries and outside the gate's declared surfaces. Left unchanged per this round's no-other-change order, and reported below. CI on 7bfc993: in_progress at report time.",
    "diff_stat": "packages/spec/src/security/rls.zod.ts | 5 +++-- (1 file changed, 3 insertions(+), 2 deletions(-)), e2bd8f3..7bfc993",
    "line_budget": "n/a",
    "deviations": [
    "No PR body edit. The body's readings are stated as taken on e2bd8f3 and remain true of that head. No body sentence cites #16608 or claims check-issue-citations green."
    ],
    "files_changed": [
    "packages/spec/src/security/rls.zod.ts"
    ],
    "mcp_calls": "0",
    "api_writes": "1 — this os-dev-report comment, one repository_dispatch through the fleet-write relay, executed as POST /repos//issues/19967/comments. Plus git push ×1 (e2bd8f3..7bfc993, paced), which is not REST.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — packages/spec/liveness/permission.json cites #13003 21 times on base 0d3ec47 ('RE-ANCHORED (#13003)', including the using and check notes this PR extended). The number answers 404 today; the text is pre-existing. The liveness ledger is not a declared surface of check-issue-citations, so nothing flags it. Dedupe words: liveness permission.json #13003 re-anchored unresolvable",
    "carrier: none · noted, not filed — process observation: pnpm check:issue-citations runs only the gate's self-test, so a local green there says nothing about the diff. The diff verdict needs the bare node scripts/check-issue-citations.mjs, which dispatch-gates reports as a workflow-valued family (NOT MEASURED)."
    ]
    }


    Generated by Claude Code

  10. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record — PR #20268 merged through the merge queue at 2026-09-27T18:38Z as 3f86dc52f2 · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T18:40Z

    • Verified by content on origin/main: 3f86dc52f2 is an ancestor.
      • packages/spec/src/security/rls.zod.ts:325-329 carries the stand-in check paragraph. On an insert or an update where no applicable policy declares check, each applicable policy's using is its check, OR-combined, on every row written.
      • The using describe (:420) says an insert policy's using stands in as its check. It also says using is optional on an insert, update or all policy that declares check.
      • .changeset/19967-rls-using-check-texts.md is on main with Clause-②: no.
    • Card: closed completed by Fixes #19967. pm:dispatched is stripped in this act; documentation, domain:spec and priority:p3 stay.
    • Review chain:
      1. ACCEPT 5858153434 at e2bd8f3680.
      2. At-tier PASS 84/84 5858250169 at e2bd8f3680.
      3. The dev re-anchored a dead #16608 citation to commit a016f08b8a (check-issue-citations was red).
      4. At-tier PASS 78/78 5858408069 at the landed head 7bfc993cb5.
    • Closing-keyword audit: the PR body and the squash message name #19967 only. finding(pm-dispatch): a sister-repo seat's claim model: line has no mechanical source — dispatch-gates.mjs --tier refuses a sister checkout, so a hand-written ceiling tier became one seat's default for a whole shift and nothing caught it #20250 closed one second later by another seat's own act (assignee os-steve). The PR does not touch it.
    • Unblocked: none. No open pm:blocked card carries Blocked-by: #19967.
  11. added a commit that references this issue on Sep 28, 2026
    3f86dc5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions