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
spec, docs: the permission-set name describe and the permission-sets page say one name per namespace #32758
Skills-docs follow-up of #31698 PR 2 (PR #32742, Metadata-protocol: added). With that PR a permission-set name is held once per namespace, so two published texts become false:
packages/spec/src/security/permission.zod.ts:1207-1208 — the name describe still reads "unique within the security catalog the environment serves".
content/docs/permissions/permission-sets.mdx:430 — "permission sets, positions and capabilities hold one name per deployment".
TO: both say a permission set is identified by (package, name), one holder per namespace; positions and capabilities keep one name per deployment; co-owners of one namespace, a package with no namespace, the platform namespaces and guest_portal keep one holder. skills/objectstack-platform/SKILL.md already teaches the (package, name) identity (checked by the PR's dev).
Restart-when: the release that carries the epic #31527 release line is published (maintainer ruling 6824949405 on #31527).
Filing gate: ② the PR's Skills-docs: follow-up owed line (review-checklist: the owed card is filed before ACCEPT). class: b · type: Docs · Grade: p2 · domain: spec (describe) with the docs line riding it.
Re-graded and queued · #32758 · 2026-11-12T22:33Z. It is a small issue (a nit, docs or typing), so it is graded priority:p3 and goes to pm:queue. The maintainer (Sales) ruled that no epic card is parked: small issues are graded priority:p3 and queued behind p1 and p2, and p1 goes first. The park under 6824949405 is withdrawn for this card.
Claim: PM loop round 1 · 2026-11-14T17:42Z
Session: session_01FEkQ5mswnWm181XgYcCUag (seat); card thread session_01FEkQ5nvMv3rqz7e8UKwxD9 is the dev
Account: os-project-manager
Branch: claude/project-thread-yngygz (the card thread's designated branch; the platform lets a thread push only that branch, so not claude/issue-32758-*)
Worktree: objectstack-issue-32758
Domain: domain:spec
Seat: domain:spec#1
File surface: packages/spec/src/security/permission.zod.ts (the name JSDoc and describe only), content/docs/permissions/permission-sets.mdx, their generated projections (content/docs/references/security/permission.mdx and any generated baseline carrying the describe string), a pin test only if the old describe string is pinned, root .changeset/ (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (describe and docs text, no rule/schema change), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6847899833
Premise: holds at origin/main6538ba48: permission.zod.ts:1207-1208 still reads "unique within the security catalog the environment serves" and permission-sets.mdx:437-438 "permission sets, positions and capabilities hold one name per deployment", while PR #32742 (merged 2026-11-12) holds a permission-set name once per namespace. The card's Restart-when park is withdrawn (6837778026). Taken under the maintainer's standing order 「p1 p2 处理完了,就可以处理 p3」 (2026-10-26; Ruling-ref). Order: /mnt/project-files/pm-orders/spec/order-32758.md (project share).
Serial constraints cleared: no open PR touches permission.zod.ts, permission-sets.mdx or references/security/permission.mdx (file lists of all open PRs read at 17:40Z: 0 hits).
os-dev-report
{
"issue": 32758,
"status": "done",
"branch": "claude/project-thread-yngygz",
"pr": "#33384",
"session": "session_01FEkQ5nvMv3rqz7e8UKwxD9",
"premise_still_valid": true,
"summary": "On origin/main 6538ba4 both texts still said one name per deployment while #32742 holds a permission-set name once per namespace. The PermissionSetSchema name describe (and its JSDoc line, plus one line in the // comment above the field) now says a set is identified by its package and name, one holder per namespace, listing the one-holder cases #32742's save-door sentence lists; the generated references/security/permission.mdx row regenerated (gen:schema + gen:docs; no other tracked projection carries it). permission-sets.mdx: permission sets one holder per namespace with the one-holder cases, positions and capabilities one name per deployment. The '.custom' point was measured on this head and kept: a probe (real protocol + ObjectQL, base namespace showcase shipping showcase_reader, pair namespace showcase_custom) answered 403 NOT_OVERRIDABLE for an undeclared same-name save into the pair (sealed managed item), 403 NOT_OVERRIDABLE for a declared override (ADR-0146 D6, a permission takes no override), 403 NOT_OVERRIDABLE for a bare save, 403 ITEM_LOCKED for a save into the base; the base set kept its body. The sentence now gives that reason instead of 'one name per deployment'. spec patch changeset; head 854b36e. skills/objectstack-platform/SKILL.md:125 already teaches package-and-name identity (not touched).",
"tests": "854b36e4: pnpm --filter @objectstack/spec typecheck exit 0; spec vitest src/security/permission: Test Files 4 passed (4), Tests 164 passed (164). The old describe string is pinned nowhere (git grep: source, generated row, released CHANGELOGs only). Text-only change: no new test, no ablation. The .custom probe was a scratch test file in packages/objectql (after building the objectql closure), deleted before the commit.",
"gates": "854b36e4: dispatch-gates --commands --repo objectstack-ai/objectstack derived 103; 102 exit 0. check:generated exit 1 in the loop (check:test-typecheck's tsc -p failed without diagnostics while sibling gates ran), re-run alone after the loop exit 0 ('All 14 generated artifacts are up to date'); recorded as the re-run. pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist; spec, lint, objectql, client, client-react closures built) = NOT MEASURED, left to CI. --ran: '103 derived famil(ies) accounted for - 102 run, 1 NOT-MEASURED'. Record /mnt/project-files/pm-orders/spec/32758-gates-ran.txt. check-nul-bytes exit 0. CI check-runs: in_progress at report time (not waited on, per os-dev.md).",
"dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
"line_budget": "+26 / -6 over 4 files (dispatch-gates count), under the 3000 human-merge threshold",
"files_changed": [
".changeset/32758-permission-set-name-describe.md",
"content/docs/permissions/permission-sets.mdx",
"content/docs/references/security/permission.mdx",
"packages/spec/src/security/permission.zod.ts"
],
"deviations": "None against the claim surface. The // comment block above the name field (part of the field's doc, same file) gained one line pointing at ADR-0150 D2/D9 and permissionSetHoldersMeet, since its 'a name is one item in the security catalog' framing is the stale reading too. PR opened with no labels: the order names none and skip-changeset does not apply (the describe ships in @objectstack/spec dist); the relay refuses an empty labels array, so the key was left out.",
"mcp_calls": "0 - card, comments and PR #32742 read through anonymous public REST",
"api_writes": "2 relay writes + 1 git push: pr_create via fleet-write fw-20261114T181325Z-dd63f1 (run 43625382209, read-back identical 7785 bytes, PR #33384, no assignees, no labels); this os-dev-report comment via post-stamped. git push of claude/project-thread-yngygz is not a REST write.",
"open_questions": [
{
"question": "packages/spec/src/migrations/entries/semantic/18.security-catalog-environment-overlay-refused.ts reason says 'Positions, permission sets and capabilities hold one name per deployment', present tense, which #32742 made false for permission sets between packages (the entry's subject, environment row vs package holder, still holds: the environment meets every holder). Reword the reason?",
"options": [
"A: leave it; the entry records the major that added the cold-boot check and its environment-vs-package refusal is still right",
"B: a follow-up spec card rewording the reason to 'the environment catalog and a package never hold one name' (prose only, patch)"
],
"recommendation": "B, because the reason states present-tense permission-set identity, but the order bars editing a migration entry's text on my own",
"status": "needs_decision"
},
{
"question": "packages/spec/src/kernel/customization-package.ts:251-252 glosses the adr_0146_d6_security_catalog basis as 'D6: one name per deployment (permission sets, positions, capabilities)'. It paraphrases ADR-0146 D6 as written; the permission-set half is no longer the reason they take no override. Reword?",
"options": [
"A: leave it; it cites the ADR's own wording",
"B: fold into the same follow-up card as the migration entry: 'D6: the security catalog takes no override (permission sets, positions, capabilities)'"
],
"recommendation": "B, same card, comment-only",
"status": "needs_decision"
}
],
"security_findings": "none",
"out_of_scope_findings": [
"class: b · Seam: spec:PermissionSetSchema.name → runtime: packages/objectql/src/registry.ts SecurityCatalogNameConflictError hot-install message (:2878-2882) and coldBootConflictMessage (:2818) · reach: exception: release-text (shipped error sentence) · evidence: both say 'Positions, permission sets and capabilities each hold one name per deployment: an assignment names a position or a permission set by its bare name', while after #32742 a grant carries permission_set_package and two namespaces may hold one name; the refusals themselves still fire only where permissionSetHoldersMeet says the holders meet · dedupe words: one name per deployment, SecurityCatalogNameConflictError, coldBootConflictMessage, bare name",
"carrier: none · noted, not filed: packages/spec/src/contracts/security-service.ts:419 PlatformBaselineSetContribution.name 'unique in the security catalog' stays true (platform namespaces keep one holder); ADR-0048 2026-10-08 addendum, ADR-0146 D6 text and dogfood comments showcase-security.ts:32, showcase-d7-default-profile.dogfood.test.ts:65 are decision records/test comments"
]
}
Activity
objectstack-fleet commentedon Nov 12, 2026
epic:#31527#1 · os-sales · session_01L6bhgXQnNkXTT1Wu7i7Y3i
Re-graded and queued · #32758 · 2026-11-12T22:33Z. It is a small issue (a nit, docs or typing), so it is graded
priority:p3and goes topm:queue. The maintainer (Sales) ruled that no epic card is parked: small issues are gradedpriority:p3and queued behind p1 and p2, and p1 goes first. The park under 6824949405 is withdrawn for this card.Generated by Claude Code
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: first-touch audit (pre-labeled card) ·
p3confirmed · 2026-11-13T08:23Z⛔ Not a claim; the claim (if any) is unchanged.
Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
Claim: PM loop round 1 · 2026-11-14T17:42Z
Session:
session_01FEkQ5mswnWm181XgYcCUag(seat); card threadsession_01FEkQ5nvMv3rqz7e8UKwxD9is the devAccount:
os-project-managerBranch:
claude/project-thread-yngygz(the card thread's designated branch; the platform lets a thread push only that branch, so notclaude/issue-32758-*)Worktree:
objectstack-issue-32758Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/security/permission.zod.ts(thenameJSDoc and describe only),content/docs/permissions/permission-sets.mdx, their generated projections (content/docs/references/security/permission.mdxand any generated baseline carrying the describe string), a pin test only if the old describe string is pinned, root.changeset/(stop on breach; explain in the report)Container & model:
S,mode:thread,model: default tier(describe and docs text, no rule/schema change),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6847899833
Premise: holds at
origin/main6538ba48:permission.zod.ts:1207-1208still reads "unique within the security catalog the environment serves" andpermission-sets.mdx:437-438"permission sets, positions and capabilities hold one name per deployment", while PR #32742 (merged 2026-11-12) holds a permission-set name once per namespace. The card's Restart-when park is withdrawn (6837778026). Taken under the maintainer's standing order 「p1 p2 处理完了,就可以处理 p3」 (2026-10-26; Ruling-ref). Order:/mnt/project-files/pm-orders/spec/order-32758.md(project share).Serial constraints cleared: no open PR touches
permission.zod.ts,permission-sets.mdxorreferences/security/permission.mdx(file lists of all open PRs read at 17:40Z: 0 hits).objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5nvMv3rqz7e8UKwxD9
os-dev-report
{
"issue": 32758,
"status": "done",
"branch": "claude/project-thread-yngygz",
"pr": "#33384",
"session": "session_01FEkQ5nvMv3rqz7e8UKwxD9",
"premise_still_valid": true,
"summary": "On origin/main 6538ba4 both texts still said one name per deployment while #32742 holds a permission-set name once per namespace. The PermissionSetSchema name describe (and its JSDoc line, plus one line in the // comment above the field) now says a set is identified by its package and name, one holder per namespace, listing the one-holder cases #32742's save-door sentence lists; the generated references/security/permission.mdx row regenerated (gen:schema + gen:docs; no other tracked projection carries it). permission-sets.mdx: permission sets one holder per namespace with the one-holder cases, positions and capabilities one name per deployment. The '.custom' point was measured on this head and kept: a probe (real protocol + ObjectQL, base namespace showcase shipping showcase_reader, pair namespace showcase_custom) answered 403 NOT_OVERRIDABLE for an undeclared same-name save into the pair (sealed managed item), 403 NOT_OVERRIDABLE for a declared override (ADR-0146 D6, a permission takes no override), 403 NOT_OVERRIDABLE for a bare save, 403 ITEM_LOCKED for a save into the base; the base set kept its body. The sentence now gives that reason instead of 'one name per deployment'. spec patch changeset; head 854b36e. skills/objectstack-platform/SKILL.md:125 already teaches package-and-name identity (not touched).",
"tests": "854b36e4: pnpm --filter @objectstack/spec typecheck exit 0; spec vitest src/security/permission: Test Files 4 passed (4), Tests 164 passed (164). The old describe string is pinned nowhere (git grep: source, generated row, released CHANGELOGs only). Text-only change: no new test, no ablation. The .custom probe was a scratch test file in packages/objectql (after building the objectql closure), deleted before the commit.",
"gates": "854b36e4: dispatch-gates --commands --repo objectstack-ai/objectstack derived 103; 102 exit 0. check:generated exit 1 in the loop (check:test-typecheck's tsc -p failed without diagnostics while sibling gates ran), re-run alone after the loop exit 0 ('All 14 generated artifacts are up to date'); recorded as the re-run. pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist; spec, lint, objectql, client, client-react closures built) = NOT MEASURED, left to CI. --ran: '103 derived famil(ies) accounted for - 102 run, 1 NOT-MEASURED'. Record /mnt/project-files/pm-orders/spec/32758-gates-ran.txt. check-nul-bytes exit 0. CI check-runs: in_progress at report time (not waited on, per os-dev.md).",
"dogfood_battery": "n/a - no
!in the PR title and no (narrowing) arm","line_budget": "+26 / -6 over 4 files (dispatch-gates count), under the 3000 human-merge threshold",
"files_changed": [
".changeset/32758-permission-set-name-describe.md",
"content/docs/permissions/permission-sets.mdx",
"content/docs/references/security/permission.mdx",
"packages/spec/src/security/permission.zod.ts"
],
"deviations": "None against the claim surface. The // comment block above the name field (part of the field's doc, same file) gained one line pointing at ADR-0150 D2/D9 and permissionSetHoldersMeet, since its 'a name is one item in the security catalog' framing is the stale reading too. PR opened with no labels: the order names none and skip-changeset does not apply (the describe ships in @objectstack/spec dist); the relay refuses an empty labels array, so the key was left out.",
"mcp_calls": "0 - card, comments and PR #32742 read through anonymous public REST",
"api_writes": "2 relay writes + 1 git push: pr_create via fleet-write fw-20261114T181325Z-dd63f1 (run 43625382209, read-back identical 7785 bytes, PR #33384, no assignees, no labels); this os-dev-report comment via post-stamped. git push of claude/project-thread-yngygz is not a REST write.",
"open_questions": [
{
"question": "packages/spec/src/migrations/entries/semantic/18.security-catalog-environment-overlay-refused.ts reason says 'Positions, permission sets and capabilities hold one name per deployment', present tense, which #32742 made false for permission sets between packages (the entry's subject, environment row vs package holder, still holds: the environment meets every holder). Reword the reason?",
"options": [
"A: leave it; the entry records the major that added the cold-boot check and its environment-vs-package refusal is still right",
"B: a follow-up spec card rewording the reason to 'the environment catalog and a package never hold one name' (prose only, patch)"
],
"recommendation": "B, because the reason states present-tense permission-set identity, but the order bars editing a migration entry's text on my own",
"status": "needs_decision"
},
{
"question": "packages/spec/src/kernel/customization-package.ts:251-252 glosses the adr_0146_d6_security_catalog basis as 'D6: one name per deployment (permission sets, positions, capabilities)'. It paraphrases ADR-0146 D6 as written; the permission-set half is no longer the reason they take no override. Reword?",
"options": [
"A: leave it; it cites the ADR's own wording",
"B: fold into the same follow-up card as the migration entry: 'D6: the security catalog takes no override (permission sets, positions, capabilities)'"
],
"recommendation": "B, same card, comment-only",
"status": "needs_decision"
}
],
"security_findings": "none",
"out_of_scope_findings": [
"class: b · Seam: spec:PermissionSetSchema.name → runtime: packages/objectql/src/registry.ts SecurityCatalogNameConflictError hot-install message (:2878-2882) and coldBootConflictMessage (:2818) · reach: exception: release-text (shipped error sentence) · evidence: both say 'Positions, permission sets and capabilities each hold one name per deployment: an assignment names a position or a permission set by its bare name', while after #32742 a grant carries permission_set_package and two namespaces may hold one name; the refusals themselves still fire only where permissionSetHoldersMeet says the holders meet · dedupe words: one name per deployment, SecurityCatalogNameConflictError, coldBootConflictMessage, bare name",
"carrier: none · noted, not filed: packages/spec/src/contracts/security-service.ts:419 PlatformBaselineSetContribution.name 'unique in the security catalog' stays true (platform namespaces keep one holder); ADR-0048 2026-10-08 addendum, ADR-0146 D6 text and dogfood comments showcase-security.ts:32, showcase-d7-default-profile.dogfood.test.ts:65 are decision records/test comments"
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
Seat answers to report 6882046858
open_questions· 2026-11-14T18:16Zreason) and Q2 (customization-package.ts:251-252gloss): B, one follow-up card, spec: the security-catalog migration entry and the D6 override gloss still say a permission set holds one name per deployment #33388 (domain:spec, p3). Not in PR docs(spec): the permission set name describe and the permission sets page say one holder per namespace #33384.registry.tsrefusal sentences): card objectql: the security-catalog name-conflict refusals still say a permission set holds one name per deployment #33389 (domain:server, p3).objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
ACCEPT → PR #33384 comment 6883104768 · 2026-11-14T19:36Z · ready + auto-merge armed; card closes on merge.