@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.
- package/CHANGELOG.md +77 -0
- package/README.md +61 -18
- package/contracts/atelier-repository-observation.v1.schema.json +163 -0
- package/contracts/public-api-baseline.json +57 -0
- package/docs/assurance-controls.md +41 -0
- package/docs/atelier-runtime.md +28 -2
- package/docs/atelier-sync.md +171 -0
- package/docs/blocks/claims.md +23 -12
- package/docs/blocks/will-not-do.md +9 -3
- package/docs/design.md +12 -6
- package/docs/install.md +26 -4
- package/docs/knowledge-graph.md +8 -4
- package/docs/local-services.md +101 -0
- package/docs/release-engineering.md +86 -12
- package/docs/repo-boundary-guard.md +12 -2
- package/docs/upgrade.md +40 -2
- package/fixtures/atelier-repository-observation/invalid/complete-with-blocker.v1.json +18 -0
- package/fixtures/atelier-repository-observation/valid/complete-local.v1.json +48 -0
- package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
- package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
- package/package.json +16 -5
- package/skills/claude/atelier-local-service/SKILL.md +47 -0
- package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
- package/skills/codex/atelier-local-service/SKILL.md +47 -0
- package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
- package/src/boundary/content-rules.mjs +283 -20
- package/src/boundary/policy.mjs +162 -72
- package/src/cli/execute-command.mjs +36 -0
- package/src/cli/run.mjs +35 -7
- package/src/collaboration/event-ledger.mjs +365 -0
- package/src/collaboration/index.mjs +17 -0
- package/src/collaboration/proposals.mjs +265 -65
- package/src/commands/attestation.mjs +20 -6
- package/src/commands/disclosure.mjs +133 -0
- package/src/commands/distribution.mjs +2 -1
- package/src/commands/extension-pack.mjs +2 -1
- package/src/commands/init.mjs +2 -1
- package/src/commands/server.mjs +1 -4
- package/src/commands/sync.mjs +100 -0
- package/src/contracts/corpus.mjs +6 -0
- package/src/disclosure/content-scan.mjs +193 -0
- package/src/egress/check.mjs +7 -38
- package/src/egress/forbidden-egress.mjs +32 -18
- package/src/graph/graph.mjs +112 -314
- package/src/graph/knowledge-graph.mjs +94 -18
- package/src/harness/context-client.mjs +9 -1
- package/src/index.mjs +41 -0
- package/src/project/config.mjs +89 -28
- package/src/project/file-class.mjs +14 -0
- package/src/project/package-root.mjs +10 -0
- package/src/project/path-match.mjs +38 -15
- package/src/project/private-state.mjs +110 -0
- package/src/runtime/git-adapter.mjs +189 -0
- package/src/runtime/local-state.mjs +439 -0
- package/src/runtime/repository-observation.mjs +491 -0
- package/src/runtime/supervisor.mjs +788 -0
- package/src/server/local-sidecar.mjs +81 -59
- package/src/server/security.mjs +89 -4
- package/src/server/server.mjs +3 -2
- package/src/support/feedback-report.mjs +4 -3
- 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.
|
|
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
|
-
**
|
|
236
|
-
telemetry,
|
|
237
|
-
the package. The
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
|
284
|
-
|
|
285
|
-
|
|
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.
|
|
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.
|
|
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.
|
package/docs/atelier-runtime.md
CHANGED
|
@@ -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
|
|
32
|
-
|
|
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).
|