@owlmeans/server-planning 0.1.18-rc.28 → 0.1.18-rc.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@ the `@owlmeans/server-planning/store` subpath.
10
10
  ## Installation
11
11
 
12
12
  ```sh
13
- bun add @owlmeans/server-planning@^0.1.18-rc.27 @owlmeans/planning@^0.1.18-rc.23 ajv
13
+ bun add @owlmeans/server-planning@^0.1.18-rc.29 @owlmeans/planning@^0.1.18-rc.25 ajv
14
14
  ```
15
15
 
16
16
  ## Concepts
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/server-planning",
4
- "version": "0.1.18-rc.28",
5
- "generatedAt": "2026-10-09T13:40:06.949Z",
4
+ "version": "0.1.18-rc.29",
5
+ "generatedAt": "2026-10-09T17:24:50.729Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/server-planning
9
9
 
10
10
  **Layer:** Server
11
- **Install:** `"@owlmeans/server-planning": "^0.1.18-rc.28"` in `dependencies` (`ajv` is a peer)
11
+ **Install:** `"@owlmeans/server-planning": "^0.1.18-rc.29"` in `dependencies` (`ajv` is a peer)
12
12
 
13
13
  The general implementation of `@owlmeans/planning`: the planning service (a plugin host), the
14
14
  scoped facade, the executor every write goes through, the in-memory reference store, the commit
@@ -300,26 +300,25 @@ mapping external records (`mappers`) belongs to that plugin's own store adapter.
300
300
  decision per request; a throw is the request's answer (an `AuthForbidden` answers 403).
301
301
 
302
302
  - `entityId` is the resolver's — never the token's, never `opts.scope`'s.
303
- - `projects` becomes `PlanningScope.projects`, which the server facade enforces on every read and
304
- write. Visible are the projects, every card whose `parents` name one, and every specification
305
- whose parent card is visible (its `parents` hold only that card). Anything else reads as absent
303
+ - `projects` becomes `PlanningScope.projects`, which the server facade enforces on reads and
304
+ writes. A card is visible when at least one project reached through its recursive parent paths
305
+ is allowed; specifications follow their containing cards. Anything else reads as absent
306
306
  (`WorkcardNotFound`, `null`, an empty list); a create under an invisible parent is
307
- `ParentNotFound`; links and transitions are filtered by `project` (and post-filtered, for a store
308
- that ignores the field); commit subscriptions drop events outside the set and a status or wait
309
- refuses them.
310
- - **A narrowed list or count sees a specification whenever its parent card is visible** — exactly
311
- what a single read admits. It is AND'd with `projectCriteriaOf(projects, through)`; when its
312
- criteria ask for specifications (`wantsSpecifications`) the facade resolves `through` (the visible
313
- parent cards) with ONE read per call: the query's `parent`, else the projects' own cards. A
314
- summary counts no specification and pays nothing extra. `tests/narrowing.spec.ts` pins it.
307
+ `ParentNotFound`. Links, transitions and commits use current endpoint/card ancestry, with a
308
+ cached project fallback only for purged records. Subscriptions and commit waits enforce the
309
+ same visibility.
310
+ - **Narrowed lists, counts and summaries use the allowed recursive descendant IDs before paging.**
311
+ A specification is admitted through the same containing-card hierarchy as a single read.
312
+ Do not replace this with a direct-parent query or a filter applied after pagination.
313
+ `tests/narrowing.spec.ts` and shared hierarchy conformance pin this behavior.
315
314
  - A person who may see only SOME projects of their organization (a tool-shed volunteer given one
316
315
  shed) is expressed here: the resolver answers the project ids the person's grants list as
317
316
  `projects`, and omits the key when a grant covers every project — never a hand-written filter in
318
317
  each handler.
319
318
  - `writes` is the subset of projects the person may WRITE in (`projects` are the ones they VIEW).
320
- `execute` on a card, specification or link needs it to be writable — the rule a narrowed read
321
- admits, over `writes`: the project itself, a card whose `parents` name one, a specification
322
- through its parent card; a create needs every named parent writable, and a create at the root
319
+ `execute` on a card, specification or link needs it to be writable — the recursive ancestor
320
+ rule over `writes`: a card admitted directly or through a writable parent path. A create needs
321
+ every named parent writable; reparenting checks every supplied destination parent. A create at the root
323
322
  (no parent, not a project) is refused. `schema.define` of a project layer needs the project in
324
323
  `writes`. A refusal is `PlanningForbidden` (403, `forbidden:writes:<id>`), checked before the grants
325
324
  and before the executor. NOT governed by it: a project create (`grants.createProjects` alone) and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/server-planning",
3
- "version": "0.1.18-rc.28",
3
+ "version": "0.1.18-rc.29",
4
4
  "license": "MIT",
5
5
  "description": "The general planning implementation — the planning service and its plugin/middleware registry, the transition executor, the in-memory store, the protocol handlers and the commit feed.",
6
6
  "type": "module",
@@ -50,7 +50,7 @@
50
50
  "@owlmeans/context": "^0.1.18-rc.34",
51
51
  "@owlmeans/entrypoint": "^0.1.18-rc.41",
52
52
  "@owlmeans/error": "^0.1.18-rc.38",
53
- "@owlmeans/planning": "^0.1.18-rc.24",
53
+ "@owlmeans/planning": "^0.1.18-rc.25",
54
54
  "@owlmeans/queue": "^0.1.18-rc.44",
55
55
  "@owlmeans/resource": "^0.1.18-rc.40",
56
56
  "@owlmeans/log": "^0.1.18-rc.3",