@mnstry/atelier 0.2.0-alpha.5 → 0.2.0-alpha.8
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 +191 -0
- package/README.md +86 -25
- 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/docs/assurance-controls.md +12 -2
- package/docs/atelier-runtime.md +13 -2
- package/docs/atelier-sync.md +172 -0
- package/docs/blocks/claims.md +28 -18
- package/docs/blocks/will-not-do.md +12 -3
- package/docs/coauthor-session.md +57 -0
- package/docs/connected-composition.md +75 -0
- package/docs/decisions.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 +65 -9
- 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/local-review.md +84 -0
- package/docs/local-services.md +227 -0
- package/docs/local-state.md +107 -0
- package/docs/obsidian-contract.md +687 -0
- package/docs/obsidian.md +387 -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 +99 -2
- package/docs/review-portability.md +55 -0
- package/docs/skill-steward.md +156 -0
- package/docs/upgrade.md +70 -2
- 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/ui/presentation/pane.v1.json +7 -0
- package/fixtures/ui/presentation/reference.v1.json +293 -0
- package/package.json +61 -6
- package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
- package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
- package/skills/claude/atelier-open/SKILL.md +5 -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-open/SKILL.md +5 -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 +9 -4
- package/src/boundary/policy.mjs +74 -42
- package/src/cli/project-options.mjs +58 -0
- package/src/cli/run.mjs +61 -3
- package/src/coauthor/session.mjs +161 -0
- package/src/coauthor/store.mjs +173 -0
- package/src/collaboration/event-ledger.mjs +16 -33
- package/src/collaboration/inspection-bundle.mjs +223 -0
- package/src/collaboration/review-contracts.mjs +25 -0
- package/src/collaboration/review-store.mjs +305 -0
- package/src/commands/coauthor.mjs +26 -0
- package/src/commands/config.mjs +6 -1
- package/src/commands/extension-pack.mjs +15 -8
- package/src/commands/init.mjs +44 -5
- package/src/commands/obsidian.mjs +368 -0
- package/src/commands/review.mjs +147 -0
- 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 +13 -0
- package/src/export/atelier-export-contract.mjs +16 -1
- package/src/extension-packs/lifecycle.mjs +154 -0
- package/src/graph/graph.mjs +64 -2
- package/src/graph/knowledge-graph.mjs +548 -24
- package/src/guides/contracts.mjs +54 -0
- package/src/index.mjs +29 -0
- package/src/intake/store.mjs +119 -0
- package/src/preview/channel.mjs +89 -0
- package/src/project/config.mjs +50 -49
- package/src/project/durable-state.mjs +161 -0
- package/src/project/file-class.mjs +166 -0
- package/src/project/private-state.mjs +11 -1
- 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 +139 -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 +110 -0
- package/src/runtime/obsidian/app-production-seams.mjs +96 -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 +243 -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-main.mjs +89 -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 +44 -0
- package/src/server/server.mjs +1 -0
- package/src/skills/steward.mjs +780 -0
- 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 +63 -28
- 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,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.
|
package/docs/blocks/claims.md
CHANGED
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
This package makes three promises. None of them asks for your trust — each
|
|
2
2
|
one names the command that proves it.
|
|
3
3
|
|
|
4
|
-
**
|
|
5
|
-
telemetry,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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:
|
|
22
32
|
|
|
23
33
|
```bash
|
|
24
34
|
npm run egress:check
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
- It does not write to a MNSTRY runtime database.
|
|
2
|
-
- It does not import, provision, publish, or send
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
5
14
|
- It does not execute model-assisted analysis or any model provider.
|
|
6
15
|
- It does not include client project content.
|
|
7
16
|
|
|
@@ -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.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Typed decision proposals
|
|
2
|
+
|
|
3
|
+
The optional `@mnstry/atelier/decisions` API validates finite questions and
|
|
4
|
+
their proposed answers. It performs no provider calls, credential lookup,
|
|
5
|
+
source mutation, or acceptance. A consuming host supplies the provider and
|
|
6
|
+
independently checks authorization before disclosure or use.
|
|
7
|
+
|
|
8
|
+
For a development pilot, pin the reviewed source commit or its verified
|
|
9
|
+
tarball. Check that the installed package exports `./decisions`; an older
|
|
10
|
+
published alpha may not contain this API. A source merge does not publish a
|
|
11
|
+
new registry version.
|
|
12
|
+
|
|
13
|
+
This API is suitable for a small, explicit choice, an ordered score, or a
|
|
14
|
+
Boolean probability. It does not extract missing evidence or generate prose.
|
|
15
|
+
The fixtures describe an invented reading room; their answers and usage are
|
|
16
|
+
synthetic examples, not model evaluation results.
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
import {
|
|
20
|
+
decisionRequestDigest,
|
|
21
|
+
validateDecisionRequest,
|
|
22
|
+
validateDecisionResult,
|
|
23
|
+
} from '@mnstry/atelier/decisions'
|
|
24
|
+
|
|
25
|
+
const requestCheck = validateDecisionRequest(request)
|
|
26
|
+
if (!requestCheck.ok) throw new Error('Invalid decision request')
|
|
27
|
+
const digest = decisionRequestDigest(request)
|
|
28
|
+
|
|
29
|
+
// The host obtains a result under its own provider and disclosure policy.
|
|
30
|
+
const resultCheck = validateDecisionResult(request, result)
|
|
31
|
+
if (!resultCheck.ok) throw new Error('Invalid decision result')
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The adjacent TypeScript declarations export `DecisionRequest`,
|
|
35
|
+
`DecisionQuestion`, `DecisionResult`, `DecisionAnswer`, `DecisionScope`,
|
|
36
|
+
`DecisionUsage`, and `DecisionValidation`, including the individual question
|
|
37
|
+
and answer variants. Runtime validation remains required for external data.
|
|
38
|
+
|
|
39
|
+
For hosts that need only question and answer validation, use
|
|
40
|
+
`validateDecisionAnswers(questions, answers)`. It checks bounded plain JSON,
|
|
41
|
+
question structure, exact answer keys and types, probability distributions,
|
|
42
|
+
and score expectations. It accepts no state, computes no hash, performs no
|
|
43
|
+
provider execution, and writes nothing. The host supplies its own transient
|
|
44
|
+
request binding and enforces its privacy policy.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import { validateDecisionAnswers } from '@mnstry/atelier/decisions'
|
|
48
|
+
|
|
49
|
+
const answerCheck = validateDecisionAnswers(questions, answers)
|
|
50
|
+
if (!answerCheck.ok) throw new Error('Invalid decision answers')
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This separate API checks evidence reference syntax, uniqueness and bounds,
|
|
54
|
+
but cannot establish membership in a source snapshot that it has not received.
|
|
55
|
+
The request and result validators still enforce that membership. A successful
|
|
56
|
+
answer check establishes neither authorization nor semantic correctness.
|
|
57
|
+
|
|
58
|
+
## Requests
|
|
59
|
+
|
|
60
|
+
`atelier-decision-request@v1` records a request ID, task, rubric version,
|
|
61
|
+
host-reported scope, state, evidence references, and questions. The
|
|
62
|
+
`scope.workspaceId` and `scope.authorizationRef` fields bind the assessment to
|
|
63
|
+
the host's reported snapshot. They do not authenticate a caller, prove
|
|
64
|
+
consent, or grant access. The host must revalidate current permissions and
|
|
65
|
+
revocation before sending data or acting on a cached result.
|
|
66
|
+
|
|
67
|
+
Each question includes instructions and at least one `evidenceIds` entry
|
|
68
|
+
referring to the request's evidence. Evidence identities are unique; their
|
|
69
|
+
`sourceRef` strings are opaque references preserved for the host. Validation
|
|
70
|
+
does not fetch them or prove that the state faithfully represents a source.
|
|
71
|
+
|
|
72
|
+
| Question | Criteria | Answer |
|
|
73
|
+
| --- | --- | --- |
|
|
74
|
+
| `choice` | A map of 2–64 option IDs to descriptions | A selected option, complete probability map, and provider confidence statistic |
|
|
75
|
+
| `score` | An ordered list of 2–10 descriptions | A zero-index weighted expectation, complete probability list, and provider confidence statistic |
|
|
76
|
+
| `boolean` | Explicit `true` and `false` descriptions | A probability between zero and one |
|
|
77
|
+
|
|
78
|
+
Identifiers are 1–128 ASCII characters, beginning with a letter or digit and
|
|
79
|
+
continuing with letters, digits, `.`, `_`, `:`, or `-`. The names `__proto__`,
|
|
80
|
+
`constructor`, and `prototype` are refused as object keys and identifiers.
|
|
81
|
+
State and descriptions support Unicode; validation does not normalize text.
|
|
82
|
+
|
|
83
|
+
Requests are limited to 64 questions, 256 evidence entries, 32,000 state
|
|
84
|
+
characters, 4,000 instruction characters per question, 2,000 characters per
|
|
85
|
+
criterion, and 2,048 characters per source reference. String limits count
|
|
86
|
+
Unicode code points. Empty state is allowed so the host can record an
|
|
87
|
+
insufficient-evidence abstention; instructions and descriptions must contain
|
|
88
|
+
non-whitespace text.
|
|
89
|
+
|
|
90
|
+
## Results and integrity
|
|
91
|
+
|
|
92
|
+
`atelier-decision-result@v1` copies the request ID, task, rubric version and
|
|
93
|
+
scope, and carries `requestDigest`, provider ID, concrete model name,
|
|
94
|
+
elapsed milliseconds, and usage. Token counts are nonnegative safe integers;
|
|
95
|
+
`usage: null` records unavailable usage without treating it as zero.
|
|
96
|
+
|
|
97
|
+
`authority` is always `proposal-only`. `mode` is `shadow` or `advisory`;
|
|
98
|
+
neither value grants execution authority. An `assessed` result contains
|
|
99
|
+
exactly the requested answer keys and types. An `abstained` result contains
|
|
100
|
+
an empty answer map and one explicit reason: `insufficient-evidence`,
|
|
101
|
+
`ambiguous`, `no-match`, `budget-exhausted`, `provider-unavailable`, `timeout`,
|
|
102
|
+
`invalid-response`, or `unauthorized`.
|
|
103
|
+
|
|
104
|
+
The validator checks that distributions sum to one within `1e-6`, a chosen
|
|
105
|
+
option has maximum probability, and a score equals its zero-index weighted
|
|
106
|
+
expectation within `1e-6`. Tied maximum choices are valid. Boolean answers
|
|
107
|
+
have no confidence field. Confidence is a provider statistic, not measured
|
|
108
|
+
semantic correctness; a structurally valid high-confidence answer can still
|
|
109
|
+
be wrong. The host owns evaluation data, calibrated thresholds, escalation,
|
|
110
|
+
and fallback behavior. The host must also compare the recorded model with
|
|
111
|
+
its requested concrete model pin; the request contract does not prescribe a
|
|
112
|
+
provider or model.
|
|
113
|
+
|
|
114
|
+
`decisionRequestDigest` returns lowercase SHA-256 over canonical JSON with
|
|
115
|
+
object keys recursively sorted in JavaScript string order. Array order and
|
|
116
|
+
exact Unicode content are retained. It includes the full request, scope,
|
|
117
|
+
evidence, rubric, and optional extensions. Reordering object insertion does
|
|
118
|
+
not change the digest; changing any represented value does. This is local
|
|
119
|
+
integrity evidence, not a signature or proof of provenance. Invalid requests
|
|
120
|
+
throw a generic `TypeError`; validators return `{ ok, errors }` without
|
|
121
|
+
echoing source text, unknown field names, or provider response content.
|
|
122
|
+
|
|
123
|
+
Content hashes can themselves be sensitive. A host whose policy forbids
|
|
124
|
+
hashing a passage must use its own transient request binding instead of this
|
|
125
|
+
digest-bearing envelope. It can reuse the question and answer types without
|
|
126
|
+
calling `decisionRequestDigest` or retaining a full request. The public
|
|
127
|
+
contract does not override the host's privacy policy.
|
|
128
|
+
|
|
129
|
+
## Closed fields and extensions
|
|
130
|
+
|
|
131
|
+
The standalone JSON Schemas are
|
|
132
|
+
`atelier-decision-request.v1.schema.json` and
|
|
133
|
+
`atelier-decision-result.v1.schema.json`. They validate static shape. Use the
|
|
134
|
+
JavaScript validator as well for request binding, evidence relationships,
|
|
135
|
+
distribution semantics, and bounded in-process JSON.
|
|
136
|
+
|
|
137
|
+
As with other Atelier contracts, the roots allow optional
|
|
138
|
+
`contractVersion: "1.0.0"`, and closed objects allow an optional object-valued
|
|
139
|
+
`ext`. Unknown first-class fields are refused. Namespaced extension members
|
|
140
|
+
are inert metadata: consumers must ignore unrecognized members and must
|
|
141
|
+
never derive authority from them. Dynamic question, choice and answer maps
|
|
142
|
+
contain only their declared entries; they have no reserved metadata entry.
|
|
143
|
+
|
|
144
|
+
Both requests and results, including extensions, are limited to 16,777,216
|
|
145
|
+
canonical JSON bytes, 100,000 values, and 32 levels of nesting below the root.
|
|
146
|
+
Cycles, symbols, sparse arrays, accessors, non-finite numbers, undefined
|
|
147
|
+
values and custom prototypes are refused. Plain objects with a null
|
|
148
|
+
prototype are accepted. No input is mutated.
|
|
149
|
+
|
|
150
|
+
## Host integration
|
|
151
|
+
|
|
152
|
+
1. Build bounded questions from already authorized evidence. Preserve all
|
|
153
|
+
source passages and coverage independently of a proposed prioritization.
|
|
154
|
+
2. Validate the request, then check the host's current consent, destination,
|
|
155
|
+
concrete model pin, input limit, evaluation budget and timeout policy.
|
|
156
|
+
3. Call a provider through the host adapter. Keep credentials, private
|
|
157
|
+
criteria, raw responses and provider execution outside the public kit.
|
|
158
|
+
4. Normalize and validate the result against the exact request. Retain full
|
|
159
|
+
distributions and unknown usage; represent failures as explicit
|
|
160
|
+
abstentions without accepting partial answer sets.
|
|
161
|
+
5. Compare shadow results with an independently labeled evaluation set.
|
|
162
|
+
Enable an advisory consumer only after task-specific acceptance. Keep the
|
|
163
|
+
host's existing behavior as the fallback and recheck authorization on
|
|
164
|
+
cache access.
|
|
165
|
+
|
|
166
|
+
This module does not change the existing analysis adapter's default-disabled
|
|
167
|
+
execution policy or accept a model proposal as an authored fact.
|