@mnstry/atelier 0.2.0-alpha.12 → 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 +661 -0
- package/README.md +142 -6
- 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-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/docs/architecture.md +89 -0
- package/docs/assurance-controls.md +2 -2
- 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 +181 -16
- package/docs/obsidian-contract.md +223 -15
- package/docs/obsidian-plugin.md +38 -4
- package/docs/obsidian.md +613 -51
- 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 +49 -0
- 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 +47 -2
- 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/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 +59 -5
- 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 +754 -63
- 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 +30 -0
- package/src/coordination/index.mjs +110 -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/projection/obsidian/edits/apply.mjs +55 -16
- package/src/projection/obsidian/personal-workspace.mjs +436 -0
- package/src/projection/obsidian/proposals/adapter.mjs +47 -8
- package/src/projection/obsidian/proposals/observation.mjs +10 -2
- package/src/projection/obsidian/publication/publisher.mjs +142 -13
- package/src/projection/obsidian/publication/vault-list.mjs +4 -3
- package/src/projection/obsidian/recovery/index.mjs +4 -1
- package/src/projection/obsidian/recovery/store.mjs +160 -7
- package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
- package/src/readiness/readiness.mjs +10 -3
- package/src/reflection/index.mjs +56 -0
- package/src/runtime/obsidian/app-production-seams.mjs +48 -16
- package/src/runtime/obsidian/app-registration.mjs +175 -28
- package/src/runtime/obsidian/app-restart.mjs +154 -0
- package/src/runtime/obsidian/engine.mjs +163 -20
- package/src/runtime/obsidian/extension-points.mjs +1 -1
- package/src/runtime/obsidian/index.mjs +10 -7
- package/src/runtime/obsidian/launch-plan.mjs +7 -4
- package/src/runtime/obsidian/lifecycle.mjs +92 -12
- package/src/runtime/obsidian/login-item.mjs +332 -0
- package/src/runtime/obsidian/machine-settings.mjs +119 -12
- package/src/runtime/obsidian/opening.mjs +171 -37
- package/src/runtime/obsidian/pipeline.mjs +71 -3
- package/src/runtime/obsidian/plugin-channel.mjs +11 -3
- package/src/runtime/obsidian/plugin-choice.mjs +16 -4
- package/src/runtime/obsidian/plugin-drift.mjs +59 -11
- package/src/runtime/obsidian/plugin-presence.mjs +14 -1
- 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 +99 -16
- 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 +87 -23
- package/src/runtime/obsidian/service.mjs +36 -3
- package/src/runtime/obsidian/startup-adapters.mjs +59 -21
- 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 +169 -2
- package/src/server/server.mjs +28 -2
- 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 +1 -0
- 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
|
@@ -282,15 +282,153 @@ proceeds.
|
|
|
282
282
|
accepts a connection and does not answer in time proves nothing.
|
|
283
283
|
`inspectPrivateGenerationLock` reports the holder without changing anything.
|
|
284
284
|
|
|
285
|
-
### Operating-system startup
|
|
285
|
+
### Operating-system startup: the login item
|
|
286
286
|
|
|
287
287
|
`buildStartupAdapter` returns the text of a launchd user agent (macOS) or a
|
|
288
288
|
systemd user unit (Linux) from the values it is given. It writes no file,
|
|
289
289
|
installs nothing, runs no service manager and looks nothing up on the machine.
|
|
290
290
|
Windows startup has not been qualified and refuses with
|
|
291
|
-
`startup-platform-unqualified`.
|
|
292
|
-
|
|
293
|
-
|
|
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.
|
|
294
432
|
|
|
295
433
|
The service entry refuses to run without an explicitly selected editor
|
|
296
434
|
adapter. Public Atelier tests start only a test entry whose adapter reports
|
|
@@ -298,29 +436,56 @@ that no app runs, in temporary directories, on ephemeral loopback ports.
|
|
|
298
436
|
|
|
299
437
|
### The `obsidian` command
|
|
300
438
|
|
|
301
|
-
`atelier obsidian <operation>` is the
|
|
302
|
-
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.
|
|
303
442
|
Exit codes: 0 done, 1 an error nobody typed, 2 a typed refusal or a usage
|
|
304
443
|
error, 3 the operation ran and its answer is not success.
|
|
305
444
|
|
|
306
445
|
| Operation | What it does | Writes |
|
|
307
446
|
| --- | --- | --- |
|
|
308
|
-
| `status` | enablement, machine settings, 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 |
|
|
309
|
-
| `
|
|
310
|
-
| `
|
|
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 |
|
|
311
453
|
| `mode show`, `mode set manual\|automatic` | `automatic` refuses without an installed, matching, active automatic policy | private machine settings |
|
|
312
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 |
|
|
313
|
-
| `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start
|
|
314
|
-
| `service unit --print` | the text `
|
|
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 |
|
|
315
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)) |
|
|
316
461
|
|
|
317
462
|
Reaching the installed app or the operating system is never a default.
|
|
318
463
|
`open`, `service start` and `service unit` refuse with
|
|
319
|
-
`app-adapter-not-selected` unless `--adapter=obsidian-cli` is given,
|
|
320
|
-
|
|
321
|
-
|
|
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
|
|
322
473
|
test file throws if anything tries to start the app, its command-line tool, an
|
|
323
|
-
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.
|
|
324
489
|
|
|
325
490
|
`open` answers one typed outcome, each with a one-line explanation and a next
|
|
326
491
|
step. Only `current` is success:
|
|
@@ -331,7 +496,7 @@ step. Only `current` is success:
|
|
|
331
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 |
|
|
332
497
|
| `held-for-your-edit` | an edited note is preserved and held |
|
|
333
498
|
| `stale-readable` | a last good vault exists and reads back, but is not proven to be the present generation |
|
|
334
|
-
| `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) |
|
|
335
500
|
| `publisher-conflict` | another publisher or an uncoordinated editor holds the vault |
|
|
336
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) |
|
|
337
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 |
|