Skip to content

records-forms.record-discussion-mentions: authorization-class finding (18.2.0 wave-2 sweep) — detail withheld pending maintainer #26453

Closed

Description

@objectstack-fleet

QA-source: #26450 · records-forms.record-discussion-mentions · observed beside the clauses

An authorization-class finding, observed during the 18.2.0 wave-2 Tier 1 sweep at framework 756220c4, on the item records-forms.record-discussion-mentions. It was found probing beside the clauses, not in a clause.

Detail withheld pending maintainer. This follows RUNNER rule 2's disclosure carve-out (maintainer ruling recorded on #9387). The reproduction is held in the runner session and in the wave-2 PM session.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    priority:p1High: required for production / M2
    on Oct 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-27T04:15Z
    Session: session_012YjcDon6BvR9MN93ZsFq3U
    Account: os-justin
    Branch: claude/issue-26453-mention-gate
    Worktree: objectstack-issue-26453
    Domain: domain:server
    File surface: packages/plugins/plugin-audit/src/** and its tests (stop on breach; explain in the report)
    Container & model: M, mode:subagent (disclosure-discipline card: the detail stays in-seat), model: default (dispatch-gates --tier: no path-derived mandate), effort: xhigh
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the platform's own write-side notification gate | none — the gate is the one door | any member reachable by the finding's precondition; stock deployments today
    Thread-read: none
    Premise: holds
    Serial constraints cleared: none

    Dispatched directly on the maintainer's word in the wave-2 session (2026-10-27), verbatim: 「如果有安全问题不能写issue的,直接派卡修复」 and 「使用 pm-dispatch 技能 派卡修复」 — recorded on #25807. Detail stays withheld pending maintainer: the card, the PR and every comment carry no reproduction.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26453,
      "status": "done",
      "branch": "claude/issue-26453-mention-gate",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26497",
      "session": "session_012YjcDon6BvR9MN93ZsFq3U — subagent run; the dispatching PM session's id, as the relay stamped it on the pr_create envelope",
      "premise_still_valid": true,
      "summary": "plugin-audit's mention recipient gate now runs a second read after the existing record read: each mentioned user's own read of the comment, by id, through resolveReadableParentIds in that user's resolved and vetted envelope. A user whose read does not return the comment is withheld, logged at warn with reason cannot_read_thread; a comment with no id withholds every candidate (no_comment_id); comment text is never logged. The gate's module header is rewritten so its claims hold. COMMENT_OBJECT is now exported from the internal comment-access-hooks.ts module; the package index is unchanged. Doc comments in audit-writers.ts and audit-plugin.ts state the two-read rule, and a patch changeset is added. The mechanism hypothesis was confirmed by code reading, by the committed engine-layer pin and its ablation, and by a one-time throwaway check in a real composition whose mutated leg went red. The card's premise held.",
      "tests": [
        "pnpm --filter @objectstack/plugin-audit exec vitest run --maxWorkers=2 src/mention-recipient-gate.integration.test.ts -> Test Files 1 passed (1), Tests 15 passed (15), VERDICT command-exit 0 (at 912eeac7c1; file unchanged since)",
        "pnpm --filter @objectstack/plugin-audit test -> Test Files 64 passed (64), Tests 1028 passed (1028), VERDICT command-exit 0 (at 88a2b6cd2d)",
        "pnpm --filter @objectstack/plugin-audit typecheck -> tsc --noEmit, tsc -p tsconfig.scripts.json and check:test-typecheck OK, VERDICT command-exit 0 (at 88a2b6cd2d); tsc --listFiles shows that tsconfig.test.json compiles both the gate and the integration test",
        "ablation, engine layer (the subject resolves through relative src imports, so no rebuild): scripts/ablation-replace.mjs --delete on the comment-read else-if line; anchor 1 -> 0, blob 1ee01f81f182 -> 47e854c54865; Tests 5 failed | 10 passed (15), i.e. the five new gate pins red and the stand-in control green; restore: blob == HEAD 1ee01f81f182, git diff HEAD empty",
        "one-time throwaway check in a real composition (dogfood bootStack with the real plugin-security, plugin-audit and messaging, driven through the REST layer; never committed, deleted afterwards): fix leg 2/2; mutated leg (plugin-audit rebuilt, ablation-dist-preflight --absent showed the marker absent from all built files) 1 failed | 1 passed, the predicted red; restore leg rebuild exit 0, preflight showed the marker present in dist/, 2/2; git status --porcelain empty after deletion. The mutated leg's build exited 1 at its DTS stage after writing the JS bundles the suite consumes, so the dist/ preflight reading, not the build exit code, certifies that leg."
      ],
      "gates": [
        "local subset at 88a2b6cd2d: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands derived 64 commands; all 64 exit 0, each code captured before any pipe",
        "check:dual-build-cjs-loads first read exit 1 while a concurrent closure build of mine was rewriting dist/ (a missing CJS file in a package this diff does not touch); re-run on the quiet tree: exit 0, 112 entry points across 69 packages load",
        "--ran reconciliation exit 0: \"64 derived famil(ies) accounted for — 64 run, 0 NOT-MEASURED (a DERIVED zero — all 64 recorded an exit code and none of them is 3)\"",
        "pre-merge run at 428f1f9c20: 62 exit 0 and 2 exit 3 PREREQUISITE NOT MET (check:dual-build-cjs-loads, check:i18n); both were measured green at 88a2b6cd2d",
        "narrowed spot readings: require(plugin-audit dist/index.js) exit 0; import(dist/index.mjs) exit 0; control-byte grep over the 6 changed files: no match",
        "CI families, from the PR #26497 check-runs at 88a2b6cd2d, one snapshot right after pr_create, not waited on: Governed Surface Queue Guard success; No other open PR may claim the same issue success; 18.x upgrade harness skipped; Packed-tarball smoke skipped; every Lint ·, Type Check ·, Check Changeset, Check PR Size and claim check in_progress"
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay stroke: pr_create draft with assignees os-justin, giving #26497; body read back 12402/12402 bytes identical); POST /repos/objectstack-ai/objectstack/dispatches (relay stroke: comment on #26453 carrying this report). git push is not a REST write and is not counted; reads were GETs only",
      "deviations": [
        "merged origin/main (10 commits, none in plugin-audit, core or objectql) into the branch before opening the PR, per AGENTS.md §10; then rebuilt the closure and re-ran the package tests and the full derived gate list on the merged head 88a2b6cd2d",
        "a one-time throwaway dogfood test was placed under packages/qa/dogfood/test, outside the declared file surface, for the real-composition check; it was never committed and was deleted, and the tree is clean",
        "test:repo (the vitest repo project) was not run locally: it belongs to CI Test Core, and this diff changes no test in that project",
        "per the dispatch's disclosure discipline, this report and every GitHub text keep to neutral, machine-checkable content; detail at the level of the reproduction stays in-seat"
      ],
      "files_changed": [
        ".changeset/26453-mention-recipient-reads-comment.md",
        "packages/plugins/plugin-audit/src/audit-plugin.ts (comment only)",
        "packages/plugins/plugin-audit/src/audit-writers.ts (comments only)",
        "packages/plugins/plugin-audit/src/comment-access-hooks.ts (exports COMMENT_OBJECT)",
        "packages/plugins/plugin-audit/src/mention-recipient-gate.integration.test.ts",
        "packages/plugins/plugin-audit/src/mention-recipient-gate.ts"
      ],
      "open_questions": [
        {
          "question": "The card's QA item (records-forms.record-discussion-mentions) scores its bell clause against a mentioned persona. After this fix, that clause holds only when the persona may read the comment as well as the record. Does the item need a persona or fixture note? Detail is held in-seat with the reproduction.",
          "options": [
            "A — PM checks the item's mention-target persona against the new rule in-seat and amends the item if needed",
            "B — no change"
          ],
          "recommendation": "A, because it is a short in-seat check, and the item text is the only place a future checklist run would learn the rule before scoring the clause"
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · producer sweep: no other notification producer copies comment text; approval.comment in plugin-approvals is a different object with its own audience · noted, not filed"
      ]
    }
  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26497 comment 6435187239 · 2026-10-27T06:17Z · landing armed (ready + auto-merge via the relay).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · session_012YjcDon6BvR9MN93ZsFq3U · 2026-10-27T06:36Z

    probe reading
    PR #26497 merged 2026-10-27T06:34:49Z through the merge queue, merge commit c3fb185a758f
    origin/main contains c3fb185a758f (head c3fb185a75, the #26497 merge)
    queue branch no gh-readonly-queue/main/* ref left for #26497
    this card closed completed by the PR's Fixes; pm:dispatched removed now

    Detail stays withheld pending maintainer. Follow-up owed (not this card): the QA item records-forms.record-discussion-mentions needs its mention-target persona to read comments as well as the record, or its bell clause will score against the fixed rule.


    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:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2security

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions