@mnstry/atelier 0.2.0-alpha.4 → 0.2.0-alpha.6

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 (64) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +61 -18
  3. package/contracts/atelier-repository-observation.v1.schema.json +163 -0
  4. package/contracts/public-api-baseline.json +57 -0
  5. package/docs/assurance-controls.md +41 -0
  6. package/docs/atelier-runtime.md +28 -2
  7. package/docs/atelier-sync.md +171 -0
  8. package/docs/blocks/claims.md +23 -12
  9. package/docs/blocks/will-not-do.md +9 -3
  10. package/docs/design.md +12 -6
  11. package/docs/install.md +26 -4
  12. package/docs/knowledge-graph.md +8 -4
  13. package/docs/local-services.md +101 -0
  14. package/docs/release-engineering.md +86 -12
  15. package/docs/repo-boundary-guard.md +12 -2
  16. package/docs/upgrade.md +40 -2
  17. package/fixtures/atelier-repository-observation/invalid/complete-with-blocker.v1.json +18 -0
  18. package/fixtures/atelier-repository-observation/valid/complete-local.v1.json +48 -0
  19. package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
  20. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
  21. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
  22. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
  23. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
  24. package/package.json +16 -5
  25. package/skills/claude/atelier-local-service/SKILL.md +47 -0
  26. package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
  27. package/skills/codex/atelier-local-service/SKILL.md +47 -0
  28. package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
  29. package/src/boundary/content-rules.mjs +283 -20
  30. package/src/boundary/policy.mjs +162 -72
  31. package/src/cli/execute-command.mjs +36 -0
  32. package/src/cli/run.mjs +35 -7
  33. package/src/collaboration/event-ledger.mjs +365 -0
  34. package/src/collaboration/index.mjs +17 -0
  35. package/src/collaboration/proposals.mjs +265 -65
  36. package/src/commands/attestation.mjs +20 -6
  37. package/src/commands/disclosure.mjs +133 -0
  38. package/src/commands/distribution.mjs +2 -1
  39. package/src/commands/extension-pack.mjs +2 -1
  40. package/src/commands/init.mjs +2 -1
  41. package/src/commands/server.mjs +1 -4
  42. package/src/commands/sync.mjs +100 -0
  43. package/src/contracts/corpus.mjs +6 -0
  44. package/src/disclosure/content-scan.mjs +193 -0
  45. package/src/egress/check.mjs +7 -38
  46. package/src/egress/forbidden-egress.mjs +32 -18
  47. package/src/graph/graph.mjs +112 -314
  48. package/src/graph/knowledge-graph.mjs +94 -18
  49. package/src/harness/context-client.mjs +9 -1
  50. package/src/index.mjs +41 -0
  51. package/src/project/config.mjs +89 -28
  52. package/src/project/file-class.mjs +14 -0
  53. package/src/project/package-root.mjs +10 -0
  54. package/src/project/path-match.mjs +38 -15
  55. package/src/project/private-state.mjs +110 -0
  56. package/src/runtime/git-adapter.mjs +189 -0
  57. package/src/runtime/local-state.mjs +439 -0
  58. package/src/runtime/repository-observation.mjs +491 -0
  59. package/src/runtime/supervisor.mjs +788 -0
  60. package/src/server/local-sidecar.mjs +81 -59
  61. package/src/server/security.mjs +89 -4
  62. package/src/server/server.mjs +3 -2
  63. package/src/support/feedback-report.mjs +4 -3
  64. package/src/upgrade/upgrade.mjs +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,82 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0-alpha.6
4
+
5
+ - Add Deliverable Zero for Atelier Sync: explicit single-repository
6
+ enrollment, a pinned direct-process Git adapter, executable repository
7
+ completeness observations, fast-forward-only reconciliation, per-repository
8
+ locking, hash-chained local operation traces, pause/resume control, and a
9
+ two-phase user-confirmed commit-and-publish path. No desktop shell, watcher
10
+ dependency, semantic conflict resolution, force operation, browser apply
11
+ endpoint, telemetry, or hidden upload is introduced.
12
+ - Raise the Sync Git floor to 2.40 so default global and system attributes can
13
+ be observed, bind publication to the single resolved push URL, refuse URL
14
+ rewrite ambiguity, strip every inherited `GIT_*` process control, keep
15
+ read-only commands mutation-free, and return non-zero exits for paused status
16
+ and failed publication.
17
+
18
+ ## 0.2.0-alpha.5
19
+
20
+ - Harden boundary enforcement so path globs use segment-aware matching, an
21
+ explicitly empty or malformed content-rule policy is invalid, staged and
22
+ pushed binary evidence is scanned within bounded budgets, incomplete Git
23
+ reads fail closed, linked worktrees install hooks in the correct Git common
24
+ directory, and `boundary audit` defaults to the current working tree with an
25
+ explicit `--head` snapshot mode.
26
+ - Consolidate graph classification in one canonical engine. Markdown without a
27
+ `kg` block is now represented as `unclassified` with a private audience and
28
+ diagnostics; empty, partial, or malformed declarations remain blocking.
29
+ Generated projection directories remain derived from the file-class manifest
30
+ so graph validation and generated-only upgrade recovery cannot drift apart.
31
+ - Bind release egress verification to the exact `npm pack` inventory, including
32
+ test-shaped paths that are actually published, and make the legacy egress
33
+ checker a thin delegate to the canonical scanner. Packed fixture-suppression
34
+ markers are refused and reviewed local-computed suppressions are counted.
35
+ - Harden `atelier dev` so it binds only to loopback, requires a generated
36
+ `atelier.manifest.json`, serves only enrolled safe static files after
37
+ realpath validation, and applies host, fetch-site, origin, method, and nonce
38
+ checks to the relevant read and mutation routes.
39
+ - Make collaboration records fail closed with typed corrupt-record results,
40
+ bounded ledger reads, POSIX no-follow and cross-platform state-leaf identity
41
+ validation, content-bound event identifiers, write locking, explicit
42
+ compaction, and one-pass proposal-list materialization. Compatibility
43
+ snapshots are best-effort projections of committed events rather than a
44
+ second authority. Proposal authority now follows declared capabilities and
45
+ apply endpoints rather than action-like words, and the never-released
46
+ provider-analysis experiment was removed before it became part of a
47
+ published API.
48
+ - Render expected project and JSON failures as typed, actionable CLI messages
49
+ without stacks by default; set `ATELIER_DEBUG=1` to include diagnostic stacks.
50
+ - Strengthen release proof with negative-control mutations and a bare consumer
51
+ that installs without publisher overrides, validates its dependency tree,
52
+ and imports every declared package export. A candidate is packed once, bound
53
+ by SHA-256, and passed unchanged through tarball audit, consumer, and branded
54
+ distribution gates. The trusted-publishing workflow publishes that same
55
+ retained, audited tarball rather than repacking the source directory.
56
+ - Pin every JavaScript subpath and named export from `v0.2.0-alpha.4` in a
57
+ registry-verified compatibility baseline with immutable tag-commit and
58
+ public-artifact provenance. Release tooling refuses removals, provenance
59
+ drift, and binding modified source to an already-tagged package version.
60
+ - Add a portable `atelier disclosure check` command that scans tracked or
61
+ staged consumer content, requires private denylist coverage by default, and
62
+ refuses tracked repository-local denylist files. Portable and repository
63
+ sweeps now detect the full bounded family of private-key headers and refuse
64
+ binary or invalid-UTF-8 evidence instead of omitting it. Fork sweeps require
65
+ the trusted denylist secret and cannot fall back to the untrusted checkout.
66
+ Repository release sweeps also inspect every bounded blob introduced by the
67
+ commit range, so content added and deleted before the final tree cannot
68
+ become public history unseen.
69
+ - Add public agent instructions and mirrored skills for extracting reusable
70
+ mechanisms from private implementations without carrying tenant material
71
+ into Atelier, plus a managed local-service contract for durable loopback
72
+ authoring and review tools.
73
+ - Document the client-zero adapter rule that exact package identity, installed
74
+ dependency resolution, CLI version, and `atelier.lock.json` must agree. This
75
+ prevents a stale sibling checkout from satisfying a current adapter proof.
76
+ - Declare the audited `fast-uri` pin as a direct runtime dependency so packed
77
+ offline consumer installs resolve the same dependency closure as the source
78
+ checkout.
79
+
3
80
  ## 0.2.0-alpha.4
4
81
 
5
82
  Presentation release. No contract changes and no runtime behaviour changes:
package/README.md CHANGED
@@ -48,7 +48,7 @@ governed projections
48
48
  You can see the complete loop in a disposable sample workspace:
49
49
 
50
50
  ```bash
51
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.4
51
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.6
52
52
  npx mnstry-atelier init --fixture=sample-workspace --target ./sample
53
53
  npx mnstry-atelier graph --project ./sample/atelier.project.json
54
54
  npx mnstry-atelier project --project ./sample/atelier.project.json
@@ -146,6 +146,20 @@ best-effort publication.
146
146
  Because the checks are local and versioned with the work, the repository can
147
147
  prove its state in CI, on a laptop, or inside a larger toolchain.
148
148
 
149
+ Repositories that may contribute to a public or shared surface can add a
150
+ private, ignored disclosure denylist and scan either the tracked tree or the
151
+ exact staged index:
152
+
153
+ ```bash
154
+ npx mnstry-atelier disclosure check --staged
155
+ ```
156
+
157
+ The built-in structural pass catches machine-local paths, key material, and
158
+ secret-shaped assignments. A client-aware verdict additionally requires the
159
+ private denylist; the command fails closed when it is absent unless
160
+ `--structural-only` is chosen explicitly. Denylist patterns and matched text
161
+ never belong in the shared repository.
162
+
149
163
  ### 3. Collaboration becomes governed disclosure
150
164
 
151
165
  Collaboration is not equivalent to giving every participant every file. The
@@ -163,11 +177,22 @@ boundary; it does not silently make access decisions on your behalf.
163
177
  graph. The library exposes the same project, graph, validation, and projection
164
178
  primitives to code.
165
179
 
180
+ Consumer-owned authoring or review services that need a separate durable
181
+ lifecycle follow [the managed local-service contract](./docs/local-services.md).
182
+ That contract standardizes process ownership, private local state, and browser
183
+ recovery without putting a tenant's service details into Atelier.
184
+
166
185
  The shipped agent model is intentionally bounded: the Atelier can assemble
167
186
  session context, capability envelopes, and proposed changes, but it does not
168
187
  apply those proposals or grant direct write access. It is a local context and
169
188
  control layer that another interface can build on, not an autonomous editor.
170
189
 
190
+ The separate headless repository supervisor can observe one explicitly
191
+ enrolled Git repository, fetch and fast-forward it, and prepare a bounded
192
+ commit plan. A commit still requires an exact user confirmation and an
193
+ unchanged re-observation; the loopback browser receives no apply endpoint.
194
+ See [Atelier Sync: Deliverable Zero](docs/atelier-sync.md).
195
+
171
196
  ### 5. The repository can power another product
172
197
 
173
198
  The CLI is one interface. The package is also a library, and its contracts are
@@ -232,18 +257,29 @@ trust boundary.
232
257
  This package makes three promises. None of them asks for your trust — each
233
258
  one names the command that proves it.
234
259
 
235
- **Nothing leaves your machine, with one exception you can see.** There is no
236
- telemetry, no update check, no crash reporting, and no send path anywhere in
237
- the package. The exception: when no actor is configured, `boundary check` and
238
- `doctor` fall back to the `gh` CLI to resolve your GitHub login, which is an
239
- authenticated request to GitHub made with your own credentials. Set
240
- `MNSTRY_ATELIER_ACTOR` and that path is never taken. The only network client
241
- refuses non-loopback URLs, the served pages carry a policy that authorizes no
242
- external origin, and a fail-closed gate scans the executable and markup files
243
- under `src/`, `bin/`, `scripts/`, and `examples/` for egress primitives. Two
244
- limits worth stating plainly: the gate does not read the `.json` and `.md`
245
- files under `templates/` and `skills/`, and it does not model
246
- `child_process`, which is why the `gh` fallback above does not trip it:
260
+ **There is no silent egress; every network path is named.** There is no
261
+ telemetry, update check, crash reporting, managed-runtime upload, or model
262
+ provider path in the package. The exceptions are explicit: `boundary check`
263
+ may invoke `gh api user` after no declared actor matches an explicit `--actor`,
264
+ `MNSTRY_ATELIER_ACTOR`, `GITHUB_ACTOR`, or a configured Git email; repository
265
+ identity checks may invoke `gh api repos/...` to resolve a canonical GitHub
266
+ identity. Those authenticated requests use your own `gh` credentials. A
267
+ recognized explicit actor prevents the boundary actor fallback; recorded
268
+ repository identities let identity checks keep working when the provider is
269
+ unavailable. Explicitly enrolled Atelier Sync may also run bounded Git fetches
270
+ for observation/reconciliation and one non-force push only when the exact
271
+ reviewed commit plan requested and confirmed it, no earlier local commit is
272
+ waiting to be published, and HEAD still names the verified commit object. Sync
273
+ never uses the network actor fallback, follows tags, or recursively publishes
274
+ submodule refs. The package's HTTP client
275
+ refuses non-loopback URLs, the served pages authorize no external origin, and
276
+ release audit scans every executable or markup file in the exact `npm pack`
277
+ inventory for egress primitives. The standalone gate also scans executable and
278
+ markup files under `src/`, `bin/`, `scripts/`, `templates/`, `examples/`, and
279
+ `skills/`. Two limits worth stating plainly: the egress control does not
280
+ interpret data-only `.json` or `.md` files, and it does not model
281
+ `child_process`; the reviewed `gh` and enrolled Git paths above are documented
282
+ subprocess exceptions rather than scanner detections:
247
283
 
248
284
  ```bash
249
285
  npm run egress:check
@@ -280,9 +316,15 @@ receive.
280
316
 
281
317
  <!-- atelier:block:will-not-do:start -->
282
318
  - It does not write to a MNSTRY runtime database.
283
- - It does not import, provision, publish, or send anything.
284
- - Except for the documented `gh` actor-resolution fallback, it initiates no
285
- external network requests.
319
+ - It does not import, provision, publish, or send project content to a MNSTRY
320
+ managed runtime.
321
+ - Conformance remains offline. Network access is limited to the documented
322
+ `gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
323
+ operations: bounded fetch for observation/reconciliation, and non-force push
324
+ only when the exact reviewed commit plan requested and confirmed it, no
325
+ earlier local commit remains unpublished, and HEAD still names the verified
326
+ commit object; Sync does not use network actor fallback, follow tags, or
327
+ recursively publish submodule refs.
286
328
  - It does not execute model-assisted analysis or any model provider.
287
329
  - It does not include client project content.
288
330
 
@@ -316,7 +358,7 @@ Node.js `>=22.18.0 <23` is required. Pin the prerelease while the package
316
358
  remains in alpha:
317
359
 
318
360
  ```bash
319
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.4
361
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.6
320
362
  ```
321
363
 
322
364
  Then choose the path that matches what you are building:
@@ -328,11 +370,12 @@ Then choose the path that matches what you are building:
328
370
  - [Distribution contracts](./docs/distributions.md)
329
371
  - [Conformance and attestation](./docs/attestation.md)
330
372
  - [Continuity commitments](./docs/continuity.md)
373
+ - [Assurance controls and evidence map](./docs/assurance-controls.md)
331
374
  - [Upgrade notes](./docs/upgrade.md)
332
375
 
333
376
  ## Status and command reference
334
377
 
335
- Current package: `@mnstry/atelier@0.2.0-alpha.4`.
378
+ Current package: `@mnstry/atelier@0.2.0-alpha.6`.
336
379
 
337
380
  The alpha package is usable and contract-tested, but its library API may still
338
381
  change before a stable release. Pin the exact version in production toolchains.
@@ -0,0 +1,163 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-repository-observation.v1.schema.json",
4
+ "$comment": "contract revision 1.0.0 (contract-stability epoch)",
5
+ "title": "atelier-repository-observation@v1",
6
+ "description": "Full-state evidence for one explicitly enrolled local Git repository. A complete observation cannot conceal a partial clone, sparse checkout, missing submodule or LFS content, custom filter, or unsupported filesystem root.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": [
10
+ "schema",
11
+ "observedAt",
12
+ "complete",
13
+ "root",
14
+ "filesystem",
15
+ "blockers",
16
+ "warnings"
17
+ ],
18
+ "properties": {
19
+ "schema": {
20
+ "const": "atelier-repository-observation@v1"
21
+ },
22
+ "contractVersion": {
23
+ "type": "string",
24
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
25
+ },
26
+ "observedAt": {
27
+ "type": "string",
28
+ "format": "date-time"
29
+ },
30
+ "complete": {
31
+ "type": "boolean"
32
+ },
33
+ "root": {
34
+ "type": ["string", "null"]
35
+ },
36
+ "filesystem": {
37
+ "type": "object"
38
+ },
39
+ "git": {
40
+ "type": "object"
41
+ },
42
+ "bare": {
43
+ "type": "boolean"
44
+ },
45
+ "branch": {
46
+ "type": "object"
47
+ },
48
+ "remotes": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object"
52
+ }
53
+ },
54
+ "features": {
55
+ "type": "object"
56
+ },
57
+ "submodules": {
58
+ "type": "object"
59
+ },
60
+ "lfs": {
61
+ "type": "object"
62
+ },
63
+ "status": {
64
+ "type": "object"
65
+ },
66
+ "blockers": {
67
+ "type": "array",
68
+ "items": {
69
+ "$ref": "#/$defs/finding"
70
+ }
71
+ },
72
+ "warnings": {
73
+ "type": "array",
74
+ "items": {
75
+ "$ref": "#/$defs/finding"
76
+ }
77
+ },
78
+ "ext": {
79
+ "type": "object",
80
+ "description": "Reserved extension container. Producers MAY add namespaced members; consumers MUST ignore members they do not recognize."
81
+ }
82
+ },
83
+ "allOf": [
84
+ {
85
+ "if": {
86
+ "properties": {
87
+ "complete": {
88
+ "const": true
89
+ }
90
+ },
91
+ "required": ["complete"]
92
+ },
93
+ "then": {
94
+ "required": ["git", "bare", "branch", "remotes", "features", "submodules", "lfs", "status"],
95
+ "properties": {
96
+ "filesystem": {
97
+ "required": ["supported"],
98
+ "properties": {
99
+ "supported": { "const": true }
100
+ }
101
+ },
102
+ "git": {
103
+ "required": ["executable", "version", "supported", "minimum"],
104
+ "properties": {
105
+ "supported": { "const": true }
106
+ }
107
+ },
108
+ "bare": { "const": false },
109
+ "features": {
110
+ "required": ["sparseCheckout", "partialClone", "customFilters"],
111
+ "properties": {
112
+ "sparseCheckout": { "const": false },
113
+ "partialClone": { "type": "array", "maxItems": 0 },
114
+ "customFilters": { "type": "array", "maxItems": 0 }
115
+ }
116
+ },
117
+ "submodules": {
118
+ "required": ["complete"],
119
+ "properties": {
120
+ "complete": { "const": true }
121
+ }
122
+ },
123
+ "lfs": {
124
+ "required": ["complete"],
125
+ "properties": {
126
+ "complete": { "const": true }
127
+ }
128
+ },
129
+ "status": {
130
+ "required": ["clean", "digest", "entries", "fingerprints", "stagedCount", "unstagedCount", "conflictCount"]
131
+ },
132
+ "blockers": {
133
+ "maxItems": 0
134
+ }
135
+ }
136
+ }
137
+ }
138
+ ],
139
+ "$defs": {
140
+ "finding": {
141
+ "type": "object",
142
+ "additionalProperties": false,
143
+ "required": ["code", "message", "details"],
144
+ "properties": {
145
+ "code": {
146
+ "type": "string",
147
+ "minLength": 1
148
+ },
149
+ "message": {
150
+ "type": "string",
151
+ "minLength": 1
152
+ },
153
+ "details": {
154
+ "type": "object"
155
+ },
156
+ "ext": {
157
+ "type": "object",
158
+ "description": "Reserved extension container. Producers MAY add namespaced members; consumers MUST ignore members they do not recognize."
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "schema": "mnstry.atelier-public-api-baseline@v1",
3
+ "baselineTag": "v0.2.0-alpha.4",
4
+ "baselineCommit": "6fed5b9e1077b361e26b2b581ea67a55e7634963",
5
+ "baselineVersion": "0.2.0-alpha.4",
6
+ "publishedRegistryArtifact": {
7
+ "package": "@mnstry/atelier",
8
+ "version": "0.2.0-alpha.4",
9
+ "shasum": "9f67f5b7fabc748ec235bbe85587a71b5ad639c8",
10
+ "integrity": "sha512-mt2vWnFZtBAc8C+bzjcgrIPYRGgVOhFHm4SPDrnXvWgcdDY/G2aUY5KP6YPmjkRCMvewGMsH7Wg+8i63f1/onQ==",
11
+ "sha256": "a032971977d9fbd3b7adc94f204739d4202b1754d72a77cbc79f4c473850e531",
12
+ "entryCount": 265,
13
+ "verifiedAt": "2026-08-25"
14
+ },
15
+ "requiredSubpaths": [
16
+ ".",
17
+ "./cli",
18
+ "./project",
19
+ "./graph",
20
+ "./projection",
21
+ "./readiness",
22
+ "./readiness-protocols",
23
+ "./server",
24
+ "./harness",
25
+ "./support",
26
+ "./egress",
27
+ "./boundary",
28
+ "./upgrade",
29
+ "./attestation",
30
+ "./extension-packs",
31
+ "./analysis/adapter",
32
+ "./export-contract",
33
+ "./dry-run",
34
+ "./contracts/atelier-export.v1.schema.json",
35
+ "./fixtures/atelier-export/sample-studio-offer.v1.json"
36
+ ],
37
+ "requiredModuleExports": {
38
+ ".": ["ALLOWED_RUNTIME_TARGETS", "ATELIER_LOCK_SCHEMA", "ATELIER_MIGRATION_SCHEMA", "ATELIER_READINESS_SCHEMA", "BASE_MIGRATIONS", "BOUNDARY_POLICY_SCHEMA", "LOCAL_AUDIENCES", "MNSTRY_READINESS_PACK_SCHEMA", "OBJECT_CLASSES", "PROJECT_CONFIG_SCHEMA", "READINESS_PROTOCOL_IDS", "READINESS_PROTOCOL_SLUGS", "RUNTIME_OWNERS", "RUNTIME_VISIBILITIES", "analysisAdapterDryRun", "applyUpgrade", "buildAtelierLock", "buildGraph", "buildProjectProjection", "buildReadiness", "buildSupportBundlePreview", "bundledMnstryReadinessPackV1", "bundledReadinessPack", "bundledReadinessProtocols", "checkAtelierLock", "checkBoundaryPolicy", "checkForbiddenEgress", "contextEnvelope", "createAtelierSidecarServer", "createPromoteEvent", "getBundledReadinessProtocol", "installBoundaryHooks", "loadAtelierLock", "loadBoundaryPolicy", "planUpgrade", "protocolById", "resolveProjectConfig", "validateAtelierExportContract", "validateAtelierExportDryRun", "validateAtelierExportDryRunFile", "validateBoundaryPolicy", "validateJsonSchema", "validateMigrationRecord", "validateProjectConfigDoc", "validateSchemaShape", "validateSupportBundlePayload", "writeAtelierLock"],
39
+ "./cli": ["DEFAULT_BRAND", "buildCommandHelpText", "buildHelpText", "buildVersionText", "commandMap", "runCli"],
40
+ "./project": ["EXTERNAL_REPO_KIND", "LOCAL_OVERLAY_ENV", "LOCAL_OVERLAY_FILES", "LOCAL_OVERLAY_SCHEMA", "LOCAL_STATE_DIR", "PROJECT_CONFIG_ARG_PREFIX", "PROJECT_CONFIG_ENV", "PROJECT_CONFIG_SCHEMA", "SUPPORTED_IDENTITY_PROVIDERS", "asObject", "commandProject", "ensureLocalState", "firstString", "gitRemoteUrl", "isExternalRepo", "loadRepoAccess", "localOverlayCandidatePaths", "localStateRoot", "parseArgs", "parseRepoPathOverrides", "projectConfigArg", "readJson", "readLocalOverlay", "readProjectConfig", "remoteHost", "resolvePathValue", "resolveProjectConfig", "stripProjectConfigArgs", "validateProjectConfigDoc", "writeJson"],
41
+ "./graph": ["VALID_AUDIENCES", "VALID_RELATIONS", "buildGraph", "ignoredSidecarWarnings", "parseFrontmatterYaml", "runGraphCommand"],
42
+ "./projection": ["buildProjectProjection", "runProjectCommand"],
43
+ "./readiness": ["ATELIER_READINESS_SCHEMA", "buildReadiness", "runReadinessCommand", "stableReadinessForCheck", "summarizeGraph", "summarizeProjection"],
44
+ "./readiness-protocols": ["MNSTRY_READINESS_PACK_SCHEMA", "READINESS_PROTOCOL_IDS", "READINESS_PROTOCOL_SCHEMA", "READINESS_PROTOCOL_SLUGS", "READINESS_RUN_SCHEMA", "bundledMnstryReadinessPackV1", "bundledReadinessPack", "bundledReadinessProtocols", "getBundledReadinessProtocol", "protocolById"],
45
+ "./server": ["ATELIER_CAPABILITIES_SCHEMA", "ATELIER_CONTEXT_SCHEMA", "ATELIER_DOCTOR_SCHEMA", "ATELIER_PRESENCE_SCHEMA", "ATELIER_RESOLVE_SCHEMA", "ATELIER_SESSION_AUTH_SCHEMA", "createAtelierSidecarServer"],
46
+ "./harness": ["contextEnvelope", "runContextCommand"],
47
+ "./support": ["BANNED_KEY_PATTERNS", "BANNED_VALUE_PATTERNS", "DEFAULT_SUPPORT_FIELDS", "SUPPORT_BUNDLE_PREVIEW_SCHEMA", "buildSupportBundlePreview", "parseSupportBundleArgs", "readSupportBundleJson", "runSupportCommand", "supportBundlePreview", "validateSupportBundlePayload", "writeOrPrintSupportBundle"],
48
+ "./egress": ["DEFAULT_EGRESS_SCAN_PATHS", "LOCAL_COMPUTED_ALLOW_MARKER", "TEST_FIXTURE_ALLOW_MARKER", "checkForbiddenEgress", "discoverForbiddenEgressScanFiles", "forbiddenEgressFindingsForText"],
49
+ "./boundary": ["BOUNDARY_POLICY_SCHEMA", "DEFAULT_FORBIDDEN_PATHS", "LEGACY_PROMOTE_EVENT_SCHEMAS", "PRIVATE_AUDIENCES", "PROMOTE_EVENT_SCHEMA", "SEMANTIC_INITIALIZATION_DEFAULTS", "VALID_AUDIENCES", "VALID_AUTOCOMMIT", "VALID_BOUNDARY_MODES", "VALID_REPO_KINDS", "auditContentRules", "checkBoundaryPolicy", "checkPushContent", "createPromoteEvent", "diffFileSections", "installBoundaryHooks", "loadBoundaryPolicy", "projectBoundaryPolicyPath", "projectGovernanceLedgerPath", "resolveCurrentActor", "runBoundaryAuditCommand", "runBoundaryCheckCommand", "runBoundaryInstallHooksCommand", "runBoundaryPushCheckCommand", "runPromoteCommand", "semanticChangesInFile", "semanticFieldOnLine", "stagedPathsForProject", "validateBoundaryPolicy"],
50
+ "./upgrade": ["ATELIER_LOCK_SCHEMA", "ATELIER_MIGRATION_SCHEMA", "BASE_MIGRATIONS", "LOCK_FILE", "MIGRATION_CLASSES", "applyMigration", "applyUpgrade", "buildAtelierLock", "checkAtelierLock", "loadAtelierLock", "lockPathForProject", "planUpgrade", "runLockCommand", "runUpgradeCommand", "validateMigrationRecord", "writeAtelierLock"],
51
+ "./attestation": ["KEY_ENV_VAR", "LOCAL_KEY_FILE", "canonicalize", "generateKeyPair", "loadSigningKey", "payloadHashOf", "safeLabel", "signAttestation", "signDocument", "signingInput", "verifyAttestation", "verifyDocument", "verifyPayloadBinding"],
52
+ "./extension-packs": ["ATELIER_EXT_NAMESPACE", "EXTENSION_PACK_SCHEMA", "PROTOCOL_POSTURE_POINTS", "RESERVED_NAMESPACE", "RESERVED_NAMESPACE_PATTERN", "computePackDigest", "createProtocolRegistry", "loadExtensionPacks"],
53
+ "./analysis/adapter": ["analysisAdapterDryRun", "runAnalysisAdapterCommand"],
54
+ "./export-contract": ["ALLOWED_RUNTIME_TARGETS", "LOCAL_AUDIENCES", "OBJECT_CLASSES", "RUNTIME_OWNERS", "RUNTIME_VISIBILITIES", "validateAtelierExportContract", "validateJsonSchema", "validateSchemaShape"],
55
+ "./dry-run": ["main", "validateAtelierExportDryRun", "validateAtelierExportDryRunFile"]
56
+ }
57
+ }
@@ -0,0 +1,41 @@
1
+ # Assurance controls and evidence map
2
+
3
+ This ledger maps public trust claims to the control that enforces them, the
4
+ test that challenges the control, and the limit that remains. It describes the
5
+ source tree; a release decision must additionally record the exact candidate
6
+ commit and packed-tarball digest.
7
+
8
+ | Claim | Enforcing control | Defensive evidence | Stated limit |
9
+ | --- | --- | --- | --- |
10
+ | Boundary rules cannot silently switch themselves off | `src/boundary/policy.mjs`, `src/boundary/content-rules.mjs`, and generated Git hooks | `boundary:test`; boundary case in `assurance:mutation-smoke` | Repository access remains the source read boundary; an audience label is not encryption |
11
+ | A clean boundary verdict uses complete evidence | Typed Git reads with diff and binary budgets; incomplete reads become blocking diagnostics; Sync requires the enrolled root to be scanned, uses its digest-bound Git for actor and staged evidence, and disables network actor fallback | `test/boundary-content-rules.test.mjs`; Sync boundary-scope, pinned-Git, and no-network actor refusal cases | Budgets intentionally refuse evidence too large to inspect rather than claiming it is clean |
12
+ | Graph classification has one meaning | `src/graph/knowledge-graph.mjs` is canonical; `src/graph/graph.mjs` adapts its result | `graph:test`; graph case in `assurance:mutation-smoke` | Unclassified Markdown is retained as private diagnostic material, not admitted as governed content |
13
+ | The package has no undisclosed runtime egress path | Canonical forbidden-egress scanner plus exact packed-file inventory in `release:audit`; Atelier Sync confines network Git to bounded fetch and an exact-plan, non-force push | egress tests, marker-inventory test, runtime fetch/push refusal tests, and egress case in `assurance:mutation-smoke` | Data-only files are not interpreted; reviewed `gh` actor resolution and explicitly enrolled Git fetch/push are documented subprocess exceptions |
14
+ | User-confirmed repository writes match what was reviewed | Content-bound, expiring plan identifiers; fresh complete observations; exact staged and written-tree blob/mode manifests; post-hook tree, single-parent, and message verification with compare-and-swap rollback; refusal of prior unpublished commits; and an exact verified-object push after HEAD/target revalidation with tag following and recursive submodule publication disabled | `sync:test` plan, expiry, hook/index, late-HEAD, ahead-branch, remote-ref, remote-drift, and evidence-failure cases | Ordinary Git hooks may run, but a hook cannot substitute a different commit object for publication |
15
+ | Resident Sync state cannot escape or grow without bound | Contained private directories, no-follow/identity-checked leaves, a 4,096-entry observation ceiling, bounded state projection, nonce-bound locks with aged abandoned-claim recovery, lock-directory identity validation and an ambiguous live-PID maximum age, consumed plans under age/file/byte ceilings, and corruption-recovering hash-chained traces with per-event/resident ceilings | `sync:test` observation/state ceilings, redirected-state/lock, plan lifecycle, concurrent enrollment/recovery, corruption, and trace ceilings | Machine-local state is diagnostic convenience; Git and readable repository files remain authoritative |
16
+ | Local review serves only generated publication output | Loopback-only bind, required `atelier.manifest.json`, realpath containment, enrolled safe types, POSIX no-follow plus cross-platform leaf type/identity validation for local state, and host/fetch-site/origin/method/nonce checks | `server:security:test`; sidecar case in `assurance:mutation-smoke` | The sidecar is a local review tool, not user authentication or runtime authorization |
17
+ | Collaboration cannot become a hidden apply path | Proposal authority is capability-derived; records are typed; POSIX ledger and snapshot leaves are no-follow, while every platform rejects redirected leaves and validates opened file identity when available; ledger reads are bounded, one-pass for lists, and corrupt tails fail closed | `collaboration:test` and ledger ceiling/performance tests | Collaboration remains copy-only proposal metadata; snapshots are rebuildable projections and Git review owns source changes |
18
+ | Expected operator failures are actionable without leaking internals | Typed project/JSON diagnostics and the CLI execution wrapper | `test/cli-brand.test.mjs` | Unexpected stacks require the operator to opt in with `ATELIER_DEBUG=1` |
19
+ | Published APIs do not disappear silently | Tag-derived subpath and named-export baseline plus version/tag identity refusal | `public-api:compat`; `test/public-api-compat.test.mjs` | Additive API checks do not decide whether a new version number is appropriate |
20
+ | The published artifact is the artifact tested | `release:candidate` packs once, binds SHA-256, sends that exact archive through allowlist/content audit, bare-consumer install, all-export import, and branded distribution smoke, then the trusted-publishing workflow retains and publishes that same tarball path | `release:audit`, `consumer:smoke`, `distribution:smoke`, `assurance:mutation-smoke`, `publish-workflow.test.mjs` | Passing gates does not publish, deploy, or constitute an external reviewer’s approval |
21
+
22
+ The release-blocking command is `npm run prepublishOnly`. It includes positive
23
+ regression suites and deliberately broken local fixtures. The latter prove
24
+ that boundary, graph, egress, sidecar, and distribution controls still refuse
25
+ their named failure modes; they do not exercise a live abuse path.
26
+
27
+ ## Exact-candidate evidence
28
+
29
+ At candidate cut, retain all of the following together:
30
+
31
+ 1. the Git commit SHA and a clean working-tree check;
32
+ 2. the `npm pack --json` inventory and tarball SHA-256;
33
+ 3. outputs from syntax, contracts, public-API compatibility, migrations, repository disclosure,
34
+ release audit, full tests, mutation smoke, bare consumer, and distribution
35
+ smoke;
36
+ 4. a defensive review tied to that same commit and digest; and
37
+ 5. explicit human decisions for versioning, publication, deployment, or any
38
+ external communication.
39
+
40
+ Evidence for a different commit or a dirty tree is not evidence for the
41
+ candidate.
@@ -14,6 +14,8 @@ The package owns reusable mechanics:
14
14
  - proposal-only collaboration metadata;
15
15
  - support-bundle dry runs with no send path;
16
16
  - export dry-run validation for `atelier-export@v1`.
17
+ - explicit single-repository enrollment and full-state Git observation;
18
+ - fast-forward-only reconciliation and two-phase user-confirmed commits.
17
19
 
18
20
  Project adapters own project facts: repo roster, source roots, read-boundary
19
21
  config, extension packs, brand language, and generated project outputs.
@@ -28,7 +30,31 @@ runtime authority.
28
30
 
29
31
  ## Safety Posture
30
32
 
31
- The default package posture is no telemetry, no external network egress, no
32
- runtime mutation, no browser apply endpoint, and no model-assisted analysis execution.
33
+ The default package posture is no telemetry, no MNSTRY runtime mutation, no
34
+ browser apply endpoint, and no model-assisted analysis execution. Conformance
35
+ is offline. The only documented subprocess network paths are the bounded `gh`
36
+ actor-resolution fallback and explicitly enrolled Atelier Sync Git fetch and
37
+ user-confirmed non-force push operations.
33
38
  Provider analysis output may only enter as proposed `atelier-claim@v1` records
34
39
  until explicitly reviewed by the project owner.
40
+
41
+ `atelier dev` is narrower than a general static server. It refuses non-loopback
42
+ bind hosts, requires a generated `atelier.manifest.json`, and publishes only
43
+ manifest-enrolled HTML, script, style, and image files that remain inside the
44
+ workspace after realpath resolution. Hidden paths, local state, secret-shaped
45
+ names, symlinks, unknown file types, and unenrolled files are unavailable.
46
+ Reads validate the loopback host and fetch metadata; mutations additionally
47
+ require an allowed method, exact same origin, and the session nonce.
48
+
49
+ Collaboration endpoints are copy-only: they create or review proposal records;
50
+ they do not apply source changes. Authority is derived from declared
51
+ capabilities and apply endpoints, never inferred from action-like prose. A
52
+ partially corrupt ledger returns typed incomplete evidence and blocks a clean
53
+ claim. Ledger reads and records are bounded, appends are locked, and retention
54
+ changes happen only through explicit compaction.
55
+
56
+ The local Git supervisor is a separate mechanical authority surface. It may
57
+ create a repository commit only from an unchanged, bounded plan after the user
58
+ repeats its exact operation id. That repository write is not a MNSTRY runtime
59
+ mutation and does not grant proposal apply authority to the browser sidecar.
60
+ See [Atelier Sync: Deliverable Zero](./atelier-sync.md).