@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
|
@@ -35,6 +35,11 @@ Portable shapes refuse absolute paths. `atelier-project-config.v1` is
|
|
|
35
35
|
unchanged: extension settings are validated by their own schema, and an
|
|
36
36
|
unknown extension key refuses in the adapter, not in the project validator.
|
|
37
37
|
|
|
38
|
+
The `ext-settings` key `ext["mnstry.atelier.personal-workspace"]` is reserved.
|
|
39
|
+
Only a personal-workspace binding sets it, in memory, to name its generation.
|
|
40
|
+
A project whose settings declare it without a binding is refused at every
|
|
41
|
+
build with `personal-binding-lost`.
|
|
42
|
+
|
|
38
43
|
## Selection
|
|
39
44
|
|
|
40
45
|
`selectScope({ canonicalSnapshot, profile, selector, expansion })` is the only
|
|
@@ -47,6 +52,31 @@ proceeds in canonical-identity order and reports truncation. Relation types are
|
|
|
47
52
|
`contradicts`, `belongs_to` and the derived `links_to`. Literal oracles and
|
|
48
53
|
refusals live in `fixtures/obsidian/contracts/oracles/scope-cases.json`.
|
|
49
54
|
|
|
55
|
+
### Which notes are eligible
|
|
56
|
+
|
|
57
|
+
The eligibility a view is built with is decided by the machine settings of
|
|
58
|
+
the workspace (`eligibilityFor` in `src/runtime/obsidian/pipeline.mjs`), and
|
|
59
|
+
the engine, source apply, the proposal adapter and the selection operation
|
|
60
|
+
all ask it, so they agree on what a view holds. By default
|
|
61
|
+
(`DEFAULT_ELIGIBILITY`, revision
|
|
62
|
+
`classified-documents/v2+assets-embedded-by-eligible-documents/v1`) a node is
|
|
63
|
+
eligible only when the census classified it. When the audience decision is
|
|
64
|
+
`only-you` with `unclassified: shown`, and only then, an unclassified note is
|
|
65
|
+
eligible too, provided its bytes pass the byte lens the emitter reads notes
|
|
66
|
+
with, and it has no front matter or front matter whose every top-level line
|
|
67
|
+
starts at column 0 with a plain `key:` (an ASCII letter or `_`, then ASCII
|
|
68
|
+
letters, digits, `_` and `-`), none of them `kg`, with indented lines only as
|
|
69
|
+
the values of such keys, and in which the graph's own reading finds no `kg`
|
|
70
|
+
key either. A quoted key, a flow or JSON mapping, a complex key, a top-level
|
|
71
|
+
list, an indented root mapping or front matter the graph could not read keeps
|
|
72
|
+
it withheld, since it may carry a `kg.audience` such as `sensitive`
|
|
73
|
+
(`onlyYouEligibility`, revision
|
|
74
|
+
`classified-documents/v2+unclassified-notes-read-as-notes-for-only-you/v4+assets-embedded-by-eligible-documents/v1`).
|
|
75
|
+
An unclassified note carries the `private` audience, which "only you" admits.
|
|
76
|
+
An admitted note is an ordinary member of the view for the redaction guard:
|
|
77
|
+
its identity may appear in generated bytes of that view, and stays forbidden
|
|
78
|
+
in every view it is not part of. Assets follow the documents that embed them.
|
|
79
|
+
|
|
50
80
|
### What redaction covers
|
|
51
81
|
|
|
52
82
|
The guarantee: Atelier never generates a reference to a note outside the
|
|
@@ -740,6 +770,77 @@ Before 0.2.0-alpha.10 no production reading was ever absent, because the probe
|
|
|
740
770
|
found Atelier's own service; from that release this path, and this window, are
|
|
741
771
|
live.
|
|
742
772
|
|
|
773
|
+
### First publication into a vault no Obsidian lists
|
|
774
|
+
|
|
775
|
+
A running or unknowable app that cannot be coordinated with still refuses the
|
|
776
|
+
whole publication, with one exception, the `direct-unheld` path. It is chosen
|
|
777
|
+
at path selection only when all of these hold:
|
|
778
|
+
|
|
779
|
+
1. The view has no committed generation.
|
|
780
|
+
2. Its vault is the folder allocated for it (`vaultOrigin: 'allocated'`), and
|
|
781
|
+
that folder's device and inode are the ones its record names.
|
|
782
|
+
3. The app's own settings file (`obsidian.json`) was read, and none of its
|
|
783
|
+
entries is the vault folder, a folder above it or a folder inside it. Both
|
|
784
|
+
sides are compared as written and by their real paths, in any letter case.
|
|
785
|
+
A file that cannot be read is read again, up to three times 50 ms apart,
|
|
786
|
+
because the app rewrites it with a plain write. A missing or unreadable
|
|
787
|
+
file, an entry whose folder is not an absolute path, an entry with a `..`
|
|
788
|
+
segment (the folder it names through a link cannot be placed by its text),
|
|
789
|
+
or a Flatpak or snap build of the app anywhere on the account (its list is
|
|
790
|
+
elsewhere) gives no evidence.
|
|
791
|
+
4. The platform is macOS or Linux.
|
|
792
|
+
|
|
793
|
+
Any other case gives the refusal it gave before. The maintenance service reads
|
|
794
|
+
the evidence from the file and never asks the app.
|
|
795
|
+
|
|
796
|
+
On this path the publisher writes only creates: a file appears through the
|
|
797
|
+
exclusive link where nothing is, or not at all. A unit that would replace or
|
|
798
|
+
remove a file, or write a settings file over one that is there, refuses as
|
|
799
|
+
`editor-uncoordinated` (blocking) and writes nothing. A settings file that
|
|
800
|
+
already holds exactly what the policy asks is left as it is, which is what an
|
|
801
|
+
interrupted run of this path leaves. A file already at a note path is kept as
|
|
802
|
+
`create-conflict`. The evidence is read again immediately before the first
|
|
803
|
+
unit and whenever two seconds have passed. Once a reading gives none, every
|
|
804
|
+
remaining unit refuses, a kept one included, and nothing is committed. The
|
|
805
|
+
view lock and the vault lock are taken as on every path, and the journal
|
|
806
|
+
records `mode: 'direct-unheld'`. Restart recovery and the late-writer check
|
|
807
|
+
treat it as a `direct` journal.
|
|
808
|
+
|
|
809
|
+
Why this loses nothing a person wrote, whoever holds the vault: no editor can
|
|
810
|
+
hold an unsaved buffer of a file that does not exist; the link either makes
|
|
811
|
+
the whole file appear or fails because something is there, which is kept; and
|
|
812
|
+
an editor that later saves over a created file wins, and is read as an edit.
|
|
813
|
+
The list evidence is for the experience, and it holds only for a run that
|
|
814
|
+
completes: that run is committed before `open` first tells the app about the
|
|
815
|
+
vault. A run that stops partway commits nothing. That happens when the list
|
|
816
|
+
names the folder meanwhile, a settings file with other bytes is already there,
|
|
817
|
+
or an interrupted run left a replacement or a removal. The view then reports
|
|
818
|
+
`editor-uncoordinated` and falls back to the coordinated path: `open` may add
|
|
819
|
+
the vault to the app and open it before it is complete, and what is left,
|
|
820
|
+
every replacement and removal included, is published through the app with its
|
|
821
|
+
usual base and buffer checks. The person may see an incomplete vault then;
|
|
822
|
+
nothing they write is at risk. Lists this account's app does not keep are
|
|
823
|
+
covered by the argument above alone: another user-data folder, another
|
|
824
|
+
machine through a synced folder.
|
|
825
|
+
|
|
826
|
+
A maintenance service whose app does not qualify (its command line off, no
|
|
827
|
+
vault open, a version below the floor) no longer keeps such a view from its
|
|
828
|
+
first publication: the publisher is reached with an adapter that coordinates
|
|
829
|
+
with nothing, and takes this path when every condition holds. When the path
|
|
830
|
+
does not apply, or the run stops partway at a unit refused as
|
|
831
|
+
`editor-uncoordinated`, the view reports the app's refusal, as before. `open`
|
|
832
|
+
then answers that refusal without adding the vault to the app, unless the
|
|
833
|
+
person asks it to restart Obsidian (`--restart-obsidian`): the vault is then
|
|
834
|
+
added and opened, and may be incomplete until the app has published the rest.
|
|
835
|
+
One case opens a vault without that flag: with the app running and no vault
|
|
836
|
+
open, a vault the app already lists is opened by its path, as before this
|
|
837
|
+
path existed, and may be incomplete. A run that stops only on a file in its
|
|
838
|
+
way reports that (`create-conflict`). When it stops for more than one reason,
|
|
839
|
+
one is reported: while the app does not qualify, the app's refusal wins over a
|
|
840
|
+
file in the way, and while it qualifies, the first blocking unit's reason is
|
|
841
|
+
reported. A reason not reported comes back at a later run, and nothing is
|
|
842
|
+
written meanwhile.
|
|
843
|
+
|
|
743
844
|
### Proven boundary
|
|
744
845
|
|
|
745
846
|
macOS (Darwin 25, arm64) with Obsidian 1.13.7 (installer 1.12.7), CLI enabled,
|
|
@@ -793,9 +894,13 @@ each open item is discharged with its own evidence.
|
|
|
793
894
|
Obsidian opens a vault from a link only when the folder is in its own vault
|
|
794
895
|
list. `atelier obsidian open` puts the view's vault there.
|
|
795
896
|
Outside its own storage (the data root, which holds the vaults and their
|
|
796
|
-
policy-owned `.obsidian/core-plugins.json`), the
|
|
797
|
-
another application that Atelier writes
|
|
798
|
-
|
|
897
|
+
policy-owned `.obsidian/core-plugins.json`), the settings file that holds the
|
|
898
|
+
list is the only file of another application that Atelier writes, and in it
|
|
899
|
+
only two things: the view's vault entry and the command-line switch `cli`. To
|
|
900
|
+
write it, Atelier writes nothing else outside the app's user-data directory,
|
|
901
|
+
and no vault note. Every write is shown in `open`'s answer
|
|
902
|
+
(`obsidianSettings`: the file, whether it was created, whether the vault was
|
|
903
|
+
added, whether the switch was turned on, and the backup).
|
|
799
904
|
|
|
800
905
|
**The file.** `obsidian.json` in the app's user-data directory:
|
|
801
906
|
`$HOME/Library/Application Support/obsidian/` on macOS and
|
|
@@ -833,7 +938,14 @@ root under another name is not recognised.
|
|
|
833
938
|
**While Obsidian runs with no vault open**, its command line answers nothing
|
|
834
939
|
and the file is still the running app's: it is read, never written. A vault
|
|
835
940
|
it already lists is opened by path; one it does not is refused as
|
|
836
|
-
`no-vault-open
|
|
941
|
+
`no-vault-open`, unless the person asked for a restart (below).
|
|
942
|
+
|
|
943
|
+
**While Obsidian runs with its command line off**, it answers every command
|
|
944
|
+
but a link with "Command line interface is not enabled", read as
|
|
945
|
+
`app-cli-unavailable` / `cli-turned-off`. The file is the running app's, which
|
|
946
|
+
holds the switch in memory and writes it back with its list, so it is not
|
|
947
|
+
written; the switch is turned on only while no Obsidian runs, or through the
|
|
948
|
+
restart below.
|
|
837
949
|
|
|
838
950
|
**Never inside another vault.** In every state, a vault inside a folder the
|
|
839
951
|
list has as a vault already (compared as written, against the vault root and
|
|
@@ -879,19 +991,21 @@ then:
|
|
|
879
991
|
a JSON object whose `vaults`, when present, is an object, of at most 4 MiB.
|
|
880
992
|
A file with a second name (a hard link) is refused as
|
|
881
993
|
`obsidian-settings-unsafe`: the replacement would leave that name with the
|
|
882
|
-
old list. A missing
|
|
883
|
-
|
|
884
|
-
refused (`obsidian-settings-missing`): the file is never created. The other
|
|
994
|
+
old list. A missing file means Obsidian never started on this account; it
|
|
995
|
+
is created as described under "Obsidian never started" below. The other
|
|
885
996
|
refusals are `obsidian-settings-unsafe`, `obsidian-settings-not-owned`,
|
|
886
997
|
`obsidian-settings-unreadable` and `obsidian-settings-not-object`.
|
|
887
|
-
3. A vault whose real path an entry already has is left as it is
|
|
888
|
-
written. A vault inside a folder an
|
|
889
|
-
(`vault-inside-another-vault`).
|
|
998
|
+
3. A vault whose real path an entry already has is left as it is. When `cli`
|
|
999
|
+
is already `true` too, nothing is written. A vault inside a folder an
|
|
1000
|
+
entry has is refused (`vault-inside-another-vault`).
|
|
890
1001
|
4. The new document is the file's object with one entry added under a fresh
|
|
891
1002
|
random 16-hex id that no entry has: `{ path: <the vault root's real path>,
|
|
892
|
-
ts: <now, ms>, open: true }
|
|
893
|
-
|
|
894
|
-
|
|
1003
|
+
ts: <now, ms>, open: true }`, unless the vault is listed already, and with
|
|
1004
|
+
`cli` set to `true` when it is not (the command-line switch: in its place
|
|
1005
|
+
when the file has the key, otherwise last, as the app adds it). Every
|
|
1006
|
+
other key and every other entry is kept in its place, as values. A
|
|
1007
|
+
document that would be larger than 4 MiB is refused
|
|
1008
|
+
(`obsidian-settings-too-large`).
|
|
895
1009
|
5. A temporary file in the same directory is written with the file's mode and
|
|
896
1010
|
fsynced; the bytes as they were are written, fsynced, to
|
|
897
1011
|
`obsidian.json.atelier-backup-<UTC time>` beside it.
|
|
@@ -912,6 +1026,91 @@ then:
|
|
|
912
1026
|
|
|
913
1027
|
Every refusal writes nothing and leaves nothing behind: a temporary file or
|
|
914
1028
|
backup created on the way is removed again whichever later step fails.
|
|
1029
|
+
|
|
1030
|
+
**Obsidian never started.** When the file does not exist and the process
|
|
1031
|
+
table says, positively, `absent` (read before, and again immediately before
|
|
1032
|
+
the file appears), the file is created, and only then:
|
|
1033
|
+
|
|
1034
|
+
1. The user-data directory must be this user's own real directory. When it
|
|
1035
|
+
does not exist, it is created with mode 0700, only inside an existing
|
|
1036
|
+
parent directory that is this user's own and no link; a missing parent is
|
|
1037
|
+
`obsidian-settings-missing`, and nothing is created above the directory.
|
|
1038
|
+
2. The content is exactly `{ "vaults": { "<16 hex>": { "path": <the vault
|
|
1039
|
+
root's real path>, "ts": <now, ms>, "open": true } }, "cli": true }`, mode
|
|
1040
|
+
0600. The app reads the file at start-up (a missing or unreadable one reads
|
|
1041
|
+
as no settings) and opens every vault flagged open, so a plain start opens
|
|
1042
|
+
this one, with its command line on.
|
|
1043
|
+
3. The bytes are written and fsynced to a temporary file in the directory,
|
|
1044
|
+
which is then hard-linked to `obsidian.json` and removed: the file appears
|
|
1045
|
+
complete or not at all, and the link fails on any file there, one the app
|
|
1046
|
+
wrote meanwhile included, which is kept (`obsidian-settings-changed`). The
|
|
1047
|
+
directory is fsynced. There is nothing to back up.
|
|
1048
|
+
4. An app that appears before the link refuses (`app-may-be-running`); one
|
|
1049
|
+
that appears right after it leaves the addition unconfirmed, as in step 7
|
|
1050
|
+
above. A refusal removes the temporary file and a directory created on the
|
|
1051
|
+
way.
|
|
1052
|
+
|
|
1053
|
+
`open` answers `registration.how: 'created-settings'` for it.
|
|
1054
|
+
|
|
1055
|
+
**Restart, only when the person asks** (`open --restart-obsidian`; never
|
|
1056
|
+
implied, and refused by every other operation). Only in the two states above
|
|
1057
|
+
where the app runs and cannot be reached: its command line off, or no vault
|
|
1058
|
+
open and the view's vault not in its list. Module:
|
|
1059
|
+
`src/runtime/obsidian/app-restart.mjs`.
|
|
1060
|
+
|
|
1061
|
+
0. Read-only, before anything is sent (`settingsWriteOutlook`): the view's
|
|
1062
|
+
vault folder exists, the settings file reads as in step 2 above (no
|
|
1063
|
+
Flatpak or snap build), has one name, would stay within 4 MiB with the
|
|
1064
|
+
entry, and lists no vault at a folder above the vault's. A file that does
|
|
1065
|
+
not exist (the app has shown only its starter window, which writes none)
|
|
1066
|
+
is the create case, checked as "Obsidian never started" checks before it
|
|
1067
|
+
writes (step 1 there); it is created after the quit. Otherwise `open`
|
|
1068
|
+
answers that refusal and the app keeps running. Once the main process is
|
|
1069
|
+
proven (step 2 below), right before the first signal, a copy of an existing
|
|
1070
|
+
file is kept beside it under the backup name (`backupObsidianSettings`,
|
|
1071
|
+
fsynced, the file's mode; `restart.settingsCopy`); a copy that cannot be
|
|
1072
|
+
kept sends nothing. The write in the same run does not prune that copy
|
|
1073
|
+
(`keepBackups`); a later write prunes it as step 7 says.
|
|
1074
|
+
1. The app's main process is proven from the process table
|
|
1075
|
+
(`ps -ww -A -o pid=,ppid=,uid=,comm=`; a uid is signed, since macOS shows
|
|
1076
|
+
`nobody` as -2): every Obsidian process (the names the process probe
|
|
1077
|
+
counts) runs as this user, exactly one names the app bundle's main
|
|
1078
|
+
executable by an absolute path (`…/Contents/MacOS/Obsidian`), and every
|
|
1079
|
+
other one is its child. `comm` is the process's argv[0], not a verified
|
|
1080
|
+
image: a process of the same user could take that name, which proves
|
|
1081
|
+
nothing while the real app runs too (two main processes). Otherwise nothing
|
|
1082
|
+
is sent (`app-main-process-unproven`, with `restart.detail`).
|
|
1083
|
+
2. That process is read again (`ps -o ppid=,uid=,lstart=,comm=`): it must be
|
|
1084
|
+
this user's, under the parent the table showed, with the same name, and
|
|
1085
|
+
read the same twice in a row; then it, and only it, gets SIGTERM, which
|
|
1086
|
+
Electron handles as a quit. The app closes every window, keeping the
|
|
1087
|
+
vaults that were open flagged open, and its helpers end (1.13.7, checked on
|
|
1088
|
+
an isolated instance).
|
|
1089
|
+
3. The process probe must say `absent` within 30 seconds. On macOS the main
|
|
1090
|
+
process can stay after the first SIGTERM, with no window (seen on
|
|
1091
|
+
an isolated 1.13.7, with vaults open and with only the starter window).
|
|
1092
|
+
Electron handles only the first SIGTERM as a quit; a second one ends the
|
|
1093
|
+
process at once, without its quit handlers. It is sent once, only when the
|
|
1094
|
+
table shows that same process alone (no helper) and it reads the same, at
|
|
1095
|
+
two readings at least 5 seconds apart. There is never a third signal, and
|
|
1096
|
+
never another kind; `restart.signals` counts the signals delivered.
|
|
1097
|
+
Otherwise `open` answers `launch-failed` / `app-did-not-quit`, writes
|
|
1098
|
+
nothing and starts nothing.
|
|
1099
|
+
4. The file is written as above, with the vault and the switch.
|
|
1100
|
+
5. The app is started plainly (`open -b md.obsidian`) by the launch steps
|
|
1101
|
+
below, and reopens its vaults and this one. An answer given after the quit
|
|
1102
|
+
and before the launch (the file could not take the vault, say) starts the
|
|
1103
|
+
app plainly first, as it was; a start that fails is said, with the next
|
|
1104
|
+
step to start it by hand.
|
|
1105
|
+
|
|
1106
|
+
The answer carries `restart: { asked, state, quit, signalled, pid, signals,
|
|
1107
|
+
settingsCopy, startedAgain }`, and `reason` and `detail` when it did not quit.
|
|
1108
|
+
An `open` interrupted between the quit and the start leaves the app quit (a
|
|
1109
|
+
known limit). At a terminal the restart still needs the flag; the question the
|
|
1110
|
+
design asks in that state comes with the first-run command. Qualified on macOS only; elsewhere the answer is
|
|
1111
|
+
`restart-platform-unqualified`, since a quit app there is started with a
|
|
1112
|
+
link, which would drop the other vaults' reopen flags.
|
|
1113
|
+
|
|
915
1114
|
`open` then shows the vault by the steps of `launchPlan`
|
|
916
1115
|
(`src/runtime/obsidian/launch-plan.mjs`, carried out by `runLaunchPlan`),
|
|
917
1116
|
naming it `obsidian://open?vault=<id>` when the id reaches it first (a path is
|
|
@@ -925,7 +1124,13 @@ plainly (`open -b md.obsidian`), which reopens every vault the list flags open
|
|
|
925
1124
|
tool once the app itself answers the tool (`appAnswered`: a version or one of
|
|
926
1125
|
the app's own lines; the tool's "unable to find Obsidian" while the app starts
|
|
927
1126
|
does not count). A link is never handed to the operating system for an app
|
|
928
|
-
this launch started, since that would reach it while it starts.
|
|
1127
|
+
this launch started, since that would reach it while it starts. A link the
|
|
1128
|
+
started app did not take is left to it when the list flags the vault open,
|
|
1129
|
+
since the plain start reopens it; for a listed vault that is closed, which a
|
|
1130
|
+
plain start does not reopen, the link is handed once more, through the tool
|
|
1131
|
+
only (this launch started the app), one wait round later, before `open`
|
|
1132
|
+
answers `launch-failed` /
|
|
1133
|
+
`app-did-not-answer-for-this-vault`. An app started with a link would delete the
|
|
929
1134
|
reopen flag of every other vault without a window (1.13.7, checked on an
|
|
930
1135
|
isolated instance). On Linux a quit app is started with the link, a known
|
|
931
1136
|
limit. With its command line turned off the app answers every other command
|
|
@@ -1095,6 +1300,7 @@ today) it refuses `exchange-unavailable`. Both write nothing.
|
|
|
1095
1300
|
| `interrupted-before-exchange`, `apply-interrupted-needs-person` | what restart recovery decided for an interrupted apply |
|
|
1096
1301
|
| `recovery-state-unreadable` | a candidate, backup or source path of an interrupted apply may not be looked at or read; nothing is settled from a read this process was denied, that record is reported with its intent still open, and every other one is still settled |
|
|
1097
1302
|
| `apply-outcome-unknown` | the source was exchanged and the settlement from digests could not be carried out; the source may have been changed, the intent stays open and `apply recover` decides |
|
|
1303
|
+
| `personal-overlay-proposals-only` | the note is a private note of a personal workspace, whose file belongs to a module-owned generation; nothing is written there. The proposal adapter's observation answers the same edit with `personal-overlay-not-proposed`, and records nothing |
|
|
1098
1304
|
|
|
1099
1305
|
A path that another program removes or replaces between two steps, before the
|
|
1100
1306
|
intent is recorded, answers one of these refusals (`source-missing`,
|
|
@@ -1317,7 +1523,9 @@ line, 16 MiB, 10,000 events, and an unreadable line refuses every append.
|
|
|
1317
1523
|
| `ledger-corrupt` | refused, for that repository only; other repositories progress in the same tick |
|
|
1318
1524
|
| `store-unavailable` | the store cannot be read or is locked now; waits like a full one |
|
|
1319
1525
|
|
|
1320
|
-
|
|
1526
|
+
For a personal workspace whose graph the engine has not confirmed yet, a due
|
|
1527
|
+
operation is left as it is (`personal-validation-pending`), and that tick is not
|
|
1528
|
+
counted as an attempt. A waiting operation is tried at most 8 times, 60 seconds after the first attempt
|
|
1321
1529
|
and twice as long after each, up to an hour. At most 8 operations per repository
|
|
1322
1530
|
and 64 unexamined edits are looked at per tick. A repository holds at most 4096
|
|
1323
1531
|
operations, 256 of them open, 64 records of 16 KiB each; a full queue refuses
|
package/docs/obsidian-plugin.md
CHANGED
|
@@ -104,18 +104,48 @@ at the maintenance service's next tick, with nothing changed at the view's
|
|
|
104
104
|
sources: the service compares the plugin files each committed generation pins
|
|
105
105
|
with the disk, has a view whose files differ prepared again, and a generation
|
|
106
106
|
that is already committed is published again, as it is, with its notes kept.
|
|
107
|
-
A drift left for the person is asked about once, and again once it changes
|
|
107
|
+
A drift left for the person is asked about once, and again once it changes.
|
|
108
|
+
What a publication could not change is not asked about again: a drift that
|
|
109
|
+
publishing cannot repair (the data file of a vault root that is a link, say)
|
|
110
|
+
is asked about at most once more after a publication that left it, which
|
|
111
|
+
writes no vault file (the view is prepared again and takes the vault's lock,
|
|
112
|
+
and for that tick shows as `stale`, then `updating`, before it is `current`
|
|
113
|
+
again), and not again after that. A plugin file
|
|
114
|
+
another writer removes or changes after the publication, even while the same
|
|
115
|
+
tick goes on, unless it holds again what it held before the tick under the
|
|
116
|
+
same pin and vault root, and a path
|
|
117
|
+
the person repairs before the tick ends (the vault root made private,
|
|
118
|
+
say), is asked about at the next look and written;
|
|
108
119
|
where the plugin is turned off in the vault, a pinned file that is gone is no
|
|
109
120
|
drift. Publishing a committed generation again needs the app when one runs;
|
|
110
121
|
if that app does not qualify, nothing is written, the view stays `current`
|
|
111
122
|
(a committed generation needs no app, so an app that cannot be qualified
|
|
112
123
|
never makes a current view stale), and the file is written at a later
|
|
113
124
|
attempt, on the retry schedule of an unsettled view, once the app
|
|
114
|
-
qualifies.
|
|
125
|
+
qualifies. A drift that publishing would only leave for the person again
|
|
126
|
+
(the data file of a vault root that is a link or not private, a folder where
|
|
127
|
+
a file goes) is no reason to publish again and needs no app: the path is
|
|
128
|
+
left as it is, and the view keeps its plain reason. Nothing in `status` or
|
|
129
|
+
`open` names such a path yet; without its data file the plugin cannot reach
|
|
130
|
+
the service, so it shows as not present (`no-live-lease`). A few paths the
|
|
131
|
+
publisher leaves for the person still count as a drift here, and wait for the
|
|
132
|
+
app as one: a file nobody may read, a parent folder that cannot be looked
|
|
133
|
+
into, and a vault root Atelier keeps whose mode cannot be changed. Until the app qualifies, a
|
|
134
|
+
view waiting for it has the reason
|
|
135
|
+
`verified-by-read-back-plugin-waits-for-app` rather than
|
|
136
|
+
`verified-by-read-back`, and `status` and `open` add `plugin files wait for
|
|
137
|
+
the app` to the plugin line (`files: "waits-for-app"` in `--json`), with a
|
|
138
|
+
next step for the plugin. (The settings files are held to the same rule for a file nobody
|
|
115
139
|
may read.) A plugin file that another program changes while a publication runs
|
|
116
140
|
is a race and is handled like one on a note: that publication does not
|
|
117
141
|
commit, the view is tried again, and the file is planned from the disk anew
|
|
118
142
|
(`plugin-file-changed`); nothing reads a plugin file as an edit of a note.
|
|
143
|
+
The view is then `publisher-conflict`, and its next step in `status` and
|
|
144
|
+
`open` names that file as what stopped the publication (changed by another
|
|
145
|
+
program or by the person; one change is enough), rather than asking the
|
|
146
|
+
person to close another publisher; the same holds for a settings file
|
|
147
|
+
(`settings-changed`). The reason is the first unit that stopped the
|
|
148
|
+
publication, so other causes are not ruled out.
|
|
119
149
|
Upgrades replace the plugin files the same way. The plugin's version in
|
|
120
150
|
`manifest.json` changes whenever its code does, and the test suite holds the
|
|
121
151
|
two together: the app keeps running the `main.js` it loaded until it reloads
|
|
@@ -423,10 +453,14 @@ answer decides wherever it gives one:
|
|
|
423
453
|
and opens by path the vault the app lists. Where the settings file does
|
|
424
454
|
not show it (a sandboxed build, say), or where it lists it and, once the
|
|
425
455
|
vault is opened, the command line still does not answer for it while only
|
|
426
|
-
the plugin reports the version, `open` answers
|
|
456
|
+
the plugin reports the version, `open` answers
|
|
427
457
|
`app-cli-unavailable` / `vault-open-cli-silent`: the plugin shows the vault
|
|
428
458
|
open, so the command line is what did not answer, and waiting for the app
|
|
429
|
-
would change nothing.
|
|
459
|
+
would change nothing. After a launch that answer is given at the second
|
|
460
|
+
such round in a row, not the first: one tool call that timed out while the
|
|
461
|
+
app was busy opening its window looks the same once, and `open` then goes
|
|
462
|
+
on waiting for the vault. A wait that ends right after one such round gives
|
|
463
|
+
the same answer.
|
|
430
464
|
- Whether an app runs is the process table's answer, which says no only when
|
|
431
465
|
it finds no Obsidian process at all. A lease outlives its app by up to the
|
|
432
466
|
lease time (six seconds after a crash), and any process that holds the
|