Skip to content

skills: security.md says a package position's permission sets resolve from its package and declared dependencies (ADR-0150 E3 Skills-docs follow-up) #31819

Closed

Description

@objectstack-fleet

domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

Filing gate: ④ coordination node: the Skills-docs: follow-up owed of child E3 #31674 of the epic #31527 (ADR-0150), named in E3's PR #31815 (report 6732978553). ⛔ Not a claim.
Business reason: inherited from the parent #31527. An AI agent authoring a package's positions reads skills/objectstack-data/rules/security.md. After #31815, a position's permissionSets entry resolves from the position's package: its own set, else the unique holder in its declared dependency closure plus sys, else a refusal naming every candidate. A set that only the environment holds is refused. The skill does not say so today, so an agent can write a position that loads and then grants nothing.
Reader: the domain:skills seat, after PR #31815 merges.
Dedupe (open AND closed): position permission set package closure skills → #31735 (closed; E4's queue-recipient paragraph in the same file, not this rule) and #31674 (E3 itself), neither on point.
class: d · type: Docs
Part of #31527. Blocked-by: #31674

维护者速读

技能文档里写岗位引用权限集的那段,要补一句:权限集按岗位所在的软件包和它声明的依赖解析,找不到、有两个、或者只有环境里有,都会被拒绝。

What to build

  • In skills/objectstack-data/rules/security.md, the position or permission-set paragraph: state the resolution rule above and the three refusals (outside the closure, two holders, environment-only), with one example each. The eval that exercises position grants gains a case.

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 9, 2026
  2. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Unblocked · 2026-11-09T07:03Z · Blocked-by: #31674 is cleared: #31674 closed as completed when PR #31815 merged (3487ccc1, landing record 6734272326). Moved pm:blocked → pm:queue. The card keeps its grade, p2. ⛔ Not a claim.

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 9, 2026
  4. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim: PM loop round 21 · 2026-11-09T07:15Z
    Session: session_01QsR2jT34CXs5fCn3BDirZw
    Account: zhuangjianguo (the seat's linked user; the card's assignee)
    Branch: the card thread's designated branch, named by claim amendment once the thread reports it (a measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-31819
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: skills/objectstack-data/rules/security.md (the "Positions grant only what they name" section, L177–188 on main d6e28c0b); skills/objectstack-data/evals/hooks-security-seeds-datasources.json (one new case on a package position's permission-set resolution); scripts/check-skills-token-ratchet.mjs (that file's ceiling row only, under standing ruling 6513306068 letter B, if the measured remainder needs it); one .changeset/*.md ('@objectstack/skills': patch). Stop on breach.
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the published objectstack-data skill's position → permission-set rule | ADR-0150 E3 (#31674, PR #31815 merged 3487ccc1) Skills-docs: follow-up #31819
    Thread-read: 6734293222
    Premise: holds on main d6e28c0b. security.md L179–182 says a position distributes only the sets its permissionSets names, and nothing about which package's set a bare name reaches or when it is refused. The dev teaches from the merged code (packages/core/src/security/security-catalog.ts referenceCaller / resolvePermissionScoped, resolve-authz-context.ts, plugin-security catalog-reference-report.ts) and its tests, not from the card's paraphrase.
    Serial constraints: none open on this file at claim time (PR #31850 edits automation surfaces only; its follow-up #31853 is a separate card).

    Governed Tier H (skills/**): draft until a governed approver approves.

    Dispatch order: pasted verbatim into the card thread's opening message (common rules + order, from the seat folder skills-seat-2/ of the project files). Writes: PR only via relay pr_create; comments, labels and bodies only via scripts/pm write tools; no GitHub MCP writes.

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

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Claim amendment · 2026-11-09T07:17Z · amends Claim 6734466739 (same session). Branch: claude/project-thread-xklyph (the card thread's designated branch, a measured platform exception to claude/issue-<n>-<slug>; dev session session_01QsR2jU2AtcY5Ky9skxahcy). Nothing else changes.

  7. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jU2AtcY5Ky9skxahcy
    os-dev-report

    {
      "issue": 31819,
      "status": "done",
      "branch": "claude/project-thread-xklyph",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31858",
      "head": "4187450a",
      "session": "session_01QsR2jU2AtcY5Ky9skxahcy",
      "premise_still_valid": true,
      "files_changed": [
        "skills/objectstack-data/rules/security.md",
        "skills/objectstack-data/evals/hooks-security-seeds-datasources.json",
        "scripts/check-skills-token-ratchet.mjs",
        ".changeset/31819-data-security-position-permission-sets.md"
      ],
      "gates": {
        "derived": 62,
        "ran": 61,
        "not_measured": ["pnpm check:dual-build-cjs-loads :: exit 3 (PREREQUISITE NOT MET, needs every package dist)"],
        "nonzero": [],
        "sweep_head": "31a8d0f3",
        "final_head_rerun": "node scripts/check-skills-token-ratchet.mjs :: exit 0 at 4187450a",
        "reconcile": "dispatch-gates --ran: 62 derived, 61 run, 1 NOT-MEASURED (DERIVED from a recorded exit 3)",
        "pr_body_gates": "check-changeset-no-major exit 0; check-adr-0087-registration exit 0; check-closing-keyword-parity exit 0; check-partof-closing-keyword exit 0"
      },
      "line_budget": {
        "security_md_bytes": "15056 -> 15834",
        "security_md_tokens": "3764 -> 3959",
        "security_md_ceiling": "3768 -> 3959 (headroom 0, pinned at measurement)",
        "security_md_lines": "317 -> 327",
        "all_SKILL_md_lines": "4601 -> 4601",
        "bytes_added": 966,
        "bytes_removed": 188,
        "remainder_over_old_ceiling": "15834 - 15072 = 762 bytes = 191 tokens",
        "ruling": "6513306068 letter B, quoted verbatim in PR body and ratchet comment"
      },
      "cuts": [
        "security.md secret paragraph: Fail-closed sentence (86 B) -> survivor rules/field-types.md L44 'fail-closed (ADR-0100)'"
      ],
      "refusal_reasons_taught": [
        "outside-closure, non-dependency holder: packages/core/src/package-scoped-resolution.ts:584-589",
        "outside-closure, environment-only holder: packages/core/src/security/security-catalog.ts:538-556",
        "ambiguous-in-closure: packages/core/src/package-scoped-resolution.ts:582",
        "boot report: packages/plugins/plugin-security/src/catalog-reference-report.ts:352-378, logged 490-510",
        "environment-wide callers: packages/core/src/security/security-catalog.ts:477-490 (referenceCaller)"
      ],
      "eval_case_id": 19,
      "deviations": [
        "ambiguous-in-closure is taught with the note that a second package declaring a set name is refused at registration first (packages/objectql/src/security-catalog-namespace.ts, one name per deployment), so the example does not claim a path the registry blocks",
        "the readonlyWhen aside was kept although SKILL.md restates it: it names a schema key (an unpayable pointer)"
      ],
      "writes": 2,
      "api_writes": "2 - relay pr_create (#31858), this post-stamped comment",
      "mcp_calls": "2 GitHub MCP - issue_read get, issue_read get_comments; reads only, no write tool",
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  8. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw

    Landed · 2026-11-09T08:25Z — PR #31858 merged through the merge queue (merge commit e27efff). The maintainer enqueued it after the seat's Tier H ACCEPT 6735227605.

    • skills/objectstack-data/rules/security.md now teaches how a package's position resolves each permissionSets name: its own package's set first, then the one holder in its declared dependencies closure plus sys. Otherwise the name is refused, either outside-closure (a non-dependency or the environment holds it) or ambiguous-in-closure. The position still loads, the boot's catalog reference report logs the refusal, and nothing is granted through that name. The bullet also names the callers that still resolve environment-wide.
    • Eval case 19 is in the objectstack-data set. The ceiling went 3768 → 3959 under standing ruling 6513306068 letter B, after one restatement cut.

    pm:dispatched removed. Nothing left on this card.

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

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions