@mnstry/atelier 0.2.0-alpha.1

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 (260) hide show
  1. package/CHANGELOG.md +383 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +262 -0
  5. package/SECURITY.md +93 -0
  6. package/TRADEMARKS.md +88 -0
  7. package/announcements/2026-08-06-announcements-channel.v1.json +12 -0
  8. package/announcements/keys/mnstry-announcements.public.v1.json +9 -0
  9. package/bin/atelier.mjs +2 -0
  10. package/bin/mnstry-atelier.mjs +3 -0
  11. package/contracts/analysis-adapter.v1.schema.json +248 -0
  12. package/contracts/atelier-action-intent.v1.schema.json +143 -0
  13. package/contracts/atelier-analysis-adapter.v1.schema.json +360 -0
  14. package/contracts/atelier-attestation.v1.schema.json +239 -0
  15. package/contracts/atelier-boundary-policy.v1.schema.json +339 -0
  16. package/contracts/atelier-claim.v1.schema.json +97 -0
  17. package/contracts/atelier-export.v1.schema.json +1015 -0
  18. package/contracts/atelier-extension-pack.v1.schema.json +290 -0
  19. package/contracts/atelier-kit-manifest.v1.schema.json +273 -0
  20. package/contracts/atelier-lock.v1.schema.json +364 -0
  21. package/contracts/atelier-migration.v1.schema.json +162 -0
  22. package/contracts/atelier-project-config.v1.schema.json +352 -0
  23. package/contracts/atelier-readiness-protocol.v1.schema.json +517 -0
  24. package/contracts/atelier-readiness-run.v1.schema.json +229 -0
  25. package/contracts/atelier-readiness.v1.schema.json +457 -0
  26. package/contracts/compat-baseline.json +10 -0
  27. package/contracts/git-promote-event.v1.schema.json +145 -0
  28. package/contracts/knowledge-source-sidecar.v1.schema.json +157 -0
  29. package/contracts/mnstry-atelier-semantic-profile.v1.json +254 -0
  30. package/docs/announcements.md +101 -0
  31. package/docs/atelier-runtime.md +34 -0
  32. package/docs/attestation.md +201 -0
  33. package/docs/continuity.md +55 -0
  34. package/docs/contract-stability.md +111 -0
  35. package/docs/distributions.md +220 -0
  36. package/docs/install.md +140 -0
  37. package/docs/knowledge-graph.md +140 -0
  38. package/docs/ontology.md +206 -0
  39. package/docs/release-engineering.md +151 -0
  40. package/docs/repo-boundary-guard.md +199 -0
  41. package/docs/tenant-readiness.md +64 -0
  42. package/docs/upgrade.md +124 -0
  43. package/fixtures/analysis/invalid/native-graph.v1.json +4 -0
  44. package/fixtures/analysis/invalid/promoted-claim.v1.json +17 -0
  45. package/fixtures/analysis/invalid/runtime-import.v1.json +20 -0
  46. package/fixtures/analysis/valid/output.claims.v1.json +17 -0
  47. package/fixtures/analysis-adapter/invalid/manifest-hidden-provider.v1.json +24 -0
  48. package/fixtures/analysis-adapter/invalid/output-frontmatter-mutation.v1.json +21 -0
  49. package/fixtures/analysis-adapter/invalid/output-native-graph.v1.json +14 -0
  50. package/fixtures/analysis-adapter/manifest.disabled.v1.json +22 -0
  51. package/fixtures/analysis-adapter/manifest.enabled-local.v1.json +23 -0
  52. package/fixtures/analysis-adapter/output.claims.v1.json +21 -0
  53. package/fixtures/atelier-action-intent/invalid/runtime-mutation-authority.v1.json +16 -0
  54. package/fixtures/atelier-action-intent/invalid/unknown-top-level-field.v1.json +17 -0
  55. package/fixtures/atelier-action-intent/invalid/writes-beyond-clipboard.v1.json +16 -0
  56. package/fixtures/atelier-action-intent/valid/copy-agent-prompt.v1.json +16 -0
  57. package/fixtures/atelier-action-intent/valid/copy-repo-path.v1.json +22 -0
  58. package/fixtures/atelier-analysis-adapter/invalid/hidden-model-provider.v1.json +24 -0
  59. package/fixtures/atelier-analysis-adapter/invalid/inert-with-execute-command.v1.json +24 -0
  60. package/fixtures/atelier-analysis-adapter/invalid/proposals-with-runtime-import.v1.json +30 -0
  61. package/fixtures/atelier-analysis-adapter/valid/manifest-inert.v1.json +24 -0
  62. package/fixtures/atelier-analysis-adapter/valid/proposals-claim-only.v1.json +27 -0
  63. package/fixtures/atelier-attestation/invalid/bad-digest.v1.json +23 -0
  64. package/fixtures/atelier-attestation/invalid/conformance-scope.v1.json +23 -0
  65. package/fixtures/atelier-attestation/invalid/missing-signature.v1.json +22 -0
  66. package/fixtures/atelier-attestation/invalid/unknown-root-field.v1.json +24 -0
  67. package/fixtures/atelier-attestation/keys/roundtrip-issuer.public.v1.json +9 -0
  68. package/fixtures/atelier-attestation/valid/rejected-with-reasons.v1.json +49 -0
  69. package/fixtures/atelier-attestation/valid/signed-admitted.v1.json +35 -0
  70. package/fixtures/atelier-attestation/valid/signed-roundtrip.v1.json +29 -0
  71. package/fixtures/atelier-attestation/valid/unsigned-advisory.v1.json +23 -0
  72. package/fixtures/atelier-claim/invalid/unknown-provider.v1.json +15 -0
  73. package/fixtures/atelier-claim/invalid/unknown-top-level-field.v1.json +16 -0
  74. package/fixtures/atelier-claim/invalid/wrong-schema-const.v1.json +15 -0
  75. package/fixtures/atelier-claim/valid/adapter-style-proposed-relation.v1.json +19 -0
  76. package/fixtures/atelier-claim/valid/codex-proposed-relation.v1.json +16 -0
  77. package/fixtures/atelier-claim/valid/manual-proposed-relation.v1.json +16 -0
  78. package/fixtures/atelier-claim/valid/readiness-proposed-relation.v1.json +18 -0
  79. package/fixtures/atelier-export/invalid/dirty-unforced-empty-taint.v1.json +19 -0
  80. package/fixtures/atelier-export/invalid/object-local-audience-visibility.v1.json +11 -0
  81. package/fixtures/atelier-export/invalid/open-object-class-owner.v1.json +23 -0
  82. package/fixtures/atelier-export/invalid/pricing-legacy-amount.v1.json +23 -0
  83. package/fixtures/atelier-export/invalid/public-disguised-internal-source-ref.v1.json +11 -0
  84. package/fixtures/atelier-export/invalid/public-nested-private-source-ref.v1.json +17 -0
  85. package/fixtures/atelier-export/invalid/public-resolved-private-source-ref.v1.json +13 -0
  86. package/fixtures/atelier-export/invalid/public-resolved-sensitive-source-ref.v1.json +13 -0
  87. package/fixtures/atelier-export/invalid/public-source-ref-missing-provenance.v1.json +20 -0
  88. package/fixtures/atelier-export/invalid/public-source-team-kg.json +12 -0
  89. package/fixtures/atelier-export/invalid/source-node-legacy-visibility.v1.json +21 -0
  90. package/fixtures/atelier-export/invalid/source-node-unknown-field.v1.json +18 -0
  91. package/fixtures/atelier-export/invalid/unresolved-public-source-ref.v1.json +11 -0
  92. package/fixtures/atelier-export/sample-studio-offer.v1.json +397 -0
  93. package/fixtures/atelier-extension-pack/invalid/bundled-slug-collision.v1.json +22 -0
  94. package/fixtures/atelier-extension-pack/invalid/escapes-root.v1.json +22 -0
  95. package/fixtures/atelier-extension-pack/invalid/posture-tampered.v1.json +22 -0
  96. package/fixtures/atelier-extension-pack/invalid/protocols/autonomous-authority.v1.json +118 -0
  97. package/fixtures/atelier-extension-pack/invalid/protocols/offer-map.v1.json +109 -0
  98. package/fixtures/atelier-extension-pack/invalid/redefines-runtime-term.v1.json +19 -0
  99. package/fixtures/atelier-extension-pack/invalid/wrong-namespace.v1.json +19 -0
  100. package/fixtures/atelier-extension-pack/valid/protocols/contract-gate.v1.json +109 -0
  101. package/fixtures/atelier-extension-pack/valid/sample-pack.v1.json +48 -0
  102. package/fixtures/atelier-kit-manifest/invalid/runtime-copy-without-canonical-role.v1.json +53 -0
  103. package/fixtures/atelier-kit-manifest/invalid/telemetry-send-path.v1.json +21 -0
  104. package/fixtures/atelier-kit-manifest/valid/mnstry-atelier.valid.v1.json +76 -0
  105. package/fixtures/atelier-lock/invalid/absolute-contract-path.v1.json +40 -0
  106. package/fixtures/atelier-lock/invalid/runtime-mutation-enabled.v1.json +41 -0
  107. package/fixtures/atelier-lock/invalid/unknown-top-level-field.v1.json +42 -0
  108. package/fixtures/atelier-lock/valid/extension-pack.v1.json +55 -0
  109. package/fixtures/atelier-lock/valid/minimal.v1.json +44 -0
  110. package/fixtures/atelier-migration/invalid/live-apply-mode.v1.json +21 -0
  111. package/fixtures/atelier-migration/invalid/missing-review-evidence.v1.json +20 -0
  112. package/fixtures/atelier-migration/invalid/runtime-mutation-enabled.v1.json +21 -0
  113. package/fixtures/atelier-migration/valid/minimal.v1.json +32 -0
  114. package/fixtures/atelier-project-config/invalid/absolute-repo-path.v1.json +11 -0
  115. package/fixtures/atelier-project-config/invalid/ext-not-object.v1.json +12 -0
  116. package/fixtures/atelier-project-config/invalid/external-kind-read-boundary.v1.json +12 -0
  117. package/fixtures/atelier-project-config/invalid/missing-repos-and-alignment.v1.json +7 -0
  118. package/fixtures/atelier-project-config/invalid/unknown-top-level-field.v1.json +14 -0
  119. package/fixtures/atelier-project-config/valid/alignment-scaffold.v1.json +15 -0
  120. package/fixtures/atelier-project-config/valid/ext-extension-packs.v1.json +36 -0
  121. package/fixtures/atelier-project-config/valid/repo-workspace.v1.json +23 -0
  122. package/fixtures/atelier-project-config/validator-only/ext-member-not-object.v1.json +14 -0
  123. package/fixtures/atelier-readiness/invalid/dry-run-only-false.v1.json +87 -0
  124. package/fixtures/atelier-readiness/invalid/support-bundle-send-path.v1.json +87 -0
  125. package/fixtures/atelier-readiness/invalid/unknown-top-level-field.v1.json +88 -0
  126. package/fixtures/atelier-readiness/valid/ready-workspace.v1.json +84 -0
  127. package/fixtures/boundary-policy/invalid/content-rule-exception-blanket-path.v1.json +67 -0
  128. package/fixtures/boundary-policy/invalid/invalid-actor-private-repo-mapping.v1.json +20 -0
  129. package/fixtures/boundary-policy/invalid/legacy-warning-missing-warning.v1.json +20 -0
  130. package/fixtures/boundary-policy/invalid/missing-repo-coverage.v1.json +19 -0
  131. package/fixtures/boundary-policy/invalid/unknown-key.v1.json +12 -0
  132. package/fixtures/boundary-policy/valid/content-rule-exception.v1.json +67 -0
  133. package/fixtures/boundary-policy/valid/legacy-warning.v1.json +33 -0
  134. package/fixtures/boundary-policy/valid/strict-private-shared.v1.json +40 -0
  135. package/fixtures/git-promote/invalid/provision-named-revocable.v1.json +29 -0
  136. package/fixtures/git-promote/private-to-team.v1.json +29 -0
  137. package/fixtures/knowledge-source-sidecar/invalid/legacy-visibility-field.v1.json +17 -0
  138. package/fixtures/knowledge-source-sidecar/invalid/missing-audience.v1.json +15 -0
  139. package/fixtures/knowledge-source-sidecar/invalid/unknown-relation-kind.v1.json +18 -0
  140. package/fixtures/knowledge-source-sidecar/valid/html-source.v1.json +18 -0
  141. package/fixtures/knowledge-source-sidecar/valid/pdf-evidence.v1.json +18 -0
  142. package/fixtures/projects/neutral-project/atelier.project.json +15 -0
  143. package/fixtures/projects/neutral-project/ops/config/repo-access.v1.json +12 -0
  144. package/fixtures/projects/neutral-project/project-knowledge.graph.json +69 -0
  145. package/fixtures/projects/sample-workspace/atelier.project.json +23 -0
  146. package/fixtures/projects/sample-workspace/boundary-policy.v1.json +59 -0
  147. package/fixtures/projects/sample-workspace/content/README.md +16 -0
  148. package/fixtures/projects/sample-workspace/content/source.html +5 -0
  149. package/fixtures/projects/sample-workspace/content/source.html.kg.json +15 -0
  150. package/fixtures/projects/sample-workspace/repo-access.v1.json +9 -0
  151. package/fixtures/projects/source-formats-workspace/atelier.project.json +23 -0
  152. package/fixtures/projects/source-formats-workspace/content/README.md +17 -0
  153. package/fixtures/projects/source-formats-workspace/content/data.json +7 -0
  154. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +15 -0
  155. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +15 -0
  156. package/fixtures/projects/source-formats-workspace/content/metrics.csv +3 -0
  157. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +15 -0
  158. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml +4 -0
  159. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +15 -0
  160. package/fixtures/projects/source-formats-workspace/repo-access.v1.json +9 -0
  161. package/fixtures/readiness-protocols/extension-pack/invalid/protocol-missing-path.v1.json +20 -0
  162. package/fixtures/readiness-protocols/extension-pack/valid/with-protocol.v1.json +24 -0
  163. package/fixtures/readiness-protocols/protocol/invalid/missing-check-target.v1.json +103 -0
  164. package/fixtures/readiness-protocols/protocol/invalid/runtime-mutation-enabled.v1.json +107 -0
  165. package/fixtures/readiness-protocols/protocol/valid/minimal.v1.json +100 -0
  166. package/fixtures/readiness-protocols/run/invalid/missing-evidence.v1.json +37 -0
  167. package/fixtures/readiness-protocols/run/invalid/pass-with-blocker.v1.json +22 -0
  168. package/fixtures/readiness-protocols/run/invalid/runtime-mutation-enabled.v1.json +22 -0
  169. package/fixtures/readiness-protocols/run/valid/pass.v1.json +44 -0
  170. package/fixtures/support/invalid/leaky-support.v1.json +13 -0
  171. package/fixtures/support/valid/minimal-safe.v1.json +20 -0
  172. package/package.json +98 -0
  173. package/skills/claude/atelier-open/SKILL.md +68 -0
  174. package/skills/claude/mnstry-readiness/SKILL.md +41 -0
  175. package/skills/codex/atelier-open/SKILL.md +68 -0
  176. package/skills/codex/mnstry-readiness/SKILL.md +41 -0
  177. package/src/analysis/adapter.mjs +20 -0
  178. package/src/analysis/analysis-claim-contract.mjs +335 -0
  179. package/src/attestation/jcs.mjs +64 -0
  180. package/src/attestation/sign.mjs +305 -0
  181. package/src/boundary/content-rules.mjs +262 -0
  182. package/src/boundary/policy.mjs +806 -0
  183. package/src/check-atelier-export-contract.mjs +116 -0
  184. package/src/cli/run.mjs +283 -0
  185. package/src/collaboration/proposals.mjs +262 -0
  186. package/src/commands/analysis.mjs +8 -0
  187. package/src/commands/announcements.mjs +308 -0
  188. package/src/commands/attestation.mjs +198 -0
  189. package/src/commands/boundary.mjs +25 -0
  190. package/src/commands/config.mjs +4 -0
  191. package/src/commands/context.mjs +3 -0
  192. package/src/commands/distribution.mjs +224 -0
  193. package/src/commands/egress.mjs +11 -0
  194. package/src/commands/extension-pack.mjs +209 -0
  195. package/src/commands/feedback.mjs +3 -0
  196. package/src/commands/graph.mjs +3 -0
  197. package/src/commands/init.mjs +130 -0
  198. package/src/commands/lock.mjs +3 -0
  199. package/src/commands/project.mjs +3 -0
  200. package/src/commands/promote.mjs +4 -0
  201. package/src/commands/readiness.mjs +3 -0
  202. package/src/commands/server.mjs +6 -0
  203. package/src/commands/setup.mjs +250 -0
  204. package/src/commands/support.mjs +3 -0
  205. package/src/commands/upgrade.mjs +3 -0
  206. package/src/contracts/corpus.mjs +171 -0
  207. package/src/egress/check.mjs +45 -0
  208. package/src/egress/forbidden-egress.mjs +323 -0
  209. package/src/export/atelier-export-contract.mjs +722 -0
  210. package/src/extension-packs/loader.mjs +491 -0
  211. package/src/graph/graph.mjs +370 -0
  212. package/src/graph/knowledge-graph.mjs +887 -0
  213. package/src/harness/context-client.mjs +144 -0
  214. package/src/harness/context.mjs +27 -0
  215. package/src/index.mjs +88 -0
  216. package/src/project/config.mjs +557 -0
  217. package/src/project/file-class.mjs +113 -0
  218. package/src/project/git-ignore.mjs +31 -0
  219. package/src/project/path-match.mjs +30 -0
  220. package/src/project/repo-identity.mjs +176 -0
  221. package/src/projection/alignment-projection.mjs +169 -0
  222. package/src/projection/policy.mjs +90 -0
  223. package/src/projection/project.mjs +152 -0
  224. package/src/readiness/readiness.mjs +312 -0
  225. package/src/readiness-protocols/bundled-pack.mjs +766 -0
  226. package/src/readiness-protocols/runtime.mjs +419 -0
  227. package/src/server/local-sidecar.mjs +640 -0
  228. package/src/server/security.mjs +229 -0
  229. package/src/server/server.mjs +42 -0
  230. package/src/support/feedback-report.mjs +414 -0
  231. package/src/support/support-bundle.mjs +226 -0
  232. package/src/ui/html-primitives.mjs +104 -0
  233. package/src/upgrade/upgrade.mjs +701 -0
  234. package/src/validate-atelier-export-dry-run.mjs +75 -0
  235. package/templates/atelier.project.example.json +23 -0
  236. package/templates/distribution-workspace/.claude/launch.json +12 -0
  237. package/templates/distribution-workspace/README.md +86 -0
  238. package/templates/distribution-workspace/atelier.project.json +36 -0
  239. package/templates/distribution-workspace/boundary-policy.v1.json +61 -0
  240. package/templates/distribution-workspace/gitignore +29 -0
  241. package/templates/distribution-workspace/governance/repo-boundary-ledger.md +5 -0
  242. package/templates/distribution-workspace/project/README.md +19 -0
  243. package/templates/distribution-workspace/repo-access.v1.json +9 -0
  244. package/templates/launch.json +12 -0
  245. package/templates/private-domain-workspace/.claude/launch.json +12 -0
  246. package/templates/private-domain-workspace/README.md +50 -0
  247. package/templates/private-domain-workspace/atelier.project.json +28 -0
  248. package/templates/private-domain-workspace/boundary-policy.v1.json +54 -0
  249. package/templates/private-domain-workspace/domain/README.md +19 -0
  250. package/templates/private-domain-workspace/gitignore +29 -0
  251. package/templates/private-domain-workspace/governance/repo-boundary-ledger.md +4 -0
  252. package/templates/private-domain-workspace/repo-access.v1.json +9 -0
  253. package/templates/shared-project-workspace/.claude/launch.json +12 -0
  254. package/templates/shared-project-workspace/README.md +51 -0
  255. package/templates/shared-project-workspace/atelier.project.json +28 -0
  256. package/templates/shared-project-workspace/boundary-policy.v1.json +61 -0
  257. package/templates/shared-project-workspace/gitignore +29 -0
  258. package/templates/shared-project-workspace/governance/repo-boundary-ledger.md +5 -0
  259. package/templates/shared-project-workspace/project/README.md +19 -0
  260. package/templates/shared-project-workspace/repo-access.v1.json +9 -0
@@ -0,0 +1,199 @@
1
+ # Repo Boundary Guard V1
2
+
3
+ Repo Boundary Guard V1 is the Atelier workspace convention for separating
4
+ private domain source from shared project source before anything reaches the
5
+ MNSTRY runtime.
6
+
7
+ ## Boundary Model
8
+
9
+ - Private domain material lives in one private Git repository per user.
10
+ - Shared project material lives in shared project repositories.
11
+ - Git repository access is the source read boundary.
12
+ - `kg.audience` is local projection metadata, not a permission system.
13
+ - Runtime/export `visibility` remains reserved for MNSTRY runtime objects.
14
+
15
+ If a file is private, place it in the user's private domain repo. Do not rely on
16
+ front matter, generated projections, readiness output, browser views, or local
17
+ HTML hiding to protect source material inside a shared repo.
18
+
19
+ ## Guard Rules
20
+
21
+ - Private or sensitive source belongs in a repo with `readBoundary: "private"`.
22
+ - Shared project source may use `team`, `operator`, `staff`, or `public`
23
+ audiences when the repository readership matches that exposure.
24
+ - Local source metadata must use `kg.audience`.
25
+ - Local source metadata must not use `kg.visibility`.
26
+ - Dry-run exports may contain runtime `visibility` only on export/runtime
27
+ objects.
28
+ - Generated outputs are projections and should be reproducible from source.
29
+
30
+ ## External Repos
31
+
32
+ Real workspaces accumulate git folders that are not Atelier repos: vendored
33
+ checkouts, app-builder exports, scratch clones. Declare one in
34
+ `atelier.project.json` with `kind: "external"`:
35
+
36
+ ```json
37
+ { "name": "external-vendor-site", "path": "external-vendor-site", "kind": "external" }
38
+ ```
39
+
40
+ An external repo is acknowledged, not managed. It implies **no** read boundary,
41
+ so it must not declare `readBoundary`, must not appear in `repo-access.v1.json`,
42
+ and must not appear in the boundary policy — declaring a boundary for a repo
43
+ nobody manages is exactly the confusion this classification removes. Its files
44
+ are excluded from graph walking, sidecar requirements, and projection, and the
45
+ staged guard and hook installer skip it entirely.
46
+
47
+ An undeclared git folder in the workspace remains an error. Forcing an explicit
48
+ decision is the point: it is how a repo pushing to an unexpected host gets
49
+ noticed. `atelier graph` prints the remote host of each external repo for the
50
+ same reason — a workspace should know where its folders push, especially when a
51
+ host is a lookalike of a familiar one.
52
+
53
+ At least one repo must remain managed; a workspace of only external repos is
54
+ not an Atelier workspace.
55
+
56
+ ## Staged Boundary Field Review
57
+
58
+ The staged guard (`atelier boundary check --staged`) inspects every staged
59
+ `*.md` and `*.kg.json` diff for changes to boundary fields — `kg.audience`,
60
+ `audience`, `handling`, `sensitivity`, `data_boundary`.
61
+
62
+ It distinguishes two cases:
63
+
64
+ - **Initialization.** A boundary field added with no prior value, set to a
65
+ value that discloses nothing (`private` or `sensitive` for `audience`), is
66
+ recorded as a fail-closed default rather than a disclosure decision. It
67
+ commits without review. This is what tooling writes when it fills in missing
68
+ front matter, so kit-generated metadata never needs a human to unjam it.
69
+ - **Change.** Anything else — widening, narrowing, removing an existing value,
70
+ or introducing a field already set to a disclosing value — needs a human.
71
+
72
+ To approve a change, put a review marker in the diff:
73
+
74
+ ```
75
+ <!-- Atelier-Boundary-Review: approved — why this exposure is correct -->
76
+ ```
77
+
78
+ The marker must travel **in the same file's diff** as the change it approves.
79
+ A marker committed in a sibling file, or already sitting elsewhere in a file
80
+ that this commit does not touch, approves nothing — the guard reads the diff,
81
+ not the working tree.
82
+
83
+ ## Non-Goals
84
+
85
+ Repo Boundary Guard V1 does not:
86
+
87
+ - create, invite, or permission GitHub users;
88
+ - move files between repositories automatically;
89
+ - write to the MNSTRY runtime;
90
+ - send telemetry;
91
+ - contact cloud services;
92
+ - mutate browser state or write directly from a browser view.
93
+
94
+ ## Review Checklist
95
+
96
+ Use this as a defensive review before copying preview content into real repos:
97
+
98
+ - Every private user has exactly one private domain repo entry.
99
+ - Private domain repos use `readBoundary: "private"`.
100
+ - Shared project repos do not contain private or sensitive source nodes.
101
+ - `rg -n "kg.visibility|visibility:"` over source files finds no local source
102
+ front matter misuse.
103
+ - `repo-access.v1.json` covers every repo listed in `atelier.project.json`.
104
+ - `atelier.lock.json` is written in the copied workspace with
105
+ `atelier lock write`, not copied from the package root.
106
+ - Generated `atelier-output/` files are not treated as source authority.
107
+
108
+ When in doubt, fail closed: move the source into the private domain repo first,
109
+ then project a reviewed summary into shared project material later.
110
+
111
+ ## Upgrade Review
112
+
113
+ When upgrading a copied workspace, review package, lockfile, and boundary
114
+ changes together. The `atelier.lock.json` refresh should be limited to the
115
+ copied workspace's Atelier package metadata, contracts, and migration state,
116
+ while private-domain and shared-project source boundaries remain unchanged.
117
+
118
+ See `docs/upgrade.md` for the upgrade sequence.
119
+
120
+ ## Repo Identity
121
+
122
+ Every Atelier-side reference to a repository used to key on its name. Hosting
123
+ providers let repos be renamed and redirect the old URL indefinitely, so a
124
+ rename leaves stale clones that keep fetching happily under a name that no
125
+ longer exists — the failure is silent, which is why two client-zero repos stopped
126
+ syncing for weeks before anyone noticed.
127
+
128
+ Record a provider-stable identity in `atelier.project.json`:
129
+
130
+ ```json
131
+ {
132
+ "name": "studio-journal",
133
+ "path": "studio-journal",
134
+ "readBoundary": "team",
135
+ "identity": { "provider": "github", "id": "900001" },
136
+ "aliases": ["journal", "press"]
137
+ }
138
+ ```
139
+
140
+ Get the id with `gh api repos/{owner}/{name} --jq .id`. It survives renames;
141
+ the name does not.
142
+
143
+ `resolveRepoIdentity(cloneDir)` answers from the provider's stable id when the
144
+ provider is reachable, then from the recorded identity, then from declared
145
+ aliases, and reports which of those it used in `source` rather than guessing
146
+ silently. **It never keys on the root commit.** Repos created from one template
147
+ share a root commit, so that heuristic reports false duplicates; it also cannot
148
+ see a rename at all. A rename is a metadata update, not a new identity.
149
+
150
+ `atelier doctor` reports:
151
+
152
+ - `repo-renamed-upstream` — the provider's canonical name has moved on
153
+ - `repo-folder-name-stale` — the config name is not the canonical name
154
+ - `repo-name-alias-deprecated` — resolved through a recorded alias
155
+ - `repo-identity-duplicate` — two clones are one repository; park the retired one
156
+ - `repo-identity-undeclared` — no recorded id, so a rename during an outage is unresolvable
157
+ - `repo-identity-unresolved` — no origin remote to identify the clone by
158
+
159
+ ## Content Rules and Exceptions
160
+
161
+ Content rules judge **what is being pushed**, not the whole tree. A whole-tree
162
+ scan cannot tell "you are about to push a new violation" from "a known, accepted
163
+ usage exists", so one legitimate use anywhere blocks every push of everything in
164
+ that repo, forever — including work that has nothing to do with the finding.
165
+ That is how a public site's owner-authorized mock cart stranded real work on a
166
+ machine for weeks.
167
+
168
+ - `pre-commit` runs `atelier boundary check --staged` — added lines in the
169
+ staged diff.
170
+ - `pre-push` runs `atelier boundary push-check` — git writes the ref updates to
171
+ the hook's stdin, and only that range is judged. A brand-new branch is diffed
172
+ against the empty tree, so nothing slips through unscanned.
173
+ - `atelier boundary audit` scans the whole tree and **reports without blocking**,
174
+ listing both matches and declared exceptions with their reasons.
175
+
176
+ If the guard cannot work out which repo it is running in, it fails closed. A
177
+ guard that silently judges nothing is worse than one that stops you.
178
+
179
+ ### Declaring an exception
180
+
181
+ Exceptions live in the boundary policy, not in the guard script. A repo-specific
182
+ product decision must not require editing shared infrastructure that every repo
183
+ runs:
184
+
185
+ ```json
186
+ "contentRuleExceptions": [
187
+ {
188
+ "rule": "browser-persistence",
189
+ "repo": "example-site",
190
+ "paths": ["src/scripts/cart.ts"],
191
+ "reason": "owner-authorized mock cart on a public demo site; localStorage is its whole design"
192
+ }
193
+ ]
194
+ ```
195
+
196
+ Every field is required, because the exception **is** the approval record. There
197
+ is no blanket repo-wide skip: `paths` must name real paths, and a bare `*` or
198
+ `**` is rejected as disabling the rule rather than excepting it. `reason` must
199
+ say something a reviewer can act on. Removing the exception re-blocks the path.
@@ -0,0 +1,64 @@
1
+ # Tenant Readiness Guide
2
+
3
+ Use this guide when preparing a tenant or project workspace for an Atelier
4
+ readiness review. The review is local-only and evidence-first: it does not
5
+ provision repositories, contact external services, mutate a MNSTRY runtime, or
6
+ write through a browser view.
7
+
8
+ ## Authority Order
9
+
10
+ 1. Treat local source files, Git history, `atelier.project.json`,
11
+ `repo-access.v1.json`, `boundary-policy.v1.json`, and `atelier.lock.json` as
12
+ review authority.
13
+ 2. Treat generated graph, projection, support, and readiness files as evidence
14
+ from the current package checks.
15
+ 3. Treat optional model/provider analysis as proposed `atelier-claim@v1`
16
+ records only. Proposed claims cannot define tenant semantics, mutate
17
+ canonical source, or bypass project-owner review.
18
+ 4. Treat runtime identity, consent, visibility, provisioning, bookings,
19
+ commerce, sessions, audit, and client-grade sharing as MNSTRY runtime
20
+ authority.
21
+
22
+ ## Local Review Pass
23
+
24
+ Run checks from the copied workspace:
25
+
26
+ ```bash
27
+ atelier graph --project ./atelier.project.json
28
+ atelier project --project ./atelier.project.json
29
+ atelier readiness --project ./atelier.project.json
30
+ atelier boundary check --project ./atelier.project.json
31
+ atelier lock check --project ./atelier.project.json
32
+ atelier upgrade --dry-run --project ./atelier.project.json
33
+ ```
34
+
35
+ Use `--check` modes where available when validating committed generated output.
36
+ If a command is unavailable in an older workspace, report the exact command and
37
+ stderr instead of substituting a new protocol.
38
+
39
+ ## Claim-First Output
40
+
41
+ Readiness summaries should lead with claims, then evidence:
42
+
43
+ - Claim: the specific readiness statement.
44
+ - Evidence: file paths, schema names, command output, or observed generated
45
+ artifact state.
46
+ - Authority: source, generated evidence, proposed claim, or runtime-owned.
47
+ - Status: ready, warning, blocked, or proposed.
48
+ - Fix path: the smallest next reviewable change.
49
+
50
+ Do not invent independent tenant semantics. Use the Atelier contracts,
51
+ readiness report, boundary policy, and local source as the vocabulary.
52
+
53
+ ## Review Hygiene
54
+
55
+ - Keep package docs, fixtures, skills, and release notes generic.
56
+ - Do not include person-specific, tenant-private, project-private, support
57
+ bundle, transcript, absolute local path, agent-local state, key, token, or
58
+ credential material.
59
+ - Prefer static inspection and existing defensive tests for security-sensitive
60
+ review work.
61
+ - Frame boundary checks as verifying that a control refuses, blocks, or fails
62
+ closed.
63
+ - Findings still need concrete evidence, severity, confidence, impact, and a
64
+ fix path.
@@ -0,0 +1,124 @@
1
+ # Upgrade Guide
2
+
3
+ Use this guide when upgrading a copied private-domain or shared-project starter
4
+ workspace between Atelier package releases. The flow is local-only: it does not
5
+ provision repositories, contact a Git host, mutate the MNSTRY runtime, or write
6
+ through a browser view.
7
+
8
+ ## Upgrading to 0.2.0-alpha.1
9
+
10
+ No contract changes and no authored-content changes: documents valid against
11
+ `0.2.0-alpha.0` remain valid, and `npm run contract:compat` is clean against
12
+ the same epoch baseline. Upgrading is a dependency bump.
13
+
14
+ Two things worth knowing. The package is now on the npm registry, so the
15
+ install command changes from a Git reference to `@mnstry/atelier@0.2.0-alpha.1`
16
+ — keep the `@mnstry/` scope, since the unscoped name belongs to an unrelated
17
+ package. And a local sidecar that previously exited on a malformed request now
18
+ answers it, so anything that supervised `atelier dev` through restarts can stop
19
+ compensating for that.
20
+
21
+ ## Upgrading to 0.2.0-alpha.0
22
+
23
+ This release breaks the export vocabulary. The runtime owner names are now
24
+ the vendor-neutral domain terms `identity`, `catalog`, `commitments`,
25
+ `events`, `projection`, `consent`, `messaging`, `providers`, and `audit`
26
+ (defined in `docs/ontology.md`), and documents written against
27
+ `v0.1.0-alpha.2` do not validate here. Regenerate exports and projections rather than hand-editing
28
+ them, and update any consumer that pins an owner name. `CHANGELOG.md` lists
29
+ every breaking change in this release, including the contract-stability epoch
30
+ (`contractVersion`, `ext`) and the schema const alignments.
31
+
32
+ Contract compatibility is now gated. `npm run contract:compat` validates the
33
+ current corpus against the validators of the baseline recorded in
34
+ `contracts/compat-baseline.json`. The baseline is set at release time: cutting
35
+ a tag sets `baselineTag` to that tag in the release commit, so the following
36
+ development cycle is checked against the released validators. Until the first
37
+ post-epoch tag is cut the baseline is null and the gate is inert by design.
38
+ See `docs/contract-stability.md`.
39
+
40
+ ## Before You Upgrade
41
+
42
+ - Start from a clean Git status in the copied workspace.
43
+ - Confirm Node.js matches the package range: `>=22.18.0 <23`.
44
+ - Keep this package root and copied starter workspaces separate.
45
+ - Keep upgrade diffs generic: placeholders only, no project-specific private
46
+ material, transcripts, support bundles, local absolute paths, local agent
47
+ state, keys, or credential assignments.
48
+
49
+ ## Refresh The Atelier Lockfile
50
+
51
+ `atelier.lock.json` records the installed Atelier package version, source,
52
+ contract versions, template lineage, extension packs, and applied migrations.
53
+ New workspaces get this file from `atelier init`. Existing workspaces can
54
+ backfill it without changing source content:
55
+
56
+ ```bash
57
+ atelier lock write --project ./atelier.project.json
58
+ atelier lock check --project ./atelier.project.json
59
+ ```
60
+
61
+ For registry installs, pin the exact version and record the resolved version
62
+ in the lockfile:
63
+
64
+ ```bash
65
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.1
66
+ npx atelier lock write --project ./atelier.project.json
67
+ ```
68
+
69
+ For Git installs, pin the release tag rather than a branch, so the lock file
70
+ records exactly what was reviewed:
71
+
72
+ ```bash
73
+ npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.1"
74
+ npx atelier lock write --project ./atelier.project.json
75
+ ```
76
+
77
+ Before accepting upstream changes, run the non-mutating upgrade planner:
78
+
79
+ ```bash
80
+ atelier upgrade --dry-run --project ./atelier.project.json
81
+ ```
82
+
83
+ Apply upgrades only after reviewing the plan:
84
+
85
+ ```bash
86
+ atelier upgrade --apply --project ./atelier.project.json
87
+ ```
88
+
89
+ The apply path creates a branch, refuses unsafe dirty state, regenerates
90
+ projections, runs checks, and leaves a reviewable commit.
91
+
92
+ ## Re-run Local Checks
93
+
94
+ Run checks from the copied workspace after refreshing dependencies:
95
+
96
+ ```bash
97
+ atelier graph --project ./atelier.project.json
98
+ atelier project --project ./atelier.project.json
99
+ atelier readiness --project ./atelier.project.json
100
+ atelier lock check --project ./atelier.project.json
101
+ atelier upgrade --dry-run --project ./atelier.project.json
102
+ atelier boundary check --project ./atelier.project.json
103
+ atelier boundary check --staged --project ./atelier.project.json
104
+ ```
105
+
106
+ Generated `atelier-output/` files are projections. Treat source files,
107
+ `atelier.project.json`, `repo-access.v1.json`, `boundary-policy.v1.json`, and
108
+ `atelier.lock.json` as the review authority.
109
+
110
+ `atelier` is the primary command. `mnstry-atelier` remains a legacy alias for
111
+ older workspaces and should not be used in new docs or package scripts.
112
+
113
+ ## Boundary Review
114
+
115
+ - Verify every repo in `atelier.project.json` is covered by `repo-access.v1.json`.
116
+ - Verify private-domain repos still use `readBoundary: "private"`.
117
+ - Verify shared-project repos do not contain private or sensitive source nodes.
118
+ - Verify local source front matter uses `kg.audience`, not `kg.visibility`.
119
+ - Verify upgrade diffs do not add project-specific private material to package
120
+ docs, fixtures, or templates.
121
+
122
+ When unsure, fail closed: keep source in the private-domain workspace and move
123
+ only a reviewed summary into the shared-project workspace through ordinary Git
124
+ review.
@@ -0,0 +1,4 @@
1
+ {
2
+ "nodes": [],
3
+ "edges": []
4
+ }
@@ -0,0 +1,17 @@
1
+ [
2
+ {
3
+ "schema": "atelier-claim@v1",
4
+ "claimId": "claim:analysis:2026-06-17:test",
5
+ "subject": "project:source-node",
6
+ "predicate": "supports",
7
+ "object": "project:claim-target",
8
+ "provider": "analysis",
9
+ "status": "proposed",
10
+ "promoted": true,
11
+ "confidence": 0.6,
12
+ "evidence": [
13
+ "docs/source.md#claim"
14
+ ],
15
+ "createdAt": "2026-06-17T00:00:00Z"
16
+ }
17
+ ]
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "schema": "atelier-claim@v1",
4
+ "claimId": "claim:analysis:2026-06-17:test",
5
+ "subject": "project:source-node",
6
+ "predicate": "supports",
7
+ "object": "project:claim-target",
8
+ "provider": "analysis",
9
+ "status": "proposed",
10
+ "promoted": false,
11
+ "confidence": 0.6,
12
+ "evidence": [
13
+ "docs/source.md#claim"
14
+ ],
15
+ "createdAt": "2026-06-17T00:00:00Z",
16
+ "runtimeImport": {
17
+ "mode": "apply"
18
+ }
19
+ }
20
+ ]
@@ -0,0 +1,17 @@
1
+ [
2
+ {
3
+ "schema": "atelier-claim@v1",
4
+ "claimId": "claim:analysis:2026-06-17:test",
5
+ "subject": "project:source-node",
6
+ "predicate": "supports",
7
+ "object": "project:claim-target",
8
+ "provider": "analysis",
9
+ "status": "proposed",
10
+ "promoted": false,
11
+ "confidence": 0.6,
12
+ "evidence": [
13
+ "docs/source.md#claim"
14
+ ],
15
+ "createdAt": "2026-06-17T00:00:00Z"
16
+ }
17
+ ]
@@ -0,0 +1,24 @@
1
+ {
2
+ "schema": "analysis-adapter-manifest@v1",
3
+ "provider": "analysis",
4
+ "enabled": true,
5
+ "outputRoot": ".mnstry/atelier/analysis/output",
6
+ "claimContract": "atelier-claim@v1",
7
+ "harness": {
8
+ "policy": "active-agentic-harness-only",
9
+ "hiddenModelProvider": true,
10
+ "network": "none",
11
+ "analysisExecution": false,
12
+ "modelProvider": "openai"
13
+ },
14
+ "canonicalMutation": false,
15
+ "authority": {
16
+ "claimOnly": true,
17
+ "frontMatterMutation": false,
18
+ "graphRelationMutation": false,
19
+ "publicExportFeed": false,
20
+ "mcpFeed": false,
21
+ "runtimeImport": false,
22
+ "directCanonicalWrite": false
23
+ }
24
+ }
@@ -0,0 +1,21 @@
1
+ [
2
+ {
3
+ "schema": "atelier-claim@v1",
4
+ "claimId": "claim:analysis:2026-06-12:invalid-frontmatter",
5
+ "subject": "sample-architecture:atelier-analysis-optional-install-decision",
6
+ "predicate": "supports",
7
+ "object": "sample-architecture:local-git-generated-db-hybrid",
8
+ "provider": "analysis",
9
+ "status": "proposed",
10
+ "promoted": false,
11
+ "frontmatter": {
12
+ "kg": {
13
+ "relations": {
14
+ "supports": [
15
+ "sample-architecture:local-git-generated-db-hybrid"
16
+ ]
17
+ }
18
+ }
19
+ }
20
+ }
21
+ ]
@@ -0,0 +1,14 @@
1
+ {
2
+ "nodes": [
3
+ {
4
+ "id": "sample-architecture:atelier-analysis-optional-install-decision"
5
+ }
6
+ ],
7
+ "edges": [
8
+ {
9
+ "source": "sample-architecture:atelier-analysis-optional-install-decision",
10
+ "target": "sample-architecture:local-git-generated-db-hybrid",
11
+ "type": "supports"
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "schema": "analysis-adapter-manifest@v1",
3
+ "provider": "analysis",
4
+ "outputRoot": ".mnstry/atelier/analysis/output",
5
+ "claimContract": "atelier-claim@v1",
6
+ "harness": {
7
+ "policy": "active-agentic-harness-only",
8
+ "hiddenModelProvider": false,
9
+ "network": "none",
10
+ "analysisExecution": false
11
+ },
12
+ "canonicalMutation": false,
13
+ "authority": {
14
+ "claimOnly": true,
15
+ "frontMatterMutation": false,
16
+ "graphRelationMutation": false,
17
+ "publicExportFeed": false,
18
+ "mcpFeed": false,
19
+ "runtimeImport": false,
20
+ "directCanonicalWrite": false
21
+ }
22
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "schema": "analysis-adapter-manifest@v1",
3
+ "provider": "analysis",
4
+ "enabled": true,
5
+ "outputRoot": ".mnstry/atelier/analysis/pilot",
6
+ "claimContract": "atelier-claim@v1",
7
+ "harness": {
8
+ "policy": "active-agentic-harness-only",
9
+ "hiddenModelProvider": false,
10
+ "network": "none",
11
+ "analysisExecution": false
12
+ },
13
+ "canonicalMutation": false,
14
+ "authority": {
15
+ "claimOnly": true,
16
+ "frontMatterMutation": false,
17
+ "graphRelationMutation": false,
18
+ "publicExportFeed": false,
19
+ "mcpFeed": false,
20
+ "runtimeImport": false,
21
+ "directCanonicalWrite": false
22
+ }
23
+ }
@@ -0,0 +1,21 @@
1
+ [
2
+ {
3
+ "schema": "atelier-claim@v1",
4
+ "claimId": "claim:analysis:2026-06-12:adapter-pilot-supports-local-hybrid",
5
+ "subject": "sample-architecture:atelier-analysis-optional-install-decision",
6
+ "predicate": "supports",
7
+ "object": "sample-architecture:local-git-generated-db-hybrid",
8
+ "provider": "analysis",
9
+ "status": "proposed",
10
+ "promoted": false,
11
+ "confidence": 0.71,
12
+ "evidence": [
13
+ "ATELIER-ANALYSIS-OPTIONAL-INSTALL-DECISION.md#authority-boundary",
14
+ "LOCAL-GIT-GENERATED-DB-HYBRID.md#optional-discovery-graph-providers"
15
+ ],
16
+ "notes": [
17
+ "Adapter fixture only. This is not model-assisted analysis execution output."
18
+ ],
19
+ "createdAt": "2026-06-12T00:00:00Z"
20
+ }
21
+ ]
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "atelier-action-intent@v1",
3
+ "id": "atelier.action.copy-repo-path",
4
+ "kind": "copy.repoPath",
5
+ "label": "Copy repo path",
6
+ "appliesTo": {
7
+ "scopes": ["entry"]
8
+ },
9
+ "reads": ["kg.id", "repoPath"],
10
+ "writes": ["clipboard"],
11
+ "authority": {
12
+ "label": "Copy only; no runtime mutation",
13
+ "runtimeMutation": true
14
+ },
15
+ "deniedWhen": []
16
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "schema": "atelier-action-intent@v1",
3
+ "id": "atelier.action.copy-repo-path",
4
+ "kind": "copy.repoPath",
5
+ "label": "Copy repo path",
6
+ "appliesTo": {
7
+ "scopes": ["entry"]
8
+ },
9
+ "reads": ["kg.id", "repoPath"],
10
+ "writes": ["clipboard"],
11
+ "authority": {
12
+ "label": "Copy only; no runtime mutation",
13
+ "runtimeMutation": false
14
+ },
15
+ "deniedWhen": [],
16
+ "applyEndpoint": "/api/apply"
17
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "atelier-action-intent@v1",
3
+ "id": "atelier.action.copy-repo-path",
4
+ "kind": "copy.repoPath",
5
+ "label": "Copy repo path",
6
+ "appliesTo": {
7
+ "scopes": ["entry"]
8
+ },
9
+ "reads": ["kg.id", "repoPath"],
10
+ "writes": ["clipboard", "filesystem"],
11
+ "authority": {
12
+ "label": "Copy only; no runtime mutation",
13
+ "runtimeMutation": false
14
+ },
15
+ "deniedWhen": []
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "atelier-action-intent@v1",
3
+ "id": "atelier.action.copy-agent-prompt",
4
+ "kind": "copy.agentPrompt",
5
+ "label": "Copy agent prompt",
6
+ "appliesTo": {
7
+ "scopes": ["entry", "realm"]
8
+ },
9
+ "reads": ["kg.id", "title", "repoPath"],
10
+ "writes": ["clipboard"],
11
+ "authority": {
12
+ "label": "Copy only; no runtime mutation",
13
+ "runtimeMutation": false
14
+ },
15
+ "deniedWhen": []
16
+ }