@mnstry/atelier 0.2.0-alpha.1 → 0.2.0-alpha.11
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 +413 -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 +698 -0
- package/docs/obsidian.md +484 -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 +155 -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 +212 -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 +138 -0
- package/src/runtime/obsidian/app-production-seams.mjs +107 -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 +280 -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 +93 -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
package/docs/upgrade.md
CHANGED
|
@@ -1,10 +1,133 @@
|
|
|
1
1
|
# Upgrade Guide
|
|
2
2
|
|
|
3
|
+
For an owner asking their agent to prepare an update, start with
|
|
4
|
+
[guided upgrades](guided-upgrades.md). It separates release selection and staged
|
|
5
|
+
installation from the exact local transaction and the owner's adoption decision.
|
|
6
|
+
|
|
3
7
|
Use this guide when upgrading a copied private-domain or shared-project starter
|
|
4
8
|
workspace between Atelier package releases. The flow is local-only: it does not
|
|
5
9
|
provision repositories, contact a Git host, mutate the MNSTRY runtime, or write
|
|
6
10
|
through a browser view.
|
|
7
11
|
|
|
12
|
+
## Upgrading to 0.2.0-alpha.11
|
|
13
|
+
|
|
14
|
+
This release tightens the Obsidian projection's app checks after independent
|
|
15
|
+
review of 0.2.0-alpha.10: Atelier never coordinates with an Obsidian whose version it
|
|
16
|
+
has not checked, the advice for a refused publication is true for every cause
|
|
17
|
+
and appears in `status` as well as `open`, Linux resolves an app started
|
|
18
|
+
through a differently named launcher, and the process check has a timeout.
|
|
19
|
+
No project or machine setting needs to change.
|
|
20
|
+
|
|
21
|
+
## Upgrading to 0.2.0-alpha.10
|
|
22
|
+
|
|
23
|
+
This release fixes the first activation of the Obsidian projection. In
|
|
24
|
+
0.2.0-alpha.9 the check for a running Obsidian matched Atelier's own maintenance
|
|
25
|
+
service, so with Obsidian quit no view was ever published, and an Obsidian
|
|
26
|
+
with no vault open was reported as an unsupported version. To publish a view
|
|
27
|
+
for the first time, quit Obsidian, let the service publish, then run
|
|
28
|
+
`atelier obsidian open --scope ID --adapter=obsidian-cli`. No project or
|
|
29
|
+
machine setting needs to change.
|
|
30
|
+
|
|
31
|
+
## Upgrading to 0.2.0-alpha.9
|
|
32
|
+
|
|
33
|
+
This release fixes a defect in 0.2.0-alpha.8: the Obsidian maintenance service
|
|
34
|
+
could not start from the published package (`atelier obsidian service start`
|
|
35
|
+
reported `start-failed` with `service-exited-13`). Upgrade from 0.2.0-alpha.8
|
|
36
|
+
directly; nothing else changes and no project or machine setting needs to be
|
|
37
|
+
touched. 0.2.0-alpha.8 is deprecated.
|
|
38
|
+
|
|
39
|
+
## Upgrading to 0.2.0-alpha.8
|
|
40
|
+
|
|
41
|
+
This release adds typed advisory decision contracts and an experimental,
|
|
42
|
+
opt-in Obsidian projection. Nothing is published for a project that does not
|
|
43
|
+
enable `ext["mnstry.atelier.obsidian"]`; see [obsidian.md](obsidian.md).
|
|
44
|
+
|
|
45
|
+
The link resolver that produces `links_to` edges changed in five classes
|
|
46
|
+
(links inside code and front matter, directory links, links that climb above
|
|
47
|
+
the repository root, malformed percent-encoding, and workspace-only wikilink
|
|
48
|
+
and cross-repository edges). Regenerate committed graph artifacts after
|
|
49
|
+
upgrading and review the difference; the classes are listed in the changelog
|
|
50
|
+
and in [obsidian-contract.md](obsidian-contract.md).
|
|
51
|
+
|
|
52
|
+
## Upgrading to 0.2.0-alpha.7
|
|
53
|
+
|
|
54
|
+
This release adds optional evidence-bound local review and the external-project
|
|
55
|
+
starter. Existing v1 locks and readers remain compatible. To use bound review,
|
|
56
|
+
explicitly qualify each pack for the new root version, regenerate the graph and
|
|
57
|
+
projection, and create a fresh run. Historical runs retain their original
|
|
58
|
+
snapshot and never acquire renewed approval from an upgrade. See
|
|
59
|
+
[local review](local-review.md) for the complete workflow.
|
|
60
|
+
|
|
61
|
+
## Upgrading to 0.2.0-alpha.6
|
|
62
|
+
|
|
63
|
+
This release adds Atelier Sync Deliverable Zero: a headless, local repository
|
|
64
|
+
supervisor with explicit enrollment, complete repository observations,
|
|
65
|
+
fast-forward-only reconciliation, pause/resume control, hash-chained local
|
|
66
|
+
operation traces, and two-phase user-confirmed commit and publication. It does
|
|
67
|
+
not add a desktop shell, semantic conflict resolution, force operations,
|
|
68
|
+
telemetry, or unattended semantic writes.
|
|
69
|
+
|
|
70
|
+
Consumers that adopt the new runtime should enroll one repository explicitly,
|
|
71
|
+
treat watchers as hints rather than truth, require a fresh complete observation
|
|
72
|
+
before each confirmed mutation, and keep commit and publication as separate
|
|
73
|
+
user decisions. Existing consumers that do not import the runtime subpaths are
|
|
74
|
+
contract-compatible and need only update their pinned dependency.
|
|
75
|
+
|
|
76
|
+
## Upgrading to 0.2.0-alpha.5
|
|
77
|
+
|
|
78
|
+
This release hardens public/private boundary enforcement, local serving,
|
|
79
|
+
collaboration-ledger integrity, disclosure review, and release provenance.
|
|
80
|
+
Documents valid against `0.2.0-alpha.0` remain contract-compatible, but some
|
|
81
|
+
previously tolerated unsafe or ambiguous states now fail closed.
|
|
82
|
+
|
|
83
|
+
- Projects using `atelier dev` must provide a generated
|
|
84
|
+
`atelier.manifest.json`; only enrolled, safe, realpath-validated static files
|
|
85
|
+
are served, and the sidecar accepts loopback traffic only.
|
|
86
|
+
- Empty or malformed content-rule policies, incomplete Git reads, corrupt or
|
|
87
|
+
oversized collaboration ledgers, and unsafe manifest entries are now
|
|
88
|
+
blocking errors with typed CLI diagnostics.
|
|
89
|
+
- Run `atelier disclosure check` before sharing tracked or staged content. A
|
|
90
|
+
private denylist is required by default and must remain outside the public
|
|
91
|
+
repository.
|
|
92
|
+
- Release candidates are packed once, SHA-256-bound, and the exact audited
|
|
93
|
+
tarball is the artifact sent through npm trusted publishing.
|
|
94
|
+
|
|
95
|
+
Re-run the boundary, disclosure, graph, readiness, and lock checks below after
|
|
96
|
+
updating. If `atelier dev` previously served files without a manifest, generate
|
|
97
|
+
and review the manifest before restarting it.
|
|
98
|
+
|
|
99
|
+
## Upgrading to 0.2.0-alpha.4
|
|
100
|
+
|
|
101
|
+
This is a presentation release. There are no contract changes and no runtime
|
|
102
|
+
behaviour changes: documents valid against `0.2.0-alpha.0` remain valid, and
|
|
103
|
+
`npm run contract:compat` is clean against the same epoch baseline. The README,
|
|
104
|
+
package metadata, and public documentation now describe the Atelier as a
|
|
105
|
+
repository substrate for people, agents, teams, and tools. Upgrading is a
|
|
106
|
+
dependency bump.
|
|
107
|
+
|
|
108
|
+
## Upgrading to 0.2.0-alpha.3
|
|
109
|
+
|
|
110
|
+
No contract changes and no runtime behaviour changes: documents valid against
|
|
111
|
+
`0.2.0-alpha.0` remain valid, and `npm run contract:compat` is clean against
|
|
112
|
+
the same epoch baseline. Upgrading is a dependency bump.
|
|
113
|
+
|
|
114
|
+
One thing worth knowing, because it changes what you type. Outside an
|
|
115
|
+
installed workspace, use `npx mnstry-atelier` rather than `npx atelier`: the
|
|
116
|
+
unscoped npm name `atelier` belongs to an unrelated third-party package, so a
|
|
117
|
+
bare `npx atelier` there runs someone else's code. Inside an installed
|
|
118
|
+
workspace both names resolve from `node_modules/.bin`, so npm scripts and
|
|
119
|
+
workspace shells need no change.
|
|
120
|
+
|
|
121
|
+
## Upgrading to 0.2.0-alpha.2
|
|
122
|
+
|
|
123
|
+
No contract changes and no runtime behaviour changes: documents valid against
|
|
124
|
+
`0.2.0-alpha.0` remain valid, and `npm run contract:compat` is clean against
|
|
125
|
+
the same epoch baseline. Upgrading is a dependency bump.
|
|
126
|
+
|
|
127
|
+
Note on version numbering: `0.2.0` was published in error and unpublished the
|
|
128
|
+
same day. If a lockfile anywhere pins `0.2.0`, repin it to `0.2.0-alpha.2` —
|
|
129
|
+
that number is permanently retired on npm and will not resolve.
|
|
130
|
+
|
|
8
131
|
## Upgrading to 0.2.0-alpha.1
|
|
9
132
|
|
|
10
133
|
No contract changes and no authored-content changes: documents valid against
|
|
@@ -12,7 +135,7 @@ No contract changes and no authored-content changes: documents valid against
|
|
|
12
135
|
the same epoch baseline. Upgrading is a dependency bump.
|
|
13
136
|
|
|
14
137
|
Two things worth knowing. The package is now on the npm registry, so the
|
|
15
|
-
install command changes from a Git reference to `@mnstry/atelier@0.2.0-alpha.
|
|
138
|
+
install command changes from a Git reference to `@mnstry/atelier@0.2.0-alpha.2`
|
|
16
139
|
— keep the `@mnstry/` scope, since the unscoped name belongs to an unrelated
|
|
17
140
|
package. And a local sidecar that previously exited on a malformed request now
|
|
18
141
|
answers it, so anything that supervised `atelier dev` through restarts can stop
|
|
@@ -62,16 +185,16 @@ For registry installs, pin the exact version and record the resolved version
|
|
|
62
185
|
in the lockfile:
|
|
63
186
|
|
|
64
187
|
```bash
|
|
65
|
-
npm install --save-dev @mnstry/atelier@0.2.0-alpha.
|
|
66
|
-
npx atelier lock write --project ./atelier.project.json
|
|
188
|
+
npm install --save-dev @mnstry/atelier@0.2.0-alpha.11
|
|
189
|
+
npx mnstry-atelier lock write --project ./atelier.project.json
|
|
67
190
|
```
|
|
68
191
|
|
|
69
192
|
For Git installs, pin the release tag rather than a branch, so the lock file
|
|
70
193
|
records exactly what was reviewed:
|
|
71
194
|
|
|
72
195
|
```bash
|
|
73
|
-
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.
|
|
74
|
-
npx atelier lock write --project ./atelier.project.json
|
|
196
|
+
npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.11"
|
|
197
|
+
npx mnstry-atelier lock write --project ./atelier.project.json
|
|
75
198
|
```
|
|
76
199
|
|
|
77
200
|
Before accepting upstream changes, run the non-mutating upgrade planner:
|
|
@@ -122,3 +245,30 @@ older workspaces and should not be used in new docs or package scripts.
|
|
|
122
245
|
When unsure, fail closed: keep source in the private-domain workspace and move
|
|
123
246
|
only a reviewed summary into the shared-project workspace through ordinary Git
|
|
124
247
|
review.
|
|
248
|
+
|
|
249
|
+
## Exact installed source and review history
|
|
250
|
+
|
|
251
|
+
`atelier lock provenance --exact-source-required` and
|
|
252
|
+
`atelier lock check --exact-source-required` refuse unverified bindings.
|
|
253
|
+
Supported npm lock metadata is a declaration matched to the exact installation
|
|
254
|
+
slot, including nested instances; a SHA in that declaration is not proof of the
|
|
255
|
+
installed bytes. Linked/unsupported stores remain unresolved when no trustworthy
|
|
256
|
+
instance evidence is available. Tarball/registry integrity is reported when
|
|
257
|
+
available, without inventing a Git origin. Dirty, ignored or untracked executable
|
|
258
|
+
inputs prevent verified checkout qualification. Inventory excludes Git metadata
|
|
259
|
+
and dependency trees; two observed byte inventories must agree and match the commit tree, including when Git index hints conceal changes. A verified clean
|
|
260
|
+
checkout does not authenticate an upstream publisher.
|
|
261
|
+
|
|
262
|
+
Review snapshots and decisions are separate from historical v1 locks. See
|
|
263
|
+
[pack lifecycle](extension-pack-lifecycle.md) and
|
|
264
|
+
[inspection portability](review-portability.md) before replacing packs or moving
|
|
265
|
+
state. Updating a package or a digest never silently renews old approval.
|
|
266
|
+
|
|
267
|
+
## Exact local candidate transactions
|
|
268
|
+
|
|
269
|
+
For the bounded, manually confirmed single-repository workflow, see
|
|
270
|
+
[Local exact-plan upgrades](exact-upgrades.md). The `upgrade plan --save`,
|
|
271
|
+
`upgrade apply --plan ... --confirm ...`, `upgrade status`, and recovery dry-run
|
|
272
|
+
commands are separate from the legacy flag-based migration workflow above.
|
|
273
|
+
They preserve history and honor existing commit hooks; they do not install a
|
|
274
|
+
new package or activate a runtime.
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Portable private artifact vaults (experimental)
|
|
2
|
+
|
|
3
|
+
This is an optional hosted service contract, not part of the local authoring
|
|
4
|
+
server. The core does not start a service, provision infrastructure, select an
|
|
5
|
+
identity provider, or make network requests on import. A host explicitly binds
|
|
6
|
+
provider SDKs and owns their network access, credentials, costs and operations.
|
|
7
|
+
Canonical sources and editorial review remain in the consuming repository.
|
|
8
|
+
Uploading a derived artifact does not satisfy an editorial publication gate.
|
|
9
|
+
|
|
10
|
+
## HTTP contract
|
|
11
|
+
|
|
12
|
+
- `GET /<vault>/<artifact-path>` and `HEAD` authenticate a browser session and
|
|
13
|
+
require exact owner issuer + subject equality. Every asset uses this route.
|
|
14
|
+
- `POST /_publish/<vault>` requires a separate vault-scoped machine credential.
|
|
15
|
+
Browser cookies and Origin headers are refused on this endpoint. The JSON
|
|
16
|
+
body has schema `atelier-vault-publication/v1`, `contractVersion: "1.0.0"`,
|
|
17
|
+
`expectedRevision` (initially
|
|
18
|
+
zero), and `files: [{path, base64}]`. No URL retrieval or directory discovery
|
|
19
|
+
occurs. The caller explicitly selects all uploaded files and is responsible
|
|
20
|
+
for source selection, disclosure checks and any editorial approval.
|
|
21
|
+
- Successful publication returns 201 and a receipt containing vault, revision
|
|
22
|
+
and the SHA-256 publication digest. Conflicts return 409. Retry after uncertain
|
|
23
|
+
delivery uses `GET /_publish/<vault>` with the same machine credential. It
|
|
24
|
+
returns only schema `atelier-vault-status/v1`, vault, revision and publication
|
|
25
|
+
digest (null before the first publication), never the file manifest. Compare
|
|
26
|
+
both revision and digest with the intended publication before declaring it
|
|
27
|
+
delivered. A differing digest or later revision requires reconciliation; do
|
|
28
|
+
not silently overwrite it. There is no automatic retry or idempotency promise.
|
|
29
|
+
- Unauthenticated reads return 401; a host may route these to its established
|
|
30
|
+
sign-in UI. Missing and non-owned vaults both return 404. Failures return 503
|
|
31
|
+
without leaking adapter errors. No CORS grants or sharing bypass exist.
|
|
32
|
+
- Requests are limited to 4 MiB encoded JSON, 100 files, conservative ASCII
|
|
33
|
+
paths and allowlisted types. HTML and CSS are supported with restrictive CSP;
|
|
34
|
+
scripts, SVG and arbitrary interactive applications are excluded. HTML is
|
|
35
|
+
sandboxed without same-origin or script privileges. PDF is a download.
|
|
36
|
+
|
|
37
|
+
All output, including errors, is private/no-store. Content bytes are checked
|
|
38
|
+
against the committed manifest before delivery. No public object URLs or
|
|
39
|
+
presigned download redirects are returned. Revocation blocks subsequent
|
|
40
|
+
checks; it cannot recall a response already authorized or a downloaded file.
|
|
41
|
+
|
|
42
|
+
The optional `contractVersion` and inert `ext` containers follow the kit schema
|
|
43
|
+
epoch. Extension data never grants authority and is not copied into artifacts.
|
|
44
|
+
|
|
45
|
+
## Host interfaces
|
|
46
|
+
|
|
47
|
+
Import the `@mnstry/atelier/vault` entrypoint. `createVaultService` takes:
|
|
48
|
+
|
|
49
|
+
- `identity.read(request)` returns a verified `{issuer, subject}` or null. It
|
|
50
|
+
must verify signatures, issuer/audience, expiry and current revocation using
|
|
51
|
+
the chosen provider. Never derive identity from a caller-provided header.
|
|
52
|
+
- `identity.publish(request, vault)` verifies a machine credential. The supplied
|
|
53
|
+
`vaultIdentity` helper hashes a high-entropy bearer credential and calls the
|
|
54
|
+
host's authoritative `lookupCredential(hash)`. A record contains `vault`,
|
|
55
|
+
`owner`, `revoked: false` and finite millisecond `expiresAt`. Generate at least
|
|
56
|
+
32 random bytes; never place credentials in repository files or URLs.
|
|
57
|
+
- `metadata.get(vault)` returns owner, revision and manifest. `commit` compares
|
|
58
|
+
owner AND expected revision atomically before replacing the current manifest.
|
|
59
|
+
- `storage.put(key, bytes)` and `get(key)` use private storage. Keys are generated
|
|
60
|
+
from validated vault IDs and byte digests; request paths never become keys.
|
|
61
|
+
|
|
62
|
+
Metadata lookup and credential lookup must use authoritative current state,
|
|
63
|
+
not eventually consistent caches. Provision vault ownership out of band; the
|
|
64
|
+
publication endpoint cannot claim a vault or change ownership. A host identity
|
|
65
|
+
migration must explicitly map issuer and subject, not match email strings.
|
|
66
|
+
|
|
67
|
+
## Provider bindings
|
|
68
|
+
|
|
69
|
+
`createVercelVault` composes Blob/PostgreSQL bindings into a Web handler.
|
|
70
|
+
`createCloudflareVault` returns a Worker with per-request first-primary D1
|
|
71
|
+
sessions, using `env.VAULT_OBJECTS` and `env.VAULT_DB`. Both require explicit
|
|
72
|
+
verified-session and current-credential lookup functions from the host.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
Vercel: pass the host-installed `@vercel/blob` SDK to `vercelPrivateStorage` and
|
|
76
|
+
an established PostgreSQL client object exposing `query(sql, args)` to `postgresVaultMetadata`. Use the
|
|
77
|
+
exported `VAULT_TABLE_SQL` to initialize a new disposable/purpose-built store.
|
|
78
|
+
Bind an established browser identity SDK to `verifySession`; the kit does not
|
|
79
|
+
ship a bespoke login system. Route all vault paths through the handler. Do not
|
|
80
|
+
copy artifact output into public/static deployment directories.
|
|
81
|
+
|
|
82
|
+
Cloudflare: pass a private R2 binding to `r2PrivateStorage` and D1 to
|
|
83
|
+
`d1VaultMetadata`. If using D1 read replication, pass a session with
|
|
84
|
+
`first-primary` semantics so ownership lookup cannot use a stale replica.
|
|
85
|
+
The Web Request/Response handler can run directly in a Worker. Disable public
|
|
86
|
+
R2 access and do not attach a public R2 domain. All Worker/provider aliases must
|
|
87
|
+
run the same handler; no cache rule or static-assets shortcut may bypass it.
|
|
88
|
+
|
|
89
|
+
Each adapter puts immutable-in-meaning content-addressed bytes first, then
|
|
90
|
+
switches the manifest through an atomic SQL update. Concurrent publications
|
|
91
|
+
cannot overwrite a newer revision. Failed uploads can leave unreferenced
|
|
92
|
+
private objects; garbage collection and retention are host responsibilities.
|
|
93
|
+
There is no automatic deletion. Republishing a selected earlier artifact set
|
|
94
|
+
at the current expected revision implements rollback as a new revision.
|
|
95
|
+
|
|
96
|
+
References:
|
|
97
|
+
- https://vercel.com/docs/vercel-blob/private-storage
|
|
98
|
+
- https://developers.cloudflare.com/r2/api/workers/workers-api-reference/
|
|
99
|
+
- https://developers.cloudflare.com/d1/worker-api/d1-database/
|
|
100
|
+
|
|
101
|
+
## Qualification and remaining integration
|
|
102
|
+
|
|
103
|
+
`node --test test/vault.test.mjs` exercises both storage adapters with SDK-shaped
|
|
104
|
+
local doubles and a real SQLite engine behind both SQL interfaces. PostgreSQL
|
|
105
|
+
placeholder translation in the test is a local double, not a PostgreSQL engine. This proves
|
|
106
|
+
shared local behavior, not Vercel, R2, D1 or PostgreSQL hosted operation.
|
|
107
|
+
|
|
108
|
+
Before serving real material: qualify the chosen identity SDK and browser
|
|
109
|
+
login/revocation, deployed provider bindings, owner/wrong-owner/anonymous reads,
|
|
110
|
+
all aliases and assets, CSS/image rendering under sandbox CSP, publication
|
|
111
|
+
failure recovery, limits and credentials. Run a source-bound independent
|
|
112
|
+
review. These are open gates. The implementation is not deployment-ready.
|
|
113
|
+
The SDKs, production credential store, provisioning UI, CLI integration and
|
|
114
|
+
hosted conformance runner remain consumer-host work for the next integration
|
|
115
|
+
step. No existing deployment or protection setting is modified by this code.
|
|
116
|
+
|
|
117
|
+
## Privacy gate and vault interface
|
|
118
|
+
|
|
119
|
+
This is an experimental contract, not a qualified hosted product. The service
|
|
120
|
+
requires a trusted `deployment: {id, origins}` binding. Origins are canonical
|
|
121
|
+
HTTPS origins, including every deployment alias and direct handler origin (up
|
|
122
|
+
to 16). The provider inspector must discover any additional bypass surfaces and
|
|
123
|
+
refuse `completeInventory` if this binding is stale. Configuration evidence is
|
|
124
|
+
trusted host input, never publisher/browser input or a repository assertion.
|
|
125
|
+
|
|
126
|
+
The context carries vault, owner, publication digest, metadata revision, manifest, deployment,
|
|
127
|
+
request origin/path, phase, and `objects: [{key, sha256, size}]`. Object keys are
|
|
128
|
+
explicit even before upload. The evaluator requires both vault home routes and
|
|
129
|
+
every manifest path on every configured origin, plus every unique object key.
|
|
130
|
+
Each route target has `kind: "route"`, URL and expected SHA-256; each storage
|
|
131
|
+
target has `kind: "storage"`, URL, key, SHA-256 and size. Storage URLs are only
|
|
132
|
+
passed to the trusted inspector/transport, never returned to the browser.
|
|
133
|
+
|
|
134
|
+
Privacy checks ask whether **anonymous and other-user identities are denied**.
|
|
135
|
+
They never request an owner's session or probe as the author. Owner rendering
|
|
136
|
+
and login continuity are separate functional acceptance checks. Consequently,
|
|
137
|
+
probes against the real handler exit at authorization without recursively
|
|
138
|
+
entering the privacy gate. No substitute owner route or privileged inspection
|
|
139
|
+
endpoint is used to manufacture a verified verdict.
|
|
140
|
+
|
|
141
|
+
`privacy.verify(context)` collects before-upload and before-activation evidence.
|
|
142
|
+
Before upload, authoritative provider configuration must attest private storage
|
|
143
|
+
and owner-only routing before private bytes are written. Denial probes of paths
|
|
144
|
+
that do not yet exist are supplementary; a 404 alone cannot prove future bytes
|
|
145
|
+
will be protected. A host can supply public synthetic canary markers to check
|
|
146
|
+
its protection machinery, without uploading private data to discover exposure.
|
|
147
|
+
Before activation, the same gate checks actual staged object locations and all
|
|
148
|
+
planned artifact routes. Unactivated artifact paths may return 404; their future
|
|
149
|
+
owner rendering is not asserted by a denial verdict. Provider configuration and
|
|
150
|
+
the handler's authorization remain the preventive controls. A change between
|
|
151
|
+
checks refuses activation, but cannot atomically lock external provider policy.
|
|
152
|
+
|
|
153
|
+
Read requests call only `privacy.current(context)`, which must load stored
|
|
154
|
+
current evidence. They never collect probes. Missing, expired, wrong-owner,
|
|
155
|
+
wrong-deployment, wrong-publication or incomplete evidence blocks delivery.
|
|
156
|
+
`createVaultPrivacyState({probe, load, compareAndSet})` supplies an explicit refresher and
|
|
157
|
+
host-owned evidence persistence. Call `refresh(context)` after commit and from
|
|
158
|
+
the host scheduler with the current authoritative manifest and owner. Use the public
|
|
159
|
+
`createVaultContext({vault, record, deployment})` export to build that context
|
|
160
|
+
from `metadata.get(vault)`; it includes storage keys, revision and null handling
|
|
161
|
+
without copying internal formats. Refresh rejects a missing, negative or
|
|
162
|
+
non-integer revision before reading the evidence store. Activation
|
|
163
|
+
evidence is deliberately not promoted to read evidence; owner delivery remains
|
|
164
|
+
unavailable until the first successful read-phase refresh. Refresh failure never
|
|
165
|
+
extends a validity window. A policy change requires immediate host invalidation;
|
|
166
|
+
the kit cannot discover that change from an evidence-store read alone.
|
|
167
|
+
|
|
168
|
+
The store key includes deployment ID and vault. `load(key)` returns an immutable
|
|
169
|
+
snapshot `{version, evidence}`; a missing record is `{version: 0, evidence: null}`.
|
|
170
|
+
`compareAndSet(key, evidence, {expectedVersion})` must atomically compare the
|
|
171
|
+
version, increment it on success and return exactly `true`, or return `false`
|
|
172
|
+
without writing. Its transaction must refuse replacement of any exposure alarm
|
|
173
|
+
and refuse older metadata revisions for green evidence. Exposure alarms must
|
|
174
|
+
be allowed to replace newer green evidence regardless of the alarm revision: a
|
|
175
|
+
staged-only exposure can concern objects outside the current manifest. Separate atomic load/save calls are not
|
|
176
|
+
sufficient. Protect the store from publishers; no unconditional save adapter is
|
|
177
|
+
accepted. Evidence and refresh contexts bind the authoritative metadata revision.
|
|
178
|
+
|
|
179
|
+
Green evidence retains the version loaded before collection. A conflict refuses
|
|
180
|
+
that collection; it is never converted into an unconditional overwrite. Before
|
|
181
|
+
returning non-read green evidence, the wrapper reloads the store to notice an
|
|
182
|
+
alarm another instance persisted during probing. This check is not atomic with
|
|
183
|
+
metadata activation; hosts must still own provider containment and transactions.
|
|
184
|
+
|
|
185
|
+
Exposure alarms use a different path. The wrapper latches the original evidence
|
|
186
|
+
in memory, then reloads and conditionally writes it, with at most three attempts
|
|
187
|
+
per verify/refresh call. If a durable alarm already exists, no rewrite is needed.
|
|
188
|
+
If writes conflict, each retry uses a fresh snapshot. If the store throws or the
|
|
189
|
+
attempt bound is reached, verify/refresh rejects with the public
|
|
190
|
+
`VaultAlarmPersistenceError` (`code: "VAULT_ALARM_NOT_PERSISTED"`, `evidence`).
|
|
191
|
+
Hosts must alert on that error and retry the same wrapper after store recovery.
|
|
192
|
+
Its next verify/refresh retries the original pending evidence without re-probing,
|
|
193
|
+
so a vanished or staged-only exposure is not forgotten. Store calls themselves
|
|
194
|
+
must have host-enforced deadlines; the attempt bound is not a network timeout.
|
|
195
|
+
|
|
196
|
+
`current` performs no persistence retry or probe and immediately returns any
|
|
197
|
+
local alarm, including an unpersisted one. The service's gate translates the
|
|
198
|
+
typed error into an exposed/refused result with `persistence: "unconfirmed"`;
|
|
199
|
+
the underlying wrapper API exposes the typed error to host refresh/verification
|
|
200
|
+
callers. Other instances and restarts cannot see an unpersisted memory latch,
|
|
201
|
+
so durable-store failure is an unresolved incident, never a success receipt.
|
|
202
|
+
Best-effort notification alone does not settle it.
|
|
203
|
+
|
|
204
|
+
No alarm-clear API is provided. Recovery is an explicit host operator procedure:
|
|
205
|
+
contain the external exposure, verify restored controls, reconcile durable state,
|
|
206
|
+
then replace affected handler instances. Restart alone is not recovery and does
|
|
207
|
+
not clear a successfully persisted alarm. No provider containment is implemented
|
|
208
|
+
by this module.
|
|
209
|
+
|
|
210
|
+
### Reusable denial probe collector
|
|
211
|
+
|
|
212
|
+
`createVaultPrivacyProbe({inspect, request, onExposure})` takes an explicit
|
|
213
|
+
provider inspector and transport, without choosing a network implementation.
|
|
214
|
+
The transport receives only anonymous/otherUser identity, manual redirects and
|
|
215
|
+
an AbortSignal; otherUser must be a dedicated synthetic unauthorized principal,
|
|
216
|
+
not another real person's session. Never give this collector an owner credential.
|
|
217
|
+
The inspector supplies configuration, policy revision and the full target list.
|
|
218
|
+
Configuration must report `ownerOnly`, `privateStorage`, `completeInventory`.
|
|
219
|
+
|
|
220
|
+
The collector supports at most 2000 targets, sufficient for 100 files across
|
|
221
|
+
16 origins plus home routes and unique storage objects. Exceeding the bound or
|
|
222
|
+
the configurable whole-operation deadline (maximum/default 60 seconds) refuses
|
|
223
|
+
verification; completeness is never replaced with sampling. The serial transport
|
|
224
|
+
may not finish a large inventory in time. Qualify provider latency and choose a
|
|
225
|
+
smaller deployment or a separately reviewed batched collector if needed. The
|
|
226
|
+
current 60-second validity starts at collection start; refresher period plus
|
|
227
|
+
worst-case collection time must be strictly less than 60 seconds. A minute
|
|
228
|
+
schedule or a near-deadline collection cannot provide continuous availability.
|
|
229
|
+
These defaults are an open product limitation, not a scheduling recommendation.
|
|
230
|
+
|
|
231
|
+
Each target supplies an expected SHA-256, optionally a public synthetic `canary`
|
|
232
|
+
marker of at least 32 characters. Nonempty whole-body digest or embedded canary matches
|
|
233
|
+
are exposure even on error or already-followed responses. Zero-byte artifacts
|
|
234
|
+
remain valid: an empty refusal discloses no bytes and never raises an exposure
|
|
235
|
+
alarm. Home-route digests may use an inspector-defined placeholder; use an
|
|
236
|
+
explicit public canary to detect actual listing disclosure. Nonempty 401/403/404 bodies without a match
|
|
237
|
+
are inconclusive, because a body fragment is not proof of non-disclosure. Empty
|
|
238
|
+
401/403/404 responses count as denial. Arbitrary HTML and 5xx are inconclusive.
|
|
239
|
+
Login redirects may match trusted `loginEndpoints: [{url, queryKeys}]`; endpoints
|
|
240
|
+
are exact HTTPS origin/path, with an explicit allowlist of supported non-secret
|
|
241
|
+
parameter names. Credential-bearing or unexpected parameters, hosts and paths
|
|
242
|
+
are inconclusive. The collector never follows redirects or copies login values
|
|
243
|
+
into evidence. This verifies refusal, not the return-to user experience.
|
|
244
|
+
|
|
245
|
+
Evidence starts its freshness window at collection start (60 seconds), binds
|
|
246
|
+
owner/operation/publication/deployment, retains target digests and keys, and
|
|
247
|
+
re-inspects provider policy using canonical object-key ordering. An unauthorized
|
|
248
|
+
content observation returns immediately and stays `exposed` even if evidence
|
|
249
|
+
later expires. Optional `onExposure(evidence)` is a best-effort host notification;
|
|
250
|
+
it cannot delay or downgrade the alarm and is not durable containment. Hosts
|
|
251
|
+
must persist incidents and enforce provider-side containment independently.
|
|
252
|
+
No scheduler, provider configuration collector, credential store, containment
|
|
253
|
+
operation, or hosted transport is bundled here.
|
|
254
|
+
|
|
255
|
+
A provider bypass can expose staged objects after a successful preflight. This
|
|
256
|
+
handler can refuse its own delivery/activation but cannot close an external
|
|
257
|
+
public origin or delete orphaned bytes. Before real material, qualify atomic
|
|
258
|
+
incident persistence, provider protection restoration, staging retention/deletion
|
|
259
|
+
and owner-visible recovery. Do not advertise a denied handler response as global
|
|
260
|
+
containment or an observed denial as permanent privacy.
|
|
261
|
+
|
|
262
|
+
### Reference interface and browser qualification
|
|
263
|
+
|
|
264
|
+
The reference home provides privacy status, revision, navigation, search, empty
|
|
265
|
+
and unavailable states, accessible labels and responsive layout. Its status
|
|
266
|
+
states that unauthorized-access checks passed at a recorded time, not that owner
|
|
267
|
+
rendering or every future provider state is proven. Generated HTML stays outside
|
|
268
|
+
the trusted shell under script-disabled sandbox CSP. This is a minimal reference
|
|
269
|
+
interface, not full authoring/review parity.
|
|
270
|
+
|
|
271
|
+
**Open browser design gate:** opaque-origin sandboxed HTML may lose SameSite
|
|
272
|
+
session cookies on CSS/image requests. Widening cookies can permit cross-site
|
|
273
|
+
embedding. The kit does not silently remove sandbox isolation or widen cookie
|
|
274
|
+
scope. A consuming host must qualify an isolated artifact-origin/session design,
|
|
275
|
+
including Chromium/Firefox/WebKit subresources and refused cross-site embeds,
|
|
276
|
+
before claiming browser-product readiness. No browser acceptance is claimed.
|
|
277
|
+
|
|
278
|
+
### Source layouts
|
|
279
|
+
|
|
280
|
+
The Node-only `@mnstry/atelier/vault/source` entrypoint exports
|
|
281
|
+
`prepareVaultSource({root, paths, expectedRevision})`. Pass an absolute local
|
|
282
|
+
artifact root and explicit relative file paths. A root can be a folder inside
|
|
283
|
+
the authoring repository or a separate artifact checkout; neither is scanned
|
|
284
|
+
automatically. It returns the publication request, digest and manifest without
|
|
285
|
+
uploading anything. Keep machine-specific roots in local host configuration.
|
|
286
|
+
|
|
287
|
+
The reader refuses symlinks, hard-linked files, path escapes, directories,
|
|
288
|
+
unsupported formats and oversized bundles. It checks file identity and metadata
|
|
289
|
+
around the read and binds the resulting bytes to the manifest. Run against a
|
|
290
|
+
quiescent source tree; portable filesystem checks are not a sandbox against a
|
|
291
|
+
malicious process concurrently replacing ancestor directories. The publication
|
|
292
|
+
bundle is an immutable byte snapshot, not a live directory handle.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-remote-capability@v1",
|
|
3
|
+
"id": "sample-capability",
|
|
4
|
+
"serviceRef": "https://example.invalid/mcp",
|
|
5
|
+
"inputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"outputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
7
|
+
"maxInputBytes": 1024,
|
|
8
|
+
"implementation": "remote",
|
|
9
|
+
"executionAuthority": false,
|
|
10
|
+
"command": "execute"
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-remote-capability@v1",
|
|
3
|
+
"id": "sample-capability",
|
|
4
|
+
"serviceRef": "https://example.invalid/mcp",
|
|
5
|
+
"inputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"outputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
7
|
+
"maxInputBytes": 1024,
|
|
8
|
+
"implementation": "remote",
|
|
9
|
+
"executionAuthority": false
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-guide-consent@v1",
|
|
3
|
+
"offerDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
4
|
+
"capabilityDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
5
|
+
"payloadDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"engagementRevision": 1,
|
|
7
|
+
"status": "approved",
|
|
8
|
+
"validFrom": "2026-01-01T00:00:00Z",
|
|
9
|
+
"expiresAt": "2026-01-02T00:00:00Z",
|
|
10
|
+
"authority": "local-assertion-only"
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-intake-completion@v1",
|
|
3
|
+
"attemptId": "sample",
|
|
4
|
+
"attemptDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
5
|
+
"outputDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"bytes": 12,
|
|
7
|
+
"integrity": "verified",
|
|
8
|
+
"semanticAcceptance": "accepted"
|
|
9
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-intake-attempt@v1",
|
|
3
|
+
"attemptId": "sample",
|
|
4
|
+
"blobId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
5
|
+
"extractorId": "plain-text",
|
|
6
|
+
"extractorVersion": "1",
|
|
7
|
+
"configurationDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
8
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "mnstry.atelier-intake-completion@v1",
|
|
3
|
+
"attemptId": "sample",
|
|
4
|
+
"attemptDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
5
|
+
"outputDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
6
|
+
"bytes": 12,
|
|
7
|
+
"integrity": "verified",
|
|
8
|
+
"semanticAcceptance": "pending"
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "atelier-repository-observation@v1",
|
|
3
|
+
"observedAt": "2026-08-25T00:00:00.000Z",
|
|
4
|
+
"complete": true,
|
|
5
|
+
"root": "/workspace/project",
|
|
6
|
+
"filesystem": {
|
|
7
|
+
"supported": true,
|
|
8
|
+
"code": "local-filesystem"
|
|
9
|
+
},
|
|
10
|
+
"blockers": [
|
|
11
|
+
{
|
|
12
|
+
"code": "partial-clone-unsupported",
|
|
13
|
+
"message": "partial clones may omit required Git objects",
|
|
14
|
+
"details": {}
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"warnings": []
|
|
18
|
+
}
|