@mnstry/atelier 0.2.0-alpha.11 → 0.2.0-alpha.13
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 +1005 -0
- package/README.md +149 -9
- package/contracts/atelier-adoption-policy.v2.schema.json +55 -0
- package/contracts/atelier-architecture.v1.schema.json +258 -0
- package/contracts/atelier-boundary-delegations.v1.schema.json +161 -0
- package/contracts/atelier-boundary-owner-keys.v1.schema.json +98 -0
- package/contracts/atelier-build.v1.schema.json +1076 -0
- package/contracts/atelier-capability.v1.schema.json +1252 -0
- package/contracts/atelier-coordination.v1.schema.json +1050 -0
- package/contracts/atelier-evidence-navigation.v1.schema.json +603 -0
- package/contracts/atelier-harness.v1.schema.json +234 -0
- package/contracts/atelier-ingestion.v1.schema.json +806 -0
- package/contracts/atelier-inquiry.v1.schema.json +1772 -0
- package/contracts/atelier-instruction-adoption.v1.schema.json +490 -0
- package/contracts/atelier-interaction.v1.schema.json +553 -0
- package/contracts/atelier-judgment.v1.schema.json +690 -0
- package/contracts/atelier-knowledge.v1.schema.json +1512 -0
- package/contracts/atelier-learning.v1.schema.json +1095 -0
- package/contracts/atelier-migration.v3.schema.json +64 -0
- package/contracts/atelier-obsidian-generation-manifest.v2.schema.json +372 -0
- package/contracts/atelier-personal-workspace-manifest.v1.schema.json +87 -0
- package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
- package/contracts/atelier-template-adoption.v1.schema.json +223 -0
- package/contracts/atelier-template-profile.v1.schema.json +1168 -0
- package/contracts/atelier-trackable.v1.schema.json +781 -0
- package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
- package/contracts/compat-baseline.json +1 -1
- package/docs/architecture.md +89 -0
- package/docs/assurance-controls.md +4 -3
- package/docs/blocks/capability-stewardship.md +17 -0
- package/docs/blocks/claims.md +16 -3
- package/docs/blocks/inquiry-harnesses.md +19 -0
- package/docs/blocks/learning-harnesses.md +17 -0
- package/docs/capability-stewardship.md +269 -0
- package/docs/coordination.md +51 -0
- package/docs/decision-practices.md +111 -0
- package/docs/decisions.md +29 -0
- package/docs/evidence-navigation.md +237 -0
- package/docs/exact-upgrades.md +3 -2
- package/docs/ingestion.md +181 -0
- package/docs/inquiry-harnesses.md +211 -0
- package/docs/install.md +80 -3
- package/docs/intake-and-guides.md +5 -0
- package/docs/integration-contract-decisions.md +24 -2
- package/docs/interaction-and-reflection.md +72 -0
- package/docs/knowledge-graph.md +20 -0
- package/docs/knowledge-health/api.md +30 -0
- package/docs/knowledge-health/assessment/api.md +96 -0
- package/docs/knowledge-health/assessment/capabilities.md +40 -0
- package/docs/knowledge-health/assessment/evaluation.md +27 -0
- package/docs/knowledge-health/assessment/facilitator.md +30 -0
- package/docs/knowledge-health/assessment/quickstart.md +61 -0
- package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
- package/docs/knowledge-health/devday/facilitator.md +16 -0
- package/docs/knowledge-health/devday/participant-response.md +22 -0
- package/docs/knowledge-health/devday/public-default.md +107 -0
- package/docs/knowledge-health/devday/quickstart.md +18 -0
- package/docs/knowledge-health/devday/support.md +22 -0
- package/docs/knowledge-health/exercise.md +17 -0
- package/docs/knowledge-health/facilitator.md +20 -0
- package/docs/knowledge-health/quickstart.md +94 -0
- package/docs/knowledge-health/readme.md +15 -0
- package/docs/knowledge-health/support.md +34 -0
- package/docs/knowledge-setup.md +248 -0
- package/docs/knowledge-workspace.md +264 -0
- package/docs/learning-harnesses.md +238 -0
- package/docs/learning.md +215 -0
- package/docs/local-services.md +242 -26
- package/docs/obsidian-contract.md +878 -36
- package/docs/obsidian-plugin.md +619 -0
- package/docs/obsidian.md +809 -64
- package/docs/optional-ingestion.md +83 -0
- package/docs/personal-workspace.md +257 -0
- package/docs/practical-judgment.md +92 -0
- package/docs/progressive-ingestion-acceptance.md +89 -0
- package/docs/progressive-ingestion.md +235 -0
- package/docs/project-command-inventory.md +1 -0
- package/docs/release-engineering.md +56 -1
- package/docs/repo-boundary-guard.md +94 -0
- package/docs/research-starter-quickstart.md +66 -0
- package/docs/research-starter.md +114 -0
- package/docs/semantic-ingestion.md +198 -0
- package/docs/semantic-operation.md +317 -0
- package/docs/skill-steward.md +6 -0
- package/docs/template-profile.md +164 -0
- package/docs/template-upgrades.md +114 -0
- package/docs/trackables.md +111 -0
- package/docs/upgrade.md +68 -3
- package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
- package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
- package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
- package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
- package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
- package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
- package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
- package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
- package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
- package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
- package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
- package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
- package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
- package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
- package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
- package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
- package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
- package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
- package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
- package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
- package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
- package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
- package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
- package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
- package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
- package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
- package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
- package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
- package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
- package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
- package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
- package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
- package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
- package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
- package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
- package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
- package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
- package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
- package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
- package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
- package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
- package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
- package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
- package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
- package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
- package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
- package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
- package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
- package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
- package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
- package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
- package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
- package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
- package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
- package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
- package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
- package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
- package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
- package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
- package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
- package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
- package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
- package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
- package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
- package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
- package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
- package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
- package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
- package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
- package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
- package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
- package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
- package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
- package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
- package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
- package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
- package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
- package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
- package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
- package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
- package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
- package/fixtures/atelier-interaction/act/valid/document.json +24 -0
- package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
- package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
- package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
- package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
- package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
- package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
- package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
- package/fixtures/atelier-judgment/case/valid/document.json +75 -0
- package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
- package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
- package/fixtures/atelier-judgment/native-decision.md +3 -0
- package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
- package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
- package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
- package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
- package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
- package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
- package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
- package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
- package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
- package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
- package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
- package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
- package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
- package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
- package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
- package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
- package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
- package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
- package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
- package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
- package/fixtures/atelier-learning/invalid/authority.json +14 -0
- package/fixtures/atelier-learning/valid/capture.json +13 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
- package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
- package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
- package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
- package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
- package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
- package/fixtures/atelier-trackable/request/valid/document.json +22 -0
- package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
- package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
- package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
- package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
- package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
- package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
- package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
- package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
- package/fixtures/capability-packages/adoption.example.json +70 -0
- package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
- package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
- package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
- package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
- package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
- package/fixtures/capability-packages/research/capability-package.json +88 -0
- package/fixtures/capability-packages/research/capability-release.json +134 -0
- package/fixtures/capability-packages/research/evaluation.md +15 -0
- package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
- package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
- package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
- package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
- package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
- package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
- package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
- package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
- package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
- package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
- package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
- package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
- package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
- package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
- package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
- package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
- package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
- package/fixtures/evidence-navigation/valid/claim.json +36 -0
- package/fixtures/evidence-navigation/valid/host.json +16 -0
- package/fixtures/evidence-navigation/valid/profile.json +16 -0
- package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
- package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
- package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
- package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
- package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
- package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
- package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
- package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
- package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
- package/fixtures/harnesses/learning-cycle.json +780 -0
- package/fixtures/inquiry/workshop.json +675 -0
- package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
- package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
- package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
- package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
- package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
- package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
- package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
- package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
- package/fixtures/knowledge-health/calibration-suite.json +26 -0
- package/fixtures/knowledge-health/calibration-trial.json +37 -0
- package/fixtures/knowledge-health/corrected/checklist.md +18 -0
- package/fixtures/knowledge-health/devday/participant-record.json +19 -0
- package/fixtures/knowledge-health/expected-summary.json +27 -0
- package/fixtures/knowledge-health/workshop/README.md +20 -0
- package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
- package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
- package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
- package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
- package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
- package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
- package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
- package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
- package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
- package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
- package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
- package/fixtures/obsidian/edits/workspace.json +1 -1
- package/fixtures/obsidian/materialization/expected-full.json +21 -21
- package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
- package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
- package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -0
- package/fixtures/personal-workspace/overlay.json +24 -0
- package/fixtures/templates/local-library.v1.json +75 -0
- package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
- package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
- package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
- package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
- package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
- package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
- package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
- package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
- package/package.json +64 -6
- package/plugins/obsidian/main.js +444 -0
- package/plugins/obsidian/manifest.json +9 -0
- package/plugins/obsidian/styles.css +22 -0
- package/skills/claude/atelier-build-harness/SKILL.md +59 -0
- package/skills/claude/atelier-coordination/SKILL.md +32 -0
- package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
- package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
- package/skills/claude/atelier-interaction/SKILL.md +34 -0
- package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
- package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
- package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
- package/skills/claude/atelier-research-harness/SKILL.md +43 -0
- package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
- package/skills/claude/atelier-trackables/SKILL.md +40 -0
- package/skills/codex/atelier-build-harness/SKILL.md +59 -0
- package/skills/codex/atelier-coordination/SKILL.md +32 -0
- package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
- package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
- package/skills/codex/atelier-interaction/SKILL.md +34 -0
- package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
- package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
- package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
- package/skills/codex/atelier-research-harness/SKILL.md +43 -0
- package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
- package/skills/codex/atelier-trackables/SKILL.md +40 -0
- package/src/architecture/catalog.mjs +355 -0
- package/src/architecture/index.mjs +93 -0
- package/src/boundary/content-rules.mjs +4 -2
- package/src/boundary/delegation-command.mjs +158 -0
- package/src/boundary/delegation.mjs +396 -0
- package/src/boundary/policy.mjs +52 -10
- package/src/build/git.mjs +18 -0
- package/src/build/index.mjs +3 -0
- package/src/build/ledger.mjs +88 -0
- package/src/capabilities/adoption.mjs +381 -0
- package/src/capabilities/evidence.mjs +140 -0
- package/src/capabilities/files.mjs +124 -0
- package/src/capabilities/index.mjs +4 -0
- package/src/capabilities/instructions.mjs +250 -0
- package/src/capabilities/package.mjs +136 -0
- package/src/cli/command-failure.mjs +36 -0
- package/src/cli/execute-command.mjs +16 -2
- package/src/cli/run.mjs +65 -9
- package/src/coauthor/store.mjs +43 -2
- package/src/collaboration/proposals.mjs +189 -0
- package/src/commands/architecture.mjs +27 -0
- package/src/commands/boundary.mjs +3 -0
- package/src/commands/capability.mjs +73 -0
- package/src/commands/enroll.mjs +3 -0
- package/src/commands/harness.mjs +79 -0
- package/src/commands/ingest.mjs +39 -0
- package/src/commands/init.mjs +4 -1
- package/src/commands/inquiry.mjs +66 -0
- package/src/commands/knowledge-semantic.mjs +128 -0
- package/src/commands/knowledge.mjs +119 -0
- package/src/commands/learn.mjs +61 -0
- package/src/commands/obsidian.mjs +832 -62
- package/src/commands/practice.mjs +24 -0
- package/src/commands/setup.mjs +22 -2
- package/src/commands/trackable.mjs +19 -0
- package/src/contracts/corpus.mjs +36 -0
- package/src/coordination/index.mjs +110 -0
- package/src/egress/forbidden-egress.mjs +2 -0
- package/src/evidence-navigation/contracts.mjs +60 -0
- package/src/evidence-navigation/evaluate.mjs +69 -0
- package/src/evidence-navigation/generation.mjs +22 -0
- package/src/evidence-navigation/index.mjs +2 -0
- package/src/evidence-navigation/local.mjs +167 -0
- package/src/evidence-navigation/schema.generated.mjs +604 -0
- package/src/evidence-navigation/types.mjs +12 -0
- package/src/export/atelier-export-contract.mjs +35 -8
- package/src/graph/enroll.mjs +248 -0
- package/src/graph/graph.mjs +17 -1
- package/src/graph/knowledge-graph.mjs +58 -8
- package/src/harnesses/contracts.mjs +41 -0
- package/src/harnesses/exchange.mjs +154 -0
- package/src/harnesses/feedback.mjs +16 -0
- package/src/harnesses/history.mjs +37 -0
- package/src/harnesses/index.mjs +4 -0
- package/src/harnesses/store.mjs +29 -0
- package/src/ingestion/contracts.mjs +41 -0
- package/src/ingestion/evaluation.mjs +119 -0
- package/src/ingestion/optional/composition/index.mjs +171 -0
- package/src/ingestion/optional/evaluation/index.mjs +219 -0
- package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
- package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
- package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
- package/src/ingestion/optional/graphify/json_bridge.py +163 -0
- package/src/ingestion/optional/graphify/query_receiving.py +209 -0
- package/src/ingestion/optional/index.mjs +9 -0
- package/src/ingestion/optional/jev/bridge.mjs +166 -0
- package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
- package/src/ingestion/optional/jev/judgments.mjs +174 -0
- package/src/ingestion/optional/jev/native-translation.mjs +32 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
- package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
- package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
- package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
- package/src/ingestion/optional/vanilla/index.mjs +218 -0
- package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
- package/src/ingestion/processors.mjs +218 -0
- package/src/ingestion/semantic.mjs +203 -0
- package/src/ingestion/store.mjs +372 -0
- package/src/inquiry/beliefs.mjs +32 -0
- package/src/inquiry/contracts.mjs +23 -0
- package/src/inquiry/index.mjs +5 -0
- package/src/inquiry/ledger.mjs +135 -0
- package/src/inquiry/lenses.mjs +15 -0
- package/src/inquiry/projection.mjs +77 -0
- package/src/inquiry/store.mjs +35 -0
- package/src/intake/read-scope.mjs +12 -0
- package/src/intake/store.mjs +69 -6
- package/src/interaction/index.mjs +91 -0
- package/src/judgment/index.mjs +82 -0
- package/src/judgment/practice-evaluation.mjs +70 -0
- package/src/judgment/practice.mjs +144 -0
- package/src/knowledge/context.mjs +217 -0
- package/src/knowledge/index.mjs +5 -0
- package/src/knowledge/ingestion.mjs +79 -0
- package/src/knowledge/intake.mjs +33 -0
- package/src/knowledge/ledger.mjs +110 -0
- package/src/knowledge/participatory/guidance.mjs +36 -0
- package/src/knowledge/participatory/guided-contribution.mjs +44 -0
- package/src/knowledge/participatory/index.mjs +2 -0
- package/src/knowledge/participatory/installed-workshop.mjs +108 -0
- package/src/knowledge/plan.mjs +67 -0
- package/src/knowledge/projection.mjs +43 -0
- package/src/knowledge/semantic-operation.mjs +567 -0
- package/src/knowledge/sessions.mjs +467 -0
- package/src/knowledge/workspace.mjs +295 -0
- package/src/knowledge-health/assessment.mjs +165 -0
- package/src/knowledge-health/capabilities.mjs +350 -0
- package/src/knowledge-health/context.mjs +62 -0
- package/src/knowledge-health/example.mjs +47 -0
- package/src/knowledge-health/index.mjs +10 -0
- package/src/knowledge-health/owner-join.mjs +88 -0
- package/src/knowledge-health/proof/common.mjs +24 -0
- package/src/knowledge-health/proof/installed-check.mjs +100 -0
- package/src/knowledge-health/proof/native-readback.mjs +37 -0
- package/src/knowledge-health/proof/rehearse.mjs +68 -0
- package/src/knowledge-health/proof/validate-participant.mjs +17 -0
- package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
- package/src/knowledge-health/proof/workshop-check.mjs +36 -0
- package/src/knowledge-health/rule-identity.mjs +44 -0
- package/src/knowledge-health/workshop-composition.mjs +19 -0
- package/src/knowledge-health/workshop-profile.mjs +176 -0
- package/src/knowledge-health/workshop.mjs +99 -0
- package/src/learning/adapters.mjs +68 -0
- package/src/learning/assistance.mjs +127 -0
- package/src/learning/contracts.mjs +65 -0
- package/src/learning/store.mjs +272 -0
- package/src/personal-workspace/index.mjs +391 -0
- package/src/personal-workspace/selection.mjs +385 -0
- package/src/project/config.mjs +8 -0
- package/src/project/durable-state.mjs +3 -1
- package/src/project/file-class.mjs +1 -1
- package/src/project/private-state.mjs +10 -1
- package/src/projection/obsidian/contracts.mjs +224 -18
- package/src/projection/obsidian/edits/apply.mjs +63 -19
- package/src/projection/obsidian/edits/regions.mjs +137 -42
- package/src/projection/obsidian/materialize/index.mjs +6 -3
- package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
- package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
- package/src/projection/obsidian/materialize/redaction.mjs +327 -0
- package/src/projection/obsidian/materialize/settings.mjs +113 -34
- package/src/projection/obsidian/personal-workspace.mjs +436 -0
- package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
- package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
- package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
- package/src/projection/obsidian/proposals/adapter.mjs +47 -8
- package/src/projection/obsidian/proposals/observation.mjs +20 -7
- package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
- package/src/projection/obsidian/publication/index.mjs +2 -1
- package/src/projection/obsidian/publication/publisher.mjs +312 -36
- package/src/projection/obsidian/publication/transport.mjs +63 -8
- package/src/projection/obsidian/publication/vault-list.mjs +200 -0
- package/src/projection/obsidian/recovery/index.mjs +4 -1
- package/src/projection/obsidian/recovery/restart.mjs +3 -1
- package/src/projection/obsidian/recovery/store.mjs +168 -8
- package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
- package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
- package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
- package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
- package/src/readiness/readiness.mjs +10 -3
- package/src/reflection/index.mjs +56 -0
- package/src/runtime/obsidian/app-capability.mjs +104 -12
- package/src/runtime/obsidian/app-production-seams.mjs +161 -42
- package/src/runtime/obsidian/app-registration.mjs +313 -0
- package/src/runtime/obsidian/app-restart.mjs +154 -0
- package/src/runtime/obsidian/engine.mjs +288 -29
- package/src/runtime/obsidian/extension-points.mjs +1 -1
- package/src/runtime/obsidian/index.mjs +15 -8
- package/src/runtime/obsidian/launch-plan.mjs +91 -0
- package/src/runtime/obsidian/lifecycle.mjs +193 -22
- package/src/runtime/obsidian/login-item.mjs +332 -0
- package/src/runtime/obsidian/machine-settings.mjs +119 -12
- package/src/runtime/obsidian/opening.mjs +369 -63
- package/src/runtime/obsidian/pending-edits.mjs +10 -0
- package/src/runtime/obsidian/pipeline.mjs +71 -3
- package/src/runtime/obsidian/plugin-channel.mjs +289 -0
- package/src/runtime/obsidian/plugin-choice.mjs +182 -0
- package/src/runtime/obsidian/plugin-drift.mjs +124 -0
- package/src/runtime/obsidian/plugin-presence.mjs +61 -0
- package/src/runtime/obsidian/process-identity.mjs +20 -10
- package/src/runtime/obsidian/project-views.mjs +282 -0
- package/src/runtime/obsidian/questions.mjs +48 -0
- package/src/runtime/obsidian/release-watch.mjs +56 -0
- package/src/runtime/obsidian/service-main.mjs +113 -17
- package/src/runtime/obsidian/service-manager-production.mjs +61 -0
- package/src/runtime/obsidian/service-managers.mjs +275 -0
- package/src/runtime/obsidian/service-record.mjs +105 -5
- package/src/runtime/obsidian/service-server.mjs +50 -12
- package/src/runtime/obsidian/service.mjs +134 -7
- package/src/runtime/obsidian/startup-adapters.mjs +59 -21
- package/src/runtime/obsidian/state-store.mjs +13 -1
- package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
- package/src/runtime/obsidian/vault-location.mjs +300 -0
- package/src/runtime/obsidian/view-counts.mjs +34 -0
- package/src/server/local-sidecar.mjs +193 -7
- package/src/server/server.mjs +45 -6
- package/src/template-bindings/project.mjs +92 -0
- package/src/templates/profile.mjs +225 -0
- package/src/trackables/domain.mjs +175 -0
- package/src/trackables/store.mjs +114 -0
- package/src/ui/knowledge-page.mjs +1388 -0
- package/src/upgrade/explanation.mjs +1 -1
- package/src/upgrade/template-participant.mjs +171 -0
- package/src/upgrade/transaction.mjs +72 -25
- package/src/upgrade/upgrade.mjs +2 -1
- package/templates/external-project-workspace/pack-lifecycle.json +6 -1
- package/templates/knowledge-workspace/.gitattributes +2 -0
- package/templates/knowledge-workspace/AGENTS.md +27 -0
- package/templates/knowledge-workspace/README.md +44 -0
- package/templates/knowledge-workspace/atelier.project.json +22 -0
- package/templates/knowledge-workspace/gitignore +6 -0
- package/templates/knowledge-workspace/knowledge-plan.json +111 -0
- package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
- package/templates/knowledge-workspace/records/forecast.md +22 -0
- package/templates/knowledge-workspace/records/inspection.md +25 -0
- package/templates/knowledge-workspace/records/telescope.md +24 -0
- package/templates/knowledge-workspace/repo-access.v1.json +9 -0
package/docs/learning.md
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Learning from corrections and outcomes
|
|
2
|
+
|
|
3
|
+
The learning module records feedback in context, preserves proposals and human
|
|
4
|
+
decisions, and supplies explicitly activated lessons to a named harness. It is
|
|
5
|
+
an experimental local source capability. It requires consumer integration and
|
|
6
|
+
does not establish availability in a published package or installed desktop.
|
|
7
|
+
|
|
8
|
+
A person defines the task and scope, an agent can propose a lesson, and the
|
|
9
|
+
person reviews its wording and consequences. Evidence can be represented before
|
|
10
|
+
acceptance. Only accepted, activated content is eligible for task context.
|
|
11
|
+
|
|
12
|
+
## Records and authority
|
|
13
|
+
|
|
14
|
+
Four kinds of records describe the main path:
|
|
15
|
+
|
|
16
|
+
1. An **observation** preserves feedback or a tool outcome, its interpretation,
|
|
17
|
+
provenance reference, project and activity. Source digests are assertions
|
|
18
|
+
supplied by the caller; the store never follows a source reference. A null
|
|
19
|
+
digest explicitly represents unavailable original-byte verification.
|
|
20
|
+
2. A **lesson proposal** names evidence observations, purpose, principle,
|
|
21
|
+
exceptions and a complete proposed artifact. Artifacts can be instructions,
|
|
22
|
+
skills, principles or descriptions of checks. Check artifacts are inert;
|
|
23
|
+
this module does not turn prose into executable validators.
|
|
24
|
+
3. A **decision** accepts, rejects or defers one exact proposal digest. The
|
|
25
|
+
digest binds its artifact, scope and cited observation digests. Editing any
|
|
26
|
+
of them requires a new proposal and decision.
|
|
27
|
+
4. An **activation** binds that decision and artifact to one harness. It makes
|
|
28
|
+
content eligible for subsequent context requests; it neither installs files
|
|
29
|
+
nor grants permissions. Withdrawal is a new record, preserving history.
|
|
30
|
+
|
|
31
|
+
The local CLI accepts an explicit actor assertion. It does not authenticate
|
|
32
|
+
people. A network or multi-user host must resolve actors from its own trusted
|
|
33
|
+
session and enforce access, capture consent and action capabilities before
|
|
34
|
+
calling the library. A field that says `human` is not authentication.
|
|
35
|
+
|
|
36
|
+
Scope always names an exact project. An activity can be an explicitly reviewed
|
|
37
|
+
`*`; context requests always name a concrete activity. There is no global
|
|
38
|
+
workspace-to-workspace inheritance. Only a local human actor may decide,
|
|
39
|
+
activate or withdraw. Capture and proposal creation never confer those powers.
|
|
40
|
+
|
|
41
|
+
Two active artifacts with the same kind and name and different content are
|
|
42
|
+
withheld when their scopes overlap the requested activity. The context result
|
|
43
|
+
explains the conflict. This deterministic slot check does not establish that
|
|
44
|
+
differently named lessons are semantically compatible.
|
|
45
|
+
|
|
46
|
+
## CLI workflow
|
|
47
|
+
|
|
48
|
+
Run inside the intended Git workspace with `.atelier-local/` ignored and
|
|
49
|
+
untracked. The existing `atelier setup` command can prepare local state for an
|
|
50
|
+
adopted project. Every command reads a JSON object from stdin, up to 256 KiB,
|
|
51
|
+
and prints JSON. Keep request and export files private.
|
|
52
|
+
|
|
53
|
+
For `capture`, `propose`, `decide`, `activate` and `withdraw`, the envelope is:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"workspaceId": "sample-workspace",
|
|
58
|
+
"actor": { "id": "local-owner", "kind": "human" },
|
|
59
|
+
"requestId": "capture-one",
|
|
60
|
+
"expectedRevision": 0,
|
|
61
|
+
"input": {
|
|
62
|
+
"id": "observation-one",
|
|
63
|
+
"signal": "user-correction",
|
|
64
|
+
"text": "Put shortages first in the inventory summary.",
|
|
65
|
+
"interpretation": "explicit",
|
|
66
|
+
"scope": { "project": "sample-project", "activity": "inventory-summary" },
|
|
67
|
+
"source": { "ref": "manual-user-entry", "digest": null }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Pass this to `atelier learn capture`. Use the returned revision for the next
|
|
73
|
+
write and a new request identifier. Retrying identical request bytes and actor
|
|
74
|
+
returns the original receipt. Reusing an identifier for changed content refuses.
|
|
75
|
+
A stale revision requires reloading and reviewing the current state.
|
|
76
|
+
|
|
77
|
+
The subsequent command inputs are:
|
|
78
|
+
|
|
79
|
+
| Command | Input |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `propose` | `id`, `title`, `principle`, `rationale`, `exceptions`, `evidenceIds`, `scope`, `artifact: {kind, name, content}`; optional `supersedes` |
|
|
82
|
+
| `decide` | `lessonId`, returned `lessonDigest`, `verdict: accepted/rejected/deferred`, `reason` |
|
|
83
|
+
| `activate` | New activation `id`, `lessonId`, `lessonDigest`, returned `decisionId`, `harnessId` |
|
|
84
|
+
| `withdraw` | `activationId`, `reason` |
|
|
85
|
+
|
|
86
|
+
For a proposal, an example complete artifact is:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"kind": "instruction",
|
|
91
|
+
"name": "inventory-summary",
|
|
92
|
+
"content": "For inventory summaries, list shortages before storage locations."
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
An exception such as “A location audit can lead with storage locations” stays
|
|
97
|
+
beside the artifact in selected context. Skill artifacts contain the complete
|
|
98
|
+
reviewed text; rendering never asks a model to add unreviewed steps.
|
|
99
|
+
|
|
100
|
+
Read commands take `{"workspaceId":"sample-workspace"}`:
|
|
101
|
+
|
|
102
|
+
- `atelier learn list` returns current records and activation states.
|
|
103
|
+
- `atelier learn graph` returns a private graph with typed evidence, proposal,
|
|
104
|
+
decision, activation and withdrawal nodes and their relationships.
|
|
105
|
+
- `atelier learn plan` groups pending evidence by exact scope and suggests a
|
|
106
|
+
processing route. Counts are not independent corroboration or promotion rules.
|
|
107
|
+
- `atelier learn export` returns a digest-bound private history archive. There
|
|
108
|
+
is no automatic send path, canonical graph enrollment or trusted import.
|
|
109
|
+
|
|
110
|
+
`render` and `context` also require a `query`. A render query is
|
|
111
|
+
`{"lessonId":"lesson-one","lessonDigest":"<digest returned by propose>"}`.
|
|
112
|
+
A context query is:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"workspaceId": "sample-workspace",
|
|
117
|
+
"query": {
|
|
118
|
+
"scope": { "project": "sample-project", "activity": "inventory-summary" },
|
|
119
|
+
"harnessId": "sample-harness"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Pass it to `atelier learn context` at each new task boundary. The response
|
|
125
|
+
includes applicable artifacts, source provenance and exceptions. Proposed,
|
|
126
|
+
rejected, deferred, withdrawn and superseded material is not active guidance.
|
|
127
|
+
The harness remains responsible for instruction hierarchy and actual tool
|
|
128
|
+
permission enforcement. Withdrawing a lesson affects future context selection;
|
|
129
|
+
it cannot erase content a running model already received.
|
|
130
|
+
|
|
131
|
+
An application outcome can be captured with `lessonId` to link subsequent
|
|
132
|
+
feedback back to the lesson. Revision uses a new proposal with `supersedes`.
|
|
133
|
+
The replacement must retain the exact scope and artifact slot. Acceptance alone
|
|
134
|
+
does not replace active content; activating the accepted replacement retires the
|
|
135
|
+
previous activation in that harness atomically. Changing an active lesson's
|
|
136
|
+
decision requires withdrawing its active bindings first.
|
|
137
|
+
|
|
138
|
+
## Persistence and recovery
|
|
139
|
+
|
|
140
|
+
Private state lives under `.atelier-local/learning`. Immutable events retain a
|
|
141
|
+
content digest, previous digest, request, actor assertion and resulting record.
|
|
142
|
+
Existing private-state helpers provide containment, no-follow regular-file
|
|
143
|
+
checks, exclusive writer ownership and non-overwriting durable publication.
|
|
144
|
+
On POSIX, directories and event files use restrictive `0700` and `0600` modes.
|
|
145
|
+
Windows uses account ACLs; POSIX mode bits do not establish Windows access
|
|
146
|
+
control. The hosting account or application must protect workspace access.
|
|
147
|
+
Ignored Git state prevents accidental enrollment, not access by other local
|
|
148
|
+
users.
|
|
149
|
+
Replay verifies the chain and transitions; projections are rebuilt from it.
|
|
150
|
+
|
|
151
|
+
There are explicit input, event-count and journal-byte ceilings. Unknown files,
|
|
152
|
+
missing events, broken chains and corrupt records refuse. Pending staging files
|
|
153
|
+
are not committed events. A lost reply after a durable write can be reconciled
|
|
154
|
+
by retrying exactly the same request. No automatic compaction or destructive
|
|
155
|
+
history repair occurs. Export before capacity maintenance; do not truncate
|
|
156
|
+
history to make an error disappear.
|
|
157
|
+
|
|
158
|
+
Admission reserves one event and the maximum valid event size for every active
|
|
159
|
+
binding that would remain after the write. Ordinary writes also preserve a
|
|
160
|
+
minimum maintenance margin. This can refuse a new activation before the journal
|
|
161
|
+
is full, ensuring every existing activation retains room for withdrawal.
|
|
162
|
+
Withdrawal consumes its own reservation while preserving the others. This is a
|
|
163
|
+
journal-capacity guarantee; filesystem failure or lost disk space can still
|
|
164
|
+
prevent a durable write.
|
|
165
|
+
|
|
166
|
+
Digests prove internal consistency against the retained bytes, not that an
|
|
167
|
+
authorized person authored them. An owner with filesystem write access can
|
|
168
|
+
replace local state. Multi-user trust and signed admission require independent
|
|
169
|
+
host authority. Retention or deletion of source material must also account for
|
|
170
|
+
private learning text and exports; a source reference is not a deletion policy.
|
|
171
|
+
|
|
172
|
+
## Optional assistance and compatibility
|
|
173
|
+
|
|
174
|
+
`@mnstry/atelier/learning/assistance` provides mechanical work planning, exact
|
|
175
|
+
bounded evidence batches and a proposal-only adapter driver. The host supplies
|
|
176
|
+
the selected adapter, its qualification evidence, authorization for the exact
|
|
177
|
+
payload and adapter version, and durable budget reservation and settlement.
|
|
178
|
+
The driver makes at most one adapter call for an admitted attempt. Unknown
|
|
179
|
+
completion is retained as unknown; there is no fallback or automatic retry.
|
|
180
|
+
Invalid responses still settle their returned attempt. Unknown usage remains
|
|
181
|
+
unknown. Cancellation, time limits, provider credentials and budget persistence
|
|
182
|
+
belong to the injected host. Tests qualify the adapter contract with synthetic
|
|
183
|
+
implementations; they do not qualify any real model.
|
|
184
|
+
|
|
185
|
+
Returned drafts still need ordinary `propose`, human decision and activation.
|
|
186
|
+
No expensive model pass is required for capture, integrity checks, grouping,
|
|
187
|
+
context selection, rendering, export or withdrawal. Stronger reasoning can be
|
|
188
|
+
reserved for exceptions and conflicting interpretations.
|
|
189
|
+
|
|
190
|
+
`@mnstry/atelier/learning/adapters` converts an existing skill-observation
|
|
191
|
+
receipt into a tool-attributed observation. The original feedback words remain
|
|
192
|
+
explicitly unavailable. A legacy lesson can become a fresh proposal with
|
|
193
|
+
caller-selected local evidence and scope; old acceptance and activation never
|
|
194
|
+
transfer. The existing `atelier feedback` support-report command and
|
|
195
|
+
proposal-only `atelier-claim@v1` contract keep their original meaning.
|
|
196
|
+
|
|
197
|
+
## Public foundation and hosts
|
|
198
|
+
|
|
199
|
+
The open-source package owns the portable records, validation, local store,
|
|
200
|
+
CLI, evidence graph, context selection, inert rendering and conformance cases.
|
|
201
|
+
Campaigns may stay in their own workspaces; selected references do not change
|
|
202
|
+
their writer ownership. Private evidence projections stay outside committed
|
|
203
|
+
canonical graphs unless an owner explicitly authors an appropriate source.
|
|
204
|
+
|
|
205
|
+
A desktop or other host owns integrated capture, authenticating its caller,
|
|
206
|
+
background jobs, provider access, budgets, review controls and actual harness
|
|
207
|
+
integration. Private feedback, preferences, methods and authored skills remain
|
|
208
|
+
in their owning workspace. A commercial host should consume these contracts
|
|
209
|
+
without making basic local learning or export depend on an account.
|
|
210
|
+
|
|
211
|
+
Run `node --test test/learning-*.test.mjs` on the supported Node version for
|
|
212
|
+
the local acceptance cases. They cover terminal capture through withdrawal
|
|
213
|
+
across process restarts, concurrent/stale writes, source and decision binding,
|
|
214
|
+
conflicts, supersession, retention of history, adapter budgets and refusal paths.
|
|
215
|
+
Installed desktop behavior and real-model quality require their own evidence.
|
package/docs/local-services.md
CHANGED
|
@@ -145,8 +145,9 @@ explicit consent that names its actor.
|
|
|
145
145
|
| --- | --- | --- | --- |
|
|
146
146
|
| Health | `GET /health` | none | service name, workspace identity, runtime identifier, PID, loopback host and port, executable digest, start time, status |
|
|
147
147
|
| Status | `GET /status` | bearer | the health fields, loop state, last tick, last error code, and per-view freshness with held notes counted, not named |
|
|
148
|
-
| Tick now | `POST /tick` | bearer | the state of the tick that ran |
|
|
148
|
+
| Tick now | `POST /tick` | bearer | the state of the tick that ran. The body may also name one view (`scopeId`, a contract identifier), which that tick prepares and publishes once more, asking the app again |
|
|
149
149
|
| Stop | `POST /stop` | bearer | an acknowledgement naming the runtime and PID, then the service ends |
|
|
150
|
+
| Plugin challenge, hello, lease, release, status | `POST /plugin/challenge`, `/plugin/hello`, `/plugin/lease`, `/plugin/release`, `/plugin/status` | a handshake over one vault's key, which never crosses the wire | Atelier's Obsidian plugin inside that vault: presence and read-only status of that one view ([obsidian-plugin.md](obsidian-plugin.md)) |
|
|
150
151
|
|
|
151
152
|
Health carries no path, no note title, no source name and no withheld
|
|
152
153
|
identity. There is no other operation: no file serving, no command, no
|
|
@@ -159,13 +160,29 @@ The listener refuses a request before looking its operation up when:
|
|
|
159
160
|
also refuses a name that resolves to loopback;
|
|
160
161
|
- `Sec-Fetch-Site` is present and is neither `none` nor `same-origin`, or
|
|
161
162
|
`Origin` is present and is not the listener itself;
|
|
162
|
-
- the path is not one of the
|
|
163
|
+
- the path is not one of the nine, exactly and without a query, or the method
|
|
163
164
|
is not that path's method.
|
|
164
165
|
|
|
165
166
|
Status, tick and stop additionally refuse without the bearer of the running
|
|
166
167
|
runtime. A `POST` payload is a JSON object of at most 1 KiB that names the
|
|
167
168
|
runtime identifier it is meant for, so a request aimed at an earlier runtime on
|
|
168
|
-
the same port does nothing.
|
|
169
|
+
the same port does nothing (409, `request-names-another-runtime`). A tick may
|
|
170
|
+
also name one view by its `scopeId`, which must be a contract identifier as
|
|
171
|
+
the scope contract defines it (400, `request-invalid`); any other member, and a
|
|
172
|
+
`scopeId` on a stop, is refused (400, `request-member-unknown`). A refused
|
|
173
|
+
request runs nothing.
|
|
174
|
+
|
|
175
|
+
The plugin commands carry no credential in a header, and refuse one. The key
|
|
176
|
+
of a vault the workspace maintains is random per view and kept owner-only in
|
|
177
|
+
private state and in that vault's plugin data file; it never crosses the
|
|
178
|
+
wire. The service answers a challenge only for a key it holds, with a proof
|
|
179
|
+
over its own exact address, before the plugin sends anything that names the
|
|
180
|
+
vault; the plugin then proves the same key, and every later command and answer
|
|
181
|
+
is sealed with a key for that session, with a counter that only goes up. What
|
|
182
|
+
a session grants is the plugin commands for that one view and nothing else:
|
|
183
|
+
the runtime bearer is not accepted there, and a vault's key is not accepted by
|
|
184
|
+
status, tick or stop. A plugin payload is a JSON object of at most 1 KiB with
|
|
185
|
+
exactly the fields of its command.
|
|
169
186
|
|
|
170
187
|
### Status values and refusal cases
|
|
171
188
|
|
|
@@ -178,8 +195,9 @@ the same port does nothing.
|
|
|
178
195
|
| `stale-record` | the recorded address is closed and the recorded PID is gone | starts; the new service replaces the record once it listens | refuses; nothing is proven to stop |
|
|
179
196
|
| `pid-not-ours` | the recorded address is closed and a process has the recorded PID (the number was reused, or a process outlived its listener) | starts; that PID is never signalled | refuses; that PID is never signalled |
|
|
180
197
|
|
|
181
|
-
`start` is serialized per workspace, spawns the service without a shell,
|
|
182
|
-
|
|
198
|
+
`start` is serialized per workspace, spawns the service without a shell, in
|
|
199
|
+
the root directory rather than the one the command runs in, and detaches it
|
|
200
|
+
only when asked for a service that survives the launching command.
|
|
183
201
|
It waits for health to echo the runtime identifier it generated and the PID of
|
|
184
202
|
the child it created. If that proof never arrives it stops only that child, by
|
|
185
203
|
its process handle, and reports the private operational log,
|
|
@@ -198,6 +216,39 @@ to end and removes only the generated record. It never looks a process up by
|
|
|
198
216
|
port, name or pattern. Ending a proven runtime that ignores the request is
|
|
199
217
|
opt-in and is proven again immediately before the signal.
|
|
200
218
|
|
|
219
|
+
A runtime of an earlier release is replaced by a command that asks for a tick
|
|
220
|
+
with the start options of the installed entry (`requestServiceTick({ service
|
|
221
|
+
})`; `open` does). Every runtime records at its start the release it runs
|
|
222
|
+
(`executable.ext.release` in its record): the package version and a digest of
|
|
223
|
+
every runtime module it ships (`src/` and `contracts/`, by path and content),
|
|
224
|
+
and of the plugin it publishes into every vault (`plugins/`; none where a
|
|
225
|
+
package has no such folder).
|
|
226
|
+
A runtime of an earlier release proves itself `healthy` but records an earlier
|
|
227
|
+
version than this package's, this version with an entry module or modules of
|
|
228
|
+
other content, or no release at all (releases up to the one that began
|
|
229
|
+
recording it); or it refuses a tick that names a view, as releases up to
|
|
230
|
+
0.2.0-alpha.11 do (their `POST` payload has exactly one member). Versions are
|
|
231
|
+
ordered as semantic versions, a prerelease below its release
|
|
232
|
+
(`0.2.0-alpha.11` < `0.2.0-alpha.12` < `0.2.0`; `releaseStanding` in
|
|
233
|
+
`lifecycle.mjs`). It is stopped as `stop` stops it and the installed entry is
|
|
234
|
+
started, detached, under the consent already recorded; the answer carries
|
|
235
|
+
`restarted: "outdated"`, and `open` shows `service: restarted (outdated)`. A
|
|
236
|
+
runtime that records a later version, or another version that cannot be
|
|
237
|
+
ordered against the installed one, is never
|
|
238
|
+
replaced by this release, nor asked for the tick: the answer is
|
|
239
|
+
`service-other-release` (`open`: `service-unavailable`, with the next step
|
|
240
|
+
`atelier obsidian service stop`, then open again). So two installations used
|
|
241
|
+
on one workspace, a global and a project-local one for example, do not replace
|
|
242
|
+
each other's runtime on every open; within one version, other content is
|
|
243
|
+
replaced. The same version string is compared by content even when it cannot
|
|
244
|
+
be ordered (a fork's `dev`, say), so the runtime `open` just started is always
|
|
245
|
+
this release and "service stop, then open" cannot loop. A listener of now refuses a tick only when it names another runtime,
|
|
246
|
+
which happens when a concurrent command replaced the runtime between the check
|
|
247
|
+
and the request: the record is read again, the runtime that took its place is
|
|
248
|
+
asked, and nothing is restarted. A `busy` runtime is not stopped, and anything
|
|
249
|
+
that is not a proven runtime of this workspace is never stopped. Without the
|
|
250
|
+
start options the runtime is only reported (`service-outdated`).
|
|
251
|
+
|
|
201
252
|
The service itself refuses to start beside a runtime of the same workspace
|
|
202
253
|
that proves itself, and ends cleanly when its record no longer names it. Two
|
|
203
254
|
engines can never tick one workspace together: each tick holds a private
|
|
@@ -231,15 +282,153 @@ proceeds.
|
|
|
231
282
|
accepts a connection and does not answer in time proves nothing.
|
|
232
283
|
`inspectPrivateGenerationLock` reports the holder without changing anything.
|
|
233
284
|
|
|
234
|
-
### Operating-system startup
|
|
285
|
+
### Operating-system startup: the login item
|
|
235
286
|
|
|
236
287
|
`buildStartupAdapter` returns the text of a launchd user agent (macOS) or a
|
|
237
288
|
systemd user unit (Linux) from the values it is given. It writes no file,
|
|
238
289
|
installs nothing, runs no service manager and looks nothing up on the machine.
|
|
239
290
|
Windows startup has not been qualified and refuses with
|
|
240
|
-
`startup-platform-unqualified`.
|
|
241
|
-
|
|
242
|
-
|
|
291
|
+
`startup-platform-unqualified`. The unit runs the service entry with
|
|
292
|
+
`--startup` in the root directory, with the search path it is given, and is
|
|
293
|
+
restarted after a crash or a non-zero exit but never after a clean one:
|
|
294
|
+
|
|
295
|
+
| Key | launchd | systemd |
|
|
296
|
+
| --- | --- | --- |
|
|
297
|
+
| Program | `ProgramArguments`: Node, the entry, `--startup`, `--project`, `--data-root`, `--workspace-id`, `--adapter` | `ExecStart`, the same words |
|
|
298
|
+
| Search path | `EnvironmentVariables` `PATH` | `Environment="PATH=…"` |
|
|
299
|
+
| Directory | `WorkingDirectory` `/` | `WorkingDirectory=/` |
|
|
300
|
+
| Start | `RunAtLoad` | `WantedBy=default.target` |
|
|
301
|
+
| Restart | `KeepAlive` `SuccessfulExit` false, `ThrottleInterval` 60 | `Restart=on-failure`, `RestartSec=60`, `RestartPreventExitStatus=2` |
|
|
302
|
+
| Stop | `ExitTimeOut` 60 (a tick in flight gets 30 s) | `TimeoutStopSec=60` |
|
|
303
|
+
| Process type | `Standard`: the service's budgets were measured without background I/O throttling | – |
|
|
304
|
+
| Output | `StandardOutPath`, `StandardErrorPath`: `state/service/login-item.log` | `StandardOutput`, `StandardError`: `append:` the same file |
|
|
305
|
+
|
|
306
|
+
Installing one is an explicit request (`service unit --install`), never a
|
|
307
|
+
side effect (`src/runtime/obsidian/login-item.mjs`):
|
|
308
|
+
|
|
309
|
+
1. The entry is the one of the package installed for the project, found as
|
|
310
|
+
Node finds a package from the project's folder and named by that path,
|
|
311
|
+
not its real path, so an upgrade or a re-pointed link is what the next
|
|
312
|
+
start runs. Without one, the command's own package is used unless it lies
|
|
313
|
+
in a package runner's cache (npx, pnpm dlx, bunx) or a temporary folder:
|
|
314
|
+
`login-item-needs-installed-package`. Node is named by its real path, so a
|
|
315
|
+
version manager's per-shell link is never named. The search path keeps
|
|
316
|
+
absolute entries once, and none in a temporary folder. The unit always
|
|
317
|
+
names the data root the workspace was resolved under (the flag, the
|
|
318
|
+
pointer, the overlay's preference or the platform default, such as
|
|
319
|
+
`$XDG_DATA_HOME/atelier`) and the workspace identity, because the
|
|
320
|
+
manager's environment carries only the search path: the service at login
|
|
321
|
+
finds the same workspace, and, when the project no longer leads to it (it
|
|
322
|
+
moved, or its pointer is gone), records its refusal in the workspace the
|
|
323
|
+
unit names, if that exists.
|
|
324
|
+
2. The consent is recorded before the unit is loaded, because the manager
|
|
325
|
+
starts the service as soon as it loads it: `--consent-actor ID`; for a
|
|
326
|
+
person at a terminal, the actor already recorded for the workspace or else
|
|
327
|
+
the account's name (asking for the login item there is that person's
|
|
328
|
+
consent); or a recorded consent that already covers startup. Otherwise
|
|
329
|
+
`startup-consent-required`. Its coverage becomes `service-and-startup`.
|
|
330
|
+
A proven service of an earlier release than the entry the unit will run
|
|
331
|
+
is stopped then, as `service stop` stops it, so the unit's own start at
|
|
332
|
+
load runs that entry instead of refusing beside the earlier one; if the
|
|
333
|
+
manager then refuses the unit, the entry is started as a child for this
|
|
334
|
+
session.
|
|
335
|
+
3. The injected service manager (`service-managers.mjs`) writes the unit
|
|
336
|
+
atomically with mode 0644 and loads it. launchd: bootout of a loaded job
|
|
337
|
+
(it keeps the definition it was loaded with), a bounded wait until launchd
|
|
338
|
+
lets it go, then `bootstrap gui/<uid>`. systemd: `daemon-reload`, `enable`.
|
|
339
|
+
A unit file written where none was is removed again when the manager
|
|
340
|
+
does not take it, since launchd loads every property list in
|
|
341
|
+
`~/Library/LaunchAgents` at login.
|
|
342
|
+
A manager that refuses the unit takes the consent back to the one recorded
|
|
343
|
+
before; when none was, the consent just recorded stays for the actor, but
|
|
344
|
+
covers the service alone.
|
|
345
|
+
4. `state/service/login-item.json` (`atelier-obsidian-login-item/v1`) records
|
|
346
|
+
the label, allocated once and kept, the unit file, the digest of its text,
|
|
347
|
+
the program and the search path. The answer is remembered as the
|
|
348
|
+
`loginItem` decision of the machine settings (`on`), by the actor named or
|
|
349
|
+
the person at the terminal; `--adapter=obsidian-cli`, when given, is
|
|
350
|
+
remembered as for `service start`.
|
|
351
|
+
|
|
352
|
+
The production manager (`service-manager-production.mjs`) is the only code
|
|
353
|
+
that runs `launchctl` or `systemctl` or writes into `~/Library/LaunchAgents`
|
|
354
|
+
or the user's systemd folder. It is imported only by the command entry, and
|
|
355
|
+
refuses under the Node test runner (`real-login-item-under-test`) and when
|
|
356
|
+
HOME is not the account's own home directory (`login-item-home-mismatch`):
|
|
357
|
+
a unit is registered in the account's real session whatever HOME says, so a
|
|
358
|
+
private HOME never installs one.
|
|
359
|
+
|
|
360
|
+
Once installed, `startService` starts the service through the manager
|
|
361
|
+
(`launchctl kickstart -p`, `systemctl --user start`) instead of spawning a
|
|
362
|
+
child, so two starts never compete, and accepts the runtime that proves itself
|
|
363
|
+
with a record naming the digest of the entry the unit runs; the runtime
|
|
364
|
+
identifier is the service's own there. As for a child, it waits for that
|
|
365
|
+
runtime to be healthy and answers `busy` only when the wait is over and the
|
|
366
|
+
runtime is still in its first tick. A listener that has not written its
|
|
367
|
+
record yet is waited for as that service, never adopted. On the way, a unit
|
|
368
|
+
whose text differs from what would be written now, keeping the recorded
|
|
369
|
+
search path, is written and loaded again (`loginItem: { refreshed: true }`).
|
|
370
|
+
The manager is asked first whether the person switched the item off (System
|
|
371
|
+
Settings on macOS, `systemctl --user disable` on Linux); one that is off is
|
|
372
|
+
neither written again, reloaded, enabled nor started through the manager
|
|
373
|
+
(`login-item-switched-off`). A unit that is switched off, whose file is gone,
|
|
374
|
+
or that the manager does not have loaded (no user systemd), is not forced: a
|
|
375
|
+
child is started for that command only, and the answer says why (`loginItem:
|
|
376
|
+
{ via: 'child', reason }`). `requestServiceTick` replaces an outdated service the same way,
|
|
377
|
+
and so does `startService` with `replaceOutdated` (`service start`): a proven
|
|
378
|
+
runtime of an earlier release is stopped through its own listener, under the
|
|
379
|
+
start lock, and the installed entry started in its place
|
|
380
|
+
(`replaced: 'outdated'`); one of a later release is left running and
|
|
381
|
+
answered as `release: 'later'`.
|
|
382
|
+
|
|
383
|
+
Which release is installed is read from the entry that would be started
|
|
384
|
+
(`runtimeRelease`): the digest of that entry, and `readReleaseIdentity({
|
|
385
|
+
root })` of the package that entry's path names (its root is the folder above
|
|
386
|
+
`src/runtime/obsidian/service-main.mjs`, read without resolving links), read
|
|
387
|
+
now and never cached. With a login item that is the project's own package,
|
|
388
|
+
whatever package the command runs from, and a re-pointed link or a `file:`
|
|
389
|
+
install is read where it leads now. An entry that is not a package's service
|
|
390
|
+
entry (a test entry) is measured against this package's own release,
|
|
391
|
+
`releaseIdentity()`, the cached form a service records when it starts. Both
|
|
392
|
+
cover the package version and every file under `src/`, `contracts/` and
|
|
393
|
+
`plugins/`; a package without `plugins/` reads as one with an empty one.
|
|
394
|
+
|
|
395
|
+
Under `--startup` the service:
|
|
396
|
+
|
|
397
|
+
- writes its log into its own bounded `service.log`, as under `start`; the
|
|
398
|
+
unit's output file receives only what happens before that log is open;
|
|
399
|
+
- exits 0 on a refusal as well (another runtime of this workspace answers, no
|
|
400
|
+
consent that covers startup, an occupied port, arguments it cannot use), so
|
|
401
|
+
its manager does not start it again every minute, and records how the start
|
|
402
|
+
ended in `state/service/last-startup.json`
|
|
403
|
+
(`atelier-obsidian-last-startup/v1`: `at`, `outcome` `started` or
|
|
404
|
+
`refused`, `code`); `status` reports a refusal while the service is not
|
|
405
|
+
running. A refusal here is any error that carries a code, Node's system
|
|
406
|
+
errors included (`EACCES`, `EADDRNOTAVAIL` or `EMFILE` from listening,
|
|
407
|
+
`EPERM` where macOS privacy settings deny a folder): those, too, wait for
|
|
408
|
+
the next login or `open` instead of a restart every minute. Only an error
|
|
409
|
+
without a code exits 1 and is restarted;
|
|
410
|
+
- records the path it was started by beside its real path
|
|
411
|
+
(`executable.ext.invokedAs`), so the busy proof reads a process table that
|
|
412
|
+
names the entry through a link;
|
|
413
|
+
- after every tick, compares the release on disk, read through the path it
|
|
414
|
+
was started by, with the one it started with (`readReleaseIdentity`: the
|
|
415
|
+
package version and a digest of every file under `src/`, `contracts/` and
|
|
416
|
+
`plugins/`). The files' status is
|
|
417
|
+
compared first and the digest computed only when that differs; a package
|
|
418
|
+
that cannot be read is not a change yet. When they differ, the service
|
|
419
|
+
finishes the tick, removes its record and exits 75, which its manager
|
|
420
|
+
restarts on the new release.
|
|
421
|
+
|
|
422
|
+
`service unit --remove` lowers the consent to the service alone first, so a
|
|
423
|
+
unit a failed removal left behind could only refuse, then unloads it (launchd
|
|
424
|
+
`bootout`, systemd `disable --now`, which stop a service it runs) and deletes
|
|
425
|
+
the file and the record, and remembers `off`. It then starts the service again
|
|
426
|
+
at once as a detached child for this session, under the consent now recorded,
|
|
427
|
+
when the adapter is given or remembered; otherwise the next `open` starts it.
|
|
428
|
+
`uninstall` removes the login item and stops the proven service, remembers
|
|
429
|
+
`off`, starts nothing, and keeps the vaults, the private state, the project
|
|
430
|
+
file and Obsidian's vault list. Removing Obsidian's vault entries is not part
|
|
431
|
+
of it.
|
|
243
432
|
|
|
244
433
|
The service entry refuses to run without an explicitly selected editor
|
|
245
434
|
adapter. Public Atelier tests start only a test entry whose adapter reports
|
|
@@ -247,45 +436,72 @@ that no app runs, in temporary directories, on ephemeral loopback ports.
|
|
|
247
436
|
|
|
248
437
|
### The `obsidian` command
|
|
249
438
|
|
|
250
|
-
`atelier obsidian <operation>` is the
|
|
251
|
-
above. With `--json` it prints exactly one JSON
|
|
439
|
+
`atelier obsidian <operation>` is the command-line surface over all of the
|
|
440
|
+
above. Every input is an argument. With `--json` it prints exactly one JSON
|
|
441
|
+
document, for a refusal too.
|
|
252
442
|
Exit codes: 0 done, 1 an error nobody typed, 2 a typed refusal or a usage
|
|
253
443
|
error, 3 the operation ran and its answer is not success.
|
|
254
444
|
|
|
255
445
|
| Operation | What it does | Writes |
|
|
256
446
|
| --- | --- | --- |
|
|
257
|
-
| `status` | enablement, machine settings, proven service state, per-view freshness, whether an apply operation exists | nothing |
|
|
258
|
-
| `
|
|
259
|
-
| `
|
|
447
|
+
| `status` | enablement, machine settings, what was decided, proven service state, per-view freshness with its diagnostics (a code, the rule and the in-view note concerned, never a value; see [the Obsidian contract](obsidian-contract.md#notes-that-were-laid-out-anyway)), whether an apply operation exists | nothing |
|
|
448
|
+
| `settings` | what this machine remembers for the workspace (who may see, where vaults live, start at login, the adapter), who allowed the service, and how each answer is changed | nothing |
|
|
449
|
+
| `scope list`, `scope show ID` (also `view list`, `view show ID`) | the declared views | nothing |
|
|
450
|
+
| `view add ID (--all \| --folder PATH [--folder PATH ...] [--repo R] \| --tag T) [--expand DEPTH:MAX] [--default] [--allow-empty] [--yes]` | adds a view to the project configuration, after showing the change and how many notes the view would show; refuses a view that would show no note unless `--allow-empty` (see [Adding a view](obsidian.md#adding-a-view)) | `atelier.project.json`, and `.gitignore` when `.atelier-local/` is not ignored. Never committed |
|
|
451
|
+
| `audience show`, `audience set me\|A,B`, `audience clear` | the audiences this machine lets into a view; none by default, which publishes an empty view. `me` is only you: every audience but `sensitive`, which is added by name. The answer is remembered as the person's decision. A change invalidates every view at the next tick | private machine settings |
|
|
452
|
+
| `location show`, `location set DIR [--allow-synced-location]` | where this workspace's vaults live; each view not published yet gets `<project> (<view>)` there at its first publication, and a vault published already stays where it is | private machine settings |
|
|
260
453
|
| `mode show`, `mode set manual\|automatic` | `automatic` refuses without an installed, matching, active automatic policy | private machine settings |
|
|
261
454
|
| `policy show`, `policy install FILE`, `policy revoke` | `install` validates against the apply-policy contract and stores the policy owner-only beside the machine settings, never in a project, a repository or a note. `revoke` marks the stored policy revoked, which the engine reads before its very next dispatch, and returns the mode to manual | private machine settings |
|
|
262
|
-
| `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start
|
|
263
|
-
| `service unit --print` | the text `
|
|
264
|
-
| `
|
|
455
|
+
| `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start records who allowed it: `--consent-actor ID`, or for a person at a terminal the account's name. `service start` replaces a proven service of an earlier release (`replaced: 'outdated'`) and never one of a later release (`release: 'later'`); with a login item it starts the service through it | what the lifecycle writes |
|
|
456
|
+
| `service unit --print` | the text `service unit --install` would write now | nothing |
|
|
457
|
+
| `service unit --install` | installs the login item and starts the service through it (see above). macOS and Linux | the service settings (consent), the unit file, `login-item.json`, the `loginItem` decision |
|
|
458
|
+
| `service unit --remove` | lowers the consent to the service alone, unloads and deletes the unit, and starts the service again as a detached child for this session | the service settings, the unit file, `login-item.json`, the `loginItem` decision |
|
|
459
|
+
| `uninstall` | removes the login item, stops the proven service, and prints where the vaults, the private state, the project file and Obsidian's vault list are; each is kept, and nothing is started again | the login item's files, the `loginItem` decision |
|
|
460
|
+
| `open [--scope ID]` | starts or reconnects the owned service, asks it for a tick, reads the view back, qualifies the installed app, makes the app know the vault (through the app while it runs; in its settings while none runs), has the vault opened, and asks again for a view the app kept from publication | what the service writes; the app's vault list (see [Obsidian's vault list](obsidian-contract.md#obsidians-vault-list)) |
|
|
265
461
|
|
|
266
462
|
Reaching the installed app or the operating system is never a default.
|
|
267
463
|
`open`, `service start` and `service unit` refuse with
|
|
268
|
-
`app-adapter-not-selected` unless `--adapter=obsidian-cli` is given,
|
|
269
|
-
|
|
270
|
-
|
|
464
|
+
`app-adapter-not-selected` unless `--adapter=obsidian-cli` is given, or was
|
|
465
|
+
given once before to `open` or `service start` of this workspace, which
|
|
466
|
+
remembers it (`selectAdapter`); `service unit --install` refuses the same way.
|
|
467
|
+
The service entry keeps its own explicit rule. The modules that talk to an app
|
|
468
|
+
are loaded only after that selection. A remembered adapter is used only by the
|
|
469
|
+
real command-line entry and never under the Node test runner
|
|
470
|
+
(`remembered-adapter-under-test`). A service manager is the caller's
|
|
471
|
+
(`serviceManager`, or `seams.serviceManager`), or, for the real command-line
|
|
472
|
+
entry only, the production one. Tests pass their own seams and a guard in the
|
|
271
473
|
test file throws if anything tries to start the app, its command-line tool, an
|
|
272
|
-
operating-system opener or a service manager
|
|
474
|
+
operating-system opener or a service manager, touches the account's real
|
|
475
|
+
LaunchAgents or systemd folder, or starts the `obsidian` command's `open` or
|
|
476
|
+
`service` outside the test runner's context with an environment that leads to
|
|
477
|
+
the developer's app.
|
|
478
|
+
|
|
479
|
+
A person at a terminal is asked one thing, by `view add` only: whether to
|
|
480
|
+
write the change it shows to a file they commit. `--yes` answers beforehand,
|
|
481
|
+
and a question gets no answer after 10 minutes, which writes nothing. The
|
|
482
|
+
first start of the maintenance service records the account's name as the
|
|
483
|
+
actor that allowed it when no `--consent-actor` is given. A person is at a
|
|
484
|
+
terminal when standard input and output are both terminals and neither
|
|
485
|
+
`--json`, `--no-input`, a `CI` environment nor `ATELIER_NONINTERACTIVE=1`
|
|
486
|
+
says otherwise (`isInteractive`); under the test runner the process's own
|
|
487
|
+
terminal is never looked at. A recorded consent is never replaced by a derived
|
|
488
|
+
one.
|
|
273
489
|
|
|
274
490
|
`open` answers one typed outcome, each with a one-line explanation and a next
|
|
275
491
|
step. Only `current` is success:
|
|
276
492
|
|
|
277
493
|
| Outcome | Meaning |
|
|
278
494
|
| --- | --- |
|
|
279
|
-
| `current` | the proven service ticked after the request; the view's persisted freshness is `current`; read back independently, the trusted generation is the prepared one and every note has the bytes it was published with; the app meets the minimum version, was asked to open
|
|
495
|
+
| `current` | the proven service ticked after the request; the view's persisted freshness is `current`; read back independently, the trusted generation is the prepared one and every note has the bytes it was published with; the app meets the minimum version, knows this vault as one of its vaults, was asked to open it, answers for exactly this vault and has finished reading it |
|
|
280
496
|
| `updating` | a publication is under way, a tick outlasted the wait, or a note differs from the trusted generation and has not been looked at yet |
|
|
281
497
|
| `held-for-your-edit` | an edited note is preserved and held |
|
|
282
498
|
| `stale-readable` | a last good vault exists and reads back, but is not proven to be the present generation |
|
|
283
|
-
| `not-prepared` | no generation of this view
|
|
499
|
+
| `not-prepared` | no generation of this view can be read back: none was published yet, or its vault cannot be found or used (the reason says which) |
|
|
284
500
|
| `publisher-conflict` | another publisher or an uncoordinated editor holds the vault |
|
|
285
|
-
| `app-missing`, `app-cli-unavailable`, `app-version-unsupported` | no installation; no command-line capability; below the minimum version, or a version that cannot be read (reason `no-vault-open` when the app runs with no vault open and its command line answers nothing else) |
|
|
286
|
-
| `launch-failed` | the operating system refused, or the app never answered for this vault |
|
|
501
|
+
| `app-missing`, `app-cli-unavailable`, `app-version-unsupported` | no installation; no command-line capability, or the command line turned off in Obsidian (`cli-turned-off`); below the minimum version, or a version that cannot be read (reason `no-vault-open` when the app runs with no vault open and its command line answers nothing else) |
|
|
502
|
+
| `launch-failed` | the vault could not be added to the app's list (a typed reason names why), the operating system refused, or the app never answered for this vault |
|
|
287
503
|
| `indexing` | the app answers for this vault and has not finished reading it |
|
|
288
|
-
| `service-unavailable` | the service could not be started or is not provably ours (`occupied`, no consent yet, a start that never proved ownership) |
|
|
504
|
+
| `service-unavailable` | the service could not be started or is not provably ours (`occupied`, no consent yet, a start that never proved ownership), or it runs a later release than this command (`service-other-release`) |
|
|
289
505
|
| `busy` | the service is ours and in a long tick |
|
|
290
506
|
| `disabled` | the integration is off or not declared |
|
|
291
507
|
|