@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 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.5
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
- **Nothing leaves your machine, with one exception you can see.** There is no
255
- telemetry, no update check, no crash reporting, and no send path anywhere in
256
- the package. The exceptions are explicit: `boundary check` may invoke `gh api
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. The only network client
264
- refuses non-loopback URLs, the served pages carry a policy that authorizes no
265
- external origin, and release audit scans every executable or markup file in
266
- the exact `npm pack` inventory for egress primitives. The standalone gate also
267
- scans executable and markup files under `src/`, `bin/`, `scripts/`,
268
- `templates/`, `examples/`, and `skills/`. Two limits worth stating plainly:
269
- the egress control does not interpret data-only `.json` or `.md` files, and it
270
- does not model `child_process`; the two reviewed `gh` paths above are therefore
271
- documented exceptions rather than scanner detections:
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 anything.
309
- - Except for the documented `gh` actor-resolution fallback, it initiates no
310
- 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.
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.5
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.5`.
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` | Budgets intentionally refuse evidence too large to inspect rather than claiming it is clean |
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` | egress tests, marker-inventory test, and egress case in `assurance:mutation-smoke` | Data-only files are not interpreted; reviewed `gh` subprocess fallbacks are documented exceptions |
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` |
@@ -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 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.
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.
@@ -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
- **Nothing leaves your machine, with one exception you can see.** There is no
5
- telemetry, no update check, no crash reporting, and no send path anywhere in
6
- the package. The exceptions are explicit: `boundary check` may invoke `gh api
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. The only network client
14
- refuses non-loopback URLs, the served pages carry a policy that authorizes no
15
- external origin, and release audit scans every executable or markup file in
16
- the exact `npm pack` inventory for egress primitives. The standalone gate also
17
- scans executable and markup files under `src/`, `bin/`, `scripts/`,
18
- `templates/`, `examples/`, and `skills/`. Two limits worth stating plainly:
19
- the egress control does not interpret data-only `.json` or `.md` files, and it
20
- does not model `child_process`; the two reviewed `gh` paths above are therefore
21
- documented exceptions rather than scanner detections:
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 anything.
3
- - Except for the documented `gh` actor-resolution fallback, it initiates no
4
- external network requests.
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.5
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.5"
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.5"
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 network egress in runtime
120
- paths; this gate is the mechanical check behind that claim.
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