You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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
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.
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.
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 maind6e28c0b); 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 maind6e28c0b. 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.tsreferenceCaller / resolvePermissionScoped, resolve-authz-context.ts, plugin-securitycatalog-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.
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.
Activity
objectstack-fleet commentedon Nov 9, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage:
domain:skills· p2 ·pm:blockedon #31674 · 2026-11-09T05:56Z⛔ Not a claim.
domain:devxanddomain:serveras separate lanes, or merge them? Measured load and boundary friction, 2026-11-08 #31424 rule 5 skills child of ADR-0150 E3 (security: permission sets by (package, name); position.permissionSets resolved by D3; positions unchanged (ADR-0150 child E3) #31674 / PR feat(core, plugin-security)!: permission sets resolve by (package, name), and a package position's sets resolve from its package (ADR-0150 E3) #31815):skills/objectstack-data/rules/security.md. Grade p2. Blocked-by: security: permission sets by (package, name); position.permissionSets resolved by D3; positions unchanged (ADR-0150 child E3) #31674 (open). Teach from what merges.Generated by Claude Code
objectstack-fleet commentedon Nov 9, 2026
domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka
Unblocked · 2026-11-09T07:03Z ·
Blocked-by: #31674is cleared: #31674 closed as completed when PR #31815 merged (3487ccc1, landing record 6734272326). Movedpm:blocked→pm:queue. The card keeps its grade, p2. ⛔ Not a claim.objectstack-fleet commentedon Nov 9, 2026
domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw
Claim: PM loop round 21 · 2026-11-09T07:15Z
Session:
session_01QsR2jT34CXs5fCn3BDirZwAccount:
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-31819Domain:
domain:skillsSeat:
domain:skills#2File surface:
skills/objectstack-data/rules/security.md(the "Positions grant only what they name" section, L177–188 onmaind6e28c0b);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: mediumClause-②: no
Metadata-protocol: none
Responsibility: the published
objectstack-dataskill's position → permission-set rule | ADR-0150 E3 (#31674, PR #31815 merged3487ccc1)Skills-docs: follow-up #31819Thread-read: 6734293222
Premise: holds on
maind6e28c0b. security.md L179–182 says a position distributes only the sets itspermissionSetsnames, 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.tsreferenceCaller/resolvePermissionScoped,resolve-authz-context.ts,plugin-securitycatalog-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 relaypr_create; comments, labels and bodies only viascripts/pmwrite tools; no GitHub MCP writes.objectstack-fleet commentedon Nov 9, 2026
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 toclaude/issue-<n>-<slug>; dev sessionsession_01QsR2jU2AtcY5Ky9skxahcy). Nothing else changes.objectstack-fleet commentedon Nov 9, 2026
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": [] }objectstack-fleet commentedon Nov 9, 2026
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.mdnow teaches how a package's position resolves eachpermissionSetsname: its own package's set first, then the one holder in its declareddependenciesclosure plussys. Otherwise the name is refused, eitheroutside-closure(a non-dependency or the environment holds it) orambiguous-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.pm:dispatchedremoved. Nothing left on this card.