@mnstry/atelier 0.2.0-alpha.5 → 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 +15 -0
- package/README.md +36 -19
- package/contracts/atelier-repository-observation.v1.schema.json +163 -0
- package/docs/assurance-controls.md +4 -2
- package/docs/atelier-runtime.md +13 -2
- package/docs/atelier-sync.md +171 -0
- package/docs/blocks/claims.md +18 -13
- package/docs/blocks/will-not-do.md +9 -3
- package/docs/install.md +3 -3
- package/docs/release-engineering.md +11 -2
- package/docs/upgrade.md +17 -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/package.json +5 -1
- package/src/boundary/content-rules.mjs +9 -4
- package/src/boundary/policy.mjs +23 -23
- package/src/cli/run.mjs +18 -0
- package/src/commands/sync.mjs +100 -0
- package/src/contracts/corpus.mjs +6 -0
- package/src/index.mjs +29 -0
- package/src/project/config.mjs +27 -25
- 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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
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
|
+
|
|
3
18
|
## 0.2.0-alpha.5
|
|
4
19
|
|
|
5
20
|
- Harden boundary enforcement so path globs use segment-aware matching, an
|
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
|
|
@@ -187,6 +187,12 @@ session context, capability envelopes, and proposed changes, but it does not
|
|
|
187
187
|
apply those proposals or grant direct write access. It is a local context and
|
|
188
188
|
control layer that another interface can build on, not an autonomous editor.
|
|
189
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
|
+
|
|
190
196
|
### 5. The repository can power another product
|
|
191
197
|
|
|
192
198
|
The CLI is one interface. The package is also a library, and its contracts are
|
|
@@ -251,24 +257,29 @@ trust boundary.
|
|
|
251
257
|
This package makes three promises. None of them asks for your trust — each
|
|
252
258
|
one names the command that proves it.
|
|
253
259
|
|
|
254
|
-
**
|
|
255
|
-
telemetry,
|
|
256
|
-
the package. The exceptions are explicit: `boundary check`
|
|
257
|
-
user` after no declared actor matches an explicit `--actor`,
|
|
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`,
|
|
258
264
|
`MNSTRY_ATELIER_ACTOR`, `GITHUB_ACTOR`, or a configured Git email; repository
|
|
259
265
|
identity checks may invoke `gh api repos/...` to resolve a canonical GitHub
|
|
260
266
|
identity. Those authenticated requests use your own `gh` credentials. A
|
|
261
267
|
recognized explicit actor prevents the boundary actor fallback; recorded
|
|
262
268
|
repository identities let identity checks keep working when the provider is
|
|
263
|
-
unavailable.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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:
|
|
272
283
|
|
|
273
284
|
```bash
|
|
274
285
|
npm run egress:check
|
|
@@ -305,9 +316,15 @@ receive.
|
|
|
305
316
|
|
|
306
317
|
<!-- atelier:block:will-not-do:start -->
|
|
307
318
|
- It does not write to a MNSTRY runtime database.
|
|
308
|
-
- It does not import, provision, publish, or send
|
|
309
|
-
|
|
310
|
-
|
|
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.
|
|
311
328
|
- It does not execute model-assisted analysis or any model provider.
|
|
312
329
|
- It does not include client project content.
|
|
313
330
|
|
|
@@ -341,7 +358,7 @@ Node.js `>=22.18.0 <23` is required. Pin the prerelease while the package
|
|
|
341
358
|
remains in alpha:
|
|
342
359
|
|
|
343
360
|
```bash
|
|
344
|
-
npm install --save-dev @mnstry/atelier@0.2.0-alpha.
|
|
361
|
+
npm install --save-dev @mnstry/atelier@0.2.0-alpha.6
|
|
345
362
|
```
|
|
346
363
|
|
|
347
364
|
Then choose the path that matches what you are building:
|
|
@@ -358,7 +375,7 @@ Then choose the path that matches what you are building:
|
|
|
358
375
|
|
|
359
376
|
## Status and command reference
|
|
360
377
|
|
|
361
|
-
Current package: `@mnstry/atelier@0.2.0-alpha.
|
|
378
|
+
Current package: `@mnstry/atelier@0.2.0-alpha.6`.
|
|
362
379
|
|
|
363
380
|
The alpha package is usable and contract-tested, but its library API may still
|
|
364
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
|
+
}
|
|
@@ -8,9 +8,11 @@ commit and packed-tarball digest.
|
|
|
8
8
|
| Claim | Enforcing control | Defensive evidence | Stated limit |
|
|
9
9
|
| --- | --- | --- | --- |
|
|
10
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 | `test/boundary-content-rules.test.mjs
|
|
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
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
|
|
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 |
|
|
14
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 |
|
|
15
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 |
|
|
16
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` |
|
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,8 +30,11 @@ 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.
|
|
35
40
|
|
|
@@ -47,3 +52,9 @@ capabilities and apply endpoints, never inferred from action-like prose. A
|
|
|
47
52
|
partially corrupt ledger returns typed incomplete evidence and blocks a clean
|
|
48
53
|
claim. Ledger reads and records are bounded, appends are locked, and retention
|
|
49
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).
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Atelier Sync: Deliverable Zero
|
|
2
|
+
|
|
3
|
+
Atelier Sync is the collaborator-facing name for the resident repository
|
|
4
|
+
supervisor. Deliverable Zero is deliberately headless: it proves the Git,
|
|
5
|
+
filesystem, state-machine, recovery, and user-authority boundaries before a
|
|
6
|
+
tray shell or installer is allowed to make the product feel finished.
|
|
7
|
+
|
|
8
|
+
This is repository mechanics, not MNSTRY runtime authority. A Git commit
|
|
9
|
+
changes the enrolled repository. It does not mutate MNSTRY identity, consent,
|
|
10
|
+
visibility, provisioning, commerce, sessions, audit, or any other managed
|
|
11
|
+
runtime object.
|
|
12
|
+
|
|
13
|
+
## Authority contract
|
|
14
|
+
|
|
15
|
+
- Enrollment names exactly one repository. Atelier never scans a home folder.
|
|
16
|
+
- One resolved absolute system Git executable, version, and executable digest
|
|
17
|
+
owns Git semantics for the enrollment. Every inherited `GIT_*` variable is
|
|
18
|
+
stripped from supervised Git calls before Atelier adds its small fixed
|
|
19
|
+
safety environment. Custom SSH transport belongs in the user's SSH config;
|
|
20
|
+
credentials continue through ordinary Git credential helpers. Git `2.40.0`
|
|
21
|
+
or newer is required so global and system attribute provenance is observable.
|
|
22
|
+
- Every cycle observes the full repository. There is no watcher correctness
|
|
23
|
+
dependency in Deliverable Zero.
|
|
24
|
+
- Fetch and fast-forward-only reconciliation are mechanical operations.
|
|
25
|
+
- Commit creation is a two-phase, user-confirmed operation. Planning records
|
|
26
|
+
the head, branch, complete status digest, exact file paths, commit message,
|
|
27
|
+
reviewed blob/mode manifest, diff summary, and exact optional upstream push
|
|
28
|
+
identity. The push identity digest covers the single resolved, normalized,
|
|
29
|
+
credential-free execution destination; persisted display evidence likewise
|
|
30
|
+
strips authentication material, query strings, and fragments. Multiple push
|
|
31
|
+
URLs and `url.*.insteadOf`/`pushInsteadOf` rewrites are refused as ambiguous.
|
|
32
|
+
Every authoritative field is bound into the operation id.
|
|
33
|
+
Execution requires that exact id and refuses if the plan, repository,
|
|
34
|
+
staged bytes/modes, written tree, commit parent/message, or publish target
|
|
35
|
+
changed. A publish plan is refused while any earlier local commit remains
|
|
36
|
+
unpublished, and publication names the exact verified commit object rather
|
|
37
|
+
than a movable `HEAD` ref. Plans expire after 24 hours, are consumed by a
|
|
38
|
+
definitive execution attempt, and are held under resident file/count
|
|
39
|
+
ceilings. Expired, malformed, or oversized retained plan files are removed
|
|
40
|
+
under the repository lock before those ceilings are enforced; redirected
|
|
41
|
+
plan state remains a hard refusal.
|
|
42
|
+
- A commit plan cannot absorb pre-existing staged work. It stages only literal,
|
|
43
|
+
explicitly reviewed paths.
|
|
44
|
+
- Configured Atelier boundary policy is checked against the staged change set
|
|
45
|
+
before commit creation using the enrolled Git executable. When that policy
|
|
46
|
+
declares private-domain ownership, actor verification is blocking even in
|
|
47
|
+
legacy-warning mode. The Sync path disables the boundary command's optional
|
|
48
|
+
network `gh api user` fallback and fails closed when local actor evidence is
|
|
49
|
+
insufficient. Commit history is provenance, not current-user identity, and
|
|
50
|
+
is not accepted as actor evidence on this path. Policies without a declared private-domain owner do not invent
|
|
51
|
+
an actor requirement. Ordinary Git hooks still run; the resulting commit tree,
|
|
52
|
+
single parent, and message must equal the reviewed authority or the local
|
|
53
|
+
commit is rolled back and publication is refused.
|
|
54
|
+
- Push is present only when the reviewed plan requested it, the branch had no
|
|
55
|
+
prior unpublished commits, and HEAD still names the exact verified commit.
|
|
56
|
+
Atelier re-resolves the single push URL immediately before publication and
|
|
57
|
+
pushes the exact commit object directly to that reviewed destination. Push is
|
|
58
|
+
never forced, never follows tags, and never recursively publishes submodule
|
|
59
|
+
refs. When fetch and push resolve to the same credential-free identity,
|
|
60
|
+
Atelier refreshes the exact remote-tracking branch and re-observes before it
|
|
61
|
+
reports `committed-and-published`. A distinct configured push URL is honored,
|
|
62
|
+
but remains an explicit attention state because it cannot prove the fetch
|
|
63
|
+
upstream synchronized. A failed push or post-push tracking refresh preserves
|
|
64
|
+
the local commit, creates one stable attention state, and returns a non-zero
|
|
65
|
+
command exit.
|
|
66
|
+
- Semantic conflict resolution, merge commits, rebase, reset, force push,
|
|
67
|
+
browser apply, broad path scans, telemetry, and hidden upload are absent.
|
|
68
|
+
|
|
69
|
+
## Repository completeness
|
|
70
|
+
|
|
71
|
+
`atelier sync status` emits a supervisor envelope whose `state.observation`
|
|
72
|
+
contains the current `atelier-repository-observation@v1` document. That
|
|
73
|
+
observation cannot report `complete: true` when any of these are unresolved:
|
|
74
|
+
|
|
75
|
+
- lexically identifiable provider-managed, UNC/network, WSL-cross-boundary, or
|
|
76
|
+
unclassified external filesystem roots (mapped-drive classification remains
|
|
77
|
+
an operating-system integration concern for the signed beta);
|
|
78
|
+
- an unsupported Git engine or bare repository;
|
|
79
|
+
- sparse checkout, partial clone, or shallow repository state;
|
|
80
|
+
- tracked paths carrying `assume-unchanged` or `skip-worktree` index flags;
|
|
81
|
+
- missing or unhealthy submodules;
|
|
82
|
+
- required Git LFS content without a working LFS integration, including LFS
|
|
83
|
+
semantics declared by tracked or untracked worktree attributes, repository
|
|
84
|
+
info attributes, and default global or system attributes;
|
|
85
|
+
- an unclassified custom clean, smudge, or process filter;
|
|
86
|
+
- a configured `core.hooksPath` whose executable behavior is outside the
|
|
87
|
+
reviewed repository contract;
|
|
88
|
+
- a remote URL whose authentication shape cannot be classified;
|
|
89
|
+
- multiple push destinations or any configured Git URL rewrite rule;
|
|
90
|
+
- any required Git evidence read that fails, times out, exceeds its budget, or
|
|
91
|
+
cannot be parsed.
|
|
92
|
+
- a change set above the 4,096-entry resident observation ceiling; or
|
|
93
|
+
- a `core.attributesFile` outside the repository-owned/tracked attributes
|
|
94
|
+
boundary whose filter semantics have not been classified.
|
|
95
|
+
|
|
96
|
+
HTTPS through Git Credential Manager, SSH through the user's existing SSH
|
|
97
|
+
configuration, and local test remotes are classified explicitly. Atelier does
|
|
98
|
+
not collect or store provider credentials.
|
|
99
|
+
|
|
100
|
+
## Local operation state
|
|
101
|
+
|
|
102
|
+
Ignored `.atelier-local/runtime/` contains:
|
|
103
|
+
|
|
104
|
+
- `enrollment.json` — exact repository and Git engine;
|
|
105
|
+
- `state.json` — a bounded projection of healthy, attention, or paused state;
|
|
106
|
+
- `control.json` — user pause/freeze state;
|
|
107
|
+
- `plans/` — expiring, consumed reviewed commit plans under count/byte ceilings;
|
|
108
|
+
- `operations.ndjson` — sequence- and hash-chained resident trace with explicit
|
|
109
|
+
hash-bound checkpoints before its byte or record ceiling, with a fresh
|
|
110
|
+
digest-linked generation after a torn or corrupt chain; and
|
|
111
|
+
- an atomic per-repository operation lock.
|
|
112
|
+
|
|
113
|
+
Every directory component is containment-checked and every state leaf is
|
|
114
|
+
opened without following redirects where the platform supports it, with leaf
|
|
115
|
+
type and identity checks on every platform. Stale-lock recovery uses an
|
|
116
|
+
exclusive recovery claim, ages out an abandoned recovery claim after the owner
|
|
117
|
+
grace interval, identity-checks the lock directory before and after quarantine,
|
|
118
|
+
and quarantines only the claimed stale directory; it never recursively deletes
|
|
119
|
+
a newly acquired lock. A live PID without durable process identity cannot wedge
|
|
120
|
+
the repository forever: its owner record becomes recoverable after the 24-hour
|
|
121
|
+
maximum operation age. Enrollment takes the same lock as every other
|
|
122
|
+
authoritative state mutation.
|
|
123
|
+
|
|
124
|
+
Deleting this directory removes convenience and diagnostics. It cannot change
|
|
125
|
+
repository meaning. Git plus readable files remain authoritative.
|
|
126
|
+
|
|
127
|
+
## Engineering commands
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
atelier sync enroll --repo /absolute/path/to/repository
|
|
131
|
+
atelier sync status --repo /absolute/path/to/repository
|
|
132
|
+
atelier sync reconcile --repo /absolute/path/to/repository
|
|
133
|
+
atelier sync run --repo /absolute/path/to/repository --once
|
|
134
|
+
|
|
135
|
+
atelier sync plan \
|
|
136
|
+
--repo /absolute/path/to/repository \
|
|
137
|
+
--path docs/decision.md \
|
|
138
|
+
--message "docs: record decision" \
|
|
139
|
+
--publish
|
|
140
|
+
|
|
141
|
+
# Repeat the exact operation id printed by plan:
|
|
142
|
+
atelier sync commit \
|
|
143
|
+
--repo /absolute/path/to/repository \
|
|
144
|
+
--operation operation-... \
|
|
145
|
+
--confirm operation-...
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
`status`, `audit`, `reconcile`, `run --once`, and `commit` return a non-zero
|
|
149
|
+
process exit when their result is not healthy, so automation cannot treat a
|
|
150
|
+
paused state, attention state, or failed publication as success merely because
|
|
151
|
+
JSON was emitted.
|
|
152
|
+
|
|
153
|
+
The future native shell may label the final two commands **Commit & sync**.
|
|
154
|
+
It must not bypass either phase.
|
|
155
|
+
|
|
156
|
+
The repeated operation id is a visible user-intent confirmation gate, not an
|
|
157
|
+
authorization secret. Local software able to read and modify the repository is
|
|
158
|
+
inside the same operating-system trust domain; the control prevents implicit
|
|
159
|
+
or stale execution, not a hostile process with the user's filesystem access.
|
|
160
|
+
|
|
161
|
+
## Evidence boundary
|
|
162
|
+
|
|
163
|
+
Deliverable Zero proves the headless supervisor contract on Linux and macOS,
|
|
164
|
+
with Windows CI covering the portable observation, state, and direct-process
|
|
165
|
+
contract. POSIX executable-wrapper substitution is explicitly skipped on
|
|
166
|
+
Windows; native Windows wrapper-injection proof, signed installation,
|
|
167
|
+
background launch at user login, Windows Home/Pro device behavior, macOS
|
|
168
|
+
notarization, and a nontechnical-user workflow belong to the signed
|
|
169
|
+
collaborator beta. Repositories without an initial commit are not supported by
|
|
170
|
+
this deliverable. A Git executable upgrade changes enrolled identity and
|
|
171
|
+
requires re-enrollment.
|
package/docs/blocks/claims.md
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
This package makes three promises. None of them asks for your trust — each
|
|
2
2
|
one names the command that proves it.
|
|
3
3
|
|
|
4
|
-
**
|
|
5
|
-
telemetry,
|
|
6
|
-
the package. The exceptions are explicit: `boundary check`
|
|
7
|
-
user` after no declared actor matches an explicit `--actor`,
|
|
4
|
+
**There is no silent egress; every network path is named.** There is no
|
|
5
|
+
telemetry, update check, crash reporting, managed-runtime upload, or model
|
|
6
|
+
provider path in the package. The exceptions are explicit: `boundary check`
|
|
7
|
+
may invoke `gh api user` after no declared actor matches an explicit `--actor`,
|
|
8
8
|
`MNSTRY_ATELIER_ACTOR`, `GITHUB_ACTOR`, or a configured Git email; repository
|
|
9
9
|
identity checks may invoke `gh api repos/...` to resolve a canonical GitHub
|
|
10
10
|
identity. Those authenticated requests use your own `gh` credentials. A
|
|
11
11
|
recognized explicit actor prevents the boundary actor fallback; recorded
|
|
12
12
|
repository identities let identity checks keep working when the provider is
|
|
13
|
-
unavailable.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
unavailable. Explicitly enrolled Atelier Sync may also run bounded Git fetches
|
|
14
|
+
for observation/reconciliation and one non-force push only when the exact
|
|
15
|
+
reviewed commit plan requested and confirmed it, no earlier local commit is
|
|
16
|
+
waiting to be published, and HEAD still names the verified commit object. Sync
|
|
17
|
+
never uses the network actor fallback, follows tags, or recursively publishes
|
|
18
|
+
submodule refs. The package's HTTP client
|
|
19
|
+
refuses non-loopback URLs, the served pages authorize no external origin, and
|
|
20
|
+
release audit scans every executable or markup file in the exact `npm pack`
|
|
21
|
+
inventory for egress primitives. The standalone gate also scans executable and
|
|
22
|
+
markup files under `src/`, `bin/`, `scripts/`, `templates/`, `examples/`, and
|
|
23
|
+
`skills/`. Two limits worth stating plainly: the egress control does not
|
|
24
|
+
interpret data-only `.json` or `.md` files, and it does not model
|
|
25
|
+
`child_process`; the reviewed `gh` and enrolled Git paths above are documented
|
|
26
|
+
subprocess exceptions rather than scanner detections:
|
|
22
27
|
|
|
23
28
|
```bash
|
|
24
29
|
npm run egress:check
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
- It does not write to a MNSTRY runtime database.
|
|
2
|
-
- It does not import, provision, publish, or send
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
- It does not import, provision, publish, or send project content to a MNSTRY
|
|
3
|
+
managed runtime.
|
|
4
|
+
- Conformance remains offline. Network access is limited to the documented
|
|
5
|
+
`gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
|
|
6
|
+
operations: bounded fetch for observation/reconciliation, and non-force push
|
|
7
|
+
only when the exact reviewed commit plan requested and confirmed it, no
|
|
8
|
+
earlier local commit remains unpublished, and HEAD still names the verified
|
|
9
|
+
commit object; Sync does not use network actor fallback, follow tags, or
|
|
10
|
+
recursively publish submodule refs.
|
|
5
11
|
- It does not execute model-assisted analysis or any model provider.
|
|
6
12
|
- It does not include client project content.
|
|
7
13
|
|
package/docs/install.md
CHANGED
|
@@ -30,19 +30,19 @@ The registry is the distribution channel of record, as `docs/continuity.md`
|
|
|
30
30
|
commits:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
npm install --save-dev @mnstry/atelier@0.2.0-alpha.
|
|
33
|
+
npm install --save-dev @mnstry/atelier@0.2.0-alpha.6
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Installing from the matching Git tag resolves to the same reviewed commit:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.
|
|
39
|
+
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.6"
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
Or over SSH:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.
|
|
45
|
+
npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.6"
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
Keep the `@mnstry/` scope — see the command-form note above for why the
|
|
@@ -116,8 +116,17 @@ function signatures, types, or behavior.
|
|
|
116
116
|
### egress:check
|
|
117
117
|
|
|
118
118
|
`npm run egress:check` (`atelier egress check`) scans package runtime paths for
|
|
119
|
-
forbidden non-localhost egress. The package claims no
|
|
120
|
-
|
|
119
|
+
forbidden non-localhost HTTP egress primitives. The package claims no silent or
|
|
120
|
+
undocumented runtime egress; this gate is one mechanical check behind that
|
|
121
|
+
claim. It does not interpret data-only Markdown/JSON and does not model
|
|
122
|
+
`child_process`, so the reviewed `gh` identity-resolution subprocesses and the
|
|
123
|
+
explicitly enrolled Atelier Sync Git fetch/non-force-push subprocesses are
|
|
124
|
+
documented exceptions backed by dedicated refusal tests. Sync refuses fetch on
|
|
125
|
+
an incomplete observation, refuses publish while prior local commits are
|
|
126
|
+
unpublished, strips repository/config retargeting environment variables, and
|
|
127
|
+
pushes the exact post-hook-verified commit object without following tags or
|
|
128
|
+
recursively publishing submodule refs. Its boundary check also suppresses the
|
|
129
|
+
optional network actor fallback.
|
|
121
130
|
|
|
122
131
|
### consumer:smoke
|
|
123
132
|
|