@mnstry/atelier 0.2.0-alpha.1
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 +383 -0
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +262 -0
- package/SECURITY.md +93 -0
- package/TRADEMARKS.md +88 -0
- package/announcements/2026-08-06-announcements-channel.v1.json +12 -0
- package/announcements/keys/mnstry-announcements.public.v1.json +9 -0
- package/bin/atelier.mjs +2 -0
- package/bin/mnstry-atelier.mjs +3 -0
- package/contracts/analysis-adapter.v1.schema.json +248 -0
- package/contracts/atelier-action-intent.v1.schema.json +143 -0
- package/contracts/atelier-analysis-adapter.v1.schema.json +360 -0
- package/contracts/atelier-attestation.v1.schema.json +239 -0
- package/contracts/atelier-boundary-policy.v1.schema.json +339 -0
- package/contracts/atelier-claim.v1.schema.json +97 -0
- package/contracts/atelier-export.v1.schema.json +1015 -0
- package/contracts/atelier-extension-pack.v1.schema.json +290 -0
- package/contracts/atelier-kit-manifest.v1.schema.json +273 -0
- package/contracts/atelier-lock.v1.schema.json +364 -0
- package/contracts/atelier-migration.v1.schema.json +162 -0
- package/contracts/atelier-project-config.v1.schema.json +352 -0
- package/contracts/atelier-readiness-protocol.v1.schema.json +517 -0
- package/contracts/atelier-readiness-run.v1.schema.json +229 -0
- package/contracts/atelier-readiness.v1.schema.json +457 -0
- package/contracts/compat-baseline.json +10 -0
- package/contracts/git-promote-event.v1.schema.json +145 -0
- package/contracts/knowledge-source-sidecar.v1.schema.json +157 -0
- package/contracts/mnstry-atelier-semantic-profile.v1.json +254 -0
- package/docs/announcements.md +101 -0
- package/docs/atelier-runtime.md +34 -0
- package/docs/attestation.md +201 -0
- package/docs/continuity.md +55 -0
- package/docs/contract-stability.md +111 -0
- package/docs/distributions.md +220 -0
- package/docs/install.md +140 -0
- package/docs/knowledge-graph.md +140 -0
- package/docs/ontology.md +206 -0
- package/docs/release-engineering.md +151 -0
- package/docs/repo-boundary-guard.md +199 -0
- package/docs/tenant-readiness.md +64 -0
- package/docs/upgrade.md +124 -0
- package/fixtures/analysis/invalid/native-graph.v1.json +4 -0
- package/fixtures/analysis/invalid/promoted-claim.v1.json +17 -0
- package/fixtures/analysis/invalid/runtime-import.v1.json +20 -0
- package/fixtures/analysis/valid/output.claims.v1.json +17 -0
- package/fixtures/analysis-adapter/invalid/manifest-hidden-provider.v1.json +24 -0
- package/fixtures/analysis-adapter/invalid/output-frontmatter-mutation.v1.json +21 -0
- package/fixtures/analysis-adapter/invalid/output-native-graph.v1.json +14 -0
- package/fixtures/analysis-adapter/manifest.disabled.v1.json +22 -0
- package/fixtures/analysis-adapter/manifest.enabled-local.v1.json +23 -0
- package/fixtures/analysis-adapter/output.claims.v1.json +21 -0
- package/fixtures/atelier-action-intent/invalid/runtime-mutation-authority.v1.json +16 -0
- package/fixtures/atelier-action-intent/invalid/unknown-top-level-field.v1.json +17 -0
- package/fixtures/atelier-action-intent/invalid/writes-beyond-clipboard.v1.json +16 -0
- package/fixtures/atelier-action-intent/valid/copy-agent-prompt.v1.json +16 -0
- package/fixtures/atelier-action-intent/valid/copy-repo-path.v1.json +22 -0
- package/fixtures/atelier-analysis-adapter/invalid/hidden-model-provider.v1.json +24 -0
- package/fixtures/atelier-analysis-adapter/invalid/inert-with-execute-command.v1.json +24 -0
- package/fixtures/atelier-analysis-adapter/invalid/proposals-with-runtime-import.v1.json +30 -0
- package/fixtures/atelier-analysis-adapter/valid/manifest-inert.v1.json +24 -0
- package/fixtures/atelier-analysis-adapter/valid/proposals-claim-only.v1.json +27 -0
- package/fixtures/atelier-attestation/invalid/bad-digest.v1.json +23 -0
- package/fixtures/atelier-attestation/invalid/conformance-scope.v1.json +23 -0
- package/fixtures/atelier-attestation/invalid/missing-signature.v1.json +22 -0
- package/fixtures/atelier-attestation/invalid/unknown-root-field.v1.json +24 -0
- package/fixtures/atelier-attestation/keys/roundtrip-issuer.public.v1.json +9 -0
- package/fixtures/atelier-attestation/valid/rejected-with-reasons.v1.json +49 -0
- package/fixtures/atelier-attestation/valid/signed-admitted.v1.json +35 -0
- package/fixtures/atelier-attestation/valid/signed-roundtrip.v1.json +29 -0
- package/fixtures/atelier-attestation/valid/unsigned-advisory.v1.json +23 -0
- package/fixtures/atelier-claim/invalid/unknown-provider.v1.json +15 -0
- package/fixtures/atelier-claim/invalid/unknown-top-level-field.v1.json +16 -0
- package/fixtures/atelier-claim/invalid/wrong-schema-const.v1.json +15 -0
- package/fixtures/atelier-claim/valid/adapter-style-proposed-relation.v1.json +19 -0
- package/fixtures/atelier-claim/valid/codex-proposed-relation.v1.json +16 -0
- package/fixtures/atelier-claim/valid/manual-proposed-relation.v1.json +16 -0
- package/fixtures/atelier-claim/valid/readiness-proposed-relation.v1.json +18 -0
- package/fixtures/atelier-export/invalid/dirty-unforced-empty-taint.v1.json +19 -0
- package/fixtures/atelier-export/invalid/object-local-audience-visibility.v1.json +11 -0
- package/fixtures/atelier-export/invalid/open-object-class-owner.v1.json +23 -0
- package/fixtures/atelier-export/invalid/pricing-legacy-amount.v1.json +23 -0
- package/fixtures/atelier-export/invalid/public-disguised-internal-source-ref.v1.json +11 -0
- package/fixtures/atelier-export/invalid/public-nested-private-source-ref.v1.json +17 -0
- package/fixtures/atelier-export/invalid/public-resolved-private-source-ref.v1.json +13 -0
- package/fixtures/atelier-export/invalid/public-resolved-sensitive-source-ref.v1.json +13 -0
- package/fixtures/atelier-export/invalid/public-source-ref-missing-provenance.v1.json +20 -0
- package/fixtures/atelier-export/invalid/public-source-team-kg.json +12 -0
- package/fixtures/atelier-export/invalid/source-node-legacy-visibility.v1.json +21 -0
- package/fixtures/atelier-export/invalid/source-node-unknown-field.v1.json +18 -0
- package/fixtures/atelier-export/invalid/unresolved-public-source-ref.v1.json +11 -0
- package/fixtures/atelier-export/sample-studio-offer.v1.json +397 -0
- package/fixtures/atelier-extension-pack/invalid/bundled-slug-collision.v1.json +22 -0
- package/fixtures/atelier-extension-pack/invalid/escapes-root.v1.json +22 -0
- package/fixtures/atelier-extension-pack/invalid/posture-tampered.v1.json +22 -0
- package/fixtures/atelier-extension-pack/invalid/protocols/autonomous-authority.v1.json +118 -0
- package/fixtures/atelier-extension-pack/invalid/protocols/offer-map.v1.json +109 -0
- package/fixtures/atelier-extension-pack/invalid/redefines-runtime-term.v1.json +19 -0
- package/fixtures/atelier-extension-pack/invalid/wrong-namespace.v1.json +19 -0
- package/fixtures/atelier-extension-pack/valid/protocols/contract-gate.v1.json +109 -0
- package/fixtures/atelier-extension-pack/valid/sample-pack.v1.json +48 -0
- package/fixtures/atelier-kit-manifest/invalid/runtime-copy-without-canonical-role.v1.json +53 -0
- package/fixtures/atelier-kit-manifest/invalid/telemetry-send-path.v1.json +21 -0
- package/fixtures/atelier-kit-manifest/valid/mnstry-atelier.valid.v1.json +76 -0
- package/fixtures/atelier-lock/invalid/absolute-contract-path.v1.json +40 -0
- package/fixtures/atelier-lock/invalid/runtime-mutation-enabled.v1.json +41 -0
- package/fixtures/atelier-lock/invalid/unknown-top-level-field.v1.json +42 -0
- package/fixtures/atelier-lock/valid/extension-pack.v1.json +55 -0
- package/fixtures/atelier-lock/valid/minimal.v1.json +44 -0
- package/fixtures/atelier-migration/invalid/live-apply-mode.v1.json +21 -0
- package/fixtures/atelier-migration/invalid/missing-review-evidence.v1.json +20 -0
- package/fixtures/atelier-migration/invalid/runtime-mutation-enabled.v1.json +21 -0
- package/fixtures/atelier-migration/valid/minimal.v1.json +32 -0
- package/fixtures/atelier-project-config/invalid/absolute-repo-path.v1.json +11 -0
- package/fixtures/atelier-project-config/invalid/ext-not-object.v1.json +12 -0
- package/fixtures/atelier-project-config/invalid/external-kind-read-boundary.v1.json +12 -0
- package/fixtures/atelier-project-config/invalid/missing-repos-and-alignment.v1.json +7 -0
- package/fixtures/atelier-project-config/invalid/unknown-top-level-field.v1.json +14 -0
- package/fixtures/atelier-project-config/valid/alignment-scaffold.v1.json +15 -0
- package/fixtures/atelier-project-config/valid/ext-extension-packs.v1.json +36 -0
- package/fixtures/atelier-project-config/valid/repo-workspace.v1.json +23 -0
- package/fixtures/atelier-project-config/validator-only/ext-member-not-object.v1.json +14 -0
- package/fixtures/atelier-readiness/invalid/dry-run-only-false.v1.json +87 -0
- package/fixtures/atelier-readiness/invalid/support-bundle-send-path.v1.json +87 -0
- package/fixtures/atelier-readiness/invalid/unknown-top-level-field.v1.json +88 -0
- package/fixtures/atelier-readiness/valid/ready-workspace.v1.json +84 -0
- package/fixtures/boundary-policy/invalid/content-rule-exception-blanket-path.v1.json +67 -0
- package/fixtures/boundary-policy/invalid/invalid-actor-private-repo-mapping.v1.json +20 -0
- package/fixtures/boundary-policy/invalid/legacy-warning-missing-warning.v1.json +20 -0
- package/fixtures/boundary-policy/invalid/missing-repo-coverage.v1.json +19 -0
- package/fixtures/boundary-policy/invalid/unknown-key.v1.json +12 -0
- package/fixtures/boundary-policy/valid/content-rule-exception.v1.json +67 -0
- package/fixtures/boundary-policy/valid/legacy-warning.v1.json +33 -0
- package/fixtures/boundary-policy/valid/strict-private-shared.v1.json +40 -0
- package/fixtures/git-promote/invalid/provision-named-revocable.v1.json +29 -0
- package/fixtures/git-promote/private-to-team.v1.json +29 -0
- package/fixtures/knowledge-source-sidecar/invalid/legacy-visibility-field.v1.json +17 -0
- package/fixtures/knowledge-source-sidecar/invalid/missing-audience.v1.json +15 -0
- package/fixtures/knowledge-source-sidecar/invalid/unknown-relation-kind.v1.json +18 -0
- package/fixtures/knowledge-source-sidecar/valid/html-source.v1.json +18 -0
- package/fixtures/knowledge-source-sidecar/valid/pdf-evidence.v1.json +18 -0
- package/fixtures/projects/neutral-project/atelier.project.json +15 -0
- package/fixtures/projects/neutral-project/ops/config/repo-access.v1.json +12 -0
- package/fixtures/projects/neutral-project/project-knowledge.graph.json +69 -0
- package/fixtures/projects/sample-workspace/atelier.project.json +23 -0
- package/fixtures/projects/sample-workspace/boundary-policy.v1.json +59 -0
- package/fixtures/projects/sample-workspace/content/README.md +16 -0
- package/fixtures/projects/sample-workspace/content/source.html +5 -0
- package/fixtures/projects/sample-workspace/content/source.html.kg.json +15 -0
- package/fixtures/projects/sample-workspace/repo-access.v1.json +9 -0
- package/fixtures/projects/source-formats-workspace/atelier.project.json +23 -0
- package/fixtures/projects/source-formats-workspace/content/README.md +17 -0
- package/fixtures/projects/source-formats-workspace/content/data.json +7 -0
- package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +15 -0
- package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +15 -0
- package/fixtures/projects/source-formats-workspace/content/metrics.csv +3 -0
- package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +15 -0
- package/fixtures/projects/source-formats-workspace/content/pipeline.yaml +4 -0
- package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +15 -0
- package/fixtures/projects/source-formats-workspace/repo-access.v1.json +9 -0
- package/fixtures/readiness-protocols/extension-pack/invalid/protocol-missing-path.v1.json +20 -0
- package/fixtures/readiness-protocols/extension-pack/valid/with-protocol.v1.json +24 -0
- package/fixtures/readiness-protocols/protocol/invalid/missing-check-target.v1.json +103 -0
- package/fixtures/readiness-protocols/protocol/invalid/runtime-mutation-enabled.v1.json +107 -0
- package/fixtures/readiness-protocols/protocol/valid/minimal.v1.json +100 -0
- package/fixtures/readiness-protocols/run/invalid/missing-evidence.v1.json +37 -0
- package/fixtures/readiness-protocols/run/invalid/pass-with-blocker.v1.json +22 -0
- package/fixtures/readiness-protocols/run/invalid/runtime-mutation-enabled.v1.json +22 -0
- package/fixtures/readiness-protocols/run/valid/pass.v1.json +44 -0
- package/fixtures/support/invalid/leaky-support.v1.json +13 -0
- package/fixtures/support/valid/minimal-safe.v1.json +20 -0
- package/package.json +98 -0
- package/skills/claude/atelier-open/SKILL.md +68 -0
- package/skills/claude/mnstry-readiness/SKILL.md +41 -0
- package/skills/codex/atelier-open/SKILL.md +68 -0
- package/skills/codex/mnstry-readiness/SKILL.md +41 -0
- package/src/analysis/adapter.mjs +20 -0
- package/src/analysis/analysis-claim-contract.mjs +335 -0
- package/src/attestation/jcs.mjs +64 -0
- package/src/attestation/sign.mjs +305 -0
- package/src/boundary/content-rules.mjs +262 -0
- package/src/boundary/policy.mjs +806 -0
- package/src/check-atelier-export-contract.mjs +116 -0
- package/src/cli/run.mjs +283 -0
- package/src/collaboration/proposals.mjs +262 -0
- package/src/commands/analysis.mjs +8 -0
- package/src/commands/announcements.mjs +308 -0
- package/src/commands/attestation.mjs +198 -0
- package/src/commands/boundary.mjs +25 -0
- package/src/commands/config.mjs +4 -0
- package/src/commands/context.mjs +3 -0
- package/src/commands/distribution.mjs +224 -0
- package/src/commands/egress.mjs +11 -0
- package/src/commands/extension-pack.mjs +209 -0
- package/src/commands/feedback.mjs +3 -0
- package/src/commands/graph.mjs +3 -0
- package/src/commands/init.mjs +130 -0
- package/src/commands/lock.mjs +3 -0
- package/src/commands/project.mjs +3 -0
- package/src/commands/promote.mjs +4 -0
- package/src/commands/readiness.mjs +3 -0
- package/src/commands/server.mjs +6 -0
- package/src/commands/setup.mjs +250 -0
- package/src/commands/support.mjs +3 -0
- package/src/commands/upgrade.mjs +3 -0
- package/src/contracts/corpus.mjs +171 -0
- package/src/egress/check.mjs +45 -0
- package/src/egress/forbidden-egress.mjs +323 -0
- package/src/export/atelier-export-contract.mjs +722 -0
- package/src/extension-packs/loader.mjs +491 -0
- package/src/graph/graph.mjs +370 -0
- package/src/graph/knowledge-graph.mjs +887 -0
- package/src/harness/context-client.mjs +144 -0
- package/src/harness/context.mjs +27 -0
- package/src/index.mjs +88 -0
- package/src/project/config.mjs +557 -0
- package/src/project/file-class.mjs +113 -0
- package/src/project/git-ignore.mjs +31 -0
- package/src/project/path-match.mjs +30 -0
- package/src/project/repo-identity.mjs +176 -0
- package/src/projection/alignment-projection.mjs +169 -0
- package/src/projection/policy.mjs +90 -0
- package/src/projection/project.mjs +152 -0
- package/src/readiness/readiness.mjs +312 -0
- package/src/readiness-protocols/bundled-pack.mjs +766 -0
- package/src/readiness-protocols/runtime.mjs +419 -0
- package/src/server/local-sidecar.mjs +640 -0
- package/src/server/security.mjs +229 -0
- package/src/server/server.mjs +42 -0
- package/src/support/feedback-report.mjs +414 -0
- package/src/support/support-bundle.mjs +226 -0
- package/src/ui/html-primitives.mjs +104 -0
- package/src/upgrade/upgrade.mjs +701 -0
- package/src/validate-atelier-export-dry-run.mjs +75 -0
- package/templates/atelier.project.example.json +23 -0
- package/templates/distribution-workspace/.claude/launch.json +12 -0
- package/templates/distribution-workspace/README.md +86 -0
- package/templates/distribution-workspace/atelier.project.json +36 -0
- package/templates/distribution-workspace/boundary-policy.v1.json +61 -0
- package/templates/distribution-workspace/gitignore +29 -0
- package/templates/distribution-workspace/governance/repo-boundary-ledger.md +5 -0
- package/templates/distribution-workspace/project/README.md +19 -0
- package/templates/distribution-workspace/repo-access.v1.json +9 -0
- package/templates/launch.json +12 -0
- package/templates/private-domain-workspace/.claude/launch.json +12 -0
- package/templates/private-domain-workspace/README.md +50 -0
- package/templates/private-domain-workspace/atelier.project.json +28 -0
- package/templates/private-domain-workspace/boundary-policy.v1.json +54 -0
- package/templates/private-domain-workspace/domain/README.md +19 -0
- package/templates/private-domain-workspace/gitignore +29 -0
- package/templates/private-domain-workspace/governance/repo-boundary-ledger.md +4 -0
- package/templates/private-domain-workspace/repo-access.v1.json +9 -0
- package/templates/shared-project-workspace/.claude/launch.json +12 -0
- package/templates/shared-project-workspace/README.md +51 -0
- package/templates/shared-project-workspace/atelier.project.json +28 -0
- package/templates/shared-project-workspace/boundary-policy.v1.json +61 -0
- package/templates/shared-project-workspace/gitignore +29 -0
- package/templates/shared-project-workspace/governance/repo-boundary-ledger.md +5 -0
- package/templates/shared-project-workspace/project/README.md +19 -0
- package/templates/shared-project-workspace/repo-access.v1.json +9 -0
package/docs/install.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Install
|
|
2
|
+
|
|
3
|
+
Repo Boundary Guard V1 is a local-first pattern for Atelier workspaces. It
|
|
4
|
+
keeps private domain source in user-owned Git repositories and keeps shared
|
|
5
|
+
project work in shared project repositories.
|
|
6
|
+
|
|
7
|
+
## Posture
|
|
8
|
+
|
|
9
|
+
- No telemetry.
|
|
10
|
+
- No cloud service is required by Atelier.
|
|
11
|
+
- No MNSTRY runtime mutation.
|
|
12
|
+
- No direct browser writes or apply endpoints.
|
|
13
|
+
- No GitHub provisioning from this package.
|
|
14
|
+
|
|
15
|
+
Git repository access is the hard read boundary for source files. Local
|
|
16
|
+
`kg.audience` labels guide projection and review, but they do not hide files
|
|
17
|
+
from anyone who can read the repository.
|
|
18
|
+
|
|
19
|
+
Use `atelier` as the primary CLI command in copied workspaces. The older
|
|
20
|
+
`mnstry-atelier` binary is a legacy alias for compatibility.
|
|
21
|
+
|
|
22
|
+
## Install Shape
|
|
23
|
+
|
|
24
|
+
The registry is the distribution channel of record, as `docs/continuity.md`
|
|
25
|
+
commits:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install --save-dev @mnstry/atelier@0.2.0-alpha.1
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Installing from the matching Git tag resolves to the same reviewed commit:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.1"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Or over SSH:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.1"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Keep the `@mnstry/` scope. The unscoped name `atelier` on npm belongs to an
|
|
44
|
+
unrelated third-party package, so a bare `npx atelier` runs someone else's code.
|
|
45
|
+
|
|
46
|
+
Do not install from `v0.2.0-alpha.0`. That tag is the **contract epoch
|
|
47
|
+
marker** — `contracts/compat-baseline.json` pins the compatibility gate to it,
|
|
48
|
+
so it stays where it is permanently. It predates the current tree and carries
|
|
49
|
+
`publishConfig.access: "restricted"`.
|
|
50
|
+
|
|
51
|
+
The workspace `atelier.lock.json` should record the resolved version or Git
|
|
52
|
+
SHA from the install. Treat the tag or version as the friendly handle and the
|
|
53
|
+
SHA as the review authority.
|
|
54
|
+
|
|
55
|
+
Use one private domain repository per user:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
github.com/<org>/<github-login>-private-domain
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Use shared project repositories for project work that the team can read:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
github.com/<org>/project-<project-slug>
|
|
65
|
+
github.com/<org>/project-shared-library
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The repository names above are examples. Create and permission repositories in
|
|
69
|
+
GitHub or your internal Git host before pointing Atelier at them.
|
|
70
|
+
|
|
71
|
+
## Tenant Workspace Example
|
|
72
|
+
|
|
73
|
+
Default placeholder shape:
|
|
74
|
+
|
|
75
|
+
- Actor id: `tenant-user`
|
|
76
|
+
- GitHub login placeholder: `TENANT_GITHUB_LOGIN_PLACEHOLDER`
|
|
77
|
+
- Private domain repo: `github.com/<org>/tenant-private-domain`
|
|
78
|
+
- Shared project repo: `github.com/<org>/project-alpha`
|
|
79
|
+
|
|
80
|
+
`TENANT_GITHUB_LOGIN_PLACEHOLDER` is not a real account. Set real identity
|
|
81
|
+
values only inside the copied private workspace or through initializer flags.
|
|
82
|
+
The example repositories are placeholders, not repositories created by this
|
|
83
|
+
package release.
|
|
84
|
+
|
|
85
|
+
## Local Setup
|
|
86
|
+
|
|
87
|
+
Copy one of the starter templates:
|
|
88
|
+
|
|
89
|
+
- `templates/private-domain-workspace/` for one user's private domain repo.
|
|
90
|
+
- `templates/shared-project-workspace/` for shared project repositories.
|
|
91
|
+
|
|
92
|
+
Prefer the CLI initializer when possible:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
atelier init --template private-domain --target ./tenant-private-domain --actor tenant-user
|
|
96
|
+
atelier init --template shared-project --target ./project-alpha --actor tenant-user
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`--actor` rewrites the copied boundary policy actor entry and binds it to the
|
|
100
|
+
local Git email when available. Use `--github-login` or `--git-email` to set
|
|
101
|
+
those values explicitly during onboarding.
|
|
102
|
+
|
|
103
|
+
Then update:
|
|
104
|
+
|
|
105
|
+
- `atelier.project.json` repo paths.
|
|
106
|
+
- `repo-access.v1.json` read boundaries.
|
|
107
|
+
- `atelier.lock.json` with `atelier lock write` after choosing the exact Atelier package source.
|
|
108
|
+
- README placeholders for project names and Git remotes.
|
|
109
|
+
|
|
110
|
+
Keep project configuration tracked and local overlay state ignored. Track
|
|
111
|
+
`atelier.project.json`, `repo-access.v1.json`, `boundary-policy.v1.json`,
|
|
112
|
+
`atelier.lock.json`, and source documents. Do not track `atelier.local.json`,
|
|
113
|
+
`atelier.workspace.local.json`, `.atelier-local/`, proposals/current/presence/
|
|
114
|
+
nonce/grants/audit/session/support state, prompts, transcripts, support
|
|
115
|
+
bundles, or generated projections.
|
|
116
|
+
|
|
117
|
+
Run local-only checks from the copied workspace:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
atelier graph --project ./atelier.project.json
|
|
121
|
+
atelier project --project ./atelier.project.json
|
|
122
|
+
atelier readiness --project ./atelier.project.json
|
|
123
|
+
atelier readiness journey --project ./atelier.project.json
|
|
124
|
+
atelier readiness run mnstry.readiness:identity-map --project ./atelier.project.json
|
|
125
|
+
atelier readiness packet --project ./atelier.project.json
|
|
126
|
+
atelier readiness export --dry-run --project ./atelier.project.json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
These commands read local files and write generated local outputs only.
|
|
130
|
+
|
|
131
|
+
## Upgrade Path
|
|
132
|
+
|
|
133
|
+
The starter commands create `atelier.lock.json` inside the copied workspace so
|
|
134
|
+
the installed Atelier package source, version, contracts, and migration state
|
|
135
|
+
are reviewable. Refresh it from inside the copied workspace after choosing a
|
|
136
|
+
registry or Git tag install. Local tarballs remain release-audit and
|
|
137
|
+
smoke-test tools; they are not the default install path.
|
|
138
|
+
|
|
139
|
+
See `docs/tenant-readiness.md` for the readiness review format and
|
|
140
|
+
`docs/upgrade.md` for the full upgrade flow and boundary review checklist.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# MNSTRY Atelier Knowledge Graph
|
|
2
|
+
|
|
3
|
+
The Atelier knowledge graph is a local, Git-backed operating model for project
|
|
4
|
+
source material. It is not a taxonomy and it is not runtime retrieval. It is a
|
|
5
|
+
durable model of source nodes, evidence, relationships, diagnostics, and
|
|
6
|
+
projection readiness.
|
|
7
|
+
|
|
8
|
+
## Source Rules
|
|
9
|
+
|
|
10
|
+
- Markdown documents use front matter.
|
|
11
|
+
- Non-Markdown sources use adjacent `.kg.json` sidecars.
|
|
12
|
+
- `kg.id` is required and stable.
|
|
13
|
+
- `kg.audience` is required.
|
|
14
|
+
- `kg.visibility` is invalid in local source metadata.
|
|
15
|
+
- Declared relations emit semantic edges.
|
|
16
|
+
|
|
17
|
+
## Source formats
|
|
18
|
+
|
|
19
|
+
The graph is sidecar-first: Markdown front matter is the only inline metadata
|
|
20
|
+
format the kit reads, and every other file becomes a first-class node through
|
|
21
|
+
an adjacent `<file>.kg.json` sidecar
|
|
22
|
+
(`contracts/knowledge-source-sidecar.v1.schema.json`). This is how any format
|
|
23
|
+
— json, yaml, csv, images, arbitrary binaries — joins the census without
|
|
24
|
+
atelier ever parsing the foreign format itself.
|
|
25
|
+
|
|
26
|
+
Two census rules follow:
|
|
27
|
+
|
|
28
|
+
- Document extensions (`.md`, `.html`, `.pdf`, `.docx`) are always sources.
|
|
29
|
+
Non-Markdown documents *demand* a sidecar and fail closed without one.
|
|
30
|
+
- Any other file *opts in* by carrying a sidecar. Without one it is simply not
|
|
31
|
+
knowledge-graph material — no error, no node. A sidecar whose adjacent asset
|
|
32
|
+
is missing is still an orphan error either way.
|
|
33
|
+
|
|
34
|
+
A sidecar that Git ignores cannot enroll a file. Membership asks whether the
|
|
35
|
+
sidecar is *visible* in tracked state, not whether it exists on this disk: an
|
|
36
|
+
untracked, ignored `<file>.kg.json` is machine-local, so obeying one mints a
|
|
37
|
+
node — with whatever audience it declares, up to `public` — that appears in no
|
|
38
|
+
tracked file and on no other machine. The refusal runs both ways: an ignored
|
|
39
|
+
sidecar enrolls nothing and describes nothing, so a document-extension asset
|
|
40
|
+
whose only sidecar is ignored still fails closed with the ordinary
|
|
41
|
+
missing-sidecar error, which is the verdict a clean checkout reaches anyway.
|
|
42
|
+
Refused sidecars are named — a warning, `ignored-sidecar`, on `buildGraph`'s
|
|
43
|
+
`ignoredSidecarWarnings(project)` and on the workspace builder's
|
|
44
|
+
`ignoredSidecars`, printed by `atelier graph` — because dropping them silently
|
|
45
|
+
is what let the injection through. They are reported *beside* the graph and
|
|
46
|
+
never inside it: `buildGraph`'s return value is written verbatim as the
|
|
47
|
+
artifact, and a machine-local observation there would churn committed bytes
|
|
48
|
+
per machine, which is the failure the ignore filter exists to prevent.
|
|
49
|
+
|
|
50
|
+
The sidecar branch is binary-safe by construction: the asset's bytes are never
|
|
51
|
+
read. Identity, audience, and relations all come from the sidecar, so
|
|
52
|
+
audience-based projection filtering, disclosure diagnostics, and the repo
|
|
53
|
+
boundary guard treat a sidecar-described binary exactly like a Markdown
|
|
54
|
+
document.
|
|
55
|
+
|
|
56
|
+
Why the kit does not parse yaml (or csv, or anything else): the zero-dependency
|
|
57
|
+
trust posture. Node ships no yaml parser, and pulling one in — or hand-rolling
|
|
58
|
+
parsers for every format an adopter might commit — widens exactly the supply
|
|
59
|
+
chain and attack surface the kit exists to keep auditable. Declared metadata in
|
|
60
|
+
a schema-checked JSON sidecar is the trust boundary. Richer format adapters
|
|
61
|
+
that derive metadata from asset contents belong to extension packs
|
|
62
|
+
(`atelier-extension-pack.v1`), not the kit core.
|
|
63
|
+
|
|
64
|
+
## Census Rules
|
|
65
|
+
|
|
66
|
+
Graph and projection walks skip git-ignored paths. A committed artifact must
|
|
67
|
+
describe the repository, not one machine's working tree — if `.mnstry-local/`,
|
|
68
|
+
support bundles, editor scratch, or OS junk enter the census, every machine
|
|
69
|
+
produces different bytes for the same commit and multi-machine workspaces
|
|
70
|
+
rebase-conflict on every sync.
|
|
71
|
+
|
|
72
|
+
The check is one batched `git ls-files --others --ignored --exclude-standard
|
|
73
|
+
--directory` per repository root, not a per-file `git check-ignore`, which is
|
|
74
|
+
too slow to survive contact with a real workspace.
|
|
75
|
+
|
|
76
|
+
Repository *discovery* is deliberately not filtered this way: a git folder that
|
|
77
|
+
appears in the workspace is an explicit decision for the operator to make (see
|
|
78
|
+
the `external` repo kind), not something to drop silently.
|
|
79
|
+
|
|
80
|
+
Determinism is a tested contract. `test/graph-determinism.test.mjs` builds
|
|
81
|
+
twice, plants git-ignored junk between builds, and fails if any committed
|
|
82
|
+
artifact changes a byte. It also asserts the planted paths really are ignored,
|
|
83
|
+
so a dropped `.gitignore` pattern fails loudly rather than passing while the
|
|
84
|
+
churn quietly returns.
|
|
85
|
+
|
|
86
|
+
### Open decision: one writer
|
|
87
|
+
|
|
88
|
+
Determinism guards the trigger, not the underlying shape. Committing generated
|
|
89
|
+
artifacts and rebuilding them on every machine on every tick is inherently
|
|
90
|
+
collision-prone: any nondeterminism that slips back in — a new census input, a
|
|
91
|
+
Node version difference, a timestamp — reproduces the churn, and a machine that
|
|
92
|
+
cannot fast-forward keeps publishing its own build, which is self-sustaining.
|
|
93
|
+
|
|
94
|
+
The durable fixes are one-writer postures: generate in CI only, or stop
|
|
95
|
+
committing projections and build them on demand. This is not yet decided. When
|
|
96
|
+
the kit formalizes projection workflows for multi-machine adopters, one of those
|
|
97
|
+
should become the documented default, with committed artifacts treated as the
|
|
98
|
+
single-machine special case.
|
|
99
|
+
|
|
100
|
+
## Projection Rules
|
|
101
|
+
|
|
102
|
+
The graph feeds local views, readiness reports, and dry-run exports. A local
|
|
103
|
+
projection may hide or emphasize material for a stakeholder, but it does not
|
|
104
|
+
enforce object-level permissions. If enforcement is required, the project must
|
|
105
|
+
use Git repo access locally or MNSTRY runtime permissions after import.
|
|
106
|
+
|
|
107
|
+
## Collaboration Rules
|
|
108
|
+
|
|
109
|
+
Git authorship is the primary local attribution signal. Actor and harness
|
|
110
|
+
annotations are advisory context. Sensitive semantic fields should fail closed
|
|
111
|
+
without an explicit review marker, while ordinary authored files can use normal
|
|
112
|
+
Git merge/review workflows.
|
|
113
|
+
|
|
114
|
+
## File Classification
|
|
115
|
+
|
|
116
|
+
Every file the kit ships or generates belongs to one of three classes, declared
|
|
117
|
+
once in the kit manifest's `fileClasses` and resolved through
|
|
118
|
+
`classifyPath(path, { repoRole })`:
|
|
119
|
+
|
|
120
|
+
| Class | Meaning | Safe automated handling |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| `source` | canonical, human or agent authored | never discard; conflicts need a human |
|
|
123
|
+
| `generated-projection` | rebuilt deterministically every tick | discard and regenerate freely |
|
|
124
|
+
| `distributed-runtime-copy` | canonical in ONE repo role, copied into consumers by runtime sync | rederivable in consumers, canonical where it is owned |
|
|
125
|
+
|
|
126
|
+
A `distributed-runtime-copy` **must** declare `canonicalRepoRole`. This is the
|
|
127
|
+
part that cannot be skipped: name-matching alone cannot tell the repo that owns
|
|
128
|
+
a file from the repos that merely receive it. A self-repair loop that treats a
|
|
129
|
+
runtime copy as authored work wedges the consumer in permanent rebase conflict;
|
|
130
|
+
a sync loop that folds it into a plain "generated" list silently destroys
|
|
131
|
+
canonical edits in the repo where it is source. The same path therefore resolves
|
|
132
|
+
to `source` in its canonical role and `distributed-runtime-copy` everywhere else.
|
|
133
|
+
|
|
134
|
+
Unclassified paths default to `source`, the fail-closed answer — never discarded.
|
|
135
|
+
Later entries win, as in `.gitignore`, so an adopter can narrow a kit default by
|
|
136
|
+
appending a more specific pattern.
|
|
137
|
+
|
|
138
|
+
Adapters must not maintain shadow lists. `test/file-class.test.mjs` asserts the
|
|
139
|
+
kit itself keeps no second copy: the graph walker's skip list is derived from the
|
|
140
|
+
declaration, and the glob dialect lives in one module.
|
package/docs/ontology.md
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Atelier export ontology
|
|
2
|
+
|
|
3
|
+
The public vocabulary of the `atelier-export@v1` contract: the nine runtime
|
|
4
|
+
owner terms, the object classes and export collections they govern, the six
|
|
5
|
+
runtime targets an export may address, and the boundary between local
|
|
6
|
+
`audience` and runtime `visibility`. Everything on this page is defined by
|
|
7
|
+
the published schemas and the dry-run validator that ship in this package.
|
|
8
|
+
|
|
9
|
+
## MNSTRY's format, offered openly
|
|
10
|
+
|
|
11
|
+
The Atelier export format is MNSTRY's format, offered openly. Conformance is
|
|
12
|
+
public and offline: the contracts, fixtures, and dry-run validator are all in
|
|
13
|
+
this package, and anyone can check a document against them without a MNSTRY
|
|
14
|
+
account, a network connection, or MNSTRY's involvement. Admission is a
|
|
15
|
+
separate and narrower decision: MNSTRY's private validator only ever decides
|
|
16
|
+
admission into a MNSTRY runtime. It never redefines conformance, and a
|
|
17
|
+
document it declines can still be fully conformant. Nothing in this
|
|
18
|
+
vocabulary requires MNSTRY approval to use.
|
|
19
|
+
|
|
20
|
+
## How ownership is declared
|
|
21
|
+
|
|
22
|
+
An export document declares, in `importPlan.runtimeOwners`, which runtime
|
|
23
|
+
owner governs each object class it ships. An owner is an area of runtime
|
|
24
|
+
authority — a named accountability for a category of governed records — not a
|
|
25
|
+
module, a table, or a service. The owner enum is closed:
|
|
26
|
+
|
|
27
|
+
`identity`, `catalog`, `commitments`, `events`, `projection`, `consent`,
|
|
28
|
+
`messaging`, `providers`, `audit`
|
|
29
|
+
|
|
30
|
+
Ownership assignments are made per document and reviewed at admission. The
|
|
31
|
+
mapping from export collections to runtime targets, by contrast, is fixed by
|
|
32
|
+
the contract and is not negotiable per document.
|
|
33
|
+
|
|
34
|
+
Two namespace notes, because the same words appear at different levels:
|
|
35
|
+
|
|
36
|
+
- The owner `consent` and the object class `consent_boundary` are different
|
|
37
|
+
namespaces. The class names a kind of exported object; the owner names the
|
|
38
|
+
runtime authority that governs objects of that kind.
|
|
39
|
+
- The owner `projection` and the local generated projection are different
|
|
40
|
+
things. The local projection is a development preview of source material on
|
|
41
|
+
your machine; the owner term names the runtime authority over what is
|
|
42
|
+
actually shown to people.
|
|
43
|
+
|
|
44
|
+
## The six runtime targets
|
|
45
|
+
|
|
46
|
+
Every export collection maps to exactly one runtime target. Any declared
|
|
47
|
+
target field anywhere in a document (`runtimeObject`, `targetObject`,
|
|
48
|
+
`targetClass`, and their snake_case forms) must name one of these six values;
|
|
49
|
+
anything else is a semantic-profile violation.
|
|
50
|
+
|
|
51
|
+
| Runtime target | Meaning | Export collections |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `content.material` | Readable and renderable content | `offers`, `surfaces`, `sdui` |
|
|
54
|
+
| `core.artifact` | Reviewable records and documents | `consentBoundaries`, `staffPrep`, `providerEgress` |
|
|
55
|
+
| `core.trackable` | Measurable signals over time | `trackables` |
|
|
56
|
+
| `scheduling.commitment` | Commitment paths and scheduled steps | `commitmentPaths` |
|
|
57
|
+
| `space.space` | Spaces where activity happens | `spaces` |
|
|
58
|
+
| `space.provision` | Provisioning of a space or provider capacity | (declared directly by readiness mappings) |
|
|
59
|
+
|
|
60
|
+
The same mapping applies to import object classes: `offer`, `public_surface`,
|
|
61
|
+
`surface`, and `sdui_block` target `content.material`; `commitment_path`
|
|
62
|
+
targets `scheduling.commitment`; `space` targets `space.space`; `trackable`
|
|
63
|
+
targets `core.trackable`; and `consent_boundary`, `staff_prep`, and
|
|
64
|
+
`provider_egress` target `core.artifact`.
|
|
65
|
+
|
|
66
|
+
## Audience and visibility
|
|
67
|
+
|
|
68
|
+
These are two different vocabularies and the contract keeps them apart.
|
|
69
|
+
|
|
70
|
+
**Audience** is local readership: `public`, `team`, `operator`, `staff`,
|
|
71
|
+
`private`, `sensitive`. It classifies who source material is written for and
|
|
72
|
+
whether it is eligible for projection. It is not a security boundary —
|
|
73
|
+
repository access is the read boundary, and an audience label does not hide a
|
|
74
|
+
file from anyone who can read the repository. Provenance source nodes carry
|
|
75
|
+
`audience` and never `visibility`.
|
|
76
|
+
|
|
77
|
+
**Visibility** is runtime authority: `private`, `shared`, `platform`,
|
|
78
|
+
`public`. It is a security boundary on governed runtime objects, and the
|
|
79
|
+
runtime default is private. Export objects carry `visibility` and never a
|
|
80
|
+
local audience value.
|
|
81
|
+
|
|
82
|
+
The validator enforces the separation in both directions: a local audience
|
|
83
|
+
value appearing in a `visibility` field is rejected, a `visibility` key on a
|
|
84
|
+
source node is rejected, and any object with public visibility must resolve
|
|
85
|
+
its source references exclusively to public-audience source nodes.
|
|
86
|
+
|
|
87
|
+
## The nine owner terms
|
|
88
|
+
|
|
89
|
+
Each section gives the term's definition, what it governs in an export
|
|
90
|
+
document, and what admission review checks for material assigned to it. The
|
|
91
|
+
"governs" lists describe the characteristic assignments made by the bundled
|
|
92
|
+
readiness protocols and the sample fixtures; a document may propose others,
|
|
93
|
+
and the proposal is what admission review reviews.
|
|
94
|
+
|
|
95
|
+
### identity
|
|
96
|
+
|
|
97
|
+
Runtime authority over who someone is: accounts, actors, roles, and the link
|
|
98
|
+
between locally described actors and governed identity records.
|
|
99
|
+
|
|
100
|
+
Governs: no export collection creates identity records. Identity-owned
|
|
101
|
+
material arrives as review artifacts (`staffPrep` entries targeting
|
|
102
|
+
`core.artifact`) that describe actors and their roles.
|
|
103
|
+
|
|
104
|
+
Admission review checks: every actor description carries source evidence and
|
|
105
|
+
a declared owner; role claims trace to sources; nothing in the document
|
|
106
|
+
creates or mutates an identity record.
|
|
107
|
+
|
|
108
|
+
### catalog
|
|
109
|
+
|
|
110
|
+
Runtime authority over what is offered: offers, their components, and their
|
|
111
|
+
pricing.
|
|
112
|
+
|
|
113
|
+
Governs: `offer` objects (the `offers` collection, targeting
|
|
114
|
+
`content.material`).
|
|
115
|
+
|
|
116
|
+
Admission review checks: pricing uses ISO-4217 currency codes and integer
|
|
117
|
+
minor-unit amounts; every offer component carries an approval status; a
|
|
118
|
+
public offer resolves only public-audience sources.
|
|
119
|
+
|
|
120
|
+
### commitments
|
|
121
|
+
|
|
122
|
+
Runtime authority over what participants commit to: commitment paths and the
|
|
123
|
+
scheduled steps inside them.
|
|
124
|
+
|
|
125
|
+
Governs: `commitment_path` objects (the `commitmentPaths` collection,
|
|
126
|
+
targeting `scheduling.commitment`).
|
|
127
|
+
|
|
128
|
+
Admission review checks: the plan is dry-run only — no scheduling writes;
|
|
129
|
+
every step is present as reviewable material rather than an instruction to
|
|
130
|
+
execute.
|
|
131
|
+
|
|
132
|
+
### events
|
|
133
|
+
|
|
134
|
+
Runtime authority over what happened: measurable signals recorded over time.
|
|
135
|
+
|
|
136
|
+
Governs: `trackable` objects (the `trackables` collection, targeting
|
|
137
|
+
`core.trackable`).
|
|
138
|
+
|
|
139
|
+
Admission review checks: every trackable declares a runtime owner and a
|
|
140
|
+
proposed runtime visibility; no local audience value leaks into a visibility
|
|
141
|
+
field.
|
|
142
|
+
|
|
143
|
+
### projection
|
|
144
|
+
|
|
145
|
+
Runtime authority over what is shown: surfaces, generated display blocks, and
|
|
146
|
+
the presented shape of spaces.
|
|
147
|
+
|
|
148
|
+
Governs: `public_surface`, `surface`, and `sdui_block` objects (the
|
|
149
|
+
`surfaces` and `sdui` collections, targeting `content.material`), and
|
|
150
|
+
presentation-side `space` material.
|
|
151
|
+
|
|
152
|
+
Admission review checks: public surfaces resolve exclusively to
|
|
153
|
+
public-audience source nodes; the visibility gate defaults to private with a
|
|
154
|
+
public-only source policy; an export from a dirty working tree must declare
|
|
155
|
+
`forced: true` and carry a non-empty taint list.
|
|
156
|
+
|
|
157
|
+
### consent
|
|
158
|
+
|
|
159
|
+
Runtime authority over what has been agreed to: consent boundaries and their
|
|
160
|
+
exceptions.
|
|
161
|
+
|
|
162
|
+
Governs: `consent_boundary` objects (the `consentBoundaries` collection,
|
|
163
|
+
targeting `core.artifact`).
|
|
164
|
+
|
|
165
|
+
Admission review checks: boundaries default to private visibility; every
|
|
166
|
+
exception is visible to audit; consent material fails closed — missing or
|
|
167
|
+
ambiguous consent evidence blocks rather than warns.
|
|
168
|
+
|
|
169
|
+
### messaging
|
|
170
|
+
|
|
171
|
+
Runtime authority over what is sent to people: outbound messages and
|
|
172
|
+
notifications.
|
|
173
|
+
|
|
174
|
+
Governs: no bundled export collection maps to messaging. The term exists in
|
|
175
|
+
the owner enum so a document can propose messaging ownership for review — for
|
|
176
|
+
example, a journey handoff that would eventually notify a participant.
|
|
177
|
+
Nothing in this format sends anything.
|
|
178
|
+
|
|
179
|
+
Admission review checks: messaging-owned material is proposal-only; the
|
|
180
|
+
document demonstrates that no send occurs locally and that any eventual send
|
|
181
|
+
would be governed at the runtime.
|
|
182
|
+
|
|
183
|
+
### providers
|
|
184
|
+
|
|
185
|
+
Runtime authority over external service relationships: provider egress and
|
|
186
|
+
the provisioning behind spaces.
|
|
187
|
+
|
|
188
|
+
Governs: `provider_egress` objects (the `providerEgress` collection,
|
|
189
|
+
targeting `core.artifact`) and provisioning review material targeting
|
|
190
|
+
`space.provision`.
|
|
191
|
+
|
|
192
|
+
Admission review checks: egress is declared, never performed; each declared
|
|
193
|
+
provider crossing names its provider class and is individually reviewable.
|
|
194
|
+
|
|
195
|
+
### audit
|
|
196
|
+
|
|
197
|
+
Runtime authority over the record of decisions: evidence, review trails, and
|
|
198
|
+
the trackables that prove a review happened.
|
|
199
|
+
|
|
200
|
+
Governs: review artifacts (`staffPrep` entries targeting `core.artifact`) and
|
|
201
|
+
review-trail trackables (the `trackables` collection, targeting
|
|
202
|
+
`core.trackable`).
|
|
203
|
+
|
|
204
|
+
Admission review checks: decisions leave a trail; evidence references resolve
|
|
205
|
+
to provenance source nodes or to export objects that themselves carry
|
|
206
|
+
provenance; nothing is silently dropped.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Release engineering
|
|
2
|
+
|
|
3
|
+
This document describes the enforcement surface for the Atelier package: the
|
|
4
|
+
release gates, the CI lanes, the fork policy, and the version-bump surface.
|
|
5
|
+
Every gate named here fails closed and reports findings as a generic label plus
|
|
6
|
+
a location, never the matched content.
|
|
7
|
+
|
|
8
|
+
## Gates
|
|
9
|
+
|
|
10
|
+
### release:audit
|
|
11
|
+
|
|
12
|
+
`npm run release:audit` (`scripts/check-release-tarball.mjs`) audits the exact
|
|
13
|
+
tarball `npm pack` would publish:
|
|
14
|
+
|
|
15
|
+
- Package metadata: name, license, exposed CLI bins, and a mandatory `files`
|
|
16
|
+
allowlist in `package.json`.
|
|
17
|
+
- Tarball allowlist: every packed path must match a known-good pattern; any
|
|
18
|
+
unexpected file fails the audit.
|
|
19
|
+
- Content scan: every packed file is scanned against committed structural
|
|
20
|
+
patterns (absolute user paths, machine-local temp paths, agent-local state
|
|
21
|
+
paths, key material, secret-like assignments) and against the maintainer-held
|
|
22
|
+
denylist described below.
|
|
23
|
+
- Version drift: `CHANGELOG.md` must contain a `## <version>` heading and
|
|
24
|
+
`README.md` must mention the version. The expected version and tarball name
|
|
25
|
+
are derived from `package.json`, never hardcoded.
|
|
26
|
+
|
|
27
|
+
Exit codes: `0` clean, `1` findings, `2` configuration error (for example an
|
|
28
|
+
unavailable denylist without explicit acknowledgment).
|
|
29
|
+
|
|
30
|
+
### repo:check
|
|
31
|
+
|
|
32
|
+
`npm run repo:check` (`scripts/check-repo-disclosure.mjs`) sweeps the whole
|
|
33
|
+
Git-tracked tree, not just the tarball:
|
|
34
|
+
|
|
35
|
+
- Default mode scans every tracked text file line-by-line with the structural
|
|
36
|
+
patterns and the denylist.
|
|
37
|
+
- `--staged` scans staged changes only, for local pre-commit use.
|
|
38
|
+
- `--structural-only` is the intentional no-denylist lane used by CI jobs that
|
|
39
|
+
run without secrets.
|
|
40
|
+
- `--commits <none|range|all>` adds the commit-identity gate and scans commit
|
|
41
|
+
messages in the selected range with the same patterns.
|
|
42
|
+
|
|
43
|
+
Exit codes match `release:audit`: `0` clean, `1` findings, `2` configuration or
|
|
44
|
+
usage error.
|
|
45
|
+
|
|
46
|
+
### Commit-identity gate
|
|
47
|
+
|
|
48
|
+
Part of `repo:check --commits`. Commit authors must match a hardcoded
|
|
49
|
+
maintainer allowlist; committers additionally allow GitHub's merge identity,
|
|
50
|
+
which GitHub-UI merges reintroduce. The allowlist is committed and reviewable
|
|
51
|
+
in the script — it is not a secret.
|
|
52
|
+
|
|
53
|
+
### migrations:check
|
|
54
|
+
|
|
55
|
+
`npm run migrations:check` (`scripts/check-breaking-migrations.mjs`) keeps the
|
|
56
|
+
changelog and the migration registry honest about breaking changes:
|
|
57
|
+
|
|
58
|
+
- Every `**Breaking:**` changelog entry must match exactly one entry in
|
|
59
|
+
`scripts/breaking-changes.map.json`, and every map entry must match exactly
|
|
60
|
+
one changelog entry (no stale exemptions).
|
|
61
|
+
- Map entries with a migration disposition must name an active breaking
|
|
62
|
+
migration in the registry, and every active breaking migration must be
|
|
63
|
+
referenced by the map.
|
|
64
|
+
- Exempt entries require a non-empty reason and a date.
|
|
65
|
+
- Every registered migration record is re-validated against the migration
|
|
66
|
+
record contract.
|
|
67
|
+
|
|
68
|
+
### egress:check
|
|
69
|
+
|
|
70
|
+
`npm run egress:check` (`atelier egress check`) scans package runtime paths for
|
|
71
|
+
forbidden non-localhost egress. The package claims no network egress in runtime
|
|
72
|
+
paths; this gate is the mechanical check behind that claim.
|
|
73
|
+
|
|
74
|
+
### consumer:smoke
|
|
75
|
+
|
|
76
|
+
`npm run consumer:smoke` (`scripts/consumer-smoke.mjs`) packs the real tarball,
|
|
77
|
+
installs it offline into a throwaway consumer project with lifecycle scripts
|
|
78
|
+
disabled, and imports the public API to validate a sample export. It proves the
|
|
79
|
+
tarball is installable and functional exactly as a consumer receives it.
|
|
80
|
+
|
|
81
|
+
### Egress-marker inventory
|
|
82
|
+
|
|
83
|
+
The local-computed egress allow marker disables unresolved-target egress
|
|
84
|
+
detection for a small window around each use, so its spread is pinned:
|
|
85
|
+
`test/egress-marker-inventory.test.mjs` asserts the exact files and occurrence
|
|
86
|
+
counts where the marker may appear. Widening that inventory is a reviewed
|
|
87
|
+
decision, not a mechanical edit.
|
|
88
|
+
|
|
89
|
+
## Denylist mechanism
|
|
90
|
+
|
|
91
|
+
Beyond the committed structural patterns, content scans apply a maintainer-held
|
|
92
|
+
pattern list supplied via the `ATELIER_RELEASE_DENYLIST` CI secret or a local
|
|
93
|
+
gitignored file (`release-denylist.local.json`); the `ATELIER_DENYLIST_JSON`
|
|
94
|
+
environment variable takes precedence over the file. Every audit fails closed
|
|
95
|
+
when the list is absent; setting `ATELIER_ALLOW_MISSING_DENYLIST=1` explicitly
|
|
96
|
+
acknowledges a structural-only run.
|
|
97
|
+
|
|
98
|
+
Findings are reported as label plus location, never content — neither the
|
|
99
|
+
pattern source nor the matched text is printed, and a pattern compile error
|
|
100
|
+
prints the label only. Labels are themselves kept generic and are
|
|
101
|
+
maintainer-reviewed before entering the list.
|
|
102
|
+
|
|
103
|
+
## CI lanes
|
|
104
|
+
|
|
105
|
+
Four jobs run on pushes to `main` and on pull requests, and all four are
|
|
106
|
+
required status checks:
|
|
107
|
+
|
|
108
|
+
- `test`: syntax check (`node --check`, not a type system), the full test suite, contract checks, `egress:check`, and
|
|
109
|
+
`migrations:check`. This job sets `ATELIER_ALLOW_MISSING_DENYLIST=1` scoped
|
|
110
|
+
to the job only — denylist assertions belong to the secret lane.
|
|
111
|
+
- `consumer-smoke`: warms the npm cache with `npm ci` (the offline tarball
|
|
112
|
+
install needs the registry dependencies cached), then runs
|
|
113
|
+
`npm run consumer:smoke`.
|
|
114
|
+
- `structural-sweep`: runs `repo:check --structural-only` with the
|
|
115
|
+
commit-identity gate over the pull-request range; on push builds the
|
|
116
|
+
`ATELIER_COMMIT_SCAN` repository variable selects the commit scan depth. No
|
|
117
|
+
secrets are required, so this lane runs for fork pull requests.
|
|
118
|
+
- `secret-sweep`: the only lane with access to the denylist. It runs the full
|
|
119
|
+
`repo:check` (with the configured commit scan) and `release:audit`.
|
|
120
|
+
|
|
121
|
+
## Fork policy
|
|
122
|
+
|
|
123
|
+
Fork pull requests never receive repository secrets, so `secret-sweep` cannot
|
|
124
|
+
pass in place. The job fails explicitly rather than skipping — GitHub treats a
|
|
125
|
+
skipped job as satisfying a required status check, so an explicit failure is
|
|
126
|
+
the only safe block.
|
|
127
|
+
|
|
128
|
+
To clear a fork pull request, a maintainer verifies the head SHA and dispatches
|
|
129
|
+
the `fork-sweep` workflow with the pull-request number and that SHA. The
|
|
130
|
+
workflow runs the trusted scanner from `main` against the fork's tree checked
|
|
131
|
+
out as data — it never installs or executes anything from the untrusted tree —
|
|
132
|
+
re-verifies that the head SHA has not moved, and posts a `secret-sweep` check
|
|
133
|
+
run on the SHA. The newest check run with that name supersedes the earlier
|
|
134
|
+
failure for branch protection.
|
|
135
|
+
|
|
136
|
+
`release:audit` never runs against untrusted code (`npm pack` executes
|
|
137
|
+
lifecycle scripts); it re-runs on the push build of the merge commit. No
|
|
138
|
+
workflow uses `pull_request_target`.
|
|
139
|
+
|
|
140
|
+
## Version-bump surface
|
|
141
|
+
|
|
142
|
+
A version bump touches exactly:
|
|
143
|
+
|
|
144
|
+
- `package.json` (`version`)
|
|
145
|
+
- `CHANGELOG.md` (a `## <version>` heading)
|
|
146
|
+
- the pinned install tags in `README.md`, `docs/install.md`,
|
|
147
|
+
and `docs/upgrade.md`
|
|
148
|
+
|
|
149
|
+
The release scripts derive the expected version and tarball name from
|
|
150
|
+
`package.json`, so they are not part of the bump surface, and `release:audit`
|
|
151
|
+
fails when the changelog heading or the README mention lags the bump.
|