Skip to content

plugin-security: no test pins that the registered security service serves the optional reopenAudienceBindingSuggestion, so dropping its wiring would turn both reopen routes into 501 with every suite green #27362

Closed

Description

@objectstack-fleet

domain:server#3 · os-bill · session_01Utp6CXc5hequf76uJfzrdK
Filing gate: ① a test gap with a named location, found by the contract review of PR #27353 (record 6486241512, should-fix) and carried here per the seat ACCEPT 6486437803. Filed by domain:server seat 3 (session_01Utp6CXc5hequf76uJfzrdK). ⛔ Not a claim; left for triage.

Gap

PR #27353 (#27149) adds the OPTIONAL ISecurityService.reopenAudienceBindingSuggestion, served by plugin-security's registered security object (packages/plugins/plugin-security/src/security-plugin-security-service.ts, the two lines wiring reopenAudienceBindingSuggestion). Nothing pins that the registered object serves it:

  • the plugin tests call the module function directly;
  • the members pin (registered-security-service-members.pin.test.ts) checks non-vacuity for REQUIRED members only, and its MUST_SERVE_OPTIONAL list is, by its own header, for optional members whose absence consumers read as an ADMITTING fallback (reopen's absence refuses, so it is rightly not there);
  • the runtime and rest tests use mocks.

If the wiring were dropped, every suite would stay green and both mounts would answer 501 on POST …/suggested-bindings/:id/reopen.

Ask

One assertion that the registered security service serves reopenAudienceBindingSuggestion (a served-member check beside the existing pin, or a separate fail-closed MUST_SERVE_OPTIONAL-shaped list with its own reason). Test-only; skip-changeset or none per the changeset gate.

Filing facts


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 真挡得住的权限 | none | P②

    Triage: p3 · domain:server · area:access · 2026-10-29T02:59Z

    ⛔ Not a claim.

    • Read fresh. Nothing pins that the registered security service serves the optional reopenAudienceBindingSuggestion from PR feat(security): re-open a dismissed or revoked suggested audience binding #27353. Dropping the wiring would turn both reopen routes into 501 with every suite green. It fails closed (it refuses, it never admits), so p3.
    • The test sits beside the existing members pin, with its own reason, not in MUST_SERVE_OPTIONAL (that list is for members whose absence admits).
    • tests, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-sales · session_01L6bhgXcN9HaZYSEUdJWEjw

    Claim: PM loop round 2 · in-seat subagent · p3 · 2026-10-29T05:27Z
    Session: session_01L6bhgXcN9HaZYSEUdJWEjw
    Account: os-sales (the seat's linked user; the card's assignee)
    Branch: claude/issue-27362-reopen-served-pin
    Worktree: objectstack-issue-27362
    Domain: domain:server
    Seat: domain:server#1
    Ruling-ref: triage 6486679343: the test sits beside the existing members pin with its own reason, not in MUST_SERVE_OPTIONAL (that list is for members whose absence admits).
    File surface: one test file under packages/plugins/plugin-security/src/ (beside registered-security-service-members.pin.test.ts); test-only, no source change, skip-changeset or none per the changeset gate (stop on breach; explain in the report)
    Container & model: S, mode:subagent (general-purpose subagent loading .claude/agents/os-dev.md as its role file), model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: nothing pins that plugin-security's registered security service serves the optional reopenAudienceBindingSuggestion | dropping its wiring turns both reopen routes into 501 with every suite green | any refactor of the registered service object
    Thread-read: 6486679343
    Premise: holds (read at origin/main cf218eed1: the wiring is security-plugin-security-service.ts:382-383; the members pin lists it 'optional' and checks non-vacuity for required members only)
    Serial constraints cleared: no open PR touches security-plugin-security-service.ts or the members pin (all 25 open PRs' file lists read).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-sales · session_01L6bhgXcN9HaZYSEUdJWEjw
    os-dev-report
    Reported: 2026-10-29T12:26Z

    {
      "issue": 27362,
      "status": "done",
      "branch": "claude/issue-27362-reopen-served-pin",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27546",
      "session": "session_01L6bhgXcN9HaZYSEUdJWEjw",
      "premise_still_valid": true,
      "summary": "Added a new test file, packages/plugins/plugin-security/src/registered-security-service-reopen.pin.test.ts, beside the members pin, per triage 6486679343: it is not in MUST_SERVE_OPTIONAL and states its own reason. The test boots the real SecurityPlugin the way the members pin does. It asserts that the registered `security` object serves reopenAudienceBindingSuggestion as a function, and that calling it reaches the module function: a vi.mock partial spy receives the suggestion deps (with ql), the caller context and the id, and its answer comes back unchanged. No source change. The premise held at origin/main cf218eed1 (wiring at security-plugin-security-service.ts:382-383). Draft PR #27546 was opened with skip-changeset, no assignees and no reviewer request, per the rule change at c5d4634174 that the coordinator relayed mid-run. pr_request_reviewers was never called.",
      "tests": "Head a34ad920b1 (the branch merged with origin/main f57eddcf0c). Both runs held the verify lock (VERDICT command-exit 0). New pin plus members pin: Test Files 2 passed (2), Tests 5 passed (5). pnpm --filter @objectstack/plugin-security test: Test Files 237 passed (237), Tests 5112 passed and 45 skipped (5157). Typecheck exit 0; it includes check:test-typecheck over tsconfig.test.json, so the new file compiles: 0 files / 0 errors. Ablation through scripts/ablation-replace.mjs, whose wrap mode restores through a trap. The test imports src/ relatively, so no dist rebuild applies. (A) Deleting the two wiring lines: anchor 1 to 0, blob 49d0052dfcc1 to f7bf8b8f1b32. The pin went RED with 'reopenAudienceBindingSuggestion is not served: both reopen routes answer 501: expected undefined to be function'. Restored: blob 49d0052dfcc19efcadaa7dd47386e9459f570413 equals HEAD, and git diff HEAD is empty. (B) Replacing the delegation with a stub Promise.resolve: RED on the toBe(answer) identity check. Restored with the blob equal to HEAD. After restore the pin is green again: 1 passed.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on head a34ad920b1 derived 52 commands. 50 exited 0. pnpm check:dual-build-cjs-loads and pnpm check:i18n exited 3 (PREREQUISITE NOT MET: the whole workspace was not built), so they are NOT MEASURED locally and left to CI Lint and Repo Gates. Exit codes were captured before any pipe. --ran reconcile: '52 derived famil(ies) accounted for, 50 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)', exit 0. The derivation warned of a stale tree, because origin/main advanced after the merge. The files it named are scripts/pm/check-owed-reviews.mjs, record-recognisers.mjs, dispatch-gates.self-test.mjs and scripts/gen-sdui-reference.mjs; none of them is in this diff. eslint --no-inline-config on the new file: exit 0. Package typecheck: exit 0. CI at the time of report: Check Changeset success. Lint, Type Check, PR-body guards and Governed Surface Queue Guard were in_progress. Test Core and Build Core were not yet listed. Convergence is the PM's.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "line_budget": "+80/-0, 1 file; under the 3000-line human-merge threshold",
      "files_changed": ["packages/plugins/plugin-security/src/registered-security-service-reopen.pin.test.ts"],
      "changeset": "none, with the skip-changeset label on the pr_create. The measure: files[] is dist, README.md and CHANGELOG.md, and the tsup entry is src/index.ts. After pnpm build, the new test's identifiers occur in 0 dist files; the positive control reopenAudienceBindingSuggestion occurs in 4.",
      "deviations": [
        "The PR body opens with an HTML-comment attribution line. The dispatch required it verbatim, and the role file allows it only when the harness writes it.",
        "pr_create carried no assignees and pr_request_reviewers was not called, following the coordinator's relay of rule change c5d4634174. This overrides the original dispatch order (assignees os-sales, then pr_request_reviewers os-sales).",
        "The merge commit a34ad920b1 has git's default message with no trailer pair. check:commit-card-trailers passed on push.",
        "The verify-lock queue cost roughly 1.5h across several queue-timeouts (exit 99, NOT MEASURED). Each try resumed the same slot. The holders were live dogfood runs and were left alone.",
        "The boot helper is copied from the members pin, about 25 lines. That pin exports nothing, and importing a test file would also run its suites."
      ],
      "mcp_calls": "0",
      "api_writes": "2: one fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, which led to the PR create plus the skip-changeset label; read back as 6272 of 6272 bytes stored identical, no assignees), and this os-dev-report comment through post-stamped (POST /repos/objectstack-ai/objectstack/issues/27362/comments). git push is not counted.",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-sales · session_01L6bhgXcN9HaZYSEUdJWEjw

    Landed — #27546 · 2026-10-29T13:06Z

    Probe Reading
    PR #27546 merged 2026-10-29T13:06Z · merge commit 6ca1a4714fef4dd573fd6a76bcea65a18aa5b5f0 · head a34ad920b120746c431b93f8dda1126ccfa915d3
    #27362 closed (completed) by the PR's Fixes line

    State change: pm:dispatched removed, assignee os-sales cleared. Nothing remains on this card.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p3tests

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions