@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,49 @@
|
|
|
1
|
+
# Assurance controls and evidence map
|
|
2
|
+
|
|
3
|
+
This ledger maps public trust claims to the control that enforces them, the
|
|
4
|
+
test that challenges the control, and the limit that remains. It describes the
|
|
5
|
+
source tree; a release decision must additionally record the exact candidate
|
|
6
|
+
commit and packed-tarball digest.
|
|
7
|
+
|
|
8
|
+
| Claim | Enforcing control | Defensive evidence | Stated limit |
|
|
9
|
+
| --- | --- | --- | --- |
|
|
10
|
+
| Boundary rules cannot silently switch themselves off | `src/boundary/policy.mjs`, `src/boundary/content-rules.mjs`, and generated Git hooks | `boundary:test`; boundary case in `assurance:mutation-smoke` | Repository access remains the source read boundary; an audience label is not encryption |
|
|
11
|
+
| A clean boundary verdict uses complete evidence | Typed Git reads with diff and binary budgets; incomplete reads become blocking diagnostics; Sync requires the enrolled root to be scanned, uses its digest-bound Git for actor and staged evidence, and disables network actor fallback | `test/boundary-content-rules.test.mjs`; Sync boundary-scope, pinned-Git, and no-network actor refusal cases | Budgets intentionally refuse evidence too large to inspect rather than claiming it is clean |
|
|
12
|
+
| Graph classification has one meaning | `src/graph/knowledge-graph.mjs` is canonical; `src/graph/graph.mjs` adapts its result | `graph:test`; graph case in `assurance:mutation-smoke` | Unclassified Markdown is retained as private diagnostic material, not admitted as governed content |
|
|
13
|
+
| The package has no undisclosed runtime egress path | Canonical forbidden-egress scanner plus exact packed-file inventory in `release:audit`; Atelier Sync confines network Git to bounded fetch and an exact-plan, non-force push | egress tests, marker-inventory test, runtime fetch/push refusal tests, and egress case in `assurance:mutation-smoke` | Data-only files are not interpreted; reviewed `gh` actor resolution and explicitly enrolled Git fetch/push are documented subprocess exceptions. Optional host-bound vault SDK and transport I/O is outside the lexical scanner model; trusted provider configuration, denial probes and hosted qualification are separate controls. |
|
|
14
|
+
| User-confirmed repository writes match what was reviewed | Content-bound, expiring plan identifiers; fresh complete observations; exact staged and written-tree blob/mode manifests; post-hook tree, single-parent, and message verification with compare-and-swap rollback; refusal of prior unpublished commits; and an exact verified-object push after HEAD/target revalidation with tag following and recursive submodule publication disabled | `sync:test` plan, expiry, hook/index, late-HEAD, ahead-branch, remote-ref, remote-drift, and evidence-failure cases | Ordinary Git hooks may run, but a hook cannot substitute a different commit object for publication |
|
|
15
|
+
| Resident Sync state cannot escape or grow without bound | Contained private directories, no-follow/identity-checked leaves, a 4,096-entry observation ceiling, bounded state projection, nonce-bound locks with aged abandoned-claim recovery, lock-directory identity validation and an ambiguous live-PID maximum age, consumed plans under age/file/byte ceilings, and corruption-recovering hash-chained traces with per-event/resident ceilings | `sync:test` observation/state ceilings, redirected-state/lock, plan lifecycle, concurrent enrollment/recovery, corruption, and trace ceilings | Machine-local state is diagnostic convenience; Git and readable repository files remain authoritative |
|
|
16
|
+
| Local review serves only generated publication output | Loopback-only bind, required `atelier.manifest.json`, realpath containment, enrolled safe types, POSIX no-follow plus cross-platform leaf type/identity validation for local state, and host/fetch-site/origin/method/nonce checks | `server:security:test`; sidecar case in `assurance:mutation-smoke` | The sidecar is a local review tool, not user authentication or runtime authorization |
|
|
17
|
+
| Collaboration cannot become a hidden apply path | Proposal authority is capability-derived; records are typed; POSIX ledger and snapshot leaves are no-follow, while every platform rejects redirected leaves and validates opened file identity when available; ledger reads are bounded, one-pass for lists, and corrupt tails fail closed | `collaboration:test` and ledger ceiling/performance tests | Collaboration remains copy-only proposal metadata; snapshots are rebuildable projections and Git review owns source changes |
|
|
18
|
+
| The Obsidian maintenance service is reachable from this machine only, and only by its owner | Bind and client are restricted to the literal `127.0.0.1` or `::1`; `Host` must be the exact bound authority; cross-site `Origin` and `Sec-Fetch-Site` are refused; four fixed operations with exact paths and methods; status, tick and stop need a per-runtime random bearer kept only in the mode-0600 record; payloads are bounded and name their runtime; health carries no path or title | `test/obsidian-maintenance.test.mjs` listener, disclosure and unauthorised-request cases, each with a deliberately broken listener that must fail | A local process running as the same user can read the record; the bearer is ownership proof between local processes, not user authentication |
|
|
19
|
+
| A maintenance service is stopped or reported as running only when it is proven to be this workspace's own | Record and health must agree on service name, workspace, runtime identifier, PID, executable digest and loopback address; anything else on the port is `occupied`; a reused PID is never signalled; a malformed or foreign record refuses; `start` stops only the child it created, by handle | Unowned and silent listener, wrong-identity, PID-reuse, stale-record, malformed-record, idempotent and concurrent start, and launcher-survival cases, with mutation controls | Status probes have a deadline: a service busy in a long synchronous tick can be reported `occupied` until it answers |
|
|
20
|
+
| Maintenance never sweeps recovery or staging, and one workspace has one ticking engine | The service deletes only its generated record; the engine and the publisher own every other write; a hard kill is settled by the publisher's journaled restart recovery; each tick holds a private per-workspace lock taken from a holder only with proof of abandonment | Directory-listing oracles across start, ticks, stop, hard kill and stale record; hard kill between exchange and manifest commit; lock exclusion and takeover cases; each with a mutation control | A live lock holder that recorded no health address needs a person; a tick that outlasts the shutdown grace period ends with the process and is settled on the next start |
|
|
21
|
+
| Source application policy is re-read before every automatic apply | The engine authorizes from disk immediately before each dispatch; manual mode never reaches the apply operation; the service keeps this on every tick; the apply operation reads the installed policy again at its decision and immediately before the write, recomputes its digest and evaluates its selector over the current canonical graph; `policy install` verifies that digest and names the expected one; whether this machine may see the object is asked before anything else, so an absent and a withheld object get one answer | Revocation, manual-mode and apply-unavailable cases in `test/obsidian-maintenance.test.mjs`; policy, refusal-table and late-revocation cases in `test/obsidian-edits.test.mjs`, each with a deliberately broken rule that must fail | A policy is private configuration of one machine; whoever can write that private state can install one |
|
|
22
|
+
| Applying an edit to a source file cannot lose another program's bytes | One operation for a person and for a policy: exact identity, path and digest checks at commit; the write is an atomic exchange, never a check followed by a rename; displaced bytes that are not the base are exchanged back and retained; the old source stays as a backup that is looked at again for late writers; write-ahead record and intent before the exchange; restart recovery decides from digests only, and so does an exchange that reports a failure; generated regions never reach a source: the tail is intact, or removed with the end of the authored text proven, and anything else refuses; every git directory is refused, nested, respelled or relocated; the hold on an edited note lifts only on a read of the note at that moment; no git command that writes | `test/obsidian-edits.test.mjs`: end to end through the real engine, a refusal table with a whole-project byte and `git status` oracle, a real second process writing in three styles and four timings with both outcomes asserted, a crash at every durable step, a disclosure walk, a generated tail cut at every byte offset from both sides and a fuzz over the whole note; every oracle has a mutation control | macOS arm64 on APFS only; refuses where no atomic exchange exists; the source becomes a new file (permission bits kept, hard links refused); a late writer's bytes are retained and surfaced, never merged; a hard link made after the path check is not detected; a fragment of generated text shorter than eight bytes left inside an edited body cannot be told from typing |
|
|
23
|
+
| A structural edit made in a vault becomes one copy-only proposal and never a source change | The proposal adapter routes by whole identity to the existing store of the enrolled repository or refuses typed and writes nothing; it records the operation in private immutable state first, looks in the persisted store for its operation identity before creating, under a private per-repository lock taken over only with proof; it preflights the ledger limits, defers `ledger-full`, refuses `proposal-too-large` and `ledger-corrupt`, bounds batches and retries, and never compacts; a proposal holds codes, offsets and digests and no note text; acceptance is shown and never acted on | `test/obsidian-proposals.test.mjs`: routing table with a whole-project byte and `git status` oracle, identity survival against the real store, a crash at every step, two real processes, generated ledgers at 256 KiB, 16 MiB and 10,000 events and an invalid line, a no-busy-loop count of store reads, a disclosure walk; engine cases in `test/obsidian-maintenance.test.mjs`; every oracle has a mutation control | In manual mode an operation exists only after apply has looked at the edit; a refused or exhausted operation waits for a person; the store directory lives in the repository and must be git-ignored; two workspaces that enrol one repository create one proposal each |
|
|
24
|
+
| Opening a view reports `current` only for the exact, verified, present generation and a qualified app | `open` needs a tick of the proven service after the request, a persisted `current`, an independent read-back of the trusted pointer and every note, and an app at or above the minimum version that answers for that vault; every other outcome is typed, distinct and exits non-zero; the app and the operating system are reached only through injected seams, and the production ones only behind `--adapter=obsidian-cli` | `test/obsidian-open.test.mjs`: outcome table, read-back, app-floor, busy and read-only cases, each with a deliberately broken rule that must fail; a spawn guard and a production-seam import check | The production probe and launcher are not exercised against a real app here; `indexing` relies on an undocumented readiness field until acceptance qualifies it |
|
|
25
|
+
| Operating-system startup is never installed implicitly | `buildStartupAdapter` is pure text generation; Windows refuses typed; the service refuses `--startup` without a consent that covers startup | Builder purity oracle (no filesystem, process or home-directory access; no machine path beyond its inputs) and startup-consent refusal | Generated units have not been qualified against real launchd or systemd hosts |
|
|
26
|
+
| Expected operator failures are actionable without leaking internals | Typed project/JSON diagnostics and the CLI execution wrapper | `test/cli-brand.test.mjs` | Unexpected stacks require the operator to opt in with `ATELIER_DEBUG=1` |
|
|
27
|
+
| Published APIs do not disappear silently | Tag-derived subpath and named-export baseline plus version/tag identity refusal | `public-api:compat`; `test/public-api-compat.test.mjs` | Additive API checks do not decide whether a new version number is appropriate |
|
|
28
|
+
| The published artifact is the artifact tested | `release:candidate` packs once, binds SHA-256, sends that exact archive through allowlist/content audit, bare-consumer install, all-export import, and branded distribution smoke, then the trusted-publishing workflow retains and publishes that same tarball path | `release:audit`, `consumer:smoke`, `distribution:smoke`, `assurance:mutation-smoke`, `publish-workflow.test.mjs` | Passing gates does not publish, deploy, or constitute an external reviewer’s approval |
|
|
29
|
+
|
|
30
|
+
The release-blocking command is `npm run prepublishOnly`. It includes positive
|
|
31
|
+
regression suites and deliberately broken local fixtures. The latter prove
|
|
32
|
+
that boundary, graph, egress, sidecar, and distribution controls still refuse
|
|
33
|
+
their named failure modes; they do not exercise a live abuse path.
|
|
34
|
+
|
|
35
|
+
## Exact-candidate evidence
|
|
36
|
+
|
|
37
|
+
At candidate cut, retain all of the following together:
|
|
38
|
+
|
|
39
|
+
1. the Git commit SHA and a clean working-tree check;
|
|
40
|
+
2. the `npm pack --json` inventory and tarball SHA-256;
|
|
41
|
+
3. outputs from syntax, contracts, public-API compatibility, migrations, repository disclosure,
|
|
42
|
+
release audit, full tests, mutation smoke, bare consumer, and distribution
|
|
43
|
+
smoke;
|
|
44
|
+
4. a defensive review tied to that same commit and digest; and
|
|
45
|
+
5. explicit human decisions for versioning, publication, deployment, or any
|
|
46
|
+
external communication.
|
|
47
|
+
|
|
48
|
+
Evidence for a different commit or a dirty tree is not evidence for the
|
|
49
|
+
candidate.
|
package/docs/atelier-runtime.md
CHANGED
|
@@ -14,6 +14,8 @@ The package owns reusable mechanics:
|
|
|
14
14
|
- proposal-only collaboration metadata;
|
|
15
15
|
- support-bundle dry runs with no send path;
|
|
16
16
|
- export dry-run validation for `atelier-export@v1`.
|
|
17
|
+
- explicit single-repository enrollment and full-state Git observation;
|
|
18
|
+
- fast-forward-only reconciliation and two-phase user-confirmed commits.
|
|
17
19
|
|
|
18
20
|
Project adapters own project facts: repo roster, source roots, read-boundary
|
|
19
21
|
config, extension packs, brand language, and generated project outputs.
|
|
@@ -28,7 +30,31 @@ runtime authority.
|
|
|
28
30
|
|
|
29
31
|
## Safety Posture
|
|
30
32
|
|
|
31
|
-
The default package posture is no telemetry, no
|
|
32
|
-
|
|
33
|
+
The default package posture is no telemetry, no MNSTRY runtime mutation, no
|
|
34
|
+
browser apply endpoint, and no model-assisted analysis execution. Conformance
|
|
35
|
+
is offline. The only documented subprocess network paths are the bounded `gh`
|
|
36
|
+
actor-resolution fallback and explicitly enrolled Atelier Sync Git fetch and
|
|
37
|
+
user-confirmed non-force push operations.
|
|
33
38
|
Provider analysis output may only enter as proposed `atelier-claim@v1` records
|
|
34
39
|
until explicitly reviewed by the project owner.
|
|
40
|
+
|
|
41
|
+
`atelier dev` is narrower than a general static server. It refuses non-loopback
|
|
42
|
+
bind hosts, requires a generated `atelier.manifest.json`, and publishes only
|
|
43
|
+
manifest-enrolled HTML, script, style, and image files that remain inside the
|
|
44
|
+
workspace after realpath resolution. Hidden paths, local state, secret-shaped
|
|
45
|
+
names, symlinks, unknown file types, and unenrolled files are unavailable.
|
|
46
|
+
Reads validate the loopback host and fetch metadata; mutations additionally
|
|
47
|
+
require an allowed method, exact same origin, and the session nonce.
|
|
48
|
+
|
|
49
|
+
Collaboration endpoints are copy-only: they create or review proposal records;
|
|
50
|
+
they do not apply source changes. Authority is derived from declared
|
|
51
|
+
capabilities and apply endpoints, never inferred from action-like prose. A
|
|
52
|
+
partially corrupt ledger returns typed incomplete evidence and blocks a clean
|
|
53
|
+
claim. Ledger reads and records are bounded, appends are locked, and retention
|
|
54
|
+
changes happen only through explicit compaction.
|
|
55
|
+
|
|
56
|
+
The local Git supervisor is a separate mechanical authority surface. It may
|
|
57
|
+
create a repository commit only from an unchanged, bounded plan after the user
|
|
58
|
+
repeats its exact operation id. That repository write is not a MNSTRY runtime
|
|
59
|
+
mutation and does not grant proposal apply authority to the browser sidecar.
|
|
60
|
+
See [Atelier Sync: Deliverable Zero](./atelier-sync.md).
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Atelier Sync: Deliverable Zero
|
|
2
|
+
|
|
3
|
+
Atelier Sync is the collaborator-facing name for the resident repository
|
|
4
|
+
supervisor. Deliverable Zero is deliberately headless: it proves the Git,
|
|
5
|
+
filesystem, state-machine, recovery, and user-authority boundaries before a
|
|
6
|
+
tray shell or installer is allowed to make the product feel finished.
|
|
7
|
+
|
|
8
|
+
This is repository mechanics, not MNSTRY runtime authority. A Git commit
|
|
9
|
+
changes the enrolled repository. It does not mutate MNSTRY identity, consent,
|
|
10
|
+
visibility, provisioning, commerce, sessions, audit, or any other managed
|
|
11
|
+
runtime object.
|
|
12
|
+
|
|
13
|
+
## Authority contract
|
|
14
|
+
|
|
15
|
+
- Enrollment names exactly one repository. Atelier never scans a home folder.
|
|
16
|
+
- One resolved absolute system Git executable, version, and executable digest
|
|
17
|
+
owns Git semantics for the enrollment. Every inherited `GIT_*` variable is
|
|
18
|
+
stripped from supervised Git calls before Atelier adds its small fixed
|
|
19
|
+
safety environment. Custom SSH transport belongs in the user's SSH config;
|
|
20
|
+
credentials continue through ordinary Git credential helpers. Git `2.40.0`
|
|
21
|
+
or newer is required so global and system attribute provenance is observable.
|
|
22
|
+
- Every cycle observes the full repository. There is no watcher correctness
|
|
23
|
+
dependency in Deliverable Zero.
|
|
24
|
+
- Fetch and fast-forward-only reconciliation are mechanical operations.
|
|
25
|
+
- Commit creation is a two-phase, user-confirmed operation. Planning records
|
|
26
|
+
the head, branch, complete status digest, exact file paths, commit message,
|
|
27
|
+
reviewed blob/mode manifest, diff summary, and exact optional upstream push
|
|
28
|
+
identity. The push identity digest covers the single resolved, normalized,
|
|
29
|
+
credential-free execution destination; persisted display evidence likewise
|
|
30
|
+
strips authentication material, query strings, and fragments. Multiple push
|
|
31
|
+
URLs and `url.*.insteadOf`/`pushInsteadOf` rewrites are refused as ambiguous.
|
|
32
|
+
Every authoritative field is bound into the operation id.
|
|
33
|
+
Execution requires that exact id and refuses if the plan, repository,
|
|
34
|
+
staged bytes/modes, written tree, commit parent/message, or publish target
|
|
35
|
+
changed. A publish plan is refused while any earlier local commit remains
|
|
36
|
+
unpublished, and publication names the exact verified commit object rather
|
|
37
|
+
than a movable `HEAD` ref. Plans expire after 24 hours, are consumed by a
|
|
38
|
+
definitive execution attempt, and are held under resident file/count
|
|
39
|
+
ceilings. Expired, malformed, or oversized retained plan files are removed
|
|
40
|
+
under the repository lock before those ceilings are enforced; redirected
|
|
41
|
+
plan state remains a hard refusal.
|
|
42
|
+
- A commit plan cannot absorb pre-existing staged work. It stages only literal,
|
|
43
|
+
explicitly reviewed paths.
|
|
44
|
+
- Configured Atelier boundary policy is checked against the staged change set
|
|
45
|
+
before commit creation using the enrolled Git executable. When the enrolled project
|
|
46
|
+
operates a private-domain repository with a declared owner, actor verification is blocking even in
|
|
47
|
+
legacy-warning mode. The Sync path disables the boundary command's optional
|
|
48
|
+
network `gh api user` fallback and fails closed when local actor evidence is
|
|
49
|
+
insufficient. Commit history is provenance, not current-user identity, and
|
|
50
|
+
is not accepted as actor evidence on this path. Shared-only checks skip derived actor lookup, including ambient platform
|
|
51
|
+
identities. Invalid explicit selectors are still refused. Ownership is scoped
|
|
52
|
+
to configured repository names; it does not authenticate repository identity. Ordinary Git hooks still run; the resulting commit tree,
|
|
53
|
+
single parent, and message must equal the reviewed authority or the local
|
|
54
|
+
commit is rolled back and publication is refused.
|
|
55
|
+
- Push is present only when the reviewed plan requested it, the branch had no
|
|
56
|
+
prior unpublished commits, and HEAD still names the exact verified commit.
|
|
57
|
+
Atelier re-resolves the single push URL immediately before publication and
|
|
58
|
+
pushes the exact commit object directly to that reviewed destination. Push is
|
|
59
|
+
never forced, never follows tags, and never recursively publishes submodule
|
|
60
|
+
refs. When fetch and push resolve to the same credential-free identity,
|
|
61
|
+
Atelier refreshes the exact remote-tracking branch and re-observes before it
|
|
62
|
+
reports `committed-and-published`. A distinct configured push URL is honored,
|
|
63
|
+
but remains an explicit attention state because it cannot prove the fetch
|
|
64
|
+
upstream synchronized. A failed push or post-push tracking refresh preserves
|
|
65
|
+
the local commit, creates one stable attention state, and returns a non-zero
|
|
66
|
+
command exit.
|
|
67
|
+
- Semantic conflict resolution, merge commits, rebase, reset, force push,
|
|
68
|
+
browser apply, broad path scans, telemetry, and hidden upload are absent.
|
|
69
|
+
|
|
70
|
+
## Repository completeness
|
|
71
|
+
|
|
72
|
+
`atelier sync status` emits a supervisor envelope whose `state.observation`
|
|
73
|
+
contains the current `atelier-repository-observation@v1` document. That
|
|
74
|
+
observation cannot report `complete: true` when any of these are unresolved:
|
|
75
|
+
|
|
76
|
+
- lexically identifiable provider-managed, UNC/network, WSL-cross-boundary, or
|
|
77
|
+
unclassified external filesystem roots (mapped-drive classification remains
|
|
78
|
+
an operating-system integration concern for the signed beta);
|
|
79
|
+
- an unsupported Git engine or bare repository;
|
|
80
|
+
- sparse checkout, partial clone, or shallow repository state;
|
|
81
|
+
- tracked paths carrying `assume-unchanged` or `skip-worktree` index flags;
|
|
82
|
+
- missing or unhealthy submodules;
|
|
83
|
+
- required Git LFS content without a working LFS integration, including LFS
|
|
84
|
+
semantics declared by tracked or untracked worktree attributes, repository
|
|
85
|
+
info attributes, and default global or system attributes;
|
|
86
|
+
- an unclassified custom clean, smudge, or process filter;
|
|
87
|
+
- a configured `core.hooksPath` whose executable behavior is outside the
|
|
88
|
+
reviewed repository contract;
|
|
89
|
+
- a remote URL whose authentication shape cannot be classified;
|
|
90
|
+
- multiple push destinations or any configured Git URL rewrite rule;
|
|
91
|
+
- any required Git evidence read that fails, times out, exceeds its budget, or
|
|
92
|
+
cannot be parsed.
|
|
93
|
+
- a change set above the 4,096-entry resident observation ceiling; or
|
|
94
|
+
- a `core.attributesFile` outside the repository-owned/tracked attributes
|
|
95
|
+
boundary whose filter semantics have not been classified.
|
|
96
|
+
|
|
97
|
+
HTTPS through Git Credential Manager, SSH through the user's existing SSH
|
|
98
|
+
configuration, and local test remotes are classified explicitly. Atelier does
|
|
99
|
+
not collect or store provider credentials.
|
|
100
|
+
|
|
101
|
+
## Local operation state
|
|
102
|
+
|
|
103
|
+
Ignored `.atelier-local/runtime/` contains:
|
|
104
|
+
|
|
105
|
+
- `enrollment.json` — exact repository and Git engine;
|
|
106
|
+
- `state.json` — a bounded projection of healthy, attention, or paused state;
|
|
107
|
+
- `control.json` — user pause/freeze state;
|
|
108
|
+
- `plans/` — expiring, consumed reviewed commit plans under count/byte ceilings;
|
|
109
|
+
- `operations.ndjson` — sequence- and hash-chained resident trace with explicit
|
|
110
|
+
hash-bound checkpoints before its byte or record ceiling, with a fresh
|
|
111
|
+
digest-linked generation after a torn or corrupt chain; and
|
|
112
|
+
- an atomic per-repository operation lock.
|
|
113
|
+
|
|
114
|
+
Every directory component is containment-checked and every state leaf is
|
|
115
|
+
opened without following redirects where the platform supports it, with leaf
|
|
116
|
+
type and identity checks on every platform. Stale-lock recovery uses an
|
|
117
|
+
exclusive recovery claim, ages out an abandoned recovery claim after the owner
|
|
118
|
+
grace interval, identity-checks the lock directory before and after quarantine,
|
|
119
|
+
and quarantines only the claimed stale directory; it never recursively deletes
|
|
120
|
+
a newly acquired lock. A live PID without durable process identity cannot wedge
|
|
121
|
+
the repository forever: its owner record becomes recoverable after the 24-hour
|
|
122
|
+
maximum operation age. Enrollment takes the same lock as every other
|
|
123
|
+
authoritative state mutation.
|
|
124
|
+
|
|
125
|
+
Deleting this directory removes convenience and diagnostics. It cannot change
|
|
126
|
+
repository meaning. Git plus readable files remain authoritative.
|
|
127
|
+
|
|
128
|
+
## Engineering commands
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
atelier sync enroll --repo /absolute/path/to/repository
|
|
132
|
+
atelier sync status --repo /absolute/path/to/repository
|
|
133
|
+
atelier sync reconcile --repo /absolute/path/to/repository
|
|
134
|
+
atelier sync run --repo /absolute/path/to/repository --once
|
|
135
|
+
|
|
136
|
+
atelier sync plan \
|
|
137
|
+
--repo /absolute/path/to/repository \
|
|
138
|
+
--path docs/decision.md \
|
|
139
|
+
--message "docs: record decision" \
|
|
140
|
+
--publish
|
|
141
|
+
|
|
142
|
+
# Repeat the exact operation id printed by plan:
|
|
143
|
+
atelier sync commit \
|
|
144
|
+
--repo /absolute/path/to/repository \
|
|
145
|
+
--operation operation-... \
|
|
146
|
+
--confirm operation-...
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
`status`, `audit`, `reconcile`, `run --once`, and `commit` return a non-zero
|
|
150
|
+
process exit when their result is not healthy, so automation cannot treat a
|
|
151
|
+
paused state, attention state, or failed publication as success merely because
|
|
152
|
+
JSON was emitted.
|
|
153
|
+
|
|
154
|
+
The future native shell may label the final two commands **Commit & sync**.
|
|
155
|
+
It must not bypass either phase.
|
|
156
|
+
|
|
157
|
+
The repeated operation id is a visible user-intent confirmation gate, not an
|
|
158
|
+
authorization secret. Local software able to read and modify the repository is
|
|
159
|
+
inside the same operating-system trust domain; the control prevents implicit
|
|
160
|
+
or stale execution, not a hostile process with the user's filesystem access.
|
|
161
|
+
|
|
162
|
+
## Evidence boundary
|
|
163
|
+
|
|
164
|
+
Deliverable Zero proves the headless supervisor contract on Linux and macOS,
|
|
165
|
+
with Windows CI covering the portable observation, state, and direct-process
|
|
166
|
+
contract. POSIX executable-wrapper substitution is explicitly skipped on
|
|
167
|
+
Windows; native Windows wrapper-injection proof, signed installation,
|
|
168
|
+
background launch at user login, Windows Home/Pro device behavior, macOS
|
|
169
|
+
notarization, and a nontechnical-user workflow belong to the signed
|
|
170
|
+
collaborator beta. Repositories without an initial commit are not supported by
|
|
171
|
+
this deliverable. A Git executable upgrade changes enrolled identity and
|
|
172
|
+
requires re-enrollment.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
The `audience` field in the header is the load-bearing word. It declares who
|
|
2
|
+
a source is written for — `public`, `team`, `operator`, `staff`, `private`,
|
|
3
|
+
or `sensitive` — and the machinery downstream refuses to let material travel
|
|
4
|
+
further than its audience allows. Runtime and export `visibility` is a
|
|
5
|
+
separate vocabulary (`private`, `shared`, `platform`, `public`) describing
|
|
6
|
+
runtime exposure, and the validators reject every crossing between the two.
|
|
7
|
+
Above all: a public export that references a source whose audience is not
|
|
8
|
+
public is refused. That check is fixture-pinned and mutation-tested —
|
|
9
|
+
deleting its enforcement fails tests, not documentation.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
This package makes three promises. None of them asks for your trust — each
|
|
2
|
+
one names the command that proves it.
|
|
3
|
+
|
|
4
|
+
**There is no silent egress; every network path is named.** There is no
|
|
5
|
+
telemetry, update check, crash reporting, or model provider path in the package.
|
|
6
|
+
The optional vault API adds explicit host-bound artifact uploads and reads; it
|
|
7
|
+
is never activated by local authoring commands. Its injected storage, database
|
|
8
|
+
and identity SDKs may use the network and require separate hosted qualification. The exceptions are explicit: `boundary check` and
|
|
9
|
+
`upgrade` (including `--dry-run` and `--apply`) may invoke `gh api user` only when
|
|
10
|
+
an operated private-domain repository needs owner attribution, no explicit selector or `GITHUB_ACTOR` was supplied, and no
|
|
11
|
+
configured Git email maps to an actor. Shared-only boundary checks skip derived
|
|
12
|
+
identity lookup. Invalid explicit selectors are refused without fallback;
|
|
13
|
+
platform logins must uniquely match declared login mappings. Repository identity
|
|
14
|
+
checks may invoke `gh api repos/...` to resolve a canonical GitHub identity.
|
|
15
|
+
Those authenticated requests use your own `gh` credentials. Recorded repository
|
|
16
|
+
identities let identity checks keep working when the provider is unavailable.
|
|
17
|
+
See `docs/install.md` for the full attribution precedence and mode semantics.
|
|
18
|
+
Explicitly enrolled Atelier Sync may also run bounded Git fetches
|
|
19
|
+
for observation/reconciliation and one non-force push only when the exact
|
|
20
|
+
reviewed commit plan requested and confirmed it, no earlier local commit is
|
|
21
|
+
waiting to be published, and HEAD still names the verified commit object. Sync
|
|
22
|
+
never uses the network actor fallback, follows tags, or recursively publishes
|
|
23
|
+
submodule refs. The local authoring HTTP client
|
|
24
|
+
refuses non-loopback URLs, the served pages authorize no external origin, and
|
|
25
|
+
release audit scans every executable or markup file in the exact `npm pack`
|
|
26
|
+
inventory for egress primitives. The standalone gate also scans executable and
|
|
27
|
+
markup files under `src/`, `bin/`, `scripts/`, `templates/`, `examples/`, and
|
|
28
|
+
`skills/`. Two limits worth stating plainly: the egress control does not
|
|
29
|
+
interpret data-only `.json` or `.md` files, and it does not model
|
|
30
|
+
`child_process`; the reviewed `gh` and enrolled Git paths above are documented
|
|
31
|
+
subprocess exceptions rather than scanner detections:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm run egress:check
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Compatibility is checked by machinery, not memory.** Documents valid
|
|
38
|
+
against the `v0.2.0-alpha.0` contracts stay valid: every change is checked
|
|
39
|
+
against the baseline tag's validators, and schema widening outside `ext`
|
|
40
|
+
containers is refused by a schema-vs-schema differ. Breaking changes require
|
|
41
|
+
a new contract version and a recorded migration. Known limit: the differ
|
|
42
|
+
compares schemas structurally and does not resolve `$ref` pointers, so a
|
|
43
|
+
`$ref` retargeted at a looser definition is not caught by this gate — the
|
|
44
|
+
fixture tests catch that for contracts with negative fixtures, and closing
|
|
45
|
+
the gap in the differ is tracked work:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm run contract:compat
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Conformance works offline, forever.** Validating a document against the
|
|
52
|
+
published contracts needs this package and nothing else — no account, no
|
|
53
|
+
service, no network:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
atelier dry-run ./atelier-export.json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`docs/continuity.md` records the distribution commitments behind these
|
|
60
|
+
claims, including the perpetual Apache-2.0 grant on every tagged release you
|
|
61
|
+
receive.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
The Atelier export format is MNSTRY's format, offered openly.
|
|
2
|
+
|
|
3
|
+
**Anyone can check a document against the published contracts, forever,
|
|
4
|
+
offline.** The contracts, fixtures, and dry-run validator all ship in the
|
|
5
|
+
package, so conformance needs no account, no network, and no MNSTRY
|
|
6
|
+
involvement.
|
|
7
|
+
|
|
8
|
+
Admission is a narrower, opt-in decision: whether a MNSTRY governed runtime
|
|
9
|
+
accepts a document for delivery to the people it serves. That is what
|
|
10
|
+
admission buys — delivery through a runtime that enforces consent and
|
|
11
|
+
visibility at serve time — and it takes the form of a signed MNSTRY
|
|
12
|
+
attestation against criteria this package publishes (`docs/attestation.md`).
|
|
13
|
+
The criteria are public, the checker is private, and the rejection message
|
|
14
|
+
is part of the contract. You can build on the Atelier without ever talking
|
|
15
|
+
to MNSTRY, and a document MNSTRY declines can still be fully conformant.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
- It does not write to a MNSTRY runtime database.
|
|
2
|
+
- It does not import, provision, publish, or send project content to a MNSTRY
|
|
3
|
+
managed runtime.
|
|
4
|
+
- Conformance remains offline. Local CLI network access is limited to the documented
|
|
5
|
+
`gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
|
|
6
|
+
operations: bounded fetch for observation/reconciliation, and non-force push
|
|
7
|
+
only when the exact reviewed commit plan requested and confirmed it, no
|
|
8
|
+
earlier local commit remains unpublished, and HEAD still names the verified
|
|
9
|
+
commit object; Sync does not use network actor fallback, follow tags, or
|
|
10
|
+
recursively publish submodule refs.
|
|
11
|
+
- Optional vault adapters use explicitly injected host SDKs and transports. The
|
|
12
|
+
host owns their network access, authentication and infrastructure; importing
|
|
13
|
+
the kit does not create a service or make a network request.
|
|
14
|
+
- It does not execute model-assisted analysis or any model provider.
|
|
15
|
+
- It does not include client project content.
|
|
16
|
+
|
|
17
|
+
These limits are the design. An authoring tool for private material earns
|
|
18
|
+
trust by what it refuses to be able to do.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Experimental portable coauthor session
|
|
2
|
+
|
|
3
|
+
Tracked by issue #33. The experimental reducer is exported at
|
|
4
|
+
`@mnstry/atelier/coauthor`; the private draft adapter at `@mnstry/atelier/coauthor/store`.
|
|
5
|
+
The `atelier coauthor start|read|event|recover` CLI consumes one JSON request on
|
|
6
|
+
stdin. Run it from the intended Git workspace; `.atelier-local/` must be ignored
|
|
7
|
+
and untracked. The shipped `atelier-guided-coauthor` skill guides harness use.
|
|
8
|
+
This local candidate has not been published or accepted by a real author.
|
|
9
|
+
|
|
10
|
+
The harness supplies a session id and an ordered list of consumer-owned field
|
|
11
|
+
ids, each bound to an immutable source reference and SHA-256 digest. The pure
|
|
12
|
+
reducer accepts revision-bound events and returns a new state plus effects.
|
|
13
|
+
It does not access files, render a browser, contact a model or authorize writes.
|
|
14
|
+
|
|
15
|
+
An answer remains in history. Every proposed wording change requires explicit
|
|
16
|
+
confirmation before saving. Answer-and-continue intent survives confirmation;
|
|
17
|
+
advance occurs only after a matching receipt. Pause retains the current phase.
|
|
18
|
+
Rejection restores the original answer. Undo of an already saved value is not
|
|
19
|
+
implemented: consumers must not advertise it or delete history to simulate it.
|
|
20
|
+
|
|
21
|
+
## Adapter obligations
|
|
22
|
+
|
|
23
|
+
- Keep reducer state inside the trusted adapter; untrusted callers submit
|
|
24
|
+
intents, never snapshots or save receipts. Rehydrate from validated events
|
|
25
|
+
with `replaySession`, using the original immutable configuration.
|
|
26
|
+
- Authenticate and authorize actors outside this module. Session identifiers
|
|
27
|
+
and matching digests are correlation data, not proof of identity or authority.
|
|
28
|
+
- Persist accepted events through the existing consumer ledger. This module's
|
|
29
|
+
in-memory history is a replay projection, not a second durable database.
|
|
30
|
+
- Before executing `write-field`, verify source identity and containment and
|
|
31
|
+
apply the consumer's compare-and-swap write policy. Key execution by session
|
|
32
|
+
id plus request id. Retry uses the same key; duplicate delivery must not
|
|
33
|
+
perform another write. Reconcile a pending write after a restart rather than
|
|
34
|
+
blindly replaying historical effects.
|
|
35
|
+
- Emit a receipt only after durable persistence and readback of the exact
|
|
36
|
+
target field's UTF-8 value. The receipt binds session, request, field, source
|
|
37
|
+
reference, source digest and value digest. A digest match alone does not
|
|
38
|
+
establish that these adapter duties occurred.
|
|
39
|
+
- A failure remains visible. One explicit retry is allowed; subsequent failures
|
|
40
|
+
require adapter reconciliation. A valid late receipt can resolve recovery.
|
|
41
|
+
- Persist the accepted receipt event before showing saved state. This module
|
|
42
|
+
grants no canonical publication, release, remote execution or guide access.
|
|
43
|
+
|
|
44
|
+
The supplied store reuses the collaboration ledger implementation, in a separate
|
|
45
|
+
coauthor stream that is never mixed into legacy proposal aggregates. It verifies
|
|
46
|
+
contiguous versions and previous-event identity; compaction that drops history
|
|
47
|
+
is refused. It writes immutable private draft values, then replays a readback-bound
|
|
48
|
+
receipt before showing saved state. It never edits selected source files.
|
|
49
|
+
Workspace-local Git checks are the only subprocess use; no network is added.
|
|
50
|
+
Operation locks serialize this adapter's writers. A leftover lock requires
|
|
51
|
+
operator inspection, never automatic removal of an unknown writer's lock.
|
|
52
|
+
|
|
53
|
+
`start` takes `{config: {id, fields}}`; `read` and `recover` take `{sessionId}`;
|
|
54
|
+
`event` takes `{sessionId, event}`. A receipt or failure event submitted through
|
|
55
|
+
the CLI is refused. Source changes block new writes, not reading old history.
|
|
56
|
+
Configuration and saved drafts have the additive `atelier-coauthor.v1` schema;
|
|
57
|
+
source path containment and duplicate fields are checked by the adapter as well.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Connected composition: synthetic foundation
|
|
2
|
+
|
|
3
|
+
Status: experimental, opt-in source prototype. Not an accepted public API,
|
|
4
|
+
production auth integration, published release, or certification of a private
|
|
5
|
+
host. Existing package exports and contracts remain unchanged.
|
|
6
|
+
|
|
7
|
+
## Bounded implementation
|
|
8
|
+
|
|
9
|
+
Owned additions: `src/composition/`, `src/access/`, `src/preview/`,
|
|
10
|
+
`examples/connected-composition/`, `test/connected-composition*.test.mjs`, and
|
|
11
|
+
`scripts/prove-connected-composition.mjs`. This document records the reservation.
|
|
12
|
+
No existing sidecar, vault, coauthor, presentation, keyboard or business module
|
|
13
|
+
is changed. The prototype starts from the frozen presentation supplier and is a
|
|
14
|
+
separate candidate; its local proof cannot satisfy that supplier's CI gate.
|
|
15
|
+
|
|
16
|
+
The public root supplies placement validation, an opt-in trusted-host enforcement
|
|
17
|
+
helper and a two-origin preview channel. A private host supplies identity,
|
|
18
|
+
membership, delegation, policy, registry/source resolution, services, result
|
|
19
|
+
filtering and audit storage. Auth adapters can differ without changing placements.
|
|
20
|
+
White-label and self-provisioned hosts remain possible; no hosting infrastructure
|
|
21
|
+
or tenant provisioning is implemented here.
|
|
22
|
+
|
|
23
|
+
The example uses two invented auth adapters and an in-memory collection service.
|
|
24
|
+
It is intentionally not an auth provider. Only preview-plane synthetic reads and
|
|
25
|
+
an explicitly enabled reversible sandbox action are supported. No production
|
|
26
|
+
plane, live network transport, credential, payment or irreversible action exists.
|
|
27
|
+
|
|
28
|
+
## Implementation sequence and acceptance
|
|
29
|
+
|
|
30
|
+
1. Closed, byte/depth/count-bounded JSON parsing, placement and action schemas;
|
|
31
|
+
exact source-byte and immutable definition/renderer digests.
|
|
32
|
+
2. Trusted channel authentication, complete decision binding, agent attenuation,
|
|
33
|
+
fail-closed revalidation before service and before output; bounded projection.
|
|
34
|
+
3. Independent fake service authorization, expected-version/idempotency behavior,
|
|
35
|
+
with accurate uncertainty rather than invented rollback after an effect.
|
|
36
|
+
4. Exact-origin/source/nonce MessageChannel handshake and generation/source/sequence
|
|
37
|
+
guards; old mounts and pending responses cleared on change or logout.
|
|
38
|
+
5. An Astro page retaining useful static content without JavaScript or an account;
|
|
39
|
+
isolated dynamic preview, ordinary native controls, narrow responsive layout.
|
|
40
|
+
6. Focused control tests, three desktop browser engines, source-edit/build/refresh,
|
|
41
|
+
fake adapter switch/logout, scoped agent refusal and no secret projection.
|
|
42
|
+
|
|
43
|
+
The browser receives proposals and filtered results, never a trusted session,
|
|
44
|
+
decision or service port. This separation protects against an untrusted preview,
|
|
45
|
+
not a malicious host constructor. A real service must independently authorize
|
|
46
|
+
and atomically own effect/version/idempotency receipts. Types and callback names
|
|
47
|
+
are not security boundaries. A compromised private service or dishonest projector
|
|
48
|
+
is outside this root helper's assurance.
|
|
49
|
+
|
|
50
|
+
No general source writer is added. The browser does not get filesystem tools.
|
|
51
|
+
The proof harness edits only its disposable authored fixture and rebuilds it.
|
|
52
|
+
Existing coauthor draft persistence and canonical source promotion stay owned by
|
|
53
|
+
their existing workflows. There is no duplicate placement database.
|
|
54
|
+
|
|
55
|
+
## Proposal alignment
|
|
56
|
+
|
|
57
|
+
The wire retains the `proposal-v1` discriminators from the reviewed placement
|
|
58
|
+
proposal, with an executable closed action validator added. The implementation
|
|
59
|
+
is `connected-composition/experimental-v1`, not a proposal acceptance event.
|
|
60
|
+
An action's full request digest is additionally bound to authorization, so an
|
|
61
|
+
identifier cannot silently stand for a changed payload. The projector returns
|
|
62
|
+
only filtered data; the root constructs all public state metadata itself.
|
|
63
|
+
Audit intake uses `pending` and output settlement uses `prepared`, not
|
|
64
|
+
`delivered`: returning a prepared result is not a browser delivery acknowledgement.
|
|
65
|
+
Preview lifecycle generations are mount-local and never serialize host session
|
|
66
|
+
generation or identity. Real hosts must map invalidation into channel disposal.
|
|
67
|
+
The first resolver intentionally admits exactly one data binding and a web
|
|
68
|
+
projection. Multi-resource composition, other host projections and a published
|
|
69
|
+
package export require their own accepted contracts; parsing their proposed
|
|
70
|
+
shape alone is not runtime admission.
|
|
71
|
+
|
|
72
|
+
Missing completion gates: owner validation of real host adapters and source
|
|
73
|
+
promotion integration, service-specific transaction/reconciliation proof,
|
|
74
|
+
assistive-technology and actual native/device tests, private adopter acceptance,
|
|
75
|
+
maintainer integration and recognized CI. None is implied by this prototype.
|
package/docs/continuity.md
CHANGED
|
@@ -21,10 +21,9 @@ NOTICE attribution obligation and the trademark limits in `TRADEMARKS.md`).
|
|
|
21
21
|
tag you fetched, with full Apache-2.0 rights over it. MNSTRY will not ask
|
|
22
22
|
for deletion of received tagged source and has no license mechanism to do
|
|
23
23
|
so.
|
|
24
|
-
2. **npm publication
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
permission — the distribution channel of record.
|
|
24
|
+
2. **npm publication.** Tagged releases are published to the npm registry
|
|
25
|
+
under `@mnstry/atelier` with public access, making the registry — not
|
|
26
|
+
repository permission — the distribution channel of record.
|
|
28
27
|
3. **Contract compatibility by machinery.** From tag `v0.2.0-alpha.0`
|
|
29
28
|
onward, the published contracts are under a compatibility gate
|
|
30
29
|
(`npm run contract:compat`): documents valid against the baseline tag must
|