@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,140 @@
1
+ # Install
2
+
3
+ Repo Boundary Guard V1 is a local-first pattern for Atelier workspaces. It
4
+ keeps private domain source in user-owned Git repositories and keeps shared
5
+ project work in shared project repositories.
6
+
7
+ ## Posture
8
+
9
+ - No telemetry.
10
+ - No cloud service is required by Atelier.
11
+ - No MNSTRY runtime mutation.
12
+ - No direct browser writes or apply endpoints.
13
+ - No GitHub provisioning from this package.
14
+
15
+ Git repository access is the hard read boundary for source files. Local
16
+ `kg.audience` labels guide projection and review, but they do not hide files
17
+ from anyone who can read the repository.
18
+
19
+ Use `atelier` as the primary CLI command in copied workspaces. The older
20
+ `mnstry-atelier` binary is a legacy alias for compatibility.
21
+
22
+ ## Install Shape
23
+
24
+ The registry is the distribution channel of record, as `docs/continuity.md`
25
+ commits:
26
+
27
+ ```bash
28
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.1
29
+ ```
30
+
31
+ Installing from the matching Git tag resolves to the same reviewed commit:
32
+
33
+ ```bash
34
+ npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.1"
35
+ ```
36
+
37
+ Or over SSH:
38
+
39
+ ```bash
40
+ npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.1"
41
+ ```
42
+
43
+ Keep the `@mnstry/` scope. The unscoped name `atelier` on npm belongs to an
44
+ unrelated third-party package, so a bare `npx atelier` runs someone else's code.
45
+
46
+ Do not install from `v0.2.0-alpha.0`. That tag is the **contract epoch
47
+ marker** — `contracts/compat-baseline.json` pins the compatibility gate to it,
48
+ so it stays where it is permanently. It predates the current tree and carries
49
+ `publishConfig.access: "restricted"`.
50
+
51
+ The workspace `atelier.lock.json` should record the resolved version or Git
52
+ SHA from the install. Treat the tag or version as the friendly handle and the
53
+ SHA as the review authority.
54
+
55
+ Use one private domain repository per user:
56
+
57
+ ```text
58
+ github.com/<org>/<github-login>-private-domain
59
+ ```
60
+
61
+ Use shared project repositories for project work that the team can read:
62
+
63
+ ```text
64
+ github.com/<org>/project-<project-slug>
65
+ github.com/<org>/project-shared-library
66
+ ```
67
+
68
+ The repository names above are examples. Create and permission repositories in
69
+ GitHub or your internal Git host before pointing Atelier at them.
70
+
71
+ ## Tenant Workspace Example
72
+
73
+ Default placeholder shape:
74
+
75
+ - Actor id: `tenant-user`
76
+ - GitHub login placeholder: `TENANT_GITHUB_LOGIN_PLACEHOLDER`
77
+ - Private domain repo: `github.com/<org>/tenant-private-domain`
78
+ - Shared project repo: `github.com/<org>/project-alpha`
79
+
80
+ `TENANT_GITHUB_LOGIN_PLACEHOLDER` is not a real account. Set real identity
81
+ values only inside the copied private workspace or through initializer flags.
82
+ The example repositories are placeholders, not repositories created by this
83
+ package release.
84
+
85
+ ## Local Setup
86
+
87
+ Copy one of the starter templates:
88
+
89
+ - `templates/private-domain-workspace/` for one user's private domain repo.
90
+ - `templates/shared-project-workspace/` for shared project repositories.
91
+
92
+ Prefer the CLI initializer when possible:
93
+
94
+ ```bash
95
+ atelier init --template private-domain --target ./tenant-private-domain --actor tenant-user
96
+ atelier init --template shared-project --target ./project-alpha --actor tenant-user
97
+ ```
98
+
99
+ `--actor` rewrites the copied boundary policy actor entry and binds it to the
100
+ local Git email when available. Use `--github-login` or `--git-email` to set
101
+ those values explicitly during onboarding.
102
+
103
+ Then update:
104
+
105
+ - `atelier.project.json` repo paths.
106
+ - `repo-access.v1.json` read boundaries.
107
+ - `atelier.lock.json` with `atelier lock write` after choosing the exact Atelier package source.
108
+ - README placeholders for project names and Git remotes.
109
+
110
+ Keep project configuration tracked and local overlay state ignored. Track
111
+ `atelier.project.json`, `repo-access.v1.json`, `boundary-policy.v1.json`,
112
+ `atelier.lock.json`, and source documents. Do not track `atelier.local.json`,
113
+ `atelier.workspace.local.json`, `.atelier-local/`, proposals/current/presence/
114
+ nonce/grants/audit/session/support state, prompts, transcripts, support
115
+ bundles, or generated projections.
116
+
117
+ Run local-only checks from the copied workspace:
118
+
119
+ ```bash
120
+ atelier graph --project ./atelier.project.json
121
+ atelier project --project ./atelier.project.json
122
+ atelier readiness --project ./atelier.project.json
123
+ atelier readiness journey --project ./atelier.project.json
124
+ atelier readiness run mnstry.readiness:identity-map --project ./atelier.project.json
125
+ atelier readiness packet --project ./atelier.project.json
126
+ atelier readiness export --dry-run --project ./atelier.project.json
127
+ ```
128
+
129
+ These commands read local files and write generated local outputs only.
130
+
131
+ ## Upgrade Path
132
+
133
+ The starter commands create `atelier.lock.json` inside the copied workspace so
134
+ the installed Atelier package source, version, contracts, and migration state
135
+ are reviewable. Refresh it from inside the copied workspace after choosing a
136
+ registry or Git tag install. Local tarballs remain release-audit and
137
+ smoke-test tools; they are not the default install path.
138
+
139
+ See `docs/tenant-readiness.md` for the readiness review format and
140
+ `docs/upgrade.md` for the full upgrade flow and boundary review checklist.
@@ -0,0 +1,140 @@
1
+ # MNSTRY Atelier Knowledge Graph
2
+
3
+ The Atelier knowledge graph is a local, Git-backed operating model for project
4
+ source material. It is not a taxonomy and it is not runtime retrieval. It is a
5
+ durable model of source nodes, evidence, relationships, diagnostics, and
6
+ projection readiness.
7
+
8
+ ## Source Rules
9
+
10
+ - Markdown documents use front matter.
11
+ - Non-Markdown sources use adjacent `.kg.json` sidecars.
12
+ - `kg.id` is required and stable.
13
+ - `kg.audience` is required.
14
+ - `kg.visibility` is invalid in local source metadata.
15
+ - Declared relations emit semantic edges.
16
+
17
+ ## Source formats
18
+
19
+ The graph is sidecar-first: Markdown front matter is the only inline metadata
20
+ format the kit reads, and every other file becomes a first-class node through
21
+ an adjacent `<file>.kg.json` sidecar
22
+ (`contracts/knowledge-source-sidecar.v1.schema.json`). This is how any format
23
+ — json, yaml, csv, images, arbitrary binaries — joins the census without
24
+ atelier ever parsing the foreign format itself.
25
+
26
+ Two census rules follow:
27
+
28
+ - Document extensions (`.md`, `.html`, `.pdf`, `.docx`) are always sources.
29
+ Non-Markdown documents *demand* a sidecar and fail closed without one.
30
+ - Any other file *opts in* by carrying a sidecar. Without one it is simply not
31
+ knowledge-graph material — no error, no node. A sidecar whose adjacent asset
32
+ is missing is still an orphan error either way.
33
+
34
+ A sidecar that Git ignores cannot enroll a file. Membership asks whether the
35
+ sidecar is *visible* in tracked state, not whether it exists on this disk: an
36
+ untracked, ignored `<file>.kg.json` is machine-local, so obeying one mints a
37
+ node — with whatever audience it declares, up to `public` — that appears in no
38
+ tracked file and on no other machine. The refusal runs both ways: an ignored
39
+ sidecar enrolls nothing and describes nothing, so a document-extension asset
40
+ whose only sidecar is ignored still fails closed with the ordinary
41
+ missing-sidecar error, which is the verdict a clean checkout reaches anyway.
42
+ Refused sidecars are named — a warning, `ignored-sidecar`, on `buildGraph`'s
43
+ `ignoredSidecarWarnings(project)` and on the workspace builder's
44
+ `ignoredSidecars`, printed by `atelier graph` — because dropping them silently
45
+ is what let the injection through. They are reported *beside* the graph and
46
+ never inside it: `buildGraph`'s return value is written verbatim as the
47
+ artifact, and a machine-local observation there would churn committed bytes
48
+ per machine, which is the failure the ignore filter exists to prevent.
49
+
50
+ The sidecar branch is binary-safe by construction: the asset's bytes are never
51
+ read. Identity, audience, and relations all come from the sidecar, so
52
+ audience-based projection filtering, disclosure diagnostics, and the repo
53
+ boundary guard treat a sidecar-described binary exactly like a Markdown
54
+ document.
55
+
56
+ Why the kit does not parse yaml (or csv, or anything else): the zero-dependency
57
+ trust posture. Node ships no yaml parser, and pulling one in — or hand-rolling
58
+ parsers for every format an adopter might commit — widens exactly the supply
59
+ chain and attack surface the kit exists to keep auditable. Declared metadata in
60
+ a schema-checked JSON sidecar is the trust boundary. Richer format adapters
61
+ that derive metadata from asset contents belong to extension packs
62
+ (`atelier-extension-pack.v1`), not the kit core.
63
+
64
+ ## Census Rules
65
+
66
+ Graph and projection walks skip git-ignored paths. A committed artifact must
67
+ describe the repository, not one machine's working tree — if `.mnstry-local/`,
68
+ support bundles, editor scratch, or OS junk enter the census, every machine
69
+ produces different bytes for the same commit and multi-machine workspaces
70
+ rebase-conflict on every sync.
71
+
72
+ The check is one batched `git ls-files --others --ignored --exclude-standard
73
+ --directory` per repository root, not a per-file `git check-ignore`, which is
74
+ too slow to survive contact with a real workspace.
75
+
76
+ Repository *discovery* is deliberately not filtered this way: a git folder that
77
+ appears in the workspace is an explicit decision for the operator to make (see
78
+ the `external` repo kind), not something to drop silently.
79
+
80
+ Determinism is a tested contract. `test/graph-determinism.test.mjs` builds
81
+ twice, plants git-ignored junk between builds, and fails if any committed
82
+ artifact changes a byte. It also asserts the planted paths really are ignored,
83
+ so a dropped `.gitignore` pattern fails loudly rather than passing while the
84
+ churn quietly returns.
85
+
86
+ ### Open decision: one writer
87
+
88
+ Determinism guards the trigger, not the underlying shape. Committing generated
89
+ artifacts and rebuilding them on every machine on every tick is inherently
90
+ collision-prone: any nondeterminism that slips back in — a new census input, a
91
+ Node version difference, a timestamp — reproduces the churn, and a machine that
92
+ cannot fast-forward keeps publishing its own build, which is self-sustaining.
93
+
94
+ The durable fixes are one-writer postures: generate in CI only, or stop
95
+ committing projections and build them on demand. This is not yet decided. When
96
+ the kit formalizes projection workflows for multi-machine adopters, one of those
97
+ should become the documented default, with committed artifacts treated as the
98
+ single-machine special case.
99
+
100
+ ## Projection Rules
101
+
102
+ The graph feeds local views, readiness reports, and dry-run exports. A local
103
+ projection may hide or emphasize material for a stakeholder, but it does not
104
+ enforce object-level permissions. If enforcement is required, the project must
105
+ use Git repo access locally or MNSTRY runtime permissions after import.
106
+
107
+ ## Collaboration Rules
108
+
109
+ Git authorship is the primary local attribution signal. Actor and harness
110
+ annotations are advisory context. Sensitive semantic fields should fail closed
111
+ without an explicit review marker, while ordinary authored files can use normal
112
+ Git merge/review workflows.
113
+
114
+ ## File Classification
115
+
116
+ Every file the kit ships or generates belongs to one of three classes, declared
117
+ once in the kit manifest's `fileClasses` and resolved through
118
+ `classifyPath(path, { repoRole })`:
119
+
120
+ | Class | Meaning | Safe automated handling |
121
+ |---|---|---|
122
+ | `source` | canonical, human or agent authored | never discard; conflicts need a human |
123
+ | `generated-projection` | rebuilt deterministically every tick | discard and regenerate freely |
124
+ | `distributed-runtime-copy` | canonical in ONE repo role, copied into consumers by runtime sync | rederivable in consumers, canonical where it is owned |
125
+
126
+ A `distributed-runtime-copy` **must** declare `canonicalRepoRole`. This is the
127
+ part that cannot be skipped: name-matching alone cannot tell the repo that owns
128
+ a file from the repos that merely receive it. A self-repair loop that treats a
129
+ runtime copy as authored work wedges the consumer in permanent rebase conflict;
130
+ a sync loop that folds it into a plain "generated" list silently destroys
131
+ canonical edits in the repo where it is source. The same path therefore resolves
132
+ to `source` in its canonical role and `distributed-runtime-copy` everywhere else.
133
+
134
+ Unclassified paths default to `source`, the fail-closed answer — never discarded.
135
+ Later entries win, as in `.gitignore`, so an adopter can narrow a kit default by
136
+ appending a more specific pattern.
137
+
138
+ Adapters must not maintain shadow lists. `test/file-class.test.mjs` asserts the
139
+ kit itself keeps no second copy: the graph walker's skip list is derived from the
140
+ declaration, and the glob dialect lives in one module.
@@ -0,0 +1,206 @@
1
+ # Atelier export ontology
2
+
3
+ The public vocabulary of the `atelier-export@v1` contract: the nine runtime
4
+ owner terms, the object classes and export collections they govern, the six
5
+ runtime targets an export may address, and the boundary between local
6
+ `audience` and runtime `visibility`. Everything on this page is defined by
7
+ the published schemas and the dry-run validator that ship in this package.
8
+
9
+ ## MNSTRY's format, offered openly
10
+
11
+ The Atelier export format is MNSTRY's format, offered openly. Conformance is
12
+ public and offline: the contracts, fixtures, and dry-run validator are all in
13
+ this package, and anyone can check a document against them without a MNSTRY
14
+ account, a network connection, or MNSTRY's involvement. Admission is a
15
+ separate and narrower decision: MNSTRY's private validator only ever decides
16
+ admission into a MNSTRY runtime. It never redefines conformance, and a
17
+ document it declines can still be fully conformant. Nothing in this
18
+ vocabulary requires MNSTRY approval to use.
19
+
20
+ ## How ownership is declared
21
+
22
+ An export document declares, in `importPlan.runtimeOwners`, which runtime
23
+ owner governs each object class it ships. An owner is an area of runtime
24
+ authority — a named accountability for a category of governed records — not a
25
+ module, a table, or a service. The owner enum is closed:
26
+
27
+ `identity`, `catalog`, `commitments`, `events`, `projection`, `consent`,
28
+ `messaging`, `providers`, `audit`
29
+
30
+ Ownership assignments are made per document and reviewed at admission. The
31
+ mapping from export collections to runtime targets, by contrast, is fixed by
32
+ the contract and is not negotiable per document.
33
+
34
+ Two namespace notes, because the same words appear at different levels:
35
+
36
+ - The owner `consent` and the object class `consent_boundary` are different
37
+ namespaces. The class names a kind of exported object; the owner names the
38
+ runtime authority that governs objects of that kind.
39
+ - The owner `projection` and the local generated projection are different
40
+ things. The local projection is a development preview of source material on
41
+ your machine; the owner term names the runtime authority over what is
42
+ actually shown to people.
43
+
44
+ ## The six runtime targets
45
+
46
+ Every export collection maps to exactly one runtime target. Any declared
47
+ target field anywhere in a document (`runtimeObject`, `targetObject`,
48
+ `targetClass`, and their snake_case forms) must name one of these six values;
49
+ anything else is a semantic-profile violation.
50
+
51
+ | Runtime target | Meaning | Export collections |
52
+ | --- | --- | --- |
53
+ | `content.material` | Readable and renderable content | `offers`, `surfaces`, `sdui` |
54
+ | `core.artifact` | Reviewable records and documents | `consentBoundaries`, `staffPrep`, `providerEgress` |
55
+ | `core.trackable` | Measurable signals over time | `trackables` |
56
+ | `scheduling.commitment` | Commitment paths and scheduled steps | `commitmentPaths` |
57
+ | `space.space` | Spaces where activity happens | `spaces` |
58
+ | `space.provision` | Provisioning of a space or provider capacity | (declared directly by readiness mappings) |
59
+
60
+ The same mapping applies to import object classes: `offer`, `public_surface`,
61
+ `surface`, and `sdui_block` target `content.material`; `commitment_path`
62
+ targets `scheduling.commitment`; `space` targets `space.space`; `trackable`
63
+ targets `core.trackable`; and `consent_boundary`, `staff_prep`, and
64
+ `provider_egress` target `core.artifact`.
65
+
66
+ ## Audience and visibility
67
+
68
+ These are two different vocabularies and the contract keeps them apart.
69
+
70
+ **Audience** is local readership: `public`, `team`, `operator`, `staff`,
71
+ `private`, `sensitive`. It classifies who source material is written for and
72
+ whether it is eligible for projection. It is not a security boundary —
73
+ repository access is the read boundary, and an audience label does not hide a
74
+ file from anyone who can read the repository. Provenance source nodes carry
75
+ `audience` and never `visibility`.
76
+
77
+ **Visibility** is runtime authority: `private`, `shared`, `platform`,
78
+ `public`. It is a security boundary on governed runtime objects, and the
79
+ runtime default is private. Export objects carry `visibility` and never a
80
+ local audience value.
81
+
82
+ The validator enforces the separation in both directions: a local audience
83
+ value appearing in a `visibility` field is rejected, a `visibility` key on a
84
+ source node is rejected, and any object with public visibility must resolve
85
+ its source references exclusively to public-audience source nodes.
86
+
87
+ ## The nine owner terms
88
+
89
+ Each section gives the term's definition, what it governs in an export
90
+ document, and what admission review checks for material assigned to it. The
91
+ "governs" lists describe the characteristic assignments made by the bundled
92
+ readiness protocols and the sample fixtures; a document may propose others,
93
+ and the proposal is what admission review reviews.
94
+
95
+ ### identity
96
+
97
+ Runtime authority over who someone is: accounts, actors, roles, and the link
98
+ between locally described actors and governed identity records.
99
+
100
+ Governs: no export collection creates identity records. Identity-owned
101
+ material arrives as review artifacts (`staffPrep` entries targeting
102
+ `core.artifact`) that describe actors and their roles.
103
+
104
+ Admission review checks: every actor description carries source evidence and
105
+ a declared owner; role claims trace to sources; nothing in the document
106
+ creates or mutates an identity record.
107
+
108
+ ### catalog
109
+
110
+ Runtime authority over what is offered: offers, their components, and their
111
+ pricing.
112
+
113
+ Governs: `offer` objects (the `offers` collection, targeting
114
+ `content.material`).
115
+
116
+ Admission review checks: pricing uses ISO-4217 currency codes and integer
117
+ minor-unit amounts; every offer component carries an approval status; a
118
+ public offer resolves only public-audience sources.
119
+
120
+ ### commitments
121
+
122
+ Runtime authority over what participants commit to: commitment paths and the
123
+ scheduled steps inside them.
124
+
125
+ Governs: `commitment_path` objects (the `commitmentPaths` collection,
126
+ targeting `scheduling.commitment`).
127
+
128
+ Admission review checks: the plan is dry-run only — no scheduling writes;
129
+ every step is present as reviewable material rather than an instruction to
130
+ execute.
131
+
132
+ ### events
133
+
134
+ Runtime authority over what happened: measurable signals recorded over time.
135
+
136
+ Governs: `trackable` objects (the `trackables` collection, targeting
137
+ `core.trackable`).
138
+
139
+ Admission review checks: every trackable declares a runtime owner and a
140
+ proposed runtime visibility; no local audience value leaks into a visibility
141
+ field.
142
+
143
+ ### projection
144
+
145
+ Runtime authority over what is shown: surfaces, generated display blocks, and
146
+ the presented shape of spaces.
147
+
148
+ Governs: `public_surface`, `surface`, and `sdui_block` objects (the
149
+ `surfaces` and `sdui` collections, targeting `content.material`), and
150
+ presentation-side `space` material.
151
+
152
+ Admission review checks: public surfaces resolve exclusively to
153
+ public-audience source nodes; the visibility gate defaults to private with a
154
+ public-only source policy; an export from a dirty working tree must declare
155
+ `forced: true` and carry a non-empty taint list.
156
+
157
+ ### consent
158
+
159
+ Runtime authority over what has been agreed to: consent boundaries and their
160
+ exceptions.
161
+
162
+ Governs: `consent_boundary` objects (the `consentBoundaries` collection,
163
+ targeting `core.artifact`).
164
+
165
+ Admission review checks: boundaries default to private visibility; every
166
+ exception is visible to audit; consent material fails closed — missing or
167
+ ambiguous consent evidence blocks rather than warns.
168
+
169
+ ### messaging
170
+
171
+ Runtime authority over what is sent to people: outbound messages and
172
+ notifications.
173
+
174
+ Governs: no bundled export collection maps to messaging. The term exists in
175
+ the owner enum so a document can propose messaging ownership for review — for
176
+ example, a journey handoff that would eventually notify a participant.
177
+ Nothing in this format sends anything.
178
+
179
+ Admission review checks: messaging-owned material is proposal-only; the
180
+ document demonstrates that no send occurs locally and that any eventual send
181
+ would be governed at the runtime.
182
+
183
+ ### providers
184
+
185
+ Runtime authority over external service relationships: provider egress and
186
+ the provisioning behind spaces.
187
+
188
+ Governs: `provider_egress` objects (the `providerEgress` collection,
189
+ targeting `core.artifact`) and provisioning review material targeting
190
+ `space.provision`.
191
+
192
+ Admission review checks: egress is declared, never performed; each declared
193
+ provider crossing names its provider class and is individually reviewable.
194
+
195
+ ### audit
196
+
197
+ Runtime authority over the record of decisions: evidence, review trails, and
198
+ the trackables that prove a review happened.
199
+
200
+ Governs: review artifacts (`staffPrep` entries targeting `core.artifact`) and
201
+ review-trail trackables (the `trackables` collection, targeting
202
+ `core.trackable`).
203
+
204
+ Admission review checks: decisions leave a trail; evidence references resolve
205
+ to provenance source nodes or to export objects that themselves carry
206
+ provenance; nothing is silently dropped.
@@ -0,0 +1,151 @@
1
+ # Release engineering
2
+
3
+ This document describes the enforcement surface for the Atelier package: the
4
+ release gates, the CI lanes, the fork policy, and the version-bump surface.
5
+ Every gate named here fails closed and reports findings as a generic label plus
6
+ a location, never the matched content.
7
+
8
+ ## Gates
9
+
10
+ ### release:audit
11
+
12
+ `npm run release:audit` (`scripts/check-release-tarball.mjs`) audits the exact
13
+ tarball `npm pack` would publish:
14
+
15
+ - Package metadata: name, license, exposed CLI bins, and a mandatory `files`
16
+ allowlist in `package.json`.
17
+ - Tarball allowlist: every packed path must match a known-good pattern; any
18
+ unexpected file fails the audit.
19
+ - Content scan: every packed file is scanned against committed structural
20
+ patterns (absolute user paths, machine-local temp paths, agent-local state
21
+ paths, key material, secret-like assignments) and against the maintainer-held
22
+ denylist described below.
23
+ - Version drift: `CHANGELOG.md` must contain a `## <version>` heading and
24
+ `README.md` must mention the version. The expected version and tarball name
25
+ are derived from `package.json`, never hardcoded.
26
+
27
+ Exit codes: `0` clean, `1` findings, `2` configuration error (for example an
28
+ unavailable denylist without explicit acknowledgment).
29
+
30
+ ### repo:check
31
+
32
+ `npm run repo:check` (`scripts/check-repo-disclosure.mjs`) sweeps the whole
33
+ Git-tracked tree, not just the tarball:
34
+
35
+ - Default mode scans every tracked text file line-by-line with the structural
36
+ patterns and the denylist.
37
+ - `--staged` scans staged changes only, for local pre-commit use.
38
+ - `--structural-only` is the intentional no-denylist lane used by CI jobs that
39
+ run without secrets.
40
+ - `--commits <none|range|all>` adds the commit-identity gate and scans commit
41
+ messages in the selected range with the same patterns.
42
+
43
+ Exit codes match `release:audit`: `0` clean, `1` findings, `2` configuration or
44
+ usage error.
45
+
46
+ ### Commit-identity gate
47
+
48
+ Part of `repo:check --commits`. Commit authors must match a hardcoded
49
+ maintainer allowlist; committers additionally allow GitHub's merge identity,
50
+ which GitHub-UI merges reintroduce. The allowlist is committed and reviewable
51
+ in the script — it is not a secret.
52
+
53
+ ### migrations:check
54
+
55
+ `npm run migrations:check` (`scripts/check-breaking-migrations.mjs`) keeps the
56
+ changelog and the migration registry honest about breaking changes:
57
+
58
+ - Every `**Breaking:**` changelog entry must match exactly one entry in
59
+ `scripts/breaking-changes.map.json`, and every map entry must match exactly
60
+ one changelog entry (no stale exemptions).
61
+ - Map entries with a migration disposition must name an active breaking
62
+ migration in the registry, and every active breaking migration must be
63
+ referenced by the map.
64
+ - Exempt entries require a non-empty reason and a date.
65
+ - Every registered migration record is re-validated against the migration
66
+ record contract.
67
+
68
+ ### egress:check
69
+
70
+ `npm run egress:check` (`atelier egress check`) scans package runtime paths for
71
+ forbidden non-localhost egress. The package claims no network egress in runtime
72
+ paths; this gate is the mechanical check behind that claim.
73
+
74
+ ### consumer:smoke
75
+
76
+ `npm run consumer:smoke` (`scripts/consumer-smoke.mjs`) packs the real tarball,
77
+ installs it offline into a throwaway consumer project with lifecycle scripts
78
+ disabled, and imports the public API to validate a sample export. It proves the
79
+ tarball is installable and functional exactly as a consumer receives it.
80
+
81
+ ### Egress-marker inventory
82
+
83
+ The local-computed egress allow marker disables unresolved-target egress
84
+ detection for a small window around each use, so its spread is pinned:
85
+ `test/egress-marker-inventory.test.mjs` asserts the exact files and occurrence
86
+ counts where the marker may appear. Widening that inventory is a reviewed
87
+ decision, not a mechanical edit.
88
+
89
+ ## Denylist mechanism
90
+
91
+ Beyond the committed structural patterns, content scans apply a maintainer-held
92
+ pattern list supplied via the `ATELIER_RELEASE_DENYLIST` CI secret or a local
93
+ gitignored file (`release-denylist.local.json`); the `ATELIER_DENYLIST_JSON`
94
+ environment variable takes precedence over the file. Every audit fails closed
95
+ when the list is absent; setting `ATELIER_ALLOW_MISSING_DENYLIST=1` explicitly
96
+ acknowledges a structural-only run.
97
+
98
+ Findings are reported as label plus location, never content — neither the
99
+ pattern source nor the matched text is printed, and a pattern compile error
100
+ prints the label only. Labels are themselves kept generic and are
101
+ maintainer-reviewed before entering the list.
102
+
103
+ ## CI lanes
104
+
105
+ Four jobs run on pushes to `main` and on pull requests, and all four are
106
+ required status checks:
107
+
108
+ - `test`: syntax check (`node --check`, not a type system), the full test suite, contract checks, `egress:check`, and
109
+ `migrations:check`. This job sets `ATELIER_ALLOW_MISSING_DENYLIST=1` scoped
110
+ to the job only — denylist assertions belong to the secret lane.
111
+ - `consumer-smoke`: warms the npm cache with `npm ci` (the offline tarball
112
+ install needs the registry dependencies cached), then runs
113
+ `npm run consumer:smoke`.
114
+ - `structural-sweep`: runs `repo:check --structural-only` with the
115
+ commit-identity gate over the pull-request range; on push builds the
116
+ `ATELIER_COMMIT_SCAN` repository variable selects the commit scan depth. No
117
+ secrets are required, so this lane runs for fork pull requests.
118
+ - `secret-sweep`: the only lane with access to the denylist. It runs the full
119
+ `repo:check` (with the configured commit scan) and `release:audit`.
120
+
121
+ ## Fork policy
122
+
123
+ Fork pull requests never receive repository secrets, so `secret-sweep` cannot
124
+ pass in place. The job fails explicitly rather than skipping — GitHub treats a
125
+ skipped job as satisfying a required status check, so an explicit failure is
126
+ the only safe block.
127
+
128
+ To clear a fork pull request, a maintainer verifies the head SHA and dispatches
129
+ the `fork-sweep` workflow with the pull-request number and that SHA. The
130
+ workflow runs the trusted scanner from `main` against the fork's tree checked
131
+ out as data — it never installs or executes anything from the untrusted tree —
132
+ re-verifies that the head SHA has not moved, and posts a `secret-sweep` check
133
+ run on the SHA. The newest check run with that name supersedes the earlier
134
+ failure for branch protection.
135
+
136
+ `release:audit` never runs against untrusted code (`npm pack` executes
137
+ lifecycle scripts); it re-runs on the push build of the merge commit. No
138
+ workflow uses `pull_request_target`.
139
+
140
+ ## Version-bump surface
141
+
142
+ A version bump touches exactly:
143
+
144
+ - `package.json` (`version`)
145
+ - `CHANGELOG.md` (a `## <version>` heading)
146
+ - the pinned install tags in `README.md`, `docs/install.md`,
147
+ and `docs/upgrade.md`
148
+
149
+ The release scripts derive the expected version and tarball name from
150
+ `package.json`, so they are not part of the bump surface, and `release:audit`
151
+ fails when the changelog heading or the README mention lags the bump.