@mnstry/atelier 0.2.0-alpha.1 → 0.2.0-alpha.10
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 +372 -0
- package/README.md +402 -205
- package/SECURITY.md +6 -1
- package/contracts/atelier-adoption-policy.v1.schema.json +49 -0
- package/contracts/atelier-coauthor.v1.schema.json +163 -0
- package/contracts/atelier-decision-request.v1.schema.json +476 -0
- package/contracts/atelier-decision-result.v1.schema.json +500 -0
- package/contracts/atelier-guide.v1.schema.json +227 -0
- package/contracts/atelier-intake.v1.schema.json +151 -0
- package/contracts/atelier-migration.v2.schema.json +61 -0
- package/contracts/atelier-obsidian-acceptance-receipt.v1.schema.json +211 -0
- package/contracts/atelier-obsidian-apply-policy.v1.schema.json +298 -0
- package/contracts/atelier-obsidian-corpus-profile.v1.schema.json +98 -0
- package/contracts/atelier-obsidian-edit-operation.v1.schema.json +138 -0
- package/contracts/atelier-obsidian-ext-settings.v1.schema.json +287 -0
- package/contracts/atelier-obsidian-generation-manifest.v1.schema.json +353 -0
- package/contracts/atelier-obsidian-proposal-receipt.v1.schema.json +110 -0
- package/contracts/atelier-obsidian-publication-journal.v1.schema.json +167 -0
- package/contracts/atelier-obsidian-scope.v1.schema.json +264 -0
- package/contracts/atelier-obsidian-service-state.v1.schema.json +149 -0
- package/contracts/atelier-obsidian-source-snapshot.v1.schema.json +179 -0
- package/contracts/atelier-pane-presentation.v1.schema.json +76 -0
- package/contracts/atelier-presentation.v1.schema.json +1293 -0
- package/contracts/atelier-repository-observation.v1.schema.json +163 -0
- package/contracts/atelier-review.v1.schema.json +1601 -0
- package/contracts/atelier-skill-steward.v1.schema.json +692 -0
- package/contracts/atelier-upgrade-plan.v2.schema.json +398 -0
- package/contracts/atelier-upgrade-receipt.v1.schema.json +99 -0
- package/contracts/atelier-vault-publication.v1.schema.json +58 -0
- package/contracts/public-api-baseline.json +57 -0
- package/docs/assurance-controls.md +49 -0
- package/docs/atelier-runtime.md +28 -2
- package/docs/atelier-sync.md +172 -0
- package/docs/blocks/audience-visibility.md +9 -0
- package/docs/blocks/claims.md +61 -0
- package/docs/blocks/conformance-admission.md +15 -0
- package/docs/blocks/will-not-do.md +18 -0
- package/docs/coauthor-session.md +57 -0
- package/docs/connected-composition.md +75 -0
- package/docs/continuity.md +3 -4
- package/docs/decisions.md +167 -0
- package/docs/design.md +167 -0
- package/docs/exact-upgrades.md +159 -0
- package/docs/extension-pack-lifecycle.md +33 -0
- package/docs/guided-upgrades.md +99 -0
- package/docs/install.md +99 -16
- package/docs/intake-and-guides.md +65 -0
- package/docs/integration-and-review-plan.md +409 -0
- package/docs/integration-contract-decisions.md +22 -0
- package/docs/knowledge-graph.md +8 -4
- package/docs/local-review.md +84 -0
- package/docs/local-services.md +328 -0
- package/docs/local-state.md +107 -0
- package/docs/obsidian-contract.md +690 -0
- package/docs/obsidian.md +423 -0
- package/docs/portable-presentation.md +328 -0
- package/docs/presentation-consumer-boundaries.md +75 -0
- package/docs/presentation-review-disposition.md +47 -0
- package/docs/project-command-inventory.md +38 -0
- package/docs/project-options.md +53 -0
- package/docs/release-engineering.md +174 -12
- package/docs/repo-boundary-guard.md +12 -2
- package/docs/review-portability.md +55 -0
- package/docs/skill-steward.md +156 -0
- package/docs/upgrade.md +146 -5
- package/docs/vault-service.md +292 -0
- package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
- package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
- package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
- package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
- package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
- package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
- package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
- package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
- package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
- package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
- package/fixtures/atelier-intake/valid/source.v1.json +7 -0
- 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/atelier-review/invalid/authenticated-identity.v1.json +22 -0
- package/fixtures/atelier-review/valid/bound.v1.json +229 -0
- package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
- package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
- package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
- package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
- package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
- package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
- package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
- package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
- package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
- package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
- package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
- package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
- package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
- package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
- package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
- package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
- package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
- package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
- package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
- package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
- package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
- package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
- package/fixtures/decisions/request/valid/triage.v1.json +60 -0
- package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
- package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
- package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
- package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
- package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
- package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
- package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
- package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
- package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
- package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
- package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
- package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
- package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
- package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
- package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
- package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
- package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
- package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
- package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
- package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
- package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
- package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
- package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
- package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
- package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
- package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
- package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
- package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
- package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
- package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
- package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
- package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
- package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
- package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
- package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
- package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
- package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
- package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
- package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
- package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
- package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
- package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
- package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
- package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
- package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
- package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
- package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
- package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
- package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
- package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
- package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
- package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
- package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
- package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
- package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
- package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
- package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
- package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
- package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
- package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
- package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
- package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
- package/fixtures/obsidian/edits/workspace.json +65 -0
- package/fixtures/obsidian/materialization/expected-full.json +99 -0
- package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
- package/fixtures/obsidian/materialization/workspace.json +54 -0
- package/fixtures/obsidian/proposals/expected-shapes.json +11 -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/fixtures/ui/presentation/pane.v1.json +7 -0
- package/fixtures/ui/presentation/reference.v1.json +293 -0
- package/package.json +86 -10
- package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
- package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
- package/skills/claude/atelier-local-service/SKILL.md +47 -0
- package/skills/claude/atelier-open/SKILL.md +11 -5
- package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
- package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
- package/skills/claude/mnstry-readiness/SKILL.md +5 -0
- package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
- package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
- package/skills/codex/atelier-local-service/SKILL.md +47 -0
- package/skills/codex/atelier-open/SKILL.md +11 -5
- package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
- package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
- package/skills/codex/mnstry-readiness/SKILL.md +5 -0
- package/src/access/preview-enforcer.mjs +84 -0
- package/src/boundary/content-rules.mjs +283 -20
- package/src/boundary/policy.mjs +213 -91
- package/src/cli/execute-command.mjs +36 -0
- package/src/cli/project-options.mjs +58 -0
- package/src/cli/run.mjs +78 -10
- package/src/coauthor/session.mjs +161 -0
- package/src/coauthor/store.mjs +173 -0
- package/src/collaboration/event-ledger.mjs +348 -0
- package/src/collaboration/index.mjs +17 -0
- package/src/collaboration/inspection-bundle.mjs +223 -0
- package/src/collaboration/proposals.mjs +265 -65
- package/src/collaboration/review-contracts.mjs +25 -0
- package/src/collaboration/review-store.mjs +305 -0
- package/src/commands/attestation.mjs +20 -6
- package/src/commands/coauthor.mjs +26 -0
- package/src/commands/config.mjs +6 -1
- package/src/commands/disclosure.mjs +133 -0
- package/src/commands/distribution.mjs +2 -1
- package/src/commands/extension-pack.mjs +17 -9
- package/src/commands/init.mjs +46 -6
- package/src/commands/obsidian.mjs +371 -0
- package/src/commands/review.mjs +147 -0
- package/src/commands/server.mjs +1 -4
- package/src/commands/setup.mjs +51 -14
- package/src/commands/skills.mjs +199 -0
- package/src/commands/sync.mjs +107 -0
- package/src/composition/registry.mjs +27 -0
- package/src/composition/wire.mjs +122 -0
- package/src/contracts/corpus.mjs +35 -0
- package/src/decisions/contracts.d.mts +96 -0
- package/src/decisions/contracts.mjs +321 -0
- package/src/disclosure/content-scan.mjs +206 -0
- package/src/egress/check.mjs +7 -38
- package/src/egress/forbidden-egress.mjs +32 -18
- package/src/export/atelier-export-contract.mjs +16 -1
- package/src/extension-packs/lifecycle.mjs +154 -0
- package/src/graph/graph.mjs +176 -316
- package/src/graph/knowledge-graph.mjs +643 -43
- package/src/guides/contracts.mjs +54 -0
- package/src/harness/context-client.mjs +9 -1
- package/src/index.mjs +41 -0
- package/src/intake/store.mjs +119 -0
- package/src/preview/channel.mjs +89 -0
- package/src/project/config.mjs +112 -52
- package/src/project/durable-state.mjs +161 -0
- package/src/project/file-class.mjs +180 -0
- package/src/project/package-root.mjs +10 -0
- package/src/project/path-match.mjs +38 -15
- package/src/project/private-state.mjs +120 -0
- package/src/projection/obsidian/contracts.mjs +571 -0
- package/src/projection/obsidian/edits/align.mjs +169 -0
- package/src/projection/obsidian/edits/apply.mjs +889 -0
- package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
- package/src/projection/obsidian/edits/contribution.mjs +108 -0
- package/src/projection/obsidian/edits/index.mjs +19 -0
- package/src/projection/obsidian/edits/object-identity.mjs +61 -0
- package/src/projection/obsidian/edits/object-store.mjs +517 -0
- package/src/projection/obsidian/edits/observe.mjs +123 -0
- package/src/projection/obsidian/edits/policy.mjs +123 -0
- package/src/projection/obsidian/edits/regions.mjs +648 -0
- package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
- package/src/projection/obsidian/materialize/index.mjs +7 -0
- package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
- package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
- package/src/projection/obsidian/materialize/settings.mjs +57 -0
- package/src/projection/obsidian/materialize/stage.mjs +27 -0
- package/src/projection/obsidian/proposals/adapter.mjs +572 -0
- package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
- package/src/projection/obsidian/proposals/contribution.mjs +55 -0
- package/src/projection/obsidian/proposals/index.mjs +23 -0
- package/src/projection/obsidian/proposals/observation.mjs +216 -0
- package/src/projection/obsidian/proposals/queue.mjs +277 -0
- package/src/projection/obsidian/proposals/router.mjs +168 -0
- package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
- package/src/projection/obsidian/publication/exchange.mjs +117 -0
- package/src/projection/obsidian/publication/index.mjs +5 -0
- package/src/projection/obsidian/publication/publisher.mjs +588 -0
- package/src/projection/obsidian/publication/test-seam.mjs +16 -0
- package/src/projection/obsidian/publication/transport.mjs +160 -0
- package/src/projection/obsidian/recovery/index.mjs +6 -0
- package/src/projection/obsidian/recovery/journal.mjs +134 -0
- package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
- package/src/projection/obsidian/recovery/restart.mjs +316 -0
- package/src/projection/obsidian/recovery/store.mjs +234 -0
- package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
- package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
- package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
- package/src/projection/obsidian/selection-ui/index.mjs +12 -0
- package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
- package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
- package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
- package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
- package/src/projection/project.mjs +28 -19
- package/src/readiness-protocols/evidence.mjs +282 -0
- package/src/readiness-protocols/runtime.mjs +4 -3
- package/src/readiness-protocols/source-read.mjs +39 -0
- package/src/runtime/git-adapter.mjs +189 -0
- package/src/runtime/local-state.mjs +439 -0
- package/src/runtime/obsidian/app-capability.mjs +129 -0
- package/src/runtime/obsidian/app-production-seams.mjs +105 -0
- package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
- package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
- package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
- package/src/runtime/obsidian/contributions.mjs +27 -0
- package/src/runtime/obsidian/documents.mjs +37 -0
- package/src/runtime/obsidian/enablement.mjs +53 -0
- package/src/runtime/obsidian/engine.mjs +532 -0
- package/src/runtime/obsidian/errors.mjs +14 -0
- package/src/runtime/obsidian/extension-points.mjs +103 -0
- package/src/runtime/obsidian/index.mjs +34 -0
- package/src/runtime/obsidian/lifecycle.mjs +258 -0
- package/src/runtime/obsidian/machine-settings.mjs +260 -0
- package/src/runtime/obsidian/observation.mjs +158 -0
- package/src/runtime/obsidian/opening.mjs +263 -0
- package/src/runtime/obsidian/pending-edits.mjs +141 -0
- package/src/runtime/obsidian/pipeline.mjs +122 -0
- package/src/runtime/obsidian/private-lock.mjs +156 -0
- package/src/runtime/obsidian/process-identity.mjs +58 -0
- package/src/runtime/obsidian/service-client.mjs +66 -0
- package/src/runtime/obsidian/service-entry-path.mjs +9 -0
- package/src/runtime/obsidian/service-main.mjs +91 -0
- package/src/runtime/obsidian/service-record.mjs +169 -0
- package/src/runtime/obsidian/service-server.mjs +121 -0
- package/src/runtime/obsidian/service.mjs +216 -0
- package/src/runtime/obsidian/startup-adapters.mjs +87 -0
- package/src/runtime/obsidian/state-store.mjs +180 -0
- package/src/runtime/obsidian/sync-notice.mjs +33 -0
- package/src/runtime/obsidian/tick-loop.mjs +84 -0
- package/src/runtime/obsidian/watchers.mjs +36 -0
- package/src/runtime/repository-observation.mjs +491 -0
- package/src/runtime/supervisor.mjs +803 -0
- package/src/server/local-sidecar.mjs +125 -59
- package/src/server/security.mjs +89 -4
- package/src/server/server.mjs +4 -2
- package/src/skills/steward.mjs +780 -0
- package/src/support/feedback-report.mjs +4 -3
- package/src/ui/presentation/browser.mjs +278 -0
- package/src/ui/presentation/contract.mjs +116 -0
- package/src/ui/presentation/index.mjs +7 -0
- package/src/ui/presentation/native.mjs +153 -0
- package/src/ui/presentation/proof.mjs +57 -0
- package/src/ui/presentation/schema-check.mjs +30 -0
- package/src/ui/presentation/schema.generated.mjs +1371 -0
- package/src/ui/presentation/state.mjs +43 -0
- package/src/ui/presentation/styles.mjs +67 -0
- package/src/ui/presentation/tokens.mjs +74 -0
- package/src/ui/presentation/web.mjs +85 -0
- package/src/ui/review-page.mjs +32 -0
- package/src/upgrade/explanation.mjs +33 -0
- package/src/upgrade/provenance.mjs +338 -0
- package/src/upgrade/transaction-files.mjs +103 -0
- package/src/upgrade/transaction.mjs +475 -0
- package/src/upgrade/upgrade.mjs +65 -29
- package/src/vault/hosts.mjs +21 -0
- package/src/vault/identity.mjs +19 -0
- package/src/vault/index.mjs +7 -0
- package/src/vault/interface.mjs +11 -0
- package/src/vault/metadata.mjs +31 -0
- package/src/vault/privacy.mjs +148 -0
- package/src/vault/probe.mjs +89 -0
- package/src/vault/service.mjs +131 -0
- package/src/vault/source.mjs +45 -0
- package/src/vault/storage.mjs +23 -0
- package/templates/distribution-workspace/.claude/launch.json +6 -2
- package/templates/distribution-workspace/gitignore +1 -0
- package/templates/distribution-workspace/project/README.md +2 -2
- package/templates/external-project-workspace/README.md +45 -0
- package/templates/external-project-workspace/answers.example.json +4 -0
- package/templates/external-project-workspace/atelier.project.json +40 -0
- package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
- package/templates/external-project-workspace/gitignore +8 -0
- package/templates/external-project-workspace/pack-lifecycle.json +14 -0
- package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
- package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
- package/templates/external-project-workspace/repo-access.v1.json +9 -0
- package/templates/external-project-workspace/source/README.md +11 -0
- package/templates/launch.json +6 -2
- package/templates/private-domain-workspace/.claude/launch.json +6 -2
- package/templates/private-domain-workspace/domain/README.md +2 -2
- package/templates/private-domain-workspace/gitignore +1 -0
- package/templates/shared-project-workspace/.claude/launch.json +6 -2
- package/templates/shared-project-workspace/gitignore +1 -0
- package/templates/shared-project-workspace/project/README.md +2 -2
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Typed decision proposals
|
|
2
|
+
|
|
3
|
+
The optional `@mnstry/atelier/decisions` API validates finite questions and
|
|
4
|
+
their proposed answers. It performs no provider calls, credential lookup,
|
|
5
|
+
source mutation, or acceptance. A consuming host supplies the provider and
|
|
6
|
+
independently checks authorization before disclosure or use.
|
|
7
|
+
|
|
8
|
+
For a development pilot, pin the reviewed source commit or its verified
|
|
9
|
+
tarball. Check that the installed package exports `./decisions`; an older
|
|
10
|
+
published alpha may not contain this API. A source merge does not publish a
|
|
11
|
+
new registry version.
|
|
12
|
+
|
|
13
|
+
This API is suitable for a small, explicit choice, an ordered score, or a
|
|
14
|
+
Boolean probability. It does not extract missing evidence or generate prose.
|
|
15
|
+
The fixtures describe an invented reading room; their answers and usage are
|
|
16
|
+
synthetic examples, not model evaluation results.
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
import {
|
|
20
|
+
decisionRequestDigest,
|
|
21
|
+
validateDecisionRequest,
|
|
22
|
+
validateDecisionResult,
|
|
23
|
+
} from '@mnstry/atelier/decisions'
|
|
24
|
+
|
|
25
|
+
const requestCheck = validateDecisionRequest(request)
|
|
26
|
+
if (!requestCheck.ok) throw new Error('Invalid decision request')
|
|
27
|
+
const digest = decisionRequestDigest(request)
|
|
28
|
+
|
|
29
|
+
// The host obtains a result under its own provider and disclosure policy.
|
|
30
|
+
const resultCheck = validateDecisionResult(request, result)
|
|
31
|
+
if (!resultCheck.ok) throw new Error('Invalid decision result')
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The adjacent TypeScript declarations export `DecisionRequest`,
|
|
35
|
+
`DecisionQuestion`, `DecisionResult`, `DecisionAnswer`, `DecisionScope`,
|
|
36
|
+
`DecisionUsage`, and `DecisionValidation`, including the individual question
|
|
37
|
+
and answer variants. Runtime validation remains required for external data.
|
|
38
|
+
|
|
39
|
+
For hosts that need only question and answer validation, use
|
|
40
|
+
`validateDecisionAnswers(questions, answers)`. It checks bounded plain JSON,
|
|
41
|
+
question structure, exact answer keys and types, probability distributions,
|
|
42
|
+
and score expectations. It accepts no state, computes no hash, performs no
|
|
43
|
+
provider execution, and writes nothing. The host supplies its own transient
|
|
44
|
+
request binding and enforces its privacy policy.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import { validateDecisionAnswers } from '@mnstry/atelier/decisions'
|
|
48
|
+
|
|
49
|
+
const answerCheck = validateDecisionAnswers(questions, answers)
|
|
50
|
+
if (!answerCheck.ok) throw new Error('Invalid decision answers')
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This separate API checks evidence reference syntax, uniqueness and bounds,
|
|
54
|
+
but cannot establish membership in a source snapshot that it has not received.
|
|
55
|
+
The request and result validators still enforce that membership. A successful
|
|
56
|
+
answer check establishes neither authorization nor semantic correctness.
|
|
57
|
+
|
|
58
|
+
## Requests
|
|
59
|
+
|
|
60
|
+
`atelier-decision-request@v1` records a request ID, task, rubric version,
|
|
61
|
+
host-reported scope, state, evidence references, and questions. The
|
|
62
|
+
`scope.workspaceId` and `scope.authorizationRef` fields bind the assessment to
|
|
63
|
+
the host's reported snapshot. They do not authenticate a caller, prove
|
|
64
|
+
consent, or grant access. The host must revalidate current permissions and
|
|
65
|
+
revocation before sending data or acting on a cached result.
|
|
66
|
+
|
|
67
|
+
Each question includes instructions and at least one `evidenceIds` entry
|
|
68
|
+
referring to the request's evidence. Evidence identities are unique; their
|
|
69
|
+
`sourceRef` strings are opaque references preserved for the host. Validation
|
|
70
|
+
does not fetch them or prove that the state faithfully represents a source.
|
|
71
|
+
|
|
72
|
+
| Question | Criteria | Answer |
|
|
73
|
+
| --- | --- | --- |
|
|
74
|
+
| `choice` | A map of 2–64 option IDs to descriptions | A selected option, complete probability map, and provider confidence statistic |
|
|
75
|
+
| `score` | An ordered list of 2–10 descriptions | A zero-index weighted expectation, complete probability list, and provider confidence statistic |
|
|
76
|
+
| `boolean` | Explicit `true` and `false` descriptions | A probability between zero and one |
|
|
77
|
+
|
|
78
|
+
Identifiers are 1–128 ASCII characters, beginning with a letter or digit and
|
|
79
|
+
continuing with letters, digits, `.`, `_`, `:`, or `-`. The names `__proto__`,
|
|
80
|
+
`constructor`, and `prototype` are refused as object keys and identifiers.
|
|
81
|
+
State and descriptions support Unicode; validation does not normalize text.
|
|
82
|
+
|
|
83
|
+
Requests are limited to 64 questions, 256 evidence entries, 32,000 state
|
|
84
|
+
characters, 4,000 instruction characters per question, 2,000 characters per
|
|
85
|
+
criterion, and 2,048 characters per source reference. String limits count
|
|
86
|
+
Unicode code points. Empty state is allowed so the host can record an
|
|
87
|
+
insufficient-evidence abstention; instructions and descriptions must contain
|
|
88
|
+
non-whitespace text.
|
|
89
|
+
|
|
90
|
+
## Results and integrity
|
|
91
|
+
|
|
92
|
+
`atelier-decision-result@v1` copies the request ID, task, rubric version and
|
|
93
|
+
scope, and carries `requestDigest`, provider ID, concrete model name,
|
|
94
|
+
elapsed milliseconds, and usage. Token counts are nonnegative safe integers;
|
|
95
|
+
`usage: null` records unavailable usage without treating it as zero.
|
|
96
|
+
|
|
97
|
+
`authority` is always `proposal-only`. `mode` is `shadow` or `advisory`;
|
|
98
|
+
neither value grants execution authority. An `assessed` result contains
|
|
99
|
+
exactly the requested answer keys and types. An `abstained` result contains
|
|
100
|
+
an empty answer map and one explicit reason: `insufficient-evidence`,
|
|
101
|
+
`ambiguous`, `no-match`, `budget-exhausted`, `provider-unavailable`, `timeout`,
|
|
102
|
+
`invalid-response`, or `unauthorized`.
|
|
103
|
+
|
|
104
|
+
The validator checks that distributions sum to one within `1e-6`, a chosen
|
|
105
|
+
option has maximum probability, and a score equals its zero-index weighted
|
|
106
|
+
expectation within `1e-6`. Tied maximum choices are valid. Boolean answers
|
|
107
|
+
have no confidence field. Confidence is a provider statistic, not measured
|
|
108
|
+
semantic correctness; a structurally valid high-confidence answer can still
|
|
109
|
+
be wrong. The host owns evaluation data, calibrated thresholds, escalation,
|
|
110
|
+
and fallback behavior. The host must also compare the recorded model with
|
|
111
|
+
its requested concrete model pin; the request contract does not prescribe a
|
|
112
|
+
provider or model.
|
|
113
|
+
|
|
114
|
+
`decisionRequestDigest` returns lowercase SHA-256 over canonical JSON with
|
|
115
|
+
object keys recursively sorted in JavaScript string order. Array order and
|
|
116
|
+
exact Unicode content are retained. It includes the full request, scope,
|
|
117
|
+
evidence, rubric, and optional extensions. Reordering object insertion does
|
|
118
|
+
not change the digest; changing any represented value does. This is local
|
|
119
|
+
integrity evidence, not a signature or proof of provenance. Invalid requests
|
|
120
|
+
throw a generic `TypeError`; validators return `{ ok, errors }` without
|
|
121
|
+
echoing source text, unknown field names, or provider response content.
|
|
122
|
+
|
|
123
|
+
Content hashes can themselves be sensitive. A host whose policy forbids
|
|
124
|
+
hashing a passage must use its own transient request binding instead of this
|
|
125
|
+
digest-bearing envelope. It can reuse the question and answer types without
|
|
126
|
+
calling `decisionRequestDigest` or retaining a full request. The public
|
|
127
|
+
contract does not override the host's privacy policy.
|
|
128
|
+
|
|
129
|
+
## Closed fields and extensions
|
|
130
|
+
|
|
131
|
+
The standalone JSON Schemas are
|
|
132
|
+
`atelier-decision-request.v1.schema.json` and
|
|
133
|
+
`atelier-decision-result.v1.schema.json`. They validate static shape. Use the
|
|
134
|
+
JavaScript validator as well for request binding, evidence relationships,
|
|
135
|
+
distribution semantics, and bounded in-process JSON.
|
|
136
|
+
|
|
137
|
+
As with other Atelier contracts, the roots allow optional
|
|
138
|
+
`contractVersion: "1.0.0"`, and closed objects allow an optional object-valued
|
|
139
|
+
`ext`. Unknown first-class fields are refused. Namespaced extension members
|
|
140
|
+
are inert metadata: consumers must ignore unrecognized members and must
|
|
141
|
+
never derive authority from them. Dynamic question, choice and answer maps
|
|
142
|
+
contain only their declared entries; they have no reserved metadata entry.
|
|
143
|
+
|
|
144
|
+
Both requests and results, including extensions, are limited to 16,777,216
|
|
145
|
+
canonical JSON bytes, 100,000 values, and 32 levels of nesting below the root.
|
|
146
|
+
Cycles, symbols, sparse arrays, accessors, non-finite numbers, undefined
|
|
147
|
+
values and custom prototypes are refused. Plain objects with a null
|
|
148
|
+
prototype are accepted. No input is mutated.
|
|
149
|
+
|
|
150
|
+
## Host integration
|
|
151
|
+
|
|
152
|
+
1. Build bounded questions from already authorized evidence. Preserve all
|
|
153
|
+
source passages and coverage independently of a proposed prioritization.
|
|
154
|
+
2. Validate the request, then check the host's current consent, destination,
|
|
155
|
+
concrete model pin, input limit, evaluation budget and timeout policy.
|
|
156
|
+
3. Call a provider through the host adapter. Keep credentials, private
|
|
157
|
+
criteria, raw responses and provider execution outside the public kit.
|
|
158
|
+
4. Normalize and validate the result against the exact request. Retain full
|
|
159
|
+
distributions and unknown usage; represent failures as explicit
|
|
160
|
+
abstentions without accepting partial answer sets.
|
|
161
|
+
5. Compare shadow results with an independently labeled evaluation set.
|
|
162
|
+
Enable an advisory consumer only after task-specific acceptance. Keep the
|
|
163
|
+
host's existing behavior as the fallback and recheck authorization on
|
|
164
|
+
cache access.
|
|
165
|
+
|
|
166
|
+
This module does not change the existing analysis adapter's default-disabled
|
|
167
|
+
execution policy or accept a model proposal as an authored fact.
|
package/docs/design.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# The design
|
|
2
|
+
|
|
3
|
+
The Atelier makes a repository mean something. Files declare what they are,
|
|
4
|
+
who they are for, and how they relate — and machinery enforces it.
|
|
5
|
+
|
|
6
|
+
**Git is the database. The ontology is the schema. The validators are the
|
|
7
|
+
constraints. The runtime is local.**
|
|
8
|
+
|
|
9
|
+
This page states the design in five movements. Each one is a general
|
|
10
|
+
primitive, grounded in a shipped mechanism, ending with the command that
|
|
11
|
+
proves it — because a design document that cannot be checked is marketing.
|
|
12
|
+
|
|
13
|
+
## 1. A repository with an ontology
|
|
14
|
+
|
|
15
|
+
A small structured header turns a file into a governed node: front matter on
|
|
16
|
+
Markdown, or a `.kg.json` sidecar beside any other format — JSON, YAML,
|
|
17
|
+
CSV, media, anything — which the kit enrolls without ever parsing the
|
|
18
|
+
foreign format. The header declares identity (`kg.id`), type, status,
|
|
19
|
+
audience, and relations to other nodes.
|
|
20
|
+
|
|
21
|
+
Markdown without a `kg` block is still counted by the canonical graph engine,
|
|
22
|
+
but only as private `unclassified` material with a diagnostic. Once a `kg`
|
|
23
|
+
block is present, partial or malformed declarations are blocking errors.
|
|
24
|
+
|
|
25
|
+
The graph builder compiles the repository into a knowledge graph,
|
|
26
|
+
deterministically: same tree in, same graph out, and `--check` mode fails
|
|
27
|
+
when a generated graph has drifted from its sources. There is no import
|
|
28
|
+
step, no database, and no export lock-in. The repository is the store. Git
|
|
29
|
+
is the history, the review process, and the read boundary you already
|
|
30
|
+
trust — an audience label guides projection, but repository access is what
|
|
31
|
+
actually hides a file.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
atelier graph --project ./atelier.project.json
|
|
35
|
+
atelier graph --check --project ./atelier.project.json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 2. Rules that refuse
|
|
39
|
+
|
|
40
|
+
The ontology is not documentation. It is the enforcement mechanism.
|
|
41
|
+
|
|
42
|
+
The JSON Schema contracts under `contracts/` define the vocabulary —
|
|
43
|
+
exports, project configuration, boundary policy, sidecars, locks,
|
|
44
|
+
migrations, readiness, attestation — and fail-closed validators enforce
|
|
45
|
+
it. The load-bearing
|
|
46
|
+
separation is `audience` versus `visibility`: audience is local readership
|
|
47
|
+
(`public`, `team`, `operator`, `staff`, `private`, `sensitive`), visibility
|
|
48
|
+
is runtime authority (`private`, `shared`, `platform`, `public`), and the
|
|
49
|
+
validators reject every crossing — a local audience word in a visibility
|
|
50
|
+
field, a `visibility` key on a source node, and above all a public export
|
|
51
|
+
that resolves any source reference to a non-public source. That last check
|
|
52
|
+
is fixture-pinned and mutation-tested: deleting its enforcement makes tests
|
|
53
|
+
fail, not documentation drift.
|
|
54
|
+
|
|
55
|
+
The contracts sit under a stability epoch. Every change is checked against
|
|
56
|
+
the baseline tag's validators, schema widening outside namespaced `ext`
|
|
57
|
+
containers is refused by a schema-vs-schema differ, and a breaking change
|
|
58
|
+
requires a new contract version with a recorded migration. Twelve bundled
|
|
59
|
+
claim-first readiness protocols check a workspace against published
|
|
60
|
+
criteria and produce proposed claims — never runtime mutations.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
atelier dry-run ./atelier-export.json
|
|
64
|
+
atelier contract check
|
|
65
|
+
npm run contract:compat
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 3. Collaboration as governed disclosure
|
|
69
|
+
|
|
70
|
+
Repositories have roles. A private-domain repo holds one person's source
|
|
71
|
+
material; a shared-project repo holds what a team may read. The boundary
|
|
72
|
+
guard enforces the difference and fails closed: private or sensitive
|
|
73
|
+
source placed in a shared repo blocks, protected local files staged for
|
|
74
|
+
commit block, and private-domain material appearing in shared work without
|
|
75
|
+
a recorded disclosure blocks.
|
|
76
|
+
|
|
77
|
+
Crossing the boundary is an event with a record: `atelier promote` writes a
|
|
78
|
+
`git.promote` disclosure event, reviewable like any other commit.
|
|
79
|
+
Disclosure is a commit, not an accident.
|
|
80
|
+
|
|
81
|
+
Change to the machinery itself is governed the same way. The workspace
|
|
82
|
+
lockfile records exactly which package version, contracts, extension
|
|
83
|
+
packs, and migrations a workspace runs; upgrades are branch-based,
|
|
84
|
+
review-first, refuse dirty repos, and never silently overwrite authored
|
|
85
|
+
content.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
atelier boundary check --project ./atelier.project.json
|
|
89
|
+
atelier boundary check --staged --project ./atelier.project.json
|
|
90
|
+
atelier promote --source-repo <private-repo> --target-repo <shared-repo> --kg-id <node>
|
|
91
|
+
atelier lock check --project ./atelier.project.json
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 4. A local runtime for humans and for agents
|
|
95
|
+
|
|
96
|
+
The same governed workspace projects two ways.
|
|
97
|
+
|
|
98
|
+
For humans: a generated review surface, served by a sidecar that binds to
|
|
99
|
+
loopback only. It requires a generated publication manifest and serves only
|
|
100
|
+
enrolled safe static files after realpath validation. The served pages carry a
|
|
101
|
+
policy that authorizes no external origin, and the only network client in the
|
|
102
|
+
package refuses non-loopback URLs.
|
|
103
|
+
|
|
104
|
+
For agents: session-bound context and capability envelopes that hand an
|
|
105
|
+
agent harness a governed view of the workspace — what exists, what it may
|
|
106
|
+
look at, what it may propose. Proposals are recorded as typed copy-only
|
|
107
|
+
metadata; capability declarations expose no apply endpoint, source write,
|
|
108
|
+
execution, or Git authority. Context
|
|
109
|
+
without authority. Neutral Claude and Codex skill wrappers ship in the
|
|
110
|
+
package, so a harness can do readiness review work against the workspace
|
|
111
|
+
without a single line of custom glue.
|
|
112
|
+
|
|
113
|
+
This is a deliberately narrow answer to a broad question. It does not make
|
|
114
|
+
an agent safe around private material in general; it makes one surface
|
|
115
|
+
checkable: within the Atelier sidecar, a harness receives session-bound
|
|
116
|
+
context and can record proposals, and there is no apply endpoint and no
|
|
117
|
+
write authority to grant. A bounded view, with writing made impossible —
|
|
118
|
+
a testable control, not a trust exercise.
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
atelier dev --project ./atelier.project.json
|
|
122
|
+
atelier context flow --project ./atelier.project.json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 5. A platform for your own tool
|
|
126
|
+
|
|
127
|
+
The Atelier is designed to be built on, under your name, including
|
|
128
|
+
commercially.
|
|
129
|
+
|
|
130
|
+
A distribution wraps the CLI under its own command, contributes a
|
|
131
|
+
validated extension pack — branded protocols, terms, templates — and
|
|
132
|
+
themes the projection, while the root contracts, guards, and conformance
|
|
133
|
+
stay canonical underneath. The repository carries a complete fictional
|
|
134
|
+
reference distribution (`examples/loomworks-studio`) small enough to read
|
|
135
|
+
in one sitting: a wrapper bin, a pack, a themed workspace.
|
|
136
|
+
|
|
137
|
+
Apache-2.0 makes commercial use a right, not a favor. The trademark policy
|
|
138
|
+
keeps the name ours and the code yours: every distribution carries
|
|
139
|
+
"powered by MNSTRY Atelier" attribution, and the check is a command, not a
|
|
140
|
+
request. The contribution terms are inbound-equals-outbound with a DCO
|
|
141
|
+
sign-off and no CLA — nobody, including MNSTRY, holds rights over a
|
|
142
|
+
contribution that the contributor does not also hold. Outside pull
|
|
143
|
+
requests are not open yet; `CONTRIBUTING.md` states the posture and the
|
|
144
|
+
terms that will govern them when they open.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
atelier distribution check --target ./my-distribution
|
|
148
|
+
atelier extension-pack validate --project ./atelier.project.json
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## The first application
|
|
152
|
+
|
|
153
|
+
Methodology authoring is the Atelier's first application, not its ceiling.
|
|
154
|
+
MNSTRY built this to carry its own most demanding case: private
|
|
155
|
+
transformational work, where a leaked document is not a bug but a
|
|
156
|
+
betrayal. That case set the bar — fail-closed boundaries, no telemetry, no
|
|
157
|
+
send path, agents without authority, disclosure as a recorded event.
|
|
158
|
+
|
|
159
|
+
That case shaped the defaults. Other bodies of work — a research corpus, a
|
|
160
|
+
client practice, an editorial pipeline, anything that must outlive the
|
|
161
|
+
tools that touch it — reuse the mechanics, and each defines and validates
|
|
162
|
+
its own ontology, protocols, and boundary policies.
|
|
163
|
+
|
|
164
|
+
The claims behind this page are stated precisely, with their known limits,
|
|
165
|
+
in the README's "Claims you can check" — each with the command that proves
|
|
166
|
+
it. `docs/continuity.md` records the distribution commitments, including
|
|
167
|
+
the perpetual Apache-2.0 grant on every tagged release you receive.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Local exact-plan upgrades
|
|
2
|
+
|
|
3
|
+
The explicit `atelier upgrade plan/apply/status/recover` commands prepare a
|
|
4
|
+
local candidate from an already installed Atelier executor. They preserve an
|
|
5
|
+
adopter's source branch and configuration, show the exact changes, and retain
|
|
6
|
+
local evidence of what was selected and what Git actually committed.
|
|
7
|
+
|
|
8
|
+
Execution in this first slice requires Linux or macOS with working directory
|
|
9
|
+
fsync. Other hosts, including native Windows, refuse before transaction state
|
|
10
|
+
creation; existing Atelier commands remain available. The platform refusal is
|
|
11
|
+
tested separately from the POSIX execution scenarios.
|
|
12
|
+
|
|
13
|
+
This first slice supports **one configuration repository in a linked Git
|
|
14
|
+
worktree**, with its project config and workspace at the root. Its single
|
|
15
|
+
managed repo must point to `.`. It refreshes the lock, graph, HTML projection,
|
|
16
|
+
manifest and readiness output. Generated paths must be distinct paths within
|
|
17
|
+
`atelier-output/`. Distribution branding is retained. External packs, local
|
|
18
|
+
overlays, private readiness runs, submodules, sparse checkouts, attribute/filter
|
|
19
|
+
transformations and runtime/alignment participants are refused. These limits
|
|
20
|
+
are explicit eligibility checks, not assurances about unsupported setups.
|
|
21
|
+
|
|
22
|
+
There is no package installation, network discovery, hook replacement, runtime
|
|
23
|
+
activation, or automatic policy mode. Existing legacy `upgrade --apply` remains
|
|
24
|
+
a separate workflow; it does not acquire these transaction guarantees.
|
|
25
|
+
|
|
26
|
+
## Enroll and prepare
|
|
27
|
+
|
|
28
|
+
Create a dedicated candidate worktree using your usual Git workflow, then add
|
|
29
|
+
and commit `atelier.adoption-policy.json` there:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"schema": "mnstry.atelier-adoption-policy@v1",
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"mode": "manual-exact-plan",
|
|
36
|
+
"maxAgeSeconds": 86400,
|
|
37
|
+
"recoveryCoverage": "local-only",
|
|
38
|
+
"allowedEffects": ["lock-and-projections", "git-commit"]
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Ignore `.atelier-local/` and keep every file beneath it untracked. Start with a
|
|
43
|
+
clean index and worktree. From the candidate worktree:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
atelier upgrade plan --save --project ./atelier.project.json
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The result names a private saved plan and its `sha256:` confirmation digest.
|
|
50
|
+
Inspect its `writes`: concrete paths, ownership, old/new byte digests and modes,
|
|
51
|
+
and the proposed bytes in base64. `readSet` inventories the entire enrolled
|
|
52
|
+
repository except Git administration and private local state. The plan also
|
|
53
|
+
binds the repository identity, HEAD, branch, policy, Git executable,
|
|
54
|
+
configuration, Git auxiliary ignore/attribute files, hook directory and files, executor and imported dependency bytes,
|
|
55
|
+
and a fixed expiry. Default lifetime is 24 hours; policy may shorten it.
|
|
56
|
+
The Git fingerprint covers the transaction's selected executable. Legacy
|
|
57
|
+
builders also invoke Git from `PATH`; use the same executable there when
|
|
58
|
+
setting `ATELIER_GIT_PATH`. Cross-host output ordering is not guaranteed.
|
|
59
|
+
Executor checkout metadata may affect generated lock provenance; the saved
|
|
60
|
+
plan binds the resulting bytes rather than promising identical regeneration.
|
|
61
|
+
|
|
62
|
+
Inherited `GIT_*` overrides such as an IDE's `GIT_ASKPASS` are refused (apart
|
|
63
|
+
from the documented prompt, pager and optional-lock controls). Prepare from
|
|
64
|
+
an environment without those overrides. Repository, global and system Git
|
|
65
|
+
attribute files must be absent or empty for this slice.
|
|
66
|
+
|
|
67
|
+
Generation uses an isolated private preparation directory and the existing
|
|
68
|
+
builders. Only five registered output paths can be written, and a complete
|
|
69
|
+
before/after inventory checks that boundary. The executor then saves those
|
|
70
|
+
bytes; application does not recalculate or silently replace the selected plan.
|
|
71
|
+
This is a bounded trusted executor, not a sandbox for arbitrary migration code.
|
|
72
|
+
The generated readiness JSON retains absolute local graph and projection paths,
|
|
73
|
+
which may include the account name. Inspect those committed bytes before sharing
|
|
74
|
+
the candidate branch; generating a candidate does not authorize publication.
|
|
75
|
+
|
|
76
|
+
## Apply the reviewed bytes
|
|
77
|
+
|
|
78
|
+
Use `atelier upgrade explain --plan SAVED_PLAN_PATH --format markdown` to read
|
|
79
|
+
the verified plan's effects, expiry and consent limits. The default JSON format
|
|
80
|
+
contains the same report. Explanation is read-only and never grants approval.
|
|
81
|
+
See [guided upgrades](guided-upgrades.md) for the owner-agent workflow.
|
|
82
|
+
|
|
83
|
+
Use the returned path and digest literally:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
atelier upgrade apply --plan SAVED_PLAN_PATH --confirm sha256:REVIEWED_DIGEST --project ./atelier.project.json
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The digest selects content; it is not an authenticated human signature. Host
|
|
90
|
+
permissions must establish any stronger authority. The command takes an
|
|
91
|
+
exclusive local writer lease, checks current bindings before mutation and at
|
|
92
|
+
safe boundaries, records original bytes and write intents, writes only expected
|
|
93
|
+
preimages, stages only the frozen paths, and runs the existing commit hooks.
|
|
94
|
+
No commit uses `--no-verify`. Hook execution is existing adopter code with its
|
|
95
|
+
normal host privileges, not a new sandbox or a promise of no hook side effects.
|
|
96
|
+
Relevant hook changes invalidate the plan; files or executables that hooks
|
|
97
|
+
consult outside their directory are not transitively fingerprinted.
|
|
98
|
+
Git commit has a 30-second execution budget. A timeout is conservatively
|
|
99
|
+
`recovery-required`, since a hook may already have acted; this budget is not
|
|
100
|
+
a guarantee that all hook descendants terminate within 30 seconds.
|
|
101
|
+
|
|
102
|
+
A successful Git exit is insufficient: the commit's parent, tree and message,
|
|
103
|
+
staged blobs, branch and worktree must match. A refused commit retains its index
|
|
104
|
+
and worktree as `commit-refused`. Unexpected changes become `recovery-required`.
|
|
105
|
+
Neither case causes an automatic retry, reset, hook bypass or success claim.
|
|
106
|
+
Every accepted attempt consumes the plan, including an interrupted attempt.
|
|
107
|
+
|
|
108
|
+
## Status and recovery evidence
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
atelier upgrade status --operation OPERATION_ID --project ./atelier.project.json
|
|
112
|
+
atelier upgrade recover --operation OPERATION_ID --dry-run --project ./atelier.project.json
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The operation ID is the hexadecimal part of the plan digest. Events live in
|
|
116
|
+
`.atelier-local/upgrades/operations/OPERATION_ID/events/`, with original bytes in
|
|
117
|
+
`backups/`. Events are exclusive, fsynced publications with sequence numbers,
|
|
118
|
+
previous-event digests and verified rereads. Missing, truncated or altered events
|
|
119
|
+
refuse success. This is local integrity evidence; a host owner who can replace
|
|
120
|
+
all records can rewrite a chain. It is not externally authenticated provenance.
|
|
121
|
+
|
|
122
|
+
Only a verified terminal receipt asserts completion. The v1 lock retains prior
|
|
123
|
+
migration history, template lineage and successful-upgrade metadata. Its success
|
|
124
|
+
fields deliberately lag the new receipt; the command never writes the hash of
|
|
125
|
+
an uncreated commit into that commit. No automatic metadata refresh is shipped.
|
|
126
|
+
|
|
127
|
+
An interruption after Git commits but before the terminal event remains
|
|
128
|
+
`recovery-required`, even when the commit exists. Recovery dry-run reports
|
|
129
|
+
current HEAD/index evidence, safely restorable bytes and conflicts. Subsequent
|
|
130
|
+
user edits and any moved HEAD prevent automatic restoration. This release offers
|
|
131
|
+
**no recovery mutation**: restoring files or reverting a commit requires a
|
|
132
|
+
separately reviewed operation with current authority. It never resets history.
|
|
133
|
+
|
|
134
|
+
A crash may leave the writer lease in place. Inspect its owner and verify that
|
|
135
|
+
process has stopped before separately handling the stale lease; elapsed time
|
|
136
|
+
alone never releases it. Status and recovery inspection remain available.
|
|
137
|
+
A crash during preparation can also leave a `prepare-*` scratch directory
|
|
138
|
+
under `.atelier-local/upgrades/`. Further preparation and application refuse
|
|
139
|
+
with a stale-preparation diagnostic. Verify the writer has stopped and inspect
|
|
140
|
+
the directory before separately removing only that abandoned scratch directory.
|
|
141
|
+
The command does not delete it automatically or remove plans, receipts or backups.
|
|
142
|
+
|
|
143
|
+
Evidence has no automatic deletion. Inventory limits (4,096 files, 64 MiB) and a
|
|
144
|
+
32 MiB retained-state admission threshold and 8 MiB saved-plan limit bound this small-workspace slice.
|
|
145
|
+
Exhaustion refuses another operation; export and verify evidence before any
|
|
146
|
+
separate retention maintenance. Ignored state is not backed up or inherited by
|
|
147
|
+
another clone. Enrollment explicitly acknowledges local-only recovery.
|
|
148
|
+
|
|
149
|
+
## Provenance and acceptance boundaries
|
|
150
|
+
|
|
151
|
+
The plan pins installed executor and dependency bytes. It does not authenticate
|
|
152
|
+
an upstream publisher or verify a newly downloaded release. Release discovery,
|
|
153
|
+
authenticated artifact intake, dependency installation, multi-repository
|
|
154
|
+
transactions and standing automatic consent remain separate future work.
|
|
155
|
+
|
|
156
|
+
A completed transaction means a prepared local candidate commit. It does not
|
|
157
|
+
mean a merged upstream change, CI acceptance, adoption in another workspace,
|
|
158
|
+
published package or activated service. Use the adopter's normal review and
|
|
159
|
+
landing process to accept the candidate.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Pack compatibility for evidence-bound review
|
|
2
|
+
|
|
3
|
+
The closed v1 pack format remains unchanged. An adapter can declare a separate
|
|
4
|
+
`atelier-pack-lifecycle@v1` file through
|
|
5
|
+
`ext["mnstry.atelier"].extensionPackLifecycle`. Each entry binds the pack ID,
|
|
6
|
+
version and content digest to `compatibleRootVersions`, an explicit finite set
|
|
7
|
+
of approved root versions. This conservative compatibility range does not infer
|
|
8
|
+
SemVer compatibility or silently approve a future root version.
|
|
9
|
+
|
|
10
|
+
`atelier review packs` reports admission. `--migration-plan` returns a dry-run
|
|
11
|
+
report referencing the existing extension-pack upgrade registry and its checks.
|
|
12
|
+
A declaration can name an available registry `migrationId`; unknown migrations
|
|
13
|
+
fail qualification. Pack loading never executes extension code or installs
|
|
14
|
+
packages. An owner reviews replacement term/protocol meaning, retains prior
|
|
15
|
+
content, updates declarations and locks, and uses the existing upgrade workflow.
|
|
16
|
+
The plan itself writes nothing. A fresh run is required after a change.
|
|
17
|
+
|
|
18
|
+
| Root/pack state | Historical inspection | New evidence-bound run |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Current root explicitly approved; exact active pack | Pinned snapshot | Admitted |
|
|
21
|
+
| Exact deprecated pack, root approved | Pinned snapshot; replacement shown | Admitted with deprecated status |
|
|
22
|
+
| Retired, wrong digest/version or unapproved root | Pinned snapshot | Refused |
|
|
23
|
+
| Legacy pack without lifecycle declaration | Existing readers remain usable | Unqualified; refused |
|
|
24
|
+
| No custom packs | Bundled snapshot | Admitted |
|
|
25
|
+
| Old root predating this feature | Its legacy readers only | No new review protocol supplied by that root |
|
|
26
|
+
|
|
27
|
+
A snapshot contains the actual protocol and source identity used originally.
|
|
28
|
+
Historical inspection does not load today's replacement as yesterday's method.
|
|
29
|
+
Migration IDs describe reviewed owner operations, not autonomous reinterpretation
|
|
30
|
+
or approval. For rollback restore the previous package, pack declarations and
|
|
31
|
+
lock; retain the evidence and contribution ledgers. Existing legacy readiness
|
|
32
|
+
execution remains compatible and does not acquire exact-review qualification
|
|
33
|
+
merely because it can still read the pack.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Upgrade with your agent
|
|
2
|
+
|
|
3
|
+
Ask your agent to prepare an upgrade using the bundled
|
|
4
|
+
`atelier-guided-upgrade` skill. It is available in both packaged skill surfaces.
|
|
5
|
+
For an older installation, the operator first selects and verifies the new
|
|
6
|
+
package. Reading its skill is not permission to install or execute it in your
|
|
7
|
+
working Atelier.
|
|
8
|
+
|
|
9
|
+
> Prepare an Atelier upgrade in an isolated candidate. Preserve my authored
|
|
10
|
+
> work, local customizations and existing approvals. Identify an exact trusted
|
|
11
|
+
> release, explain its effect here and run the appropriate checks. Show me what
|
|
12
|
+
> is ready and ask before applying changes to my working installation, merging
|
|
13
|
+
> or restarting services. Report unsupported configurations explicitly.
|
|
14
|
+
|
|
15
|
+
## What the owner reviews
|
|
16
|
+
|
|
17
|
+
The agent prepares a short explanation with inspectable evidence:
|
|
18
|
+
|
|
19
|
+
| Item | Required information |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| Source | Old and selected package identities, source commit when verified, artifact integrity, dependency lock and trust source. |
|
|
22
|
+
| Local impact | Benefit, actual changed paths, preserved customizations, migrations and unsupported participants. |
|
|
23
|
+
| Validation | Exact candidate tested, commands, results, skipped coverage and remaining acceptance checks. |
|
|
24
|
+
| Consent | The specific installation, commit, merge or activation effects requested; prior applicable authority and any new decision. |
|
|
25
|
+
| Recovery | What remains untouched, retained backups and conflicts; whether restoration is manual. |
|
|
26
|
+
| Outcome | Prepared, installed in candidate, committed, merged, running and owner-accepted are distinct states. |
|
|
27
|
+
|
|
28
|
+
Do not attach private authored content to an upstream issue or public release.
|
|
29
|
+
Even generated readiness output can contain account paths. Retain full evidence
|
|
30
|
+
privately and publish only an explicitly approved summary.
|
|
31
|
+
|
|
32
|
+
## Exact-plan explanation
|
|
33
|
+
|
|
34
|
+
After selecting/installing the executor in an eligible candidate, follow
|
|
35
|
+
[exact upgrades](exact-upgrades.md) for enrollment and preparation. Use the
|
|
36
|
+
verified installed binary (these examples assume a root-local npm install):
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
./node_modules/.bin/atelier upgrade plan --save --project ./atelier.project.json
|
|
40
|
+
./node_modules/.bin/atelier upgrade explain --plan SAVED_PLAN_PATH --project ./atelier.project.json
|
|
41
|
+
./node_modules/.bin/atelier upgrade explain --plan SAVED_PLAN_PATH --format markdown --project ./atelier.project.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Both explanations derive from the same verified saved plan. They expose paths,
|
|
45
|
+
before/after hashes, executor evidence, expiry and consent limits, without
|
|
46
|
+
printing the proposed base64 contents. Inspect the saved bytes separately.
|
|
47
|
+
The command is read-only: it neither records consent nor regenerates output.
|
|
48
|
+
JSON `bindingsCurrent: false` and `blockers` identify observed staleness even
|
|
49
|
+
when explanation succeeds. `bindingsCurrent: true` is not a reservation or a
|
|
50
|
+
complete application admission; apply performs its full checks again.
|
|
51
|
+
|
|
52
|
+
The owner's decision must bind the displayed plan and effects. An agent records
|
|
53
|
+
the exact words and conversation reference privately with the report digest,
|
|
54
|
+
candidate, target and decision. Use `humanApprovalAuthenticated: false` and
|
|
55
|
+
`recordedBy: agent`; the record is an attestation of the conversation, not a
|
|
56
|
+
cryptographic human signature. Hashes identify content and detect changes. A
|
|
57
|
+
trusted host/harness must enforce any stronger approval boundary. Merely
|
|
58
|
+
writing an approval-looking JSON file grants no authority.
|
|
59
|
+
|
|
60
|
+
## Existing workspaces outside the first slice
|
|
61
|
+
|
|
62
|
+
A managed subdirectory, multiple repositories, external packs, overlays or an
|
|
63
|
+
unsupported host require a separate operator procedure. Keep those boundaries;
|
|
64
|
+
changing a graph root to `.` can expose previously excluded material. Never
|
|
65
|
+
remove a guard to make the exact planner accept a workspace.
|
|
66
|
+
|
|
67
|
+
Use the consuming repository's documented procedure, retaining the old source
|
|
68
|
+
and lock history, an exact dependency pin and a before/after manifest. Label the
|
|
69
|
+
result as an operator-prepared candidate. The exact transaction receipt and its
|
|
70
|
+
guarantees do not apply. If no procedure exists, prepare a migration proposal and
|
|
71
|
+
stop before application. The legacy flag-based apply command is not an automatic
|
|
72
|
+
substitute for the saved-plan workflow.
|
|
73
|
+
|
|
74
|
+
An isolated snapshot may preserve active local edits for a rehearsal, provided
|
|
75
|
+
its manifest is stable and the original remains untouched. It does not settle
|
|
76
|
+
ownership of those edits or include ignored answer history. Reconcile with the
|
|
77
|
+
active writer before eventual adoption. Test reopening/resuming owned state at
|
|
78
|
+
the actual recipient before claiming owner acceptance.
|
|
79
|
+
|
|
80
|
+
## Release and pilot checklist
|
|
81
|
+
|
|
82
|
+
Maintainers retain a release candidate with `ATELIER_RELEASE_OUTPUT_DIR` and
|
|
83
|
+
`npm run prepublishOnly`: one archive is audited and exercised by installed
|
|
84
|
+
consumer and distribution smokes. This proves the candidate artifact, not that
|
|
85
|
+
it was published or that an adopter trusts its publisher. Include the candidate
|
|
86
|
+
commit/tree, artifact digest, release notes, supported runtimes, migration limits
|
|
87
|
+
and original review qualifications in the release handoff.
|
|
88
|
+
|
|
89
|
+
The publishing workflow rebuilds and verifies its own retained artifact after
|
|
90
|
+
the release commit lands. Its published integrity is the consumer's installation
|
|
91
|
+
reference; do not substitute a different local tarball's digest. Publication
|
|
92
|
+
uses a separately authorized version tag. An alpha version in source is not
|
|
93
|
+
evidence that npm already contains it.
|
|
94
|
+
|
|
95
|
+
Pilot one explicitly selected workspace: inspect, prepare separately, explain,
|
|
96
|
+
record a real decision, apply the authorized effects, verify and confirm the
|
|
97
|
+
owner can continue their work. Candidate tests alone do not complete that last
|
|
98
|
+
step. Background discovery, unattended installation and automatic recovery are
|
|
99
|
+
not provided by this workflow.
|