@mnstry/atelier 0.2.0-alpha.13 → 0.2.0-alpha.15

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.
Files changed (253) hide show
  1. package/CHANGELOG.md +283 -0
  2. package/README.md +102 -52
  3. package/SECURITY.md +1 -1
  4. package/TRADEMARKS.md +2 -2
  5. package/contracts/atelier-extension-manifest.v1.schema.json +412 -0
  6. package/contracts/atelier-graph-view.v1.schema.json +1085 -0
  7. package/contracts/public-api-baseline.json +298 -19
  8. package/docs/README.md +90 -0
  9. package/docs/blocks/capability-stewardship.md +1 -1
  10. package/docs/blocks/claims.md +2 -2
  11. package/docs/blocks/conformance-admission.md +1 -1
  12. package/docs/blocks/learning-harnesses.md +1 -1
  13. package/docs/{atelier-sync.md → guides/atelier-sync.md} +20 -14
  14. package/docs/{capability-stewardship.md → guides/capability-stewardship.md} +2 -4
  15. package/docs/guides/co-authoring.md +113 -0
  16. package/docs/{distributions.md → guides/distributions.md} +13 -8
  17. package/docs/guides/extensions.md +189 -0
  18. package/docs/guides/graph-refresh.md +152 -0
  19. package/docs/guides/graph-workspace.md +64 -0
  20. package/docs/{ingestion.md → guides/ingestion.md} +16 -15
  21. package/docs/{inquiry-harnesses.md → guides/inquiry-harnesses.md} +2 -3
  22. package/docs/{knowledge-workspace.md → guides/knowledge-workspace.md} +2 -2
  23. package/docs/{learning-harnesses.md → guides/learning-harnesses.md} +2 -3
  24. package/docs/{learning.md → guides/learning.md} +12 -5
  25. package/docs/{obsidian.md → guides/obsidian.md} +370 -23
  26. package/docs/guides/ontology-guide.md +111 -0
  27. package/docs/{personal-workspace.md → guides/personal-workspace.md} +17 -5
  28. package/docs/{research-starter.md → guides/research-starter.md} +1 -1
  29. package/docs/{tenant-readiness.md → guides/tenant-readiness.md} +39 -0
  30. package/docs/{upgrade.md → guides/upgrade.md} +197 -11
  31. package/docs/knowledge-health/assessment/capabilities.md +6 -15
  32. package/docs/knowledge-health/facilitator.md +15 -4
  33. package/docs/knowledge-health/{devday/participant-response.md → participant-response.md} +4 -2
  34. package/docs/knowledge-health/quickstart.md +97 -75
  35. package/docs/knowledge-health/readme.md +13 -5
  36. package/docs/maintainers/describing-the-atelier.md +173 -0
  37. package/docs/{release-engineering.md → maintainers/release-engineering.md} +5 -4
  38. package/docs/{announcements.md → reference/announcements.md} +1 -1
  39. package/docs/{architecture.md → reference/architecture.md} +31 -5
  40. package/docs/{atelier-runtime.md → reference/atelier-runtime.md} +1 -1
  41. package/docs/{connected-composition.md → reference/connected-composition.md} +7 -10
  42. package/docs/{coordination.md → reference/coordination.md} +1 -1
  43. package/docs/{decisions.md → reference/decisions.md} +3 -3
  44. package/docs/{design.md → reference/design.md} +1 -1
  45. package/docs/reference/edge-policy.md +151 -0
  46. package/docs/reference/graph-view-structured.md +119 -0
  47. package/docs/reference/graph-view.md +139 -0
  48. package/docs/reference/graph-workspace.md +37 -0
  49. package/docs/{intake-and-guides.md → reference/intake-and-guides.md} +3 -4
  50. package/docs/{knowledge-graph.md → reference/knowledge-graph.md} +120 -6
  51. package/docs/{local-services.md → reference/local-services.md} +43 -4
  52. package/docs/{obsidian-contract.md → reference/obsidian-contract.md} +29 -4
  53. package/docs/{obsidian-plugin.md → reference/obsidian-plugin.md} +218 -68
  54. package/docs/{practical-judgment.md → reference/phronesis.md} +12 -3
  55. package/docs/reference/portability.md +92 -0
  56. package/docs/{portable-presentation.md → reference/portable-presentation.md} +2 -2
  57. package/docs/{presentation-consumer-boundaries.md → reference/presentation-consumer-boundaries.md} +5 -0
  58. package/docs/{project-options.md → reference/project-options.md} +17 -0
  59. package/docs/{repo-boundary-guard.md → reference/repo-boundary-guard.md} +50 -4
  60. package/docs/{review-portability.md → reference/review-portability.md} +4 -0
  61. package/docs/{semantic-operation.md → reference/semantic-operation.md} +4 -3
  62. package/docs/{template-profile.md → reference/template-profile.md} +1 -1
  63. package/docs/{trackables.md → reference/trackables.md} +2 -2
  64. package/docs/start/independent-start.md +89 -0
  65. package/docs/{install.md → start/install.md} +9 -9
  66. package/docs/{knowledge-setup.md → start/knowledge-setup.md} +5 -5
  67. package/docs/{research-starter-quickstart.md → start/research-starter-quickstart.md} +6 -6
  68. package/fixtures/atelier-architecture/catalog/invalid/document.json +2 -2
  69. package/fixtures/atelier-architecture/catalog/valid/document.json +2 -2
  70. package/fixtures/graph-view/synthetic-authorized-input.v1.json +437 -0
  71. package/fixtures/graph-view/synthetic-view.v1.json +1 -0
  72. package/fixtures/knowledge-health/workshop/README.md +1 -1
  73. package/fixtures/templates/local-library.v1.json +3 -1
  74. package/package.json +22 -8
  75. package/plugins/obsidian/main.js +57 -8
  76. package/plugins/obsidian/manifest.json +1 -1
  77. package/skills/claude/atelier-guided-upgrade/SKILL.md +1 -1
  78. package/skills/claude/atelier-knowledge-setup/SKILL.md +2 -2
  79. package/skills/claude/atelier-local-service/SKILL.md +1 -1
  80. package/skills/claude/atelier-practical-judgment/SKILL.md +7 -2
  81. package/skills/claude/atelier-skill-steward/SKILL.md +1 -1
  82. package/skills/claude/mnstry-readiness/SKILL.md +2 -2
  83. package/skills/codex/atelier-guided-upgrade/SKILL.md +1 -1
  84. package/skills/codex/atelier-knowledge-setup/SKILL.md +2 -2
  85. package/skills/codex/atelier-local-service/SKILL.md +1 -1
  86. package/skills/codex/atelier-practical-judgment/SKILL.md +7 -2
  87. package/skills/codex/atelier-skill-steward/SKILL.md +1 -1
  88. package/skills/codex/mnstry-readiness/SKILL.md +2 -2
  89. package/src/architecture/catalog.mjs +2 -2
  90. package/src/attestation/sign.mjs +1 -1
  91. package/src/boundary/content-rules.mjs +534 -68
  92. package/src/boundary/policy.mjs +187 -60
  93. package/src/cli/run.mjs +26 -9
  94. package/src/commands/distribution.mjs +1 -1
  95. package/src/commands/extension.mjs +27 -0
  96. package/src/commands/ingest.mjs +1 -1
  97. package/src/commands/learn.mjs +1 -1
  98. package/src/commands/obsidian.mjs +49 -21
  99. package/src/commands/review.mjs +3 -0
  100. package/src/edge-policy/contract.mjs +69 -0
  101. package/src/edge-policy/policy.mjs +142 -0
  102. package/src/edge-policy/source-citation-adapter.mjs +43 -0
  103. package/src/extension-packs/loader.mjs +4 -3
  104. package/src/extensions/admission.mjs +83 -0
  105. package/src/extensions/client.d.mts +23 -0
  106. package/src/extensions/client.mjs +99 -0
  107. package/src/extensions/contracts.d.mts +29 -0
  108. package/src/extensions/contracts.mjs +163 -0
  109. package/src/extensions/convex.d.mts +24 -0
  110. package/src/extensions/convex.mjs +189 -0
  111. package/src/extensions/delegation.mjs +54 -0
  112. package/src/extensions/drizzle.d.mts +11 -0
  113. package/src/extensions/drizzle.mjs +33 -0
  114. package/src/extensions/postgres.d.mts +7 -0
  115. package/src/extensions/postgres.mjs +66 -0
  116. package/src/extensions/prisma.d.mts +13 -0
  117. package/src/extensions/prisma.mjs +63 -0
  118. package/src/extensions/project.mjs +432 -0
  119. package/src/extensions/scaffold-convex.mjs +130 -0
  120. package/src/extensions/scaffold-sql.mjs +144 -0
  121. package/src/extensions/server.d.mts +20 -0
  122. package/src/extensions/server.mjs +102 -0
  123. package/src/extensions/sql-scope.mjs +22 -0
  124. package/src/graph/graph.mjs +13 -5
  125. package/src/graph/knowledge-graph.mjs +20 -2
  126. package/src/graph/repo-contribution.mjs +405 -0
  127. package/src/graph/repo-contribution.types.mjs +32 -0
  128. package/src/graph-access/edge-decision-adapter.mjs +41 -0
  129. package/src/graph-access/edge-record-adapter.mjs +73 -0
  130. package/src/graph-access/index.mjs +253 -0
  131. package/src/graph-access/multi-contribution-record-adapter.mjs +101 -0
  132. package/src/graph-access/multi-record-projection-adapter.mjs +74 -0
  133. package/src/graph-access/source-adapter.mjs +81 -0
  134. package/src/graph-refresh/compare.mjs +110 -0
  135. package/src/graph-refresh/controller.mjs +324 -0
  136. package/src/graph-refresh/index.mjs +3 -0
  137. package/src/graph-refresh/local.mjs +78 -0
  138. package/src/graph-view/babylon/babylon-scene-port.mjs +64 -0
  139. package/src/graph-view/babylon/index.mjs +2 -0
  140. package/src/graph-view/babylon/navigator.mjs +312 -0
  141. package/src/graph-view/babylon/provenance.mjs +36 -0
  142. package/src/graph-view/babylon/scene-controller.mjs +131 -0
  143. package/src/graph-view/babylon/semantic-picking.mjs +35 -0
  144. package/src/graph-view/babylon/web-host.mjs +188 -0
  145. package/src/graph-view/cli.mjs +3 -0
  146. package/src/graph-view/command.mjs +34 -0
  147. package/src/graph-view/contracts.mjs +79 -0
  148. package/src/graph-view/errors.mjs +5 -0
  149. package/src/graph-view/index.mjs +4 -0
  150. package/src/graph-view/intents.mjs +30 -0
  151. package/src/graph-view/query.mjs +213 -0
  152. package/src/graph-view/refs.mjs +2 -0
  153. package/src/graph-view/structured/browser.mjs +262 -0
  154. package/src/graph-view/structured/styles.mjs +8 -0
  155. package/src/graph-workspace/authoring.mjs +185 -0
  156. package/src/graph-workspace/browser/constellation.mjs +369 -0
  157. package/src/graph-workspace/browser/dom.mjs +23 -0
  158. package/src/graph-workspace/browser/index.mjs +6 -0
  159. package/src/graph-workspace/browser/review.mjs +55 -0
  160. package/src/graph-workspace/browser/styles.mjs +11 -0
  161. package/src/graph-workspace/browser/workbench.mjs +351 -0
  162. package/src/graph-workspace/browser/workspace.mjs +431 -0
  163. package/src/graph-workspace/disclosure.mjs +39 -0
  164. package/src/graph-workspace/geometry.mjs +78 -0
  165. package/src/graph-workspace/index.mjs +11 -0
  166. package/src/graph-workspace/labels.mjs +50 -0
  167. package/src/graph-workspace/model.mjs +109 -0
  168. package/src/graph-workspace/recipes.mjs +88 -0
  169. package/src/graph-workspace/scale.mjs +95 -0
  170. package/src/graph-workspace/theme.mjs +156 -0
  171. package/src/ingestion/optional/graphify/graphify_supplier.py +5 -0
  172. package/src/ingestion/optional/graphify/native-closure-pins.json +275 -0
  173. package/src/ingestion/optional/graphify/native-pins.json +306 -0
  174. package/src/knowledge/ontology-guide.mjs +152 -0
  175. package/src/knowledge-health/proof/installed-check.mjs +2 -2
  176. package/src/knowledge-health/rule-identity.mjs +14 -9
  177. package/src/knowledge-health/workshop.mjs +22 -2
  178. package/src/personal-workspace/index.mjs +1 -1
  179. package/src/personal-workspace/selection.mjs +34 -3
  180. package/src/project/config.mjs +1 -1
  181. package/src/project/path-match.mjs +2 -1
  182. package/src/project/providers/github.mjs +24 -0
  183. package/src/project/repo-identity.mjs +3 -22
  184. package/src/projection/obsidian/contracts.mjs +1 -1
  185. package/src/projection/obsidian/materialize/path-registry.mjs +1 -1
  186. package/src/projection/obsidian/materialize/prepare-view.mjs +88 -6
  187. package/src/projection/obsidian/materialize/redaction.mjs +1 -1
  188. package/src/projection/obsidian/personal-workspace.mjs +84 -5
  189. package/src/projection/obsidian/plugin-bridge/channel.mjs +1 -1
  190. package/src/projection/obsidian/proposals/adapter.mjs +46 -23
  191. package/src/projection/obsidian/proposals/observation.mjs +40 -2
  192. package/src/projection/obsidian/publication/publisher.mjs +96 -8
  193. package/src/projection/project.mjs +21 -16
  194. package/src/readiness/readiness.mjs +20 -11
  195. package/src/readiness-protocols/bundled-pack.mjs +14 -766
  196. package/src/readiness-protocols/bundled-selection.mjs +32 -0
  197. package/src/readiness-protocols/evidence.mjs +2 -1
  198. package/src/readiness-protocols/packs/mnstry.mjs +766 -0
  199. package/src/readiness-protocols/runtime.mjs +43 -6
  200. package/src/runtime/obsidian/engine.mjs +387 -76
  201. package/src/runtime/obsidian/lifecycle.mjs +20 -15
  202. package/src/runtime/obsidian/login-item.mjs +6 -3
  203. package/src/runtime/obsidian/machine-settings.mjs +52 -8
  204. package/src/runtime/obsidian/observation.mjs +36 -4
  205. package/src/runtime/obsidian/opening.mjs +4 -3
  206. package/src/runtime/obsidian/personal-selection.mjs +187 -0
  207. package/src/runtime/obsidian/pipeline.mjs +115 -6
  208. package/src/runtime/obsidian/private-lock.mjs +50 -6
  209. package/src/runtime/obsidian/selection-continuity.mjs +124 -0
  210. package/src/runtime/obsidian/service-main.mjs +68 -16
  211. package/src/runtime/obsidian/service.mjs +80 -6
  212. package/src/runtime/obsidian/unheld-evidence.mjs +1 -1
  213. package/src/runtime/obsidian/view-permission.mjs +335 -0
  214. package/src/ui/control-system.mjs +201 -0
  215. package/src/ui/html-primitives.mjs +3 -0
  216. package/src/upgrade/closure-diagnostics.mjs +135 -0
  217. package/src/upgrade/closure.mjs +649 -0
  218. package/src/upgrade/upgrade.mjs +42 -11
  219. package/templates/distribution-workspace/README.md +2 -2
  220. package/templates/external-project-workspace/atelier.project.json +3 -0
  221. package/templates/external-project-workspace/pack-lifecycle.json +3 -1
  222. package/templates/knowledge-workspace/README.md +2 -2
  223. package/docs/integration-and-review-plan.md +0 -409
  224. package/docs/integration-contract-decisions.md +0 -44
  225. package/docs/knowledge-health/devday/facilitator.md +0 -16
  226. package/docs/knowledge-health/devday/public-default.md +0 -107
  227. package/docs/knowledge-health/devday/quickstart.md +0 -18
  228. package/docs/knowledge-health/devday/support.md +0 -22
  229. package/docs/knowledge-health/exercise.md +0 -17
  230. package/docs/knowledge-health/support.md +0 -34
  231. package/docs/presentation-review-disposition.md +0 -47
  232. package/docs/progressive-ingestion-acceptance.md +0 -89
  233. package/docs/progressive-ingestion.md +0 -235
  234. /package/docs/{exact-upgrades.md → guides/exact-upgrades.md} +0 -0
  235. /package/docs/{guided-upgrades.md → guides/guided-upgrades.md} +0 -0
  236. /package/docs/{local-review.md → guides/local-review.md} +0 -0
  237. /package/docs/{skill-steward.md → guides/skill-steward.md} +0 -0
  238. /package/docs/{template-upgrades.md → guides/template-upgrades.md} +0 -0
  239. /package/docs/{assurance-controls.md → maintainers/assurance-controls.md} +0 -0
  240. /package/docs/{attestation.md → reference/attestation.md} +0 -0
  241. /package/docs/{coauthor-session.md → reference/coauthor-session.md} +0 -0
  242. /package/docs/{continuity.md → reference/continuity.md} +0 -0
  243. /package/docs/{contract-stability.md → reference/contract-stability.md} +0 -0
  244. /package/docs/{decision-practices.md → reference/decision-practices.md} +0 -0
  245. /package/docs/{evidence-navigation.md → reference/evidence-navigation.md} +0 -0
  246. /package/docs/{extension-pack-lifecycle.md → reference/extension-pack-lifecycle.md} +0 -0
  247. /package/docs/{interaction-and-reflection.md → reference/interaction-and-reflection.md} +0 -0
  248. /package/docs/{local-state.md → reference/local-state.md} +0 -0
  249. /package/docs/{ontology.md → reference/ontology.md} +0 -0
  250. /package/docs/{optional-ingestion.md → reference/optional-ingestion.md} +0 -0
  251. /package/docs/{project-command-inventory.md → reference/project-command-inventory.md} +0 -0
  252. /package/docs/{semantic-ingestion.md → reference/semantic-ingestion.md} +0 -0
  253. /package/docs/{vault-service.md → reference/vault-service.md} +0 -0
@@ -0,0 +1,113 @@
1
+ # Co-authoring with agents
2
+
3
+ A body of work is authored together, in the structure of the work itself
4
+ rather than in a document tool or an email thread. People read and question
5
+ the pages. Agents draft from the graph and the questions. Where the checks
6
+ run in the commit path, every change, by a person or an agent, passes the
7
+ same checks, and that is what makes the agentic
8
+ process (an agent acting inside a governed workflow) reliable.
9
+
10
+ This page describes the loop, the record it leaves, and what has to be in
11
+ place for it to hold. The files are yours. The package supplies the graph,
12
+ the checks and the collaboration records. The harness supplies the agent.
13
+ Nothing here changes what the package will and will not do to a source:
14
+ README section 4, "The local runtime serves people and agents", states that,
15
+ and the will-not-do block states the rest.
16
+
17
+ ## The loop
18
+
19
+ Three actors take part: a person, an agent running in the harness, and the
20
+ package. In this loop the package records, checks and refuses; the edit and
21
+ the commit are the agent's or the person's.
22
+
23
+ 1. **A person asks on the page.** A reader selects the sentence they mean on
24
+ the projected page and leaves a question, a correction or a discussion. The
25
+ review surface (the package's optional `atelier dev --review`, or a
26
+ consumer adapter built on the collaboration ledger) records the note and
27
+ pins it to that passage and to the digest of that revision of the source.
28
+ 2. **An agent drafts from the graph.** In the harness it reads the open
29
+ questions on the file, follows the graph to every file declared to depend
30
+ on it, and edits those files in the working tree. Where they are wired in,
31
+ the graph check and the boundary guard run against its work as they would
32
+ against anyone's.
33
+ 3. **A person decides, and the change lands.** The person reviews the draft
34
+ and, where the workflow records decisions, records one with its rationale
35
+ through the consumer adapter or the team's workflow. The optional review
36
+ workspace records decisions on review-run claims, not decisions about a draft
37
+ change. The package does not require or check a decision before a commit. The
38
+ person or the agent commits the change through the boundary guard, and the
39
+ graph and the pages built from it follow on their next build.
40
+
41
+ The next question starts from the updated source.
42
+
43
+ ## Provenance is built in
44
+
45
+ The review store pins notes and reading positions to a document's digest and
46
+ the passage they address, and binds decisions to the evidence they judged.
47
+ A contribution made against a stale version is refused. A later decision
48
+ supersedes an earlier one, and the history keeps both. Each record carries the
49
+ name its author gives, which the package records as locally asserted, not
50
+ authenticated. `docs/guides/local-review.md` describes the store and its refusals. When the source changes, earlier notes stay pinned to
51
+ the wording they addressed, so "what has been questioned about this passage"
52
+ is a lookup, not a memory.
53
+
54
+ A change by an agent passes the same checks as a change by a person: the graph
55
+ check and the boundary guard, where they are wired in. A team that wants every
56
+ change to carry a recorded decision adds that rule to its own workflow; the
57
+ package does not enforce it.
58
+
59
+ ## Giving an agent a job
60
+
61
+ This section describes the system (the package with a harness and connected
62
+ tools), not the package alone.
63
+
64
+ You define the outcome and constraints. An agent uses the relevant files,
65
+ works through the task with connected tools and returns work to review.
66
+ Approved changes become part of the shared record for the next task. The
67
+ agent's instructions (its skill and the harness's permissions, not a package
68
+ gate) specify which records it may use, what it may change and when approval
69
+ is required.
70
+
71
+ The team defines a goal and reviews a proposed plan before the agent starts,
72
+ then reviews the outputs and approves consequential actions. Accepted changes
73
+ update the shared knowledge, so the next task starts from the latest agreed
74
+ material rather than from a fresh briefing.
75
+
76
+ What has to be connected: the agent, access to the relevant files, and
77
+ whatever other tools the chosen workflow uses,
78
+ plus agreed review responsibilities and action permissions. The package
79
+ organizes source material and review contributions; agent execution and
80
+ external delivery are integrations you configure in the harness.
81
+
82
+ ## What the loop rests on
83
+
84
+ - **A harness with the skills installed.** `atelier skills sync` installs the
85
+ package's skill files into the workspace from a digest-confirmed plan (by
86
+ default from the package's `skills/codex` into `.agents/skills`; `--source`
87
+ and `--target` change that). Whether a harness discovers and follows them
88
+ is the harness's matter. See `docs/guides/skill-steward.md`.
89
+ - **Gates in the commit path.** The boundary guard hooks
90
+ (`atelier boundary install-hooks`) and the graph check in CI. The sentence
91
+ "every change passes the same checks" is true where the checks run on every
92
+ commit.
93
+ - **A contribution surface.** The package's loopback projection carries the
94
+ page and its passages. Its optional review workspace (`atelier dev --review`,
95
+ described in `docs/guides/local-review.md`) records passage notes and decisions
96
+ on review-run claims. A consumer adapter built on the collaboration ledger
97
+ or the team's workflow records decisions about a draft change;
98
+ `docs/reference/coauthor-session.md` describes the experimental portable
99
+ session reducer. These records do not apply a source change; the agent in
100
+ the harness does, and the checks run against it.
101
+ - **Examples with expected results.** By convention, each round of authoring
102
+ adds reviewed examples with expected results beside the rules they test. The
103
+ package keeps them and their links in the graph; it does not run them. An
104
+ agent in the harness runs them against its drafts, and because they stay in
105
+ the record, a later draft can be checked against the same cases.
106
+
107
+ ## What the package does not do here
108
+
109
+ It does not draft. It does not apply a proposal to a source. It does not
110
+ grant an agent write access. It does not decide. It records the question,
111
+ checks the change, and records a decision when one is given, and it refuses
112
+ a contribution made against a stale version. The rest is the harness's work
113
+ and the people's.
@@ -39,7 +39,7 @@ changes what a root command means is a fork, not a distribution.
39
39
  Distributions must carry MNSTRY attribution. The normative wording of this
40
40
  requirement lives in `TRADEMARKS.md` under "Required attribution" — this
41
41
  document deliberately does not restate it, so the two cannot drift. See also
42
- `docs/attestation.md` for how admission decisions are recorded.
42
+ `docs/reference/attestation.md` for how admission decisions are recorded.
43
43
 
44
44
  Three related obligations live alongside it:
45
45
 
@@ -149,8 +149,10 @@ Workspace projections read
149
149
  }
150
150
  ```
151
151
 
152
- The "MNSTRY Tenant Readiness" section heading in the rendered projection stays
153
- as is: it names the bundled MNSTRY pack.
152
+ When the bundled readiness pack is selected, the rendered projection keeps the
153
+ "MNSTRY Tenant Readiness" heading: it names that pack. An explicit
154
+ `readiness.includeBundled: false` in the project's `ext["mnstry.atelier"]` omits
155
+ the section; absent or `true` retains the existing default.
154
156
 
155
157
  ### 5. Add an extension pack
156
158
 
@@ -165,10 +167,13 @@ The manifest carries the advisory attribution key:
165
167
  }
166
168
  ```
167
169
 
168
- Extension protocols load alongside the bundled twelve; they never replace
169
- them. Note that pack contributions to the tenant readiness packet ride in an
170
- unschema'd runtime document (`mnstry.tenant-readiness-packet@v1`) whose shape
171
- is pinned by tests, not by the versioned contracts the compat gate checks.
170
+ Extension protocols load alongside the bundled twelve by default. A project
171
+ can [deselect the bundle](tenant-readiness.md#select-the-readiness-pack) and use
172
+ only its selected custom protocols; this does not create a replacement tenant
173
+ journey or packet. When the bundle is selected, pack contributions to the tenant
174
+ readiness packet ride in an unschema'd runtime document
175
+ (`mnstry.tenant-readiness-packet@v1`) whose shape is pinned by tests, not by the
176
+ versioned contracts the compat gate checks.
172
177
 
173
178
  Declared pack paths resolve from the directory holding `atelier.project.json`
174
179
  and may not contain `..` segments, so the pack directory has to sit inside the
@@ -216,5 +221,5 @@ a stylistic preference.
216
221
 
217
222
  A distribution changes branding, not authority. Admission of any payload into
218
223
  a MNSTRY destination is decided and recorded exactly as for the root package —
219
- see `docs/attestation.md` for the admission model and how attestations record
224
+ see `docs/reference/attestation.md` for the admission model and how attestations record
220
225
  those decisions.
@@ -0,0 +1,189 @@
1
+ # Custom database extensions
2
+
3
+ Use `atelier extension init --directory ./custom-extension --id sample.counter`
4
+ to generate a TypeScript Postgres backend. The destination must not exist.
5
+ The command writes files only. It creates no database, starts no process and
6
+ grants no access. Apply the emitted migration to a customer-owned PostgreSQL 17
7
+ database with a separate migration role; keep the application login restricted.
8
+
9
+ The generated backend is a host adapter. Its host supplies the database client,
10
+ verified root public keys, pinned installation/release and an admission origin.
11
+ The server authenticates a short-lived invocation and obtains durable root
12
+ admission before creating its in-process effect scope. The Postgres helper
13
+ keeps a native transaction API and atomically commits custom writes with their
14
+ operation receipts. Credentials and application data stay in the customer backend.
15
+
16
+ Import portable wire types from `@mnstry/atelier/extensions`, member/admin clients
17
+ from `/extensions/client`, and backend helpers from `/extensions/server` and
18
+ `/extensions/postgres`. Browser clients never import database drivers or server keys.
19
+ The Postgres driver is installed in the generated project, not in Atelier.
20
+
21
+ Studio installation and member permission are separate. An authenticated host
22
+ owns membership, consent and product access. The manifest declares requested
23
+ capabilities; it grants none. Root-bound results use a separate authorized action.
24
+ The generated `atelier.extension-pack.json` reuses Atelier's canonical pack identity,
25
+ loader and lock adoption. Its namespaced `runtimeManifest` field pins this component's
26
+ manifest file and release digest. The runtime manifest describes the backend protocol;
27
+ it does not create another pack identity. Declare the emitted pack in your existing
28
+ project and adopt it with the normal validation/lock workflow. Pack loading remains
29
+ non-executing and grants no backend or root authority. Standalone hosts can consume
30
+ the portable SDK without an Atelier project.
31
+
32
+ Use `extension validate --directory ...` to check source/schema/release digests.
33
+ After reviewing an edit, use `extension seal --directory ...` to update them.
34
+ A valid seal identifies bytes; it proves neither publisher trust nor deployment.
35
+ Keep the package lockfile after installation. Lost write replies require explicit
36
+ lookup/recovery; neither client silently retries or refreshes a generation.
37
+
38
+ Scaffold profiles include postgres-sql, drizzle-db-first, drizzle-code-first,
39
+ prisma-7-postgres and convex-native. Drizzle retains its native query builder and transaction API;
40
+ Prisma retains its native generated client and pg adapter. Convex uses the native
41
+ starter described below. Prisma 8 remains an unqualified separate experiment. Scaffolding, synthetic
42
+ protocol tests, real provider tests, actual supported hosts, public release and
43
+ customer acceptance carry separate evidence. Private runtime bindings are not
44
+ distributed in this package.
45
+
46
+ The runtime parser is required after JSON Schema validation: it enforces unique IDs and cross-references, recovery scope/effect, current-schema readability, Unicode and total JSON bounds. Native Postgres operation results are capped at 60 KiB inside the transaction, leaving room for the original-operation recovery proof within the 64 KiB action output bound. Every failure after successful admission remains an uncertain operation; inspect its durable receipt before deciding what to do next.
47
+
48
+ The candidate SDK version 0.2.0-alpha.15 is unpublished. Before its release,
49
+ pack the reviewed Atelier checkout with `npm pack --ignore-scripts` and install
50
+ the resulting local tarball in the generated project with
51
+ `npm install /absolute/path/to/mnstry-atelier-0.2.0-alpha.15.tgz`. Then run
52
+ `npm run typecheck` and reseal the reviewed project. Do not expect the unpublished
53
+ version to install from the public registry. String length limits use Unicode
54
+ code points, matching JSON Schema; ill-formed surrogate sequences remain refused.
55
+
56
+ The source seal covers package.json, tsconfig.json, src/, present npm lockfiles,
57
+ and present Drizzle/Prisma configuration and Prisma schema files. Installing or
58
+ changing a lockfile requires an explicit reseal. It does not cover an arbitrary
59
+ external host or deployed image. Schema bytes cover schemas/ and migrations/.
60
+ Each source file is limited to 1 MiB; each canonical digest map is limited to
61
+ 128 KiB. Deterministic invalid pack state refuses before rewriting the manifest.
62
+ The manifest and pack remain separate files: an interruption between their writes
63
+ is detected as stale by validation and requires an explicit reseal.
64
+
65
+ Choose a profile with `atelier extension init --profile drizzle-db-first` (or
66
+ `drizzle-code-first`, `prisma-7-postgres`). DB-first uses native `drizzle-kit pull`
67
+ restricted to extension_data, then normalizes the generated local relation import
68
+ for Node ESM. Review and retain the generated schema before resealing. Code-first
69
+ uses native generation: review and apply its SQL before the explicit forced-RLS
70
+ governance migration. Export the schema declaration so generation creates it.
71
+ Prisma 7 uses native client generation and the explicit application DSN supplied
72
+ by the customer host; the reviewed SQL still installs RLS. Generator output is
73
+ a proposed source change, never permission to mutate a shared or Root database.
74
+ Optional provider dependencies are installed in the generated app, never Atelier.
75
+
76
+ Custom native configuration, schema and migration locations must be listed in the
77
+ generated package.json `files` array as literal project-relative files or directories.
78
+ This reuses the project's native package input list; it adds no second project catalog
79
+ and never executes a TypeScript config during sealing. The list itself is sealed.
80
+ Conventional generated paths and present npm locks are included automatically.
81
+ Globs, parent paths, dependency directories, hidden paths except Git ignore/attribute files, and self-referential
82
+ manifest/pack inputs refuse. The seal identifies these declared inputs; it does not
83
+ claim an arbitrary external host, build artifact or dependency outside the project.
84
+
85
+ Prisma interactive transactions use a 12-second transaction timeout and a 10-second
86
+ SQL statement timeout. A manifest may allow up to 30 seconds, but the native
87
+ transaction can roll back sooner and the handler then reports operation unknown.
88
+
89
+
90
+ After reviewing and sealing a project, `atelier extension bundle --directory
91
+ ./custom-extension --json` writes its registration bundle to stdout. It contains
92
+ the pinned manifest, exact schema strings and migration hashes. It uses the same
93
+ file checks as sealing and refuses stale inputs. It creates no account, database,
94
+ process or installation and applies no migration.
95
+
96
+ Pass this bundle to `createExtensionAdminClient(transport).registerRelease(bundle)`
97
+ through the consuming host's authenticated transport, then configure the returned
98
+ release using the existing connection and lifecycle methods. The receiving host
99
+ must independently verify every release and file digest and apply its publisher
100
+ policy. A registration receipt is separate from health, enablement and consent.
101
+ An older host without registration refuses with `unavailable`; clients do not
102
+ silently enable or repeat the operation.
103
+
104
+ A generic counter response is custom application data. A host's result-recording
105
+ contract can require a different schema and narrower bounds. Author that result
106
+ explicitly, update its action output schema, review and reseal it, and request the
107
+ host's separate permission before recording it. Declaring a root-write permission
108
+ alone does not make an arbitrary action result compatible.
109
+
110
+ ## Native Convex starter
111
+
112
+ Use `atelier extension init --profile convex-native --directory ./custom-extension`
113
+ for a TypeScript project pinned to Convex 1.46.0. This optional adapter uses native
114
+ Convex schema/functions, indexes and OCC transactions. It installs no SQL driver
115
+ and adds no Convex dependency to Atelier itself. Import native backend helpers
116
+ from `@mnstry/atelier/extensions/convex`; browser clients use the same portable
117
+ `/extensions/client` interface as the SQL profiles.
118
+
119
+ The HTTP action verifies the original Root delegation and consumes admission
120
+ once. It then passes that token and the canonical payload to an **internal
121
+ mutation**, which verifies them again. A serialized scope or an `admitted`
122
+ boolean is not authority. Native writes and the indexed operation result commit
123
+ in one mutation. Output validators refuse invalid values and preserve canonical
124
+ result bytes, so response and durable lookup cannot diverge. Root callbacks and provider commits remain separate. A lost
125
+ reply requires a new admitted lookup operation, without repeating the write.
126
+ No ordinary public mutation/query exposes the generated member tables. `GET /health`
127
+ reports only the immutable release/schema health envelope after native index checks.
128
+
129
+ The customer owns its Convex project and deployment. Set the public verification
130
+ keys, issuer, exact invocation audience, opaque installation reference and Root
131
+ admission origin in that deployment. Keep admin keys and member identities out
132
+ of the browser and runtime request. HTTPS is required by default. The explicit
133
+ local test option additionally requires both provider deployment URLs to be
134
+ literal loopback addresses; Convex can set `NODE_ENV` to production even locally.
135
+
136
+ The versioned native schema is `migrations/001-schema.ts`; `convex/schema.ts`
137
+ re-exports it. The existing schema digest binds those migration bytes. Native
138
+ source and generated code are sealed as bundle inputs. Generate provider code,
139
+ strictly typecheck, seal, validate and export the bundle; validate again after
140
+ deployment. Any changed generated input requires resealing and requalification.
141
+ Atelier's CLI performs no provider login, process startup or deployment.
142
+
143
+ The sample supports scoped set/get/export/delete and durable lookup. Deletion
144
+ atomically clears live sample rows and older operation results for up to 500
145
+ operations; larger histories refuse and need an explicit paginated erasure design.
146
+ Backups remain subject to the operator's retention policy. In-flight admitted
147
+ mutations may finish after disable. Public reactive feeds, revocation on feed
148
+ reconnect, schema backfills, portability and complete host/privacy acceptance
149
+ remain unqualified. The native starter's provider proof does not enable a
150
+ receiving host's Convex profile or establish a complete customer journey.
151
+
152
+ ## Readiness extension packs
153
+
154
+ Local readiness protocols use the existing extension-pack declarations in
155
+ `atelier.project.json`. They are separate from database runtime adapters. A
156
+ project can select custom protocols without the bundled MNSTRY readiness pack:
157
+
158
+ ```json
159
+ {
160
+ "ext": {
161
+ "mnstry.atelier": {
162
+ "readiness": { "includeBundled": false },
163
+ "extensionPacks": [
164
+ {
165
+ "id": "sample.readiness",
166
+ "version": "v1",
167
+ "path": "packs/sample-pack.v1.json",
168
+ "enabled": true
169
+ }
170
+ ]
171
+ }
172
+ }
173
+ }
174
+ ```
175
+
176
+ Review the pack, then run `atelier extension-pack validate` and
177
+ `atelier lock write`, both with `--project ./atelier.project.json`.
178
+ Use `atelier readiness protocols --project ./atelier.project.json` to list the
179
+ selected protocols, then pass a full namespaced ID to `atelier readiness run`
180
+ or `atelier review run` with the same project. Evidence-bound review still
181
+ requires the existing [pack compatibility declaration](../reference/extension-pack-lifecycle.md).
182
+ Existing answer, proposal and evidence rules continue to apply.
183
+
184
+ Omitting `readiness.includeBundled` or setting it to `true` keeps custom
185
+ protocols alongside the bundle. With `false`, bundled IDs and aliases are
186
+ unavailable to project runs. A standalone `readiness protocols` invocation
187
+ without a project selection still lists the bundle. Generic graph, project and
188
+ readiness checks remain available; the MNSTRY journey, packet and readiness
189
+ export commands refuse. See [pack selection and lock transitions](tenant-readiness.md#select-the-readiness-pack).
@@ -0,0 +1,152 @@
1
+ # Graph projection refresh
2
+
3
+ This is an experimental host integration module in `src/graph-refresh/`. It is
4
+ not enabled by `atelier dev --knowledge`, and has no published package export.
5
+ It adds no listener, daemon, graph database, identity or grant authority. A host
6
+ attaches its start and stop to the existing sidecar lifecycle. The first proof
7
+ uses invented graph-view fixtures; authenticated host receiving is separate.
8
+
9
+ The Git source, canonical graph builder and knowledge plan still own source
10
+ identity and semantics. Refresh consumes complete authorized projections. It
11
+ does not extract a second graph, accept a relation, change a plan or apply a
12
+ proposal. The existing graph file cache supplies incremental source reuse.
13
+
14
+ ## Lifecycle ports
15
+
16
+ `createGraphRefresh` takes these host functions:
17
+
18
+ | Port | Contract |
19
+ | --- | --- |
20
+ | `build({generation,binding,signal})` | Return one complete authorized graph-view projection. Compute in isolation, honor cancellation, and bound execution. Do not write a current output from inside the builder. |
21
+ | `validate(projection)` | Return exactly `true` only for a supported, complete projection with a verified digest. Use the projection owner's validator. It may be asynchronous. |
22
+ | `revalidate(binding,projection)` | Return exactly `true` only while this host-issued binding and every requested historical or current projection are still readable. `projection` is null before the build. Errors and other values refuse. It may be asynchronous. |
23
+ | `stage({projection,generation,signal})` | Optional preparation of a complete host output, isolated from readers. Return `{commit,discard}`. It may be asynchronous. The default uses only the controller's in-memory pointer. |
24
+ | `commit()` | Synchronously and atomically replace the host's current output. Never queue an asynchronous current write. A promise result is unsupported and refuses controller publication. |
25
+ | `discard()` | Idempotently remove only this uncommitted staging output. It may be asynchronous. Failure retains cleanup custody even after supersession, access loss or stop. |
26
+ | `clear()` | Synchronously clear host reader caches, inspectors, selections, search results and renderer resources. A failure or promise result blocks accepting a replacement binding. |
27
+ | `onCleanup(outcome)` | Optional trusted host notification `{cleanupId,state,code}` for resolved or failed staging cleanup. It carries no source, path, binding or raw exception and is never a reader event. |
28
+
29
+ `setAccess({key,expiresAtMs,...privateHostState})` accepts a trusted host binding.
30
+ The key binds principal, exact authorized repositories, grant revision and
31
+ expiry, policy and request filter. This is a cache and lifecycle key, not proof
32
+ of a grant. Keep any instance-issued capability object in private host state;
33
+ do not clone that capability or reconstruct it from browser JSON. Each access
34
+ replacement first purges prior history, projection and selection. A host access
35
+ adapter must revalidate the actual capability, not just compare the key.
36
+
37
+ `start()` starts a pending build only when a binding is present. `invalidate()`
38
+ immediately marks an existing view stale, aborts a superseded build and requests
39
+ a replacement. Bursts share a fixed coalescing window, default 40 ms. Only one
40
+ build and staging operation runs at a time. An abort-ignoring builder must
41
+ settle before its successor can compute; its late result cannot publish.
42
+
43
+ Every awaited build, validation, access check and staging step is followed by a
44
+ generation fence. A final current access check and fence precede synchronous
45
+ commit and pointer replacement without an intervening await. Partial builds,
46
+ failed saves and obsolete generations never become the controller's current
47
+ view. A conforming staging adapter is required for equivalent disk behavior.
48
+
49
+ Cleanup custody is separate from publication and reader eligibility.
50
+ `cleanupStatus()` returns sanitized host-only records with a `cleanupId` and
51
+ `cleaning` or `failed` state. A failed discard retains its transaction handle;
52
+ new builds and staging stop until the host resolves it with
53
+ `await retryCleanup(cleanupId)`. Concurrent retries share the complete operation
54
+ and its result, including a rejection. A failed attempt requires a separate host
55
+ call to retry; a waiting caller never starts another attempt automatically.
56
+ Success releases the handle and requests a fresh build if the host is running
57
+ with current access. Rejection remains retained and notifies the host again.
58
+ This bounds unresolved custody to one transaction without a retry daemon.
59
+
60
+ The host must consume these operational outcomes and keep the controller until
61
+ cleanup is resolved. Never serialize cleanup records into a reader response.
62
+ Grant loss still purges private reader state immediately; resource custody does
63
+ not authorize any old view delivery. `stop()` retains unresolved cleanup, and
64
+ `await flush()` settles an already in-flight operation even after stop. Process
65
+ restart recovery belongs to the staging adapter's existing resource journal;
66
+ this controller does not add a persistent store or trust a saved projection.
67
+
68
+ `read(digest?)` revalidates before returning a detached copy. A previous view is
69
+ returned with `stale:true` after a source edit or failure, and `historical:true`
70
+ when it is no longer the published snapshot. History is in memory, bounded to
71
+ three previous digests by default, and available only under the same still-valid
72
+ binding. A missing digest returns no projection. It does not fall back to a
73
+ different snapshot. Restart requires fresh host access and a successful rebuild;
74
+ there is no automatic trust of saved projections.
75
+
76
+ `select(ref,digest)` accepts a current qualified `{repoId,localId}` only against
77
+ the exact published digest. `compare(beforeDigest,afterDigest)` revalidates both
78
+ retained snapshots and fences access changes before returning their comparison.
79
+
80
+ ## Revocation and UI receiving
81
+
82
+ On a grant or policy notification the host first retires its access capability,
83
+ then calls `invalidateAccess()`. This synchronously aborts work and drops the
84
+ current projection, all history, selection and host caches. Expiry and a refused
85
+ read or build check do the same. They cannot wait for a replacement build. Each
86
+ read still checks access, covering a missed notification before another delivery.
87
+ The controller cannot detect remote revocation without its host's notification
88
+ or revalidation; this module does not establish an authenticated access host.
89
+
90
+ Subscribe with `subscribe(listener)` and dispose with its returned unsubscribe
91
+ function. Events contain only `{type,phase,generation,stale,failure}`. On `clear`,
92
+ the UI must immediately dispose its graph, inspector, selection, query caches
93
+ and pending render work, including all WebGL resources that retain private
94
+ labels or topology. A previous browser copy cannot be recalled by clearing the
95
+ controller alone. Conforming hosts must connect this event and `clear` to their
96
+ own state and verify the visible result. Do not keep the old graph on screen
97
+ while fetching a narrower replacement. Old refs and diagnostics are absent
98
+ from clear events. A listener failure does not prevent other listeners running.
99
+
100
+ | Phase | Meaning |
101
+ | --- | --- |
102
+ | `stopped` | No delivery; snapshots and selections cleared. |
103
+ | `denied` | No current host binding or access refused/expired; no delivery. |
104
+ | `pending` | Authorized first build requested. |
105
+ | `building` | Build or staging in progress; an existing view is explicitly stale. |
106
+ | `stale` | Source change invalidated the published generation. |
107
+ | `current` | Latest complete generation passed validation and access checks. |
108
+ | `failed` | Build, save or staging cleanup failed. An authorized old view may remain stale. |
109
+ | `unsupported` | Host validator refused the projection. An authorized old view may remain stale. |
110
+
111
+ Failures expose generic codes, never arbitrary build exceptions or source paths.
112
+ The host can keep source-level details in an independently authorized diagnostic
113
+ channel. `flush()` awaits pending work for a drill or on-demand build; it is not
114
+ a background completion promise. `stop()` purges immediately and fences late
115
+ results. The host must also await its own resource cleanup where required.
116
+
117
+ ## Local watcher binding
118
+
119
+ `createLocalGraphRefresh({roots,...ports})` reuses Atelier's existing filesystem
120
+ watcher factory. Roots are trusted host inputs for the exact current permitted
121
+ repository set. It does not discover, clone or authorize repositories. Start it
122
+ with the existing sidecar, and call `stop()` from that sidecar's close path.
123
+ On a replacement access decision, pass the new permitted roots explicitly as
124
+ `setAccess(binding,roots)`. Old watchers close on clear; delayed events from a
125
+ retired watcher cannot invalidate the replacement reader's projection.
126
+
127
+ Watch events are hints. A periodic rebuild, default every 30 seconds, reconciles
128
+ dropped events using the canonical builder and file cache. It does not interrupt
129
+ an in-flight build. `status().watchState` is `watching`, `unavailable` or `stopped`;
130
+ failure to watch remains visible while periodic reconciliation can continue.
131
+ Neither watcher nor reconciliation timer keeps a second process alive.
132
+
133
+ ## Snapshot comparison
134
+
135
+ `compareGraphSnapshots(before,after)` is a pure derived comparison. Trusted callers
136
+ must revalidate both snapshots first; controller `compare` performs that check.
137
+ The pure function refuses incompatible schemas, different access contexts or
138
+ filters, duplicate qualified refs and dangling references. It does not turn
139
+ matching access metadata into authentication.
140
+
141
+ Nodes compare by qualified ref, sources by repository and path with all exact
142
+ pins retained, edges by edge id, and questions by question id. A rename does not
143
+ merge identities. Assertions sharing a semantic triple retain separate edge ids.
144
+ Changed bytes, revision, locator, edge support or question state are included.
145
+ Possible question impact conservatively follows permitted edges in either
146
+ direction within the supplied slice. It is explicitly possible impact, not
147
+ proof of a semantic dependency or completeness outside that slice. No model,
148
+ provider, source write or accepted history mutation occurs.
149
+
150
+ Run `node --test test/graph-refresh-*.test.mjs` for the synthetic lifecycle,
151
+ comparison and real local file-edit/restart drills. These checks do not qualify
152
+ the held sidecar integration, a real recipient access host, or a browser renderer.
@@ -0,0 +1,64 @@
1
+ # Graph workspace
2
+
3
+ A graph workspace lets a person explore a whole knowledge graph, then shape its concepts one step at a time. It is built in three layers, and the last one belongs to the owner:
4
+
5
+ 1. **Atelier** ships primitives and defaults: the read model, scale and layout helpers, label placement, recipes, themes, authoring and the browser rooms.
6
+ 2. **A coach** builds tooling for a cohort from those pieces: their own recipes, a theme, perhaps a different shell around the same rooms.
7
+ 3. **The owner** shapes their own system from everything they receive: hiding what they do not use, renaming, adding their own recipes and appearance.
8
+
9
+ Nothing in a layer is hard-coded into the one below it. Recipes and themes are data that compose by name, and every resolved recipe field records which layer set it.
10
+
11
+ ## One graph, three rooms
12
+
13
+ - **Constellation.** Every readable record, alive on a night-sky canvas (the default), with soft glows for the owner's folders and folder names at a distance. Names fade in by importance as you zoom in and never overlap each other or the controls. Hovering lights a neighbourhood; clicking selects without moving the map. "Let it move" turns on live physics.
14
+ - **Workbench.** A sparse set of rich cards (incoming on the left, outgoing on the right) beside a focused authoring sheet. One subject at a time, one step at a time, with deferral and structural guidance. Drafts belong to one workspace identity (and reader scope, where the host has one), so two workspaces never see each other's drafts. Without an identity they live in this tab only. With `profile.id` or `draftIdentity` they persist in this browser, and with a host storage port they persist there. The interface says which.
15
+ - **Review.** Before and proposed, the state of the evidence, and that a person decides. Nothing is sent.
16
+
17
+ A work **recipe** picks the room, the lens and the single primary action. Lenses (`question`, `concept`, `zone`) belong to the constellation, subjects (`record`, `concept`, `relation`) to the workbench, and the review room takes neither. The primary action is one of `search`, `open-evidence`, `next-step`, `walk`, `review` or `pick`, and only one the recipe's room can carry out (`primaryActionsFor`). Combinations the shell cannot honour are refused when recipes are composed, and recipes the workspace cannot run (a relation recipe with no relations, say) are not offered. Defaults: *Explore*, *Answer a question*, *Refine a concept*, *Inspect a record*. A command bar (⌘K or `/`) replaces persistent navigation. Text view lists every record, and without WebGL every task remains available through Text view and the workbench.
18
+
19
+ ## Honesty rules the primitives keep
20
+
21
+ - Zones come only from the owner's folder structure. No computed clusters are drawn.
22
+ - A record belongs to a concept only when the record carries the concept's tag itself. Text matches are offered as suggestions labelled "not members".
23
+ - Edge direction is preserved. Edges fall into three classes: written links, folder containment and declared relations. Only declared relations are drawn with arrows and emphasis.
24
+ - Links to records outside the readable set are counted, never drawn.
25
+ - "Ready for human review" means complete and grounded in readable records. It is not a verdict on truth.
26
+
27
+ ## Scale
28
+
29
+ `planConstellation()` decides whether to draw every record or to show zones. The default budget is 12,000 records or 60,000 links. Above it, `aggregateZones()` gives counts by zone and directed bundles between zones, and `zoneSlice()` opens one zone at a time. Every link touching the zone is accounted for exactly once (drawn, omitted inside the zone, to another zone, or omitted to another zone), and plan concepts list only the kept records that declare them, with the rest counted. Aggregating 30,000 records is part of the test suite. On a laptop GPU the constellation holds 60 fps at 5,000 records, with labels and zone glows.
30
+
31
+ ## Build a workspace
32
+
33
+ ```js
34
+ import Graph from 'graphology'
35
+ import Sigma from 'sigma'
36
+ import { EdgeArrowProgram } from 'sigma/rendering'
37
+ import forceAtlas2 from 'graphology-layout-forceatlas2'
38
+ import FA2Layout from 'graphology-layout-forceatlas2/worker'
39
+ import { buildWorkspaceModel, layoutWorkspace, composeRecipes, composeTheme, DEFAULT_THEME } from '@mnstry/atelier/graph-workspace'
40
+ import { mountGraphWorkspace } from '@mnstry/atelier/graph-workspace/browser'
41
+
42
+ // graph: an Atelier knowledge graph the host has already limited to this reader.
43
+ const model = buildWorkspaceModel({ graph, plan, zoneRule: { prefix: 'notes/', depth: 1 } })
44
+ layoutWorkspace(model, { Graph, forceAtlas2 }) // or store positions at build time
45
+
46
+ const recipes = composeRecipes({ coach: coachRecipes, owner: ownerRecipes }).recipes
47
+ const theme = composeTheme(DEFAULT_THEME, coachTheme, ownerTheme) // every layer is checked; one bad layer refuses the theme
48
+
49
+ mountGraphWorkspace(element, { model, recipes, theme, deps: { Sigma, Graph, EdgeArrowProgram, FA2Layout },
50
+ profile: { id: 'workspace-id', name: 'My notebook', vocabulary: { record: 'note', records: 'notes', zone: 'folder' } },
51
+ // Optional: persist drafts to the host instead of this browser.
52
+ // storage: hostDraftPort, draftIdentity: { workspace: 'workspace-id', reader: readerScope },
53
+ })
54
+ ```
55
+
56
+ Atelier does not depend on `sigma` or `graphology`; the host injects them. Pin sigma 3 and graphology 0.25 or later in the consuming application.
57
+
58
+ ## Keeping a shareable layer clean
59
+
60
+ A coach or owner who builds on private workspaces can check that nothing from them reaches a shareable layer. `fingerprintsFrom()` derives distinctive strings from a private graph and plan (record ids, paths, long titles, summary openings, plan wording and names). `scanForFingerprints()` reports where any of them appears in shareable text, naming the file and a masked sample only.
61
+
62
+ ## What this does not do
63
+
64
+ It does not authenticate a reader, grant access, read source bodies, save to a source or apply a plan change. Drafts that outlive the browser, and proposals, need a host storage port bound to the coauthor ledger, and the host's ontology guide remains the authority on guidance. See the [reference](../reference/graph-workspace.md) for every export.
@@ -1,12 +1,14 @@
1
1
  # Progressive local ingestion
2
2
 
3
- Status: experimental source implementation, not yet a released package feature.
3
+ Status: experimental. Shipped since 0.2.0-alpha.13 as the `atelier ingest`
4
+ command and the `@mnstry/atelier/ingestion` export.
4
5
  The local runner preserves explicitly selected files and makes bounded text
5
6
  search useful before semantic interpretation. It composes the existing
6
- [immutable intake](intake-and-guides.md) with a resumable plan. It never enrolls
7
+ [immutable intake](../reference/intake-and-guides.md) with a resumable plan. It never enrolls
7
8
  raw captures into the canonical graph or treats extracted text as accepted
8
- knowledge. The [architecture proposal](progressive-ingestion.md) describes the
9
- larger destination; this page describes the implemented subset.
9
+ knowledge. Host integrations use the existing [semantic proposal processor](../reference/semantic-ingestion.md),
10
+ [semantic operation](../reference/semantic-operation.md) and [optional suppliers](../reference/optional-ingestion.md)
11
+ under their documented profiles and limits.
10
12
 
11
13
  ## Start with a purpose and selected sources
12
14
 
@@ -16,8 +18,7 @@ traversal, symlinks and implicit external reads are refused. The local CLI is
16
18
  for a trusted workspace owner. Its workspace identifier is a binding against
17
19
  accidental cross-workspace reuse, not an authenticated identity or tenant ACL.
18
20
 
19
- The following examples assume the development checkout or a future package
20
- version containing this command. Released alpha.7 does not contain it.
21
+ The following examples need 0.2.0-alpha.13 or later.
21
22
 
22
23
  ```sh
23
24
  atelier ingest plan <<'JSON'
@@ -169,13 +170,13 @@ verification and correction effort. Compare cost per useful accepted result,
169
170
  with quality floors and rare exceptions preserved. Keep private examples and
170
171
  methods in their owning workspace.
171
172
 
172
- ## Remaining product work
173
+ ## Host responsibilities and limits
173
174
 
174
- The public foundation still needs qualified semantic adapters, focused
175
- synthesis and graph decision integration, richer document/media processors,
176
- connector census and permission-change handling, and representative pilots.
177
- The proprietary runtime adds native scheduling, installed processors,
178
- provider credentials/budgets, progress and source review, cancellation,
179
- notifications and scoped harness delivery. The public reference path remains
180
- usable without that runtime. Neither private material nor private methodology
181
- belongs in public fixtures or distributed proprietary prompts.
175
+ The local runner supplies no richer document/media processors, connector census,
176
+ permission-change orchestration or provider execution. Semantic processing and
177
+ graph decisions use separate APIs and require qualified host integration.
178
+ Native scheduling, installed processors, provider credentials/budgets, progress
179
+ and source review, cancellation, notifications and scoped harness delivery belong
180
+ to the host. The public reference path remains usable without a proprietary
181
+ runtime. Neither private material nor private methodology belongs in public
182
+ fixtures or distributed proprietary prompts.
@@ -1,8 +1,7 @@
1
1
  # Discovery Harness and Research Harness
2
2
 
3
- Status: implemented locally for the next release. The published alpha.7 package
4
- does not expose `inquiry`. Use `node bin/atelier.mjs inquiry help` from this
5
- source checkout, or `atelier inquiry help` from a package built from it.
3
+ Status: shipped since 0.2.0-alpha.13. Run `atelier inquiry help` for the
4
+ commands.
6
5
 
7
6
  Discovery frames questions, compares explanations and prepares decisions.
8
7
  Research gathers and checks evidence and returns a portable bundle. People set