Skip to content

Add the judgment calls to the realm-policy-authoring skill - #175

Merged
habdelra merged 3 commits into
mainfrom
cs-13108-policy-card-author-skill-for-writing-policies
Oct 6, 2026
Merged

habdelra merged 3 commits into
mainfrom
cs-13108-policy-card-author-skill-for-writing-policies

Conversation

@habdelra

@habdelra habdelra commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Important

Merge order: this PR waits on none of the boxel anonymous-access work. Its one constraint is that it merges before #174, which merges this PR in and renumbers the skill's sections. The rest of the chain, for context:

  1. Compile a policy grant's opt-in to callers who aren't signed in boxel#6534: compile a grant's anonymous opt-in (merged)
  2. Policy: admit anonymous reads through a grant that opts in, rate-limited per realm and address boxel#6568: anonymous reads (CS-13536)
  3. Policy: admit anonymous searches through a query grant that opts in boxel#6575 (CS-13578): anonymous search, stacked on #6568
  4. Policy: admit anonymous writes as a user the realm's config names boxel#6577 (CS-13579): anonymous writes, stacked on #6575
  5. Teach the realm-policy-authoring skill anonymous grants and a realm's anonymous traffic controls #174: anonymous grants in the skill, which merges after 1–4, 5a and this PR
    5a. Say that no policy grant reaches a path the realm ignores #178: lands before step 5
  6. CS-13572: the boxel PR that moves the boxel-skills pin for boxel-skills#178 and Teach the realm-policy-authoring skill anonymous grants and a realm's anonymous traffic controls #174
  7. State every limit of a realm policy in the skills #179 (CS-13109): states every policy limit in the two policy skills; merges after step 5 (Teach the realm-policy-authoring skill anonymous grants and a realm's anonymous traffic controls #174)

This PR: can merge any time before step 5. A separate boxel feat(skills): pin bump (CS-13108, not opened yet) ships this PR and boxel-skills#177 without waiting on this chain.

Each "not opened yet" line gets its PR URL as soon as that PR opens.

In service of the operation-permission policies project, which lets a realm's policy admit callers the realm's own permissions turn away. This PR adds the decisions an author has to make that the engine can't make for them. The realm-policy-authoring skill already covers what a policy card accepts. The engine compiles a policy that lets a caller widen their own access as readily as one that doesn't, so this guidance has to live in the skill.

The new §13, "Choosing what to grant", covers:

  • A named operation, not a raw base. A write's predicate is judged against the card as it was before the write, so a raw update granted on teacherIds lets the caller rewrite teacherIds. A named operation such as appendActivity writes only what its declaration fills. This is why a grant on a named operation never grants its base.
  • Keeping authorization-bearing fields out of reach. Don't grant raw update, transform, appendContainsMany or delete where the predicate reads a field those operations change, unless everyone the predicate admits is trusted with that change. Three places to keep the authorizing data instead: another realm the policy grants nothing in, a mirror only the realm's writers update, or a nonGrantable operation.
  • When snapshot: true is acceptable. The cost is a gap as long as the index's delay, for the computed values and linked cards' fields the predicate reads. That's fine for low-stakes reads and for query grants, which already answer from the index. It isn't fine for writes, revocation for cause, or anything you'd have to undo by hand. The alternative is a stored mirror, which has its own sync gap.
  • read and query as separate grants. Repeating a predicate across the two is the cost of the separation. The lanes are judged differently, can mean different things, and change independently.
  • Reading an explanation. Covers acl first, reason against refusal, what no-grant (with no rules, or with grants: []) and predicate-false each point at, tier before outcome, threw, and chasing an unexpected allowed through admittedBy. It ends with the edit loop: explain the draft before saving, then the live policy after.

Each rule is tied to a scenario in the school example realms that §10's worked call already uses: Alice's refused raw update of her own classroom's teacherIds, the provider's ad-hoc search that finds nothing, and the teacherIds / providerId mirrors. §8 and §11 now point at the new section, the checklist (now §14) gains two lines, and the skill's description, index.md and the glossary entry mention the judgment calls. No other section is renumbered, so the existing cross-references into §7–§12 still hold.

After this merges, a boxel PR titled feat(skills): bumps BOXEL_SKILLS_VERSION so the CLI plugin copy picks this up.

🤖 Generated with Claude Code

A new section, "Choosing what to grant", covers the decisions the policy
engine accepts either way: a named operation over a raw update when a grant
rests on a field, keeping authorization-bearing fields out of a grant's
reach, when a snapshot grant's index-lag window is acceptable, why read and
query are separate grants, and how to read an explanation. Each rule is
tied to a scenario in the school example realms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Staging Workspace Sync Successful

Successfully synced changes to staging workspace
Workspace: https://realms-staging.stack.cards/skills/
Commit: 4176882
Synced at: 2026-10-06 18:46:58 UTC

Sync Details

Starting push from . to https://realms-staging.stack.cards/skills/
Testing realm access...
Realm access verified
Found 300 files in local directory
No sync manifest found, will upload all files
Uploading 300 file(s) via /_atomic...
  Uploaded: skills/boxel/scripts/instance-correctness-scan.py
  Uploaded: index.json
  Uploaded: index.md
  Uploaded: realm.json
  Uploaded: skills/boxel/SKILL.md
  Uploaded: skills/boxel/references/base-field-catalog.md
  Uploaded: skills/boxel/references/card-references.md
  Uploaded: skills/boxel/references/command-development.md
  Uploaded: skills/boxel/references/command-invocation-modes.md
  Uploaded: skills/boxel/references/common-imports.md
  Uploaded: skills/boxel/references/container-query-fitted-layout.md
  Uploaded: skills/boxel/references/core-concept.md
  Uploaded: skills/boxel/references/core-patterns.md
  Uploaded: skills/boxel/references/data-management.md
  Uploaded: skills/boxel/references/date-math.md
  Uploaded: skills/boxel/references/default-index-card.md
  Uploaded: skills/boxel/references/defensive-link-traversal.md
  Uploaded: skills/boxel/references/defensive-programming.md
  Uploaded: skills/boxel/references/delegated-rendering.md
  Uploaded: skills/boxel/references/design-playbook.md
  Uploaded: skills/boxel/references/enumerations.md
  Uploaded: skills/boxel/references/external-libraries.md
  Uploaded: skills/boxel/references/file-editing.md
  Uploaded: skills/boxel/references/fitted-formats.md
  Uploaded: skills/boxel/references/formatters.md
  Uploaded: skills/boxel/references/icons.md
  Uploaded: skills/boxel/references/imagedef.md
  Uploaded: skills/boxel/references/lint-workflow.md
  Uploaded: skills/boxel/references/prefers-wide-format.md
  Uploaded: skills/boxel/references/query-systems.md
  Uploaded: skills/boxel/references/quick-reference.md
  Uploaded: skills/boxel/references/qunit-testing.md
  Uploaded: skills/boxel/references/relationship-loading-state.md
  Uploaded: skills/boxel/references/searchable-fields.md
  Uploaded: skills/boxel/references/spec-usage.md
  Uploaded: skills/boxel/references/styling-design.md
  Uploaded: skills/boxel/references/template-syntax.md
  Uploaded: skills/boxel/references/theme-design-system.md
  Uploaded: skills/boxel-create-edit-cards/SKILL.md
  Uploaded: skills/boxel-design/SKILL.md
  Uploaded: skills/boxel-design/references/asset-selection-guidelines.md
  Uploaded: skills/boxel-design/references/critical-rules.md
  Uploaded: skills/boxel-environment/SKILL.md
  Uploaded: skills/boxel-environment/references/assistant-persona.md
  Uploaded: skills/boxel-environment/references/calling-commands.md
  Uploaded: skills/boxel-environment/references/card-tool-selection.md
  Uploaded: skills/boxel-environment/references/common-errors.md
  Uploaded: skills/boxel-environment/references/diagnosing-broken-links.md
  Uploaded: skills/boxel-environment/references/fresh-realm-push-integrity.md
  Uploaded: skills/boxel-environment/references/host-commands-reference.md
  Uploaded: skills/boxel-environment/references/indexing-operations.md
  Uploaded: skills/boxel-environment/references/markdown-edit.md
  Uploaded: skills/boxel-environment/references/searching-and-querying.md
  Uploaded: skills/boxel-environment/references/shared-mirror-safety.md
  Uploaded: skills/boxel-environment/references/source-code-editing.md
  Uploaded: skills/boxel-environment/references/user-environment-awareness.md
  Uploaded: skills/boxel-environment/references/workflows-and-orchestration.md
  Uploaded: skills/boxel-file-def/SKILL.md
  Uploaded: skills/boxel-file-def/references/available-fields.md
  Uploaded: skills/boxel-file-def/references/filedef-first-class-file-support.md
  Uploaded: skills/boxel-file-def/references/filedef-vs-base64imagefield.md
  Uploaded: skills/boxel-file-def/references/import-paths.md
  Uploaded: skills/boxel-file-def/references/markdowndef-vs-markdownfield.md
  Uploaded: skills/boxel-file-def/references/no-inline-binary.md
  Uploaded: skills/boxel-file-def/references/rendering-file-fields-in-templates.md
  Uploaded: skills/boxel-file-def/references/type-hierarchy.md
  Uploaded: skills/boxel-file-def/references/using-filedef-in-cards.md
  Uploaded: skills/boxel-flavored-markdown/SKILL.md
  Uploaded: skills/boxel-flavored-markdown/references/authoring-notes.md
  Uploaded: skills/boxel-flavored-markdown/references/base-syntax.md
  Uploaded: skills/boxel-flavored-markdown/references/bfm-extensions-beyond-commonmarkgfm.md
  Uploaded: skills/boxel-flavored-markdown/references/card-directives-the-boxel-extension.md
  Uploaded: skills/boxel-flavored-markdown/references/quick-reference.md
  Uploaded: skills/boxel-flavored-markdown/references/where-bfm-is-used.md
  Uploaded: skills/boxel-markdown-format/SKILL.md
  Uploaded: skills/boxel-markdown-format/references/delegation-composes.md
  Uploaded: skills/boxel-markdown-format/references/essential-helper-markdownescape.md
  Uploaded: skills/boxel-markdown-format/references/pitfalls.md
  Uploaded: skills/boxel-markdown-format/references/rendering-markdown-html-at-runtime.md
  Uploaded: skills/boxel-markdown-format/references/shape-of-a-static-markdown-template.md
  Uploaded: skills/boxel-markdown-format/references/the-default-usually-good-enough.md
  Uploaded: skills/boxel-markdown-format/references/the-markdown-helpers-toolkit.md
  Uploaded: skills/boxel-markdown-format/references/when-youre-done.md
  Uploaded: skills/boxel-markdown-format/references/worked-example-note-card-with-custom-markdown.md
  Uploaded: skills/boxel-patterns/SKILL.md
  Uploaded: skills/boxel-patterns/patterns/app-card-home-with-search/README.md
  Uploaded: skills/boxel-patterns/patterns/attach-remote-image/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-declared-captures/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-declared-captures/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-image-steering/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-image-steering/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-linked-to-me-lookup/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-linked-to-me-lookup/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-run-command-cli/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-run-command-cli/example.gts
  Uploaded: skills/boxel-patterns/patterns/build-planning-cards-trio/README.md
  Uploaded: skills/boxel-patterns/patterns/build-site-config-with-theme/README.md
  Uploaded: skills/boxel-patterns/patterns/build-site-config-with-theme/example.gts
  Uploaded: skills/boxel-patterns/patterns/cardinfo-override-title/README.md
  Uploaded: skills/boxel-patterns/patterns/cardinfo-override-title/example.gts
  Uploaded: skills/boxel-patterns/patterns/collab-yjs-shared-document/README.md
  Uploaded: skills/boxel-patterns/patterns/command-atomic-install/README.md
  Uploaded: skills/boxel-patterns/patterns/command-atomic-install/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-data-resource/README.md
  Uploaded: skills/boxel-patterns/patterns/command-data-resource/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-optimistic-pipeline/README.md
  Uploaded: skills/boxel-patterns/patterns/command-optimistic-pipeline/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-typed-with-progress/README.md
  Uploaded: skills/boxel-patterns/patterns/command-typed-with-progress/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-with-skill-card-ref/README.md
  Uploaded: skills/boxel-patterns/patterns/command-with-skill-card-ref/example.gts
  Uploaded: skills/boxel-patterns/patterns/containsmany-sorted-render/README.md
  Uploaded: skills/boxel-patterns/patterns/containsmany-sorted-render/example.gts
  Uploaded: skills/boxel-patterns/patterns/format-morph-shared-component/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-capture-card-format/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-capture-card-format/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-filedef-generated-image/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-filedef-generated-image/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-one-shot-llm/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-one-shot-llm/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-openrouter-image-generation/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-openrouter-image-generation/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-send-request-via-proxy/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-send-request-via-proxy/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-web-audio-synthesis/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-web-audio-synthesis/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-3d-card-carousel/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-3d-card-carousel/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-design-board/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-design-board/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-kanban-drag-drop/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-kanban-drag-drop/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-command-menu-item/README.md
  Uploaded: skills/boxel-patterns/patterns/link-command-menu-item/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-discriminated-action-resolver/README.md
  Uploaded: skills/boxel-patterns/patterns/link-discriminated-action-resolver/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-element-tag-helper/README.md
  Uploaded: skills/boxel-patterns/patterns/link-element-tag-helper/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-flip-card/README.md
  Uploaded: skills/boxel-patterns/patterns/link-flip-card/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-host-mode-paths/README.md
  Uploaded: skills/boxel-patterns/patterns/link-host-mode-paths/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-onclick-outside/README.md
  Uploaded: skills/boxel-patterns/patterns/link-onclick-outside/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-view-transition/README.md
  Uploaded: skills/boxel-patterns/patterns/link-view-transition/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-atomic-field-factory/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-atomic-field-factory/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-base-class-taxonomy/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-base-class-taxonomy/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-lru-cached-parser/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-lru-cached-parser/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-recursive-fielddef/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-recursive-fielddef/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-resource-class-data-loader/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-resource-class-data-loader/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-sensitive-stub-pair/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-sensitive-stub-pair/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-typed-activity-feed/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-typed-activity-feed/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-variant-field-dispatcher/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-variant-field-dispatcher/example.gts
  Uploaded: skills/boxel-patterns/patterns/pick-rating/README.md
  Uploaded: skills/boxel-patterns/patterns/pick-rating/example.gts
  Uploaded: skills/boxel-patterns/patterns/pick-typed-sort/README.md
  Uploaded: skills/boxel-patterns/patterns/pick-typed-sort/example.gts
  Uploaded: skills/boxel-patterns/patterns/polymorphic-field-subclass/README.md
  Uploaded: skills/boxel-patterns/patterns/resource-consume-from-context/README.md
  Uploaded: skills/boxel-patterns/patterns/resource-consume-from-context/example.gts
  Uploaded: skills/boxel-patterns/patterns/resource-for-state/README.md
  Uploaded: skills/boxel-patterns/patterns/show-card-list-with-views/README.md
  Uploaded: skills/boxel-patterns/patterns/show-card-list-with-views/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-count-tiles-from-query/README.md
  Uploaded: skills/boxel-patterns/patterns/show-count-tiles-from-query/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-filedef-audio-player/README.md
  Uploaded: skills/boxel-patterns/patterns/show-filedef-audio-player/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-list-prefer-prerendered/README.md
  Uploaded: skills/boxel-patterns/patterns/show-list-prefer-prerendered/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-pdf-annotations-filedef/README.md
  Uploaded: skills/boxel-patterns/patterns/show-pdf-annotations-filedef/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-runtime-markdown-html/README.md
  Uploaded: skills/boxel-patterns/patterns/show-runtime-markdown-html/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-table-from-query/README.md
  Uploaded: skills/boxel-patterns/patterns/show-table-from-query/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-wiki-links/README.md
  Uploaded: skills/boxel-patterns/patterns/show-wiki-links/example.gts
  Uploaded: skills/boxel-patterns/patterns/theme-first-workflow/README.md
  Uploaded: skills/boxel-patterns/patterns/theme-first-workflow/example.gts
  Uploaded: skills/boxel-patterns/references/ai-image-models.md
  Uploaded: skills/boxel-patterns/references/integration-surfaces.md
  Uploaded: skills/boxel-patterns/references/libraries.md
  Uploaded: skills/boxel-patterns/references/pattern-authoring.md
  Uploaded: skills/boxel-patterns/references/pattern-backlog.md
  Uploaded: skills/boxel-patterns/scripts/audit-host-command-refs.mjs
  Uploaded: skills/boxel-skill-authoring/SKILL.md
  Uploaded: skills/boxel-theme-development/SKILL.md
  Uploaded: skills/boxel-theme-development/references/design-md-adapter.md
  Uploaded: skills/boxel-theme-development/references/shadcn-boxel-token-mapping.md
  Uploaded: skills/boxel-ui-component-discovery/SKILL.md
  Uploaded: skills/boxel-ui-guidelines/SKILL.md
  Uploaded: skills/boxel-ui-guidelines/references/checklist.md
  Uploaded: skills/boxel-ui-guidelines/references/delegated-render-control.md
  Uploaded: skills/boxel-ui-guidelines/references/field-rendering-fields-vs-model.md
  Uploaded: skills/boxel-ui-guidelines/references/font-loading-theme-card-owns-imports.md
  Uploaded: skills/boxel-ui-guidelines/references/prefer-component-apis-write-new-components-when-needed.md
  Uploaded: skills/boxel-ui-guidelines/references/prevent-content-overflow.md
  Uploaded: skills/boxel-ui-guidelines/references/print-and-published-output.md
  Uploaded: skills/boxel-ui-guidelines/references/style-budget.md
  Uploaded: skills/boxel-ui-guidelines/references/template-patterns.md
  Uploaded: skills/boxel-ui-guidelines/references/theme-token-contract.md
  Uploaded: skills/boxel-ui-guidelines/references/ui-review-procedure.md
  Uploaded: skills/boxel-ui-guidelines/references/use-boxel-design-tokens-for-theming.md
  Uploaded: skills/boxel-ui-guidelines/references/use-boxel-ui-components.md
  Uploaded: skills/boxel-ui-guidelines/references/use-container-queries-not-viewport-units.md
  Uploaded: skills/boxel-workspace-cardinal-rules/SKILL.md
  Uploaded: skills/bxl-authoring/SKILL.md
  Uploaded: skills/card-operations-authoring/SKILL.md
  Uploaded: skills/catalog-listing/SKILL.md
  Uploaded: skills/catalog-listing/references/submission-workflow.md
  Uploaded: skills/catalog-reuse/SKILL.md
  Uploaded: skills/ember-best-practices/README.md
  Uploaded: skills/ember-best-practices/SKILL.md
  Uploaded: skills/ember-best-practices/rules/a11y-automated-testing.md
  Uploaded: skills/ember-best-practices/rules/a11y-form-labels.md
  Uploaded: skills/ember-best-practices/rules/a11y-keyboard-navigation.md
  Uploaded: skills/ember-best-practices/rules/a11y-route-announcements.md
  Uploaded: skills/ember-best-practices/rules/a11y-semantic-html.md
  Uploaded: skills/ember-best-practices/rules/advanced-concurrency.md
  Uploaded: skills/ember-best-practices/rules/advanced-data-loading-with-ember-concurrency.md
  Uploaded: skills/ember-best-practices/rules/advanced-helpers.md
  Uploaded: skills/ember-best-practices/rules/advanced-modifiers.md
  Uploaded: skills/ember-best-practices/rules/advanced-tracked-built-ins.md
  Uploaded: skills/ember-best-practices/rules/bundle-direct-imports.md
  Uploaded: skills/ember-best-practices/rules/bundle-embroider-static.md
  Uploaded: skills/ember-best-practices/rules/bundle-lazy-dependencies.md
  Uploaded: skills/ember-best-practices/rules/component-args-validation.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-classes-in-examples.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-constructors.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-lifecycle-hooks.md
  Uploaded: skills/ember-best-practices/rules/component-cached-getters.md
  Uploaded: skills/ember-best-practices/rules/component-class-fields.md
  Uploaded: skills/ember-best-practices/rules/component-composition-patterns.md
  Uploaded: skills/ember-best-practices/rules/component-controlled-forms.md
  Uploaded: skills/ember-best-practices/rules/component-file-conventions.md
  Uploaded: skills/ember-best-practices/rules/component-memory-leaks.md
  Uploaded: skills/ember-best-practices/rules/component-minimal-tracking.md
  Uploaded: skills/ember-best-practices/rules/component-on-modifier.md
  Uploaded: skills/ember-best-practices/rules/component-reactive-chains.md
  Uploaded: skills/ember-best-practices/rules/component-strict-mode.md
  Uploaded: skills/ember-best-practices/rules/component-tracked-toolbox.md
  Uploaded: skills/ember-best-practices/rules/component-use-glimmer.md
  Uploaded: skills/ember-best-practices/rules/exports-named-with-default-fallback.md
  Uploaded: skills/ember-best-practices/rules/helper-builtin-functions.md
  Uploaded: skills/ember-best-practices/rules/helper-composition.md
  Uploaded: skills/ember-best-practices/rules/helper-plain-functions.md
  Uploaded: skills/ember-best-practices/rules/performance-on-modifier-vs-handlers.md
  Uploaded: skills/ember-best-practices/rules/route-lazy-routes.md
  Uploaded: skills/ember-best-practices/rules/route-loading-substates.md
  Uploaded: skills/ember-best-practices/rules/route-model-caching.md
  Uploaded: skills/ember-best-practices/rules/route-parallel-model.md
  Uploaded: skills/ember-best-practices/rules/route-templates.md
  Uploaded: skills/ember-best-practices/rules/service-cache-responses.md
  Uploaded: skills/ember-best-practices/rules/service-data-requesting.md
  Uploaded: skills/ember-best-practices/rules/service-ember-data-optimization.md
  Uploaded: skills/ember-best-practices/rules/service-owner-linkage.md
  Uploaded: skills/ember-best-practices/rules/service-shared-state.md
  Uploaded: skills/ember-best-practices/rules/template-avoid-computation.md
  Uploaded: skills/ember-best-practices/rules/template-conditional-rendering.md
  Uploaded: skills/ember-best-practices/rules/template-each-key.md
  Uploaded: skills/ember-best-practices/rules/template-fn-helper.md
  Uploaded: skills/ember-best-practices/rules/template-helper-imports.md
  Uploaded: skills/ember-best-practices/rules/template-let-helper.md
  Uploaded: skills/ember-best-practices/rules/template-only-component-functions.md
  Uploaded: skills/ember-best-practices/rules/testing-library-dom-abstraction.md
  Uploaded: skills/ember-best-practices/rules/testing-modern-patterns.md
  Uploaded: skills/ember-best-practices/rules/testing-msw-setup.md
  Uploaded: skills/ember-best-practices/rules/testing-no-raf-for-state.md
  Uploaded: skills/ember-best-practices/rules/testing-qunit-dom-assertions.md
  Uploaded: skills/ember-best-practices/rules/testing-render-patterns.md
  Uploaded: skills/ember-best-practices/rules/testing-test-waiters.md
  Uploaded: skills/ember-best-practices/rules/vscode-setup-recommended.md
  Uploaded: skills/glossary.md
  Uploaded: skills/query-backed-relationships/SKILL.md
  Uploaded: skills/realm-policy-authoring/SKILL.md
  Uploaded: skills/rich-markdown-reports/SKILL.md
  Uploaded: skills/source-code-editing/SKILL.md
Skipping 2 realm-managed remote artifact(s): index.json, realm.json

Checkpoint created: 3417924 [MAJOR] Push: 300 files (~300)
Push completed
Push completed successfully

@habdelra habdelra left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] This review checked §13's claims about the platform against boxel main (the gate, explain, gate-trace, executors, coordinator and policy compile) and the school example realms and their test. It also checked the membership spelling, audience and evergreen wording. It didn't review the prose style of the sections this PR leaves alone.

One blocking gap: the rule against raw writes and the checklist line that restates it both leave out raw appendContainsMany, which can extend teacherIds directly. The checklist line, read literally, also rules out read grants. Everything else is accuracy or wording.

  1. Name appendContainsMany in §13's raw-write rule. Blocking. See the "Keep authorization-bearing fields out of reach" thread.
  2. Limit the checklist line to write grants and add appendContainsMany. Blocking. Suggestion in the thread.
  3. A snapshot grant lays the index under the stored source. Stored fields stay current, so the opening of "When snapshot: true is acceptable" and explain item 4 overstate the gap. Non-blocking.
  4. The lead-teacher example in the read/query split shows read versus write, and no school scenario backs "can mean different things". Non-blocking.
  5. threw gives failed only when no other grant held. Nit.

The membership spellings are all any(. == actor()) and parenthesized inside or. The skill names no server logs and no internal source paths. The skill text has no ticket IDs and no temporal wording. card-operations-authoring is unchanged.

Comment thread skills/realm-policy-authoring/SKILL.md Outdated
Comment on lines +1168 to +1172
**Never grant raw `update`, `transform` or `delete` on a type whose predicate
reads a field those operations can change, unless every caller who passes the
predicate is trusted with the consequence.** `update` and `transform` rewrite
the field. `delete` removes it along with the card, so any caller the predicate
admits decides alone whether the card and its roster go on existing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] This list leaves out raw appendContainsMany, and that base writes exactly the fields membership predicates read. §3 lists it as a base every card carries. The raw entry lets the caller choose the field and the items (AppendContainsManyEntry in card-operations/executors.ts takes field/items or fields). So a grant of appendContainsMany on Classroom with .teacherIds | any(. == actor()) lets Alice add anyone to teacherIds. That is the escalation this section exists to prevent, and a reader who follows the rule as written would allow it.

Please name appendContainsMany here next to update and transform (it extends the field rather than rewriting it). The checklist line has the same gap; see the comment there.

Regression in the new guidance. Blocking.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Fixed in 88b3866. Raw appendContainsMany is now in the list, and the prose says why: the caller names both the field and the items, so it can add anyone to teacherIds.

Comment thread skills/realm-policy-authoring/SKILL.md Outdated
Comment on lines +1322 to +1324
- No grant can write the field its own predicate reads. Every grant that
rests on a field names a named operation, not a raw `update`, `transform` or
`delete`, unless everyone it admits is trusted with that write (§13).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Read literally, "Every grant that rests on a field names a named operation" also covers read grants, and so it fails the school's own read grants. Both of them rest on fields. The line means write grants only. It also leaves out raw appendContainsMany (see the comment on §13's "Keep authorization-bearing fields out of reach"). Suggested wording:

Suggested change
- No grant can write the field its own predicate reads. Every grant that
rests on a field names a named operation, not a raw `update`, `transform` or
`delete`, unless everyone it admits is trusted with that write (§13).
- No grant can write the field its own predicate reads. Every write grant
that rests on a field names a named operation, not a raw `update`,
`transform`, `appendContainsMany` or `delete`, unless everyone it admits is
trusted with that write (§13).

Regression. Blocking, together with the §13 list.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Fixed in 88b3866. The checklist line now reads "Every write grant that rests on a field…" and lists update, transform, appendContainsMany and delete, so read grants are outside it.

Comment thread skills/realm-policy-authoring/SKILL.md Outdated
Comment on lines +1203 to +1209
A snapshot grant decides on the card as the index last saw it (§8). That opens
a time-of-check gap the length of the index's delay. Suppose a classroom has a
computed `headTeacher`, or a `searchable` link to its coordinator's roster card.
Take someone off the roster, and their grant keeps holding until the classroom
is indexed again. The delay is usually short, but it grows while the realm's
index is busy. The gap applies to writes too: the write lock judges a snapshot
grant against the same indexed copy.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] "Decides on the card as the index last saw it" says more than the realm does, and it contradicts §8's "lays the card's indexed values under its stored ones". snapshotInput in card-operations/gate.ts lays the row under the stored source. Stored fields are read as of now, and only computed values and the fields of a searchable linked card come from the index. A linked card's fields also count only while the stored link still names the card the index expanded. Two things follow for this paragraph:

  • Re-pointing the classroom's coordinator link takes effect at once. The old coordinator stops matching and the new one fails closed until the classroom is indexed. The gap opens only when the linked card's own fields change, or the inputs of a computed value.
  • In "Take someone off the roster", the gap comes from editing the roster card. It doesn't come from changing the classroom's link.

Suggested opening: "A snapshot grant reads computed values and linked cards' fields as the index last saw them (§8); stored fields stay current." Then make the example an edit to the coordinator's roster card. Item 4 of "Reading an explanation" (lines 1290–1293) needs the same narrowing: a did-not-hold after an edit to a stored field the predicate reads is not the index catching up.

Regression (inaccurate new prose). Non-blocking, but this is the mechanism the whole subsection rests on.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Fixed in 88b3866. The section now says that a snapshot grant reads stored fields as they are now, and only its computed values and searchable linked cards' fields as the index last saw them. The example names the lagging case (the computed value's inputs, or the id on the linked roster card) and says that re-pointing the link takes effect at once. Explain item 4 is narrowed the same way.

Comment thread skills/realm-policy-authoring/SKILL.md Outdated
Comment on lines +1255 to +1258
- **They can mean different things.** Being allowed to open a card you were
sent a link to is different from being allowed to enumerate every card like
it. A lead teacher in the school reads the classroom they lead but can't log
an activity there. The same split applies between reading and listing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] The lead-teacher example shows a different split from the one this bullet argues for. Reading a classroom versus appending an activity is read versus a write, not read versus listing. "The same split applies between reading and listing" asks the reader to make that jump themselves. In the school, the read and listMySchedules predicates are identical, so no scenario there shows the two lanes meaning different things. That breaks the rule that every rule in this section maps to a school scenario. Two options:

  1. Drop the lead-teacher sentence and keep the bullet's first sentence as the whole argument.
  2. Give a hypothetical and label it as one, for example "a substitute who can open the classroom they were sent but shouldn't enumerate every classroom".

I'd take (1). Non-blocking.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Fixed in 88b3866. I dropped the lead-teacher sentence. The bullet now argues only open-versus-enumerate, which the provider's ad-hoc search in the same subsection illustrates.

Comment thread skills/realm-policy-authoring/SKILL.md Outdated
Comment on lines +1296 to +1297
5. **`threw` is a bug in the policy, not a refusal.** The answer is
`decision: "failed"` and the invocation would answer 500 to a realm reader.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] decision: "failed" happens only when no other grant held. Grants union: firstHolding in card-operations/gate.ts keeps evaluating after a throw and admits on any grant that holds. An explanation can therefore show one grant threw and still be allowed, and a reader of this item would take that as contradicting it. Suggested wording: "If no other grant held, the answer is decision: "failed" …; if another held, the throw still hides a bug for every card that grant doesn't admit."

Non-blocking nit.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Fixed in 88b3866. Item 5 now says failed applies only when no other grant held, and that an explanation can be allowed with a threw grant inside it. The bug is still there, and it refuses the first card that only the throwing grant could admit.

…nsMany and a throw beside a held grant

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng a snapshot link

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@habdelra
habdelra requested a review from a team October 6, 2026 14:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants