@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/docs/upgrade.md
CHANGED
|
@@ -5,6 +5,44 @@ workspace between Atelier package releases. The flow is local-only: it does not
|
|
|
5
5
|
provision repositories, contact a Git host, mutate the MNSTRY runtime, or write
|
|
6
6
|
through a browser view.
|
|
7
7
|
|
|
8
|
+
## Upgrading to 0.2.0-alpha.6
|
|
9
|
+
|
|
10
|
+
This release adds Atelier Sync Deliverable Zero: a headless, local repository
|
|
11
|
+
supervisor with explicit enrollment, complete repository observations,
|
|
12
|
+
fast-forward-only reconciliation, pause/resume control, hash-chained local
|
|
13
|
+
operation traces, and two-phase user-confirmed commit and publication. It does
|
|
14
|
+
not add a desktop shell, semantic conflict resolution, force operations,
|
|
15
|
+
telemetry, or unattended semantic writes.
|
|
16
|
+
|
|
17
|
+
Consumers that adopt the new runtime should enroll one repository explicitly,
|
|
18
|
+
treat watchers as hints rather than truth, require a fresh complete observation
|
|
19
|
+
before each confirmed mutation, and keep commit and publication as separate
|
|
20
|
+
user decisions. Existing consumers that do not import the runtime subpaths are
|
|
21
|
+
contract-compatible and need only update their pinned dependency.
|
|
22
|
+
|
|
23
|
+
## Upgrading to 0.2.0-alpha.5
|
|
24
|
+
|
|
25
|
+
This release hardens public/private boundary enforcement, local serving,
|
|
26
|
+
collaboration-ledger integrity, disclosure review, and release provenance.
|
|
27
|
+
Documents valid against `0.2.0-alpha.0` remain contract-compatible, but some
|
|
28
|
+
previously tolerated unsafe or ambiguous states now fail closed.
|
|
29
|
+
|
|
30
|
+
- Projects using `atelier dev` must provide a generated
|
|
31
|
+
`atelier.manifest.json`; only enrolled, safe, realpath-validated static files
|
|
32
|
+
are served, and the sidecar accepts loopback traffic only.
|
|
33
|
+
- Empty or malformed content-rule policies, incomplete Git reads, corrupt or
|
|
34
|
+
oversized collaboration ledgers, and unsafe manifest entries are now
|
|
35
|
+
blocking errors with typed CLI diagnostics.
|
|
36
|
+
- Run `atelier disclosure check` before sharing tracked or staged content. A
|
|
37
|
+
private denylist is required by default and must remain outside the public
|
|
38
|
+
repository.
|
|
39
|
+
- Release candidates are packed once, SHA-256-bound, and the exact audited
|
|
40
|
+
tarball is the artifact sent through npm trusted publishing.
|
|
41
|
+
|
|
42
|
+
Re-run the boundary, disclosure, graph, readiness, and lock checks below after
|
|
43
|
+
updating. If `atelier dev` previously served files without a manifest, generate
|
|
44
|
+
and review the manifest before restarting it.
|
|
45
|
+
|
|
8
46
|
## Upgrading to 0.2.0-alpha.4
|
|
9
47
|
|
|
10
48
|
This is a presentation release. There are no contract changes and no runtime
|
|
@@ -94,7 +132,7 @@ For registry installs, pin the exact version and record the resolved version
|
|
|
94
132
|
in the lockfile:
|
|
95
133
|
|
|
96
134
|
```bash
|
|
97
|
-
npm install --save-dev @mnstry/atelier@0.2.0-alpha.
|
|
135
|
+
npm install --save-dev @mnstry/atelier@0.2.0-alpha.6
|
|
98
136
|
npx mnstry-atelier lock write --project ./atelier.project.json
|
|
99
137
|
```
|
|
100
138
|
|
|
@@ -102,7 +140,7 @@ For Git installs, pin the release tag rather than a branch, so the lock file
|
|
|
102
140
|
records exactly what was reviewed:
|
|
103
141
|
|
|
104
142
|
```bash
|
|
105
|
-
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.
|
|
143
|
+
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.6"
|
|
106
144
|
npx mnstry-atelier lock write --project ./atelier.project.json
|
|
107
145
|
```
|
|
108
146
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "atelier-repository-observation@v1",
|
|
3
|
+
"observedAt": "2026-08-25T00:00:00.000Z",
|
|
4
|
+
"complete": true,
|
|
5
|
+
"root": "/workspace/project",
|
|
6
|
+
"filesystem": {
|
|
7
|
+
"supported": true,
|
|
8
|
+
"code": "local-filesystem"
|
|
9
|
+
},
|
|
10
|
+
"blockers": [
|
|
11
|
+
{
|
|
12
|
+
"code": "partial-clone-unsupported",
|
|
13
|
+
"message": "partial clones may omit required Git objects",
|
|
14
|
+
"details": {}
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"warnings": []
|
|
18
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "atelier-repository-observation@v1",
|
|
3
|
+
"observedAt": "2026-08-25T00:00:00.000Z",
|
|
4
|
+
"complete": true,
|
|
5
|
+
"root": "/workspace/project",
|
|
6
|
+
"filesystem": {
|
|
7
|
+
"supported": true,
|
|
8
|
+
"code": "local-filesystem"
|
|
9
|
+
},
|
|
10
|
+
"git": {
|
|
11
|
+
"executable": "/usr/bin/git",
|
|
12
|
+
"version": "2.40.0",
|
|
13
|
+
"supported": true,
|
|
14
|
+
"minimum": "2.40.0"
|
|
15
|
+
},
|
|
16
|
+
"bare": false,
|
|
17
|
+
"branch": {
|
|
18
|
+
"branch": "main",
|
|
19
|
+
"detached": false,
|
|
20
|
+
"head": "1111111111111111111111111111111111111111",
|
|
21
|
+
"upstream": "origin/main",
|
|
22
|
+
"ahead": 0,
|
|
23
|
+
"behind": 0
|
|
24
|
+
},
|
|
25
|
+
"remotes": [],
|
|
26
|
+
"features": {
|
|
27
|
+
"sparseCheckout": false,
|
|
28
|
+
"partialClone": [],
|
|
29
|
+
"customFilters": []
|
|
30
|
+
},
|
|
31
|
+
"submodules": {
|
|
32
|
+
"complete": true
|
|
33
|
+
},
|
|
34
|
+
"lfs": {
|
|
35
|
+
"complete": true
|
|
36
|
+
},
|
|
37
|
+
"status": {
|
|
38
|
+
"clean": true,
|
|
39
|
+
"digest": "2222222222222222222222222222222222222222222222222222222222222222",
|
|
40
|
+
"entries": [],
|
|
41
|
+
"fingerprints": [],
|
|
42
|
+
"stagedCount": 0,
|
|
43
|
+
"unstagedCount": 0,
|
|
44
|
+
"conflictCount": 0
|
|
45
|
+
},
|
|
46
|
+
"blockers": [],
|
|
47
|
+
"warnings": []
|
|
48
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "mnstry.source-sidecar@v1",
|
|
3
|
+
"asset": "source.html",
|
|
3
4
|
"title": "Sample Source",
|
|
4
5
|
"summary": "Neutral non-Markdown source with durable sidecar identity.",
|
|
5
6
|
"tags": [
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
"kg": {
|
|
9
10
|
"id": "sample-workspace:source-html",
|
|
10
11
|
"type": "source",
|
|
12
|
+
"domain": "sample",
|
|
13
|
+
"lifecycle": "source",
|
|
11
14
|
"status": "active",
|
|
12
15
|
"audience": "private",
|
|
13
16
|
"relations": {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "mnstry.source-sidecar@v1",
|
|
3
|
+
"asset": "data.json",
|
|
3
4
|
"title": "Sample dataset",
|
|
4
5
|
"summary": "Neutral JSON dataset described entirely by its sidecar.",
|
|
5
6
|
"tags": [
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
"kg": {
|
|
9
10
|
"id": "source-formats:data-json",
|
|
10
11
|
"type": "source",
|
|
12
|
+
"domain": "sample",
|
|
13
|
+
"lifecycle": "source",
|
|
11
14
|
"status": "active",
|
|
12
15
|
"audience": "team",
|
|
13
16
|
"relations": {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "mnstry.source-sidecar@v1",
|
|
3
|
+
"asset": "logo.png",
|
|
3
4
|
"title": "Sample binary asset",
|
|
4
5
|
"summary": "Four-byte PNG-magic stub; the graph never reads the asset bytes.",
|
|
5
6
|
"tags": [
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
"kg": {
|
|
9
10
|
"id": "source-formats:logo-png",
|
|
10
11
|
"type": "artifact",
|
|
12
|
+
"domain": "sample",
|
|
13
|
+
"lifecycle": "source",
|
|
11
14
|
"status": "active",
|
|
12
15
|
"audience": "sensitive",
|
|
13
16
|
"relations": {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "mnstry.source-sidecar@v1",
|
|
3
|
+
"asset": "metrics.csv",
|
|
3
4
|
"title": "Sample metrics",
|
|
4
5
|
"summary": "Neutral CSV evidence table described by its sidecar.",
|
|
5
6
|
"tags": [
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
"kg": {
|
|
9
10
|
"id": "source-formats:metrics-csv",
|
|
10
11
|
"type": "evidence",
|
|
12
|
+
"domain": "sample",
|
|
13
|
+
"lifecycle": "source",
|
|
11
14
|
"status": "active",
|
|
12
15
|
"audience": "operator",
|
|
13
16
|
"relations": {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "mnstry.source-sidecar@v1",
|
|
3
|
+
"asset": "pipeline.yaml",
|
|
3
4
|
"title": "Sample pipeline",
|
|
4
5
|
"summary": "Neutral YAML file; atelier never parses it, the sidecar speaks for it.",
|
|
5
6
|
"tags": [
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
"kg": {
|
|
9
10
|
"id": "source-formats:pipeline-yaml",
|
|
10
11
|
"type": "source",
|
|
12
|
+
"domain": "sample",
|
|
13
|
+
"lifecycle": "source",
|
|
11
14
|
"status": "active",
|
|
12
15
|
"audience": "public",
|
|
13
16
|
"relations": {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnstry/atelier",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Local toolkit that turns a Git repository into an ontology-governed knowledge graph, enforcement layer, and runtime for people, agents, and tools. No telemetry, service, or account.",
|
|
6
6
|
"keywords": [
|
|
@@ -32,13 +32,18 @@
|
|
|
32
32
|
"./readiness-protocols": "./src/readiness-protocols/bundled-pack.mjs",
|
|
33
33
|
"./server": "./src/server/local-sidecar.mjs",
|
|
34
34
|
"./harness": "./src/harness/context.mjs",
|
|
35
|
+
"./collaboration": "./src/collaboration/index.mjs",
|
|
35
36
|
"./support": "./src/support/support-bundle.mjs",
|
|
36
37
|
"./egress": "./src/egress/forbidden-egress.mjs",
|
|
38
|
+
"./disclosure": "./src/disclosure/content-scan.mjs",
|
|
37
39
|
"./boundary": "./src/boundary/policy.mjs",
|
|
38
40
|
"./upgrade": "./src/upgrade/upgrade.mjs",
|
|
39
41
|
"./attestation": "./src/attestation/sign.mjs",
|
|
40
42
|
"./extension-packs": "./src/extension-packs/loader.mjs",
|
|
41
43
|
"./analysis/adapter": "./src/analysis/adapter.mjs",
|
|
44
|
+
"./runtime": "./src/runtime/supervisor.mjs",
|
|
45
|
+
"./runtime/git": "./src/runtime/git-adapter.mjs",
|
|
46
|
+
"./runtime/observation": "./src/runtime/repository-observation.mjs",
|
|
42
47
|
"./export-contract": "./src/export/atelier-export-contract.mjs",
|
|
43
48
|
"./dry-run": "./src/validate-atelier-export-dry-run.mjs",
|
|
44
49
|
"./contracts/atelier-export.v1.schema.json": "./contracts/atelier-export.v1.schema.json",
|
|
@@ -48,7 +53,7 @@
|
|
|
48
53
|
"contract": "node src/check-atelier-export-contract.mjs",
|
|
49
54
|
"dry-run": "node src/validate-atelier-export-dry-run.mjs fixtures/atelier-export/sample-studio-offer.v1.json",
|
|
50
55
|
"test": "node --test test/*.test.mjs",
|
|
51
|
-
"syntax:check": "
|
|
56
|
+
"syntax:check": "node scripts/check-syntax.mjs",
|
|
52
57
|
"graph:test": "node --test test/graph.test.mjs test/graph-knowledge-graph.test.mjs test/graph-determinism.test.mjs test/graph-source-formats.test.mjs",
|
|
53
58
|
"project:test": "node --test test/project.test.mjs test/project-config.test.mjs test/projection-policy.test.mjs test/projection-alignment.test.mjs",
|
|
54
59
|
"server:security:test": "node --test test/server.test.mjs test/server-security.test.mjs test/server-proposals.test.mjs",
|
|
@@ -57,19 +62,25 @@
|
|
|
57
62
|
"egress:check": "node bin/atelier.mjs egress check",
|
|
58
63
|
"readiness:test": "node --test test/readiness.test.mjs test/readiness-summary.test.mjs test/readiness-protocol-contract.test.mjs test/readiness-protocols.test.mjs test/readiness-protocol-runtime.test.mjs",
|
|
59
64
|
"harness:test": "node --test test/harness.test.mjs test/harness-context.test.mjs",
|
|
60
|
-
"
|
|
65
|
+
"collaboration:test": "node --test test/collaboration-ledger.test.mjs test/server-proposals.test.mjs",
|
|
66
|
+
"sync:test": "node --test test/runtime-git-adapter.test.mjs test/runtime-observation.test.mjs test/runtime-supervisor.test.mjs",
|
|
67
|
+
"boundary:test": "node --test test/boundary-policy-contract.test.mjs test/boundary-content-rules.test.mjs test/boundary-guard.test.mjs",
|
|
61
68
|
"upgrade:test": "node --test test/upgrade-contract.test.mjs test/upgrade.test.mjs",
|
|
62
69
|
"release:audit": "node scripts/check-release-tarball.mjs",
|
|
70
|
+
"release:candidate": "node scripts/release-candidate.mjs",
|
|
63
71
|
"repo:check": "node scripts/check-repo-disclosure.mjs",
|
|
64
72
|
"migrations:check": "node scripts/check-breaking-migrations.mjs",
|
|
65
73
|
"contract:compat": "node scripts/check-contract-compat.mjs",
|
|
74
|
+
"public-api:compat": "node scripts/check-public-api-compat.mjs",
|
|
75
|
+
"assurance:mutation-smoke": "node --test test/assurance-mutations.test.mjs",
|
|
66
76
|
"consumer:smoke": "node scripts/consumer-smoke.mjs",
|
|
67
77
|
"distribution:smoke": "node scripts/distribution-smoke.mjs",
|
|
68
|
-
"prepublishOnly": "npm run
|
|
78
|
+
"prepublishOnly": "npm run repo:check && npm run migrations:check && npm run contract:compat && npm run public-api:compat && npm run syntax:check && npm test && npm run assurance:mutation-smoke && npm run release:candidate"
|
|
69
79
|
},
|
|
70
80
|
"dependencies": {
|
|
71
81
|
"ajv": "8.20.0",
|
|
72
|
-
"ajv-formats": "3.0.1"
|
|
82
|
+
"ajv-formats": "3.0.1",
|
|
83
|
+
"fast-uri": "3.1.5"
|
|
73
84
|
},
|
|
74
85
|
"devDependencies": {
|
|
75
86
|
"@types/node": "^22.0.0"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: atelier-local-service
|
|
3
|
+
description: Build or repair a durable loopback-only authoring, review, or preview service in an Atelier-backed repository when local state must survive agent commands and fail safely.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Atelier local service
|
|
7
|
+
|
|
8
|
+
Use this skill for a consumer-owned service that persists repository-backed
|
|
9
|
+
local state. Do not use it to change `atelier dev` itself or to install an
|
|
10
|
+
operating-system service without explicit authorization.
|
|
11
|
+
|
|
12
|
+
Read `docs/local-services.md` from the installed Atelier package or source
|
|
13
|
+
checkout before changing lifecycle code.
|
|
14
|
+
|
|
15
|
+
## Boundary first
|
|
16
|
+
|
|
17
|
+
Separate the portable mechanism from the consumer adapter before editing:
|
|
18
|
+
|
|
19
|
+
- Atelier invariants: loopback binding, proven ownership, exact stop, ignored
|
|
20
|
+
mode-0600 state, atomic writes, recoverable browser failure, and tests.
|
|
21
|
+
- Consumer details: service identity, port, commands, paths, schema, content,
|
|
22
|
+
and user-facing language.
|
|
23
|
+
|
|
24
|
+
Never promote consumer names, content, structures, examples, or local paths
|
|
25
|
+
into Atelier. Public tests use invented fixtures.
|
|
26
|
+
|
|
27
|
+
## Workflow
|
|
28
|
+
|
|
29
|
+
1. Inspect the existing server, process owner, port, persistence file,
|
|
30
|
+
`.gitignore`, health route, save handler, and tests. Preserve the live draft
|
|
31
|
+
before restarting anything.
|
|
32
|
+
2. Expose repository-owned `start`, `status`, and `stop` commands. Start may
|
|
33
|
+
detach only because the user needs continuity beyond the launching command.
|
|
34
|
+
3. Bind to loopback. Pair a random runtime identifier with the PID in both the
|
|
35
|
+
private runtime record and health response. Refuse unowned listeners.
|
|
36
|
+
4. Keep drafts, runtime metadata, and operational logs ignored and owner-only.
|
|
37
|
+
Do not commit live authoring state.
|
|
38
|
+
5. Make the UI retain the draft when the service disappears. Show the exact
|
|
39
|
+
restart command, snapshot export, and Retry path instead of a generic error.
|
|
40
|
+
6. Serialize writes without permanently rejecting the queue after one failed
|
|
41
|
+
operation. Keep conflicts and invalid state fail-closed.
|
|
42
|
+
7. Prove lifecycle ownership, server-loss recovery, later-save recovery,
|
|
43
|
+
permissions, ignore coverage, and fresh-checkout discoverability.
|
|
44
|
+
|
|
45
|
+
Do not claim durability from a passing request alone. Report separately:
|
|
46
|
+
saved file truth, managed-process truth, browser recovery truth, and the
|
|
47
|
+
remaining OS-restart boundary.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: atelier-public-boundary
|
|
3
|
+
description: Generalize a lesson from a private or tenant implementation into the public Atelier repository without carrying proprietary material across the trust boundary.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Atelier public boundary
|
|
7
|
+
|
|
8
|
+
Use this skill whenever a public Atelier change is informed by work in a
|
|
9
|
+
private, client, tenant, or internal repository.
|
|
10
|
+
|
|
11
|
+
## Extract the invariant, not the source
|
|
12
|
+
|
|
13
|
+
1. State the reusable failure mode or contract without client vocabulary.
|
|
14
|
+
2. Identify every source-specific name, path, port, field, content structure,
|
|
15
|
+
example, and operational fact. Keep those in the source repository.
|
|
16
|
+
3. Re-derive the public mechanism against an invented fixture. Neutral wording
|
|
17
|
+
is not enough if the fixture still reproduces a proprietary structure.
|
|
18
|
+
4. Keep private disclosure patterns in the ignored denylist or CI secret. Do
|
|
19
|
+
not place them in code, tests, docs, branch names, or commit messages.
|
|
20
|
+
5. Add a regression test for the general control and run an evidence-backed
|
|
21
|
+
defensive review when a guard changes.
|
|
22
|
+
|
|
23
|
+
## Required gates
|
|
24
|
+
|
|
25
|
+
Before staging, run the repository's disclosure check. After staging, scan the
|
|
26
|
+
staged index with the private denylist, then inspect the exact diff and release
|
|
27
|
+
tarball. A structural-only pass is useful on an untrusted fork but is not a
|
|
28
|
+
complete maintainer verdict.
|
|
29
|
+
|
|
30
|
+
If the private denylist is unavailable, stop short of claiming the public
|
|
31
|
+
boundary is green. Do not replace it with remembered client names.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: atelier-local-service
|
|
3
|
+
description: Build or repair a durable loopback-only authoring, review, or preview service in an Atelier-backed repository when local state must survive agent commands and fail safely.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Atelier local service
|
|
7
|
+
|
|
8
|
+
Use this skill for a consumer-owned service that persists repository-backed
|
|
9
|
+
local state. Do not use it to change `atelier dev` itself or to install an
|
|
10
|
+
operating-system service without explicit authorization.
|
|
11
|
+
|
|
12
|
+
Read `docs/local-services.md` from the installed Atelier package or source
|
|
13
|
+
checkout before changing lifecycle code.
|
|
14
|
+
|
|
15
|
+
## Boundary first
|
|
16
|
+
|
|
17
|
+
Separate the portable mechanism from the consumer adapter before editing:
|
|
18
|
+
|
|
19
|
+
- Atelier invariants: loopback binding, proven ownership, exact stop, ignored
|
|
20
|
+
mode-0600 state, atomic writes, recoverable browser failure, and tests.
|
|
21
|
+
- Consumer details: service identity, port, commands, paths, schema, content,
|
|
22
|
+
and user-facing language.
|
|
23
|
+
|
|
24
|
+
Never promote consumer names, content, structures, examples, or local paths
|
|
25
|
+
into Atelier. Public tests use invented fixtures.
|
|
26
|
+
|
|
27
|
+
## Workflow
|
|
28
|
+
|
|
29
|
+
1. Inspect the existing server, process owner, port, persistence file,
|
|
30
|
+
`.gitignore`, health route, save handler, and tests. Preserve the live draft
|
|
31
|
+
before restarting anything.
|
|
32
|
+
2. Expose repository-owned `start`, `status`, and `stop` commands. Start may
|
|
33
|
+
detach only because the user needs continuity beyond the launching command.
|
|
34
|
+
3. Bind to loopback. Pair a random runtime identifier with the PID in both the
|
|
35
|
+
private runtime record and health response. Refuse unowned listeners.
|
|
36
|
+
4. Keep drafts, runtime metadata, and operational logs ignored and owner-only.
|
|
37
|
+
Do not commit live authoring state.
|
|
38
|
+
5. Make the UI retain the draft when the service disappears. Show the exact
|
|
39
|
+
restart command, snapshot export, and Retry path instead of a generic error.
|
|
40
|
+
6. Serialize writes without permanently rejecting the queue after one failed
|
|
41
|
+
operation. Keep conflicts and invalid state fail-closed.
|
|
42
|
+
7. Prove lifecycle ownership, server-loss recovery, later-save recovery,
|
|
43
|
+
permissions, ignore coverage, and fresh-checkout discoverability.
|
|
44
|
+
|
|
45
|
+
Do not claim durability from a passing request alone. Report separately:
|
|
46
|
+
saved file truth, managed-process truth, browser recovery truth, and the
|
|
47
|
+
remaining OS-restart boundary.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: atelier-public-boundary
|
|
3
|
+
description: Generalize a lesson from a private or tenant implementation into the public Atelier repository without carrying proprietary material across the trust boundary.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Atelier public boundary
|
|
7
|
+
|
|
8
|
+
Use this skill whenever a public Atelier change is informed by work in a
|
|
9
|
+
private, client, tenant, or internal repository.
|
|
10
|
+
|
|
11
|
+
## Extract the invariant, not the source
|
|
12
|
+
|
|
13
|
+
1. State the reusable failure mode or contract without client vocabulary.
|
|
14
|
+
2. Identify every source-specific name, path, port, field, content structure,
|
|
15
|
+
example, and operational fact. Keep those in the source repository.
|
|
16
|
+
3. Re-derive the public mechanism against an invented fixture. Neutral wording
|
|
17
|
+
is not enough if the fixture still reproduces a proprietary structure.
|
|
18
|
+
4. Keep private disclosure patterns in the ignored denylist or CI secret. Do
|
|
19
|
+
not place them in code, tests, docs, branch names, or commit messages.
|
|
20
|
+
5. Add a regression test for the general control and run an evidence-backed
|
|
21
|
+
defensive review when a guard changes.
|
|
22
|
+
|
|
23
|
+
## Required gates
|
|
24
|
+
|
|
25
|
+
Before staging, run the repository's disclosure check. After staging, scan the
|
|
26
|
+
staged index with the private denylist, then inspect the exact diff and release
|
|
27
|
+
tarball. A structural-only pass is useful on an untrusted fork but is not a
|
|
28
|
+
complete maintainer verdict.
|
|
29
|
+
|
|
30
|
+
If the private denylist is unavailable, stop short of claiming the public
|
|
31
|
+
boundary is green. Do not replace it with remembered client names.
|