visionlog-md 0.2.0__tar.gz

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.
Files changed (169) hide show
  1. visionlog_md-0.2.0/.forge/manifest.yaml +42 -0
  2. visionlog_md-0.2.0/.github/workflows/ci.yml +62 -0
  3. visionlog_md-0.2.0/.github/workflows/publish.yml +29 -0
  4. visionlog_md-0.2.0/.gitignore +38 -0
  5. visionlog_md-0.2.0/.pre-commit-config.yaml +25 -0
  6. visionlog_md-0.2.0/.visionlog/adr/ADR-001-the-trilogy-must-remain-composable-and-non-prescri.md +29 -0
  7. visionlog_md-0.2.0/.visionlog/config.yaml +3 -0
  8. visionlog_md-0.2.0/.visionlog/guardrails/GUARD-001-no-new-cross-cutting-abstractions-without-clearing.md +28 -0
  9. visionlog_md-0.2.0/.visionlog/sops/SOP-001-goal-decomposition.md +36 -0
  10. visionlog_md-0.2.0/.visionlog/sops/SOP-002-completion-feedback.md +32 -0
  11. visionlog_md-0.2.0/.visionlog/sops/SOP-003-blocked-task-escalation.md +37 -0
  12. visionlog_md-0.2.0/.visionlog/vision.md +41 -0
  13. visionlog_md-0.2.0/CHANGELOG.md +13 -0
  14. visionlog_md-0.2.0/CONTRIBUTING.md +50 -0
  15. visionlog_md-0.2.0/LICENSE +21 -0
  16. visionlog_md-0.2.0/PKG-INFO +146 -0
  17. visionlog_md-0.2.0/README.md +123 -0
  18. visionlog_md-0.2.0/SECURITY.md +24 -0
  19. visionlog_md-0.2.0/backlog/config.yml +6 -0
  20. visionlog_md-0.2.0/backlog/tasks/task-1 - visionlog-scan-surface-backlog-from-docs.md +50 -0
  21. visionlog_md-0.2.0/backlog/tasks/task-2 - documents-layer-register-project-knowledge.md +60 -0
  22. visionlog_md-0.2.0/backlog/tasks/task-3 - backlog-gap-tool-goals-without-tasks.md +54 -0
  23. visionlog_md-0.2.0/biome.json +19 -0
  24. visionlog_md-0.2.0/bun.lock +255 -0
  25. visionlog_md-0.2.0/defaults.json +20 -0
  26. visionlog_md-0.2.0/package.json +29 -0
  27. visionlog_md-0.2.0/pyproject.toml +48 -0
  28. visionlog_md-0.2.0/refactor/capture-edge-cases.ts +212 -0
  29. visionlog_md-0.2.0/refactor/capture-fixtures.ts +344 -0
  30. visionlog_md-0.2.0/refactor/fixtures/decision_create/001-accepted.json +20 -0
  31. visionlog_md-0.2.0/refactor/fixtures/decision_create/002-with-relations.json +22 -0
  32. visionlog_md-0.2.0/refactor/fixtures/decision_create/003-supersedes.json +20 -0
  33. visionlog_md-0.2.0/refactor/fixtures/decision_create/004-full.json +26 -0
  34. visionlog_md-0.2.0/refactor/fixtures/decision_create/005-rejected.json +19 -0
  35. visionlog_md-0.2.0/refactor/fixtures/decision_list/001-with-decisions.json +17 -0
  36. visionlog_md-0.2.0/refactor/fixtures/decision_list/002-empty.json +17 -0
  37. visionlog_md-0.2.0/refactor/fixtures/decision_update/001-accept.json +20 -0
  38. visionlog_md-0.2.0/refactor/fixtures/decision_update/002-not-found.json +20 -0
  39. visionlog_md-0.2.0/refactor/fixtures/decision_update/003-supersede.json +19 -0
  40. visionlog_md-0.2.0/refactor/fixtures/decision_view/001-exists.json +18 -0
  41. visionlog_md-0.2.0/refactor/fixtures/goal_create/001-available.json +20 -0
  42. visionlog_md-0.2.0/refactor/fixtures/goal_create/002-with-deps.json +22 -0
  43. visionlog_md-0.2.0/refactor/fixtures/goal_create/003-with-backlog-tag.json +23 -0
  44. visionlog_md-0.2.0/refactor/fixtures/goal_create/004-minimal.json +18 -0
  45. visionlog_md-0.2.0/refactor/fixtures/goal_create/005-unicode.json +19 -0
  46. visionlog_md-0.2.0/refactor/fixtures/goal_create/006-long-title.json +19 -0
  47. visionlog_md-0.2.0/refactor/fixtures/goal_create/007-with-unlocks.json +22 -0
  48. visionlog_md-0.2.0/refactor/fixtures/goal_create/008-unicode.json +19 -0
  49. visionlog_md-0.2.0/refactor/fixtures/goal_create/009-long-title.json +19 -0
  50. visionlog_md-0.2.0/refactor/fixtures/goal_create/010-default-body.json +18 -0
  51. visionlog_md-0.2.0/refactor/fixtures/goal_create/011-in-progress.json +19 -0
  52. visionlog_md-0.2.0/refactor/fixtures/goal_create/012-complete.json +19 -0
  53. visionlog_md-0.2.0/refactor/fixtures/goal_create/013-with-unlocks.json +21 -0
  54. visionlog_md-0.2.0/refactor/fixtures/goal_list/001-with-goals.json +17 -0
  55. visionlog_md-0.2.0/refactor/fixtures/goal_list/002-empty.json +17 -0
  56. visionlog_md-0.2.0/refactor/fixtures/goal_unlockable/001-with-unlockable.json +17 -0
  57. visionlog_md-0.2.0/refactor/fixtures/goal_unlockable/002-empty.json +17 -0
  58. visionlog_md-0.2.0/refactor/fixtures/goal_unlockable/003-none-ready.json +17 -0
  59. visionlog_md-0.2.0/refactor/fixtures/goal_update/001-complete.json +19 -0
  60. visionlog_md-0.2.0/refactor/fixtures/goal_update/002-not-found.json +20 -0
  61. visionlog_md-0.2.0/refactor/fixtures/goal_update/003-update-title-body.json +20 -0
  62. visionlog_md-0.2.0/refactor/fixtures/goal_view/001-exists.json +18 -0
  63. visionlog_md-0.2.0/refactor/fixtures/goal_view/002-not-found.json +18 -0
  64. visionlog_md-0.2.0/refactor/fixtures/guardrail_create/001-with-body.json +19 -0
  65. visionlog_md-0.2.0/refactor/fixtures/guardrail_create/002-minimal.json +18 -0
  66. visionlog_md-0.2.0/refactor/fixtures/guardrail_create/003-with-adr.json +20 -0
  67. visionlog_md-0.2.0/refactor/fixtures/guardrail_create/004-unicode.json +19 -0
  68. visionlog_md-0.2.0/refactor/fixtures/guardrail_create/005-retired.json +19 -0
  69. visionlog_md-0.2.0/refactor/fixtures/guardrail_inject/001-inject.json +17 -0
  70. visionlog_md-0.2.0/refactor/fixtures/guardrail_list/001-with-guardrails.json +17 -0
  71. visionlog_md-0.2.0/refactor/fixtures/guardrail_list/002-empty.json +17 -0
  72. visionlog_md-0.2.0/refactor/fixtures/guardrail_update/001-retire.json +19 -0
  73. visionlog_md-0.2.0/refactor/fixtures/guardrail_update/002-not-found.json +20 -0
  74. visionlog_md-0.2.0/refactor/fixtures/guardrail_update/003-update-body.json +19 -0
  75. visionlog_md-0.2.0/refactor/fixtures/guardrail_view/001-exists.json +18 -0
  76. visionlog_md-0.2.0/refactor/fixtures/project_init/001-happy-path.json +18 -0
  77. visionlog_md-0.2.0/refactor/fixtures/project_init/002-re-init-preserves-id.json +18 -0
  78. visionlog_md-0.2.0/refactor/fixtures/project_set/001-happy-path.json +17 -0
  79. visionlog_md-0.2.0/refactor/fixtures/project_set/002-not-found.json +18 -0
  80. visionlog_md-0.2.0/refactor/fixtures/sop_create/001-active.json +20 -0
  81. visionlog_md-0.2.0/refactor/fixtures/sop_create/002-deprecated.json +20 -0
  82. visionlog_md-0.2.0/refactor/fixtures/sop_create/003-with-adr.json +20 -0
  83. visionlog_md-0.2.0/refactor/fixtures/sop_list/001-with-sops.json +17 -0
  84. visionlog_md-0.2.0/refactor/fixtures/sop_list/002-default-sops-only.json +17 -0
  85. visionlog_md-0.2.0/refactor/fixtures/sop_update/001-deprecate.json +19 -0
  86. visionlog_md-0.2.0/refactor/fixtures/sop_update/002-not-found.json +20 -0
  87. visionlog_md-0.2.0/refactor/fixtures/sop_update/003-activate.json +19 -0
  88. visionlog_md-0.2.0/refactor/fixtures/sop_view/001-exists.json +18 -0
  89. visionlog_md-0.2.0/refactor/fixtures/vision_set/001-set.json +19 -0
  90. visionlog_md-0.2.0/refactor/fixtures/vision_set/002-overwrite.json +19 -0
  91. visionlog_md-0.2.0/refactor/fixtures/vision_view/001-no-vision.json +17 -0
  92. visionlog_md-0.2.0/refactor/fixtures/vision_view/002-with-vision.json +17 -0
  93. visionlog_md-0.2.0/refactor/fixtures/vision_view/003-after-overwrite.json +17 -0
  94. visionlog_md-0.2.0/refactor/fixtures/visionlog_status/001-full.json +17 -0
  95. visionlog_md-0.2.0/refactor/fixtures/visionlog_status/002-empty.json +17 -0
  96. visionlog_md-0.2.0/refactor/fixtures/visionlog_status/003-mixed.json +17 -0
  97. visionlog_md-0.2.0/refactor/verify-fixtures.py +208 -0
  98. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/DECISION.md +13 -0
  99. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/blocked-reason-field.md +25 -0
  100. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/defaults-check-on-init.md +25 -0
  101. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/guardrail-inject-boot.md +25 -0
  102. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/initiative-layer.md +25 -0
  103. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/open-questions.md +25 -0
  104. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/sop-list-per-task.md +25 -0
  105. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/source-research-id.md +25 -0
  106. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/visionlog-boot-full.md +25 -0
  107. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/candidates/visionlog-goal-id.md +25 -0
  108. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/evaluations/decision-criteria.md +13 -0
  109. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/evaluations/peer-review.md +16 -0
  110. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/evaluations/scoring-matrix.md +26 -0
  111. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0001-token-cost-of-full-visionlog_boot-on-a-mature-project.md +20 -0
  112. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0002-sop_list-per-task-full-bodies-is-the-most-expensive-pattern.md +20 -0
  113. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0003-metadata-fields-source_research_id-visionlog_goal_id-have-near-zero-ongoing-cost.md +22 -0
  114. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0004-blocked_reason-field-adds-10-tokens-only-when-a-task-is-actually-blocked.md +20 -0
  115. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0005-defaults_check-is-a-one-time-or-on-demand-cost-not-per-session.md +20 -0
  116. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/findings/0006-initiative-layer-imposes-cross-session-query-overhead-with-no-bounded-cost.md +20 -0
  117. visionlog_md-0.2.0/research/token-cost-vs-governance-value/.research/research.json +35 -0
  118. visionlog_md-0.2.0/src/cli.ts +262 -0
  119. visionlog_md-0.2.0/src/constants/index.ts +29 -0
  120. visionlog_md-0.2.0/src/core/visionlog.ts +315 -0
  121. visionlog_md-0.2.0/src/defaults/bundled.ts +132 -0
  122. visionlog_md-0.2.0/src/file-system/operations.ts +314 -0
  123. visionlog_md-0.2.0/src/markdown/parser.ts +114 -0
  124. visionlog_md-0.2.0/src/markdown/serializer.ts +102 -0
  125. visionlog_md-0.2.0/src/mcp/registry.ts +111 -0
  126. visionlog_md-0.2.0/src/mcp/server.ts +56 -0
  127. visionlog_md-0.2.0/src/mcp/tools/decisions.ts +99 -0
  128. visionlog_md-0.2.0/src/mcp/tools/defaults.ts +313 -0
  129. visionlog_md-0.2.0/src/mcp/tools/goals.ts +124 -0
  130. visionlog_md-0.2.0/src/mcp/tools/guardrails.ts +109 -0
  131. visionlog_md-0.2.0/src/mcp/tools/sops.ts +92 -0
  132. visionlog_md-0.2.0/src/mcp/tools/vision.ts +264 -0
  133. visionlog_md-0.2.0/src/test/concurrency.test.ts +71 -0
  134. visionlog_md-0.2.0/src/test/config.test.ts +100 -0
  135. visionlog_md-0.2.0/src/test/dag.test.ts +81 -0
  136. visionlog_md-0.2.0/src/test/find-root.test.ts +51 -0
  137. visionlog_md-0.2.0/src/test/helpers.ts +24 -0
  138. visionlog_md-0.2.0/src/test/next-id.test.ts +63 -0
  139. visionlog_md-0.2.0/src/test/registry.test.ts +238 -0
  140. visionlog_md-0.2.0/src/test/roundtrip.test.ts +186 -0
  141. visionlog_md-0.2.0/src/test/update.test.ts +112 -0
  142. visionlog_md-0.2.0/src/types/index.ts +146 -0
  143. visionlog_md-0.2.0/tsconfig.json +14 -0
  144. visionlog_md-0.2.0/visionlog/adr/ADR-001-guardrails-are-the-kernel-immutable-conscience-not.md +29 -0
  145. visionlog_md-0.2.0/visionlog/adr/ADR-002-the-separation-governance-is-structure-code-is-sub.md +28 -0
  146. visionlog_md-0.2.0/visionlog/adr/ADR-003-perceive-before-act-visionlog-boot-and-visionlog-g.md +28 -0
  147. visionlog_md-0.2.0/visionlog/adr/ADR-004-vision-is-sticky-goals-are-dealt-the-destination-d.md +28 -0
  148. visionlog_md-0.2.0/visionlog/adr/ADR-005-goals-need-a-vision-challenge-step-before-execution.md +49 -0
  149. visionlog_md-0.2.0/visionlog/adr/ADR-006-guid-handshake-multi-project-targeting.md +52 -0
  150. visionlog_md-0.2.0/visionlog/config.yaml +4 -0
  151. visionlog_md-0.2.0/visionlog/goals/GOAL-001-core-schema-parser-serializer-cli-mcp-server.md +19 -0
  152. visionlog_md-0.2.0/visionlog/goals/GOAL-002-dogfooding-visionlog-governs-itself.md +19 -0
  153. visionlog_md-0.2.0/visionlog/goals/GOAL-003-integration-claude-md-injection-session-start-sequ.md +19 -0
  154. visionlog_md-0.2.0/visionlog/goals/GOAL-004-ecosystem-governs-manyhats-reeves-and-other-eidos-.md +19 -0
  155. visionlog_md-0.2.0/visionlog/guardrails/GUARD-001-visionlog-md-must-be-governed-by-visionlog-md-neve.md +20 -0
  156. visionlog_md-0.2.0/visionlog/guardrails/GUARD-002-every-gap-exposed-by-a-consumer-project-is-a-real-.md +20 -0
  157. visionlog_md-0.2.0/visionlog/guardrails/GUARD-003-always-work-inside-a-backlog-task-no-freeform-codi.md +22 -0
  158. visionlog_md-0.2.0/visionlog/sops/SOP-001-session-start-orient-before-acting.md +25 -0
  159. visionlog_md-0.2.0/visionlog/sops/SOP-002-the-vision-challenge-validate-goals-before-executing.md +40 -0
  160. visionlog_md-0.2.0/visionlog/vision.md +39 -0
  161. visionlog_md-0.2.0/visionlog_md/__init__.py +3 -0
  162. visionlog_md-0.2.0/visionlog_md/constants.py +31 -0
  163. visionlog_md-0.2.0/visionlog_md/core.py +247 -0
  164. visionlog_md-0.2.0/visionlog_md/defaults.py +97 -0
  165. visionlog_md-0.2.0/visionlog_md/filesystem.py +263 -0
  166. visionlog_md-0.2.0/visionlog_md/parser.py +157 -0
  167. visionlog_md-0.2.0/visionlog_md/serializer.py +119 -0
  168. visionlog_md-0.2.0/visionlog_md/server.py +481 -0
  169. visionlog_md-0.2.0/visionlog_md/types.py +85 -0
@@ -0,0 +1,42 @@
1
+ manifest_version: 1
2
+
3
+ repo:
4
+ visibility: public
5
+ org: eidos-agi
6
+ topics: [mcp, vision, governance, guardrails, agent-tools]
7
+
8
+ packaging:
9
+ build_system: hatchling
10
+ pypi:
11
+ name: visionlog-md
12
+ publish: true
13
+ trusted_publisher:
14
+ owner: eidos-agi
15
+ repo: visionlog.md
16
+ workflow: publish.yml
17
+ environment: pypi
18
+ readme:
19
+ absolute_images: true
20
+
21
+ quality:
22
+ required_files:
23
+ - LICENSE
24
+ - README.md
25
+ - CHANGELOG.md
26
+ - CONTRIBUTING.md
27
+ - SECURITY.md
28
+ min_grade:
29
+ foss_check: B
30
+ ship_check: pass
31
+ sec_audit: clean
32
+
33
+ dependencies:
34
+ max_count: 3
35
+
36
+ ci:
37
+ workflows:
38
+ ci: true
39
+ publish: true
40
+ permissions:
41
+ contents_read: true
42
+ pre_commit: true
@@ -0,0 +1,62 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ concurrency:
10
+ group: ci-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ lint:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+ - name: Lint
22
+ run: |
23
+ pip install ruff
24
+ ruff check visionlog_md/
25
+ ruff format --check visionlog_md/
26
+
27
+ test:
28
+ runs-on: ubuntu-latest
29
+ strategy:
30
+ matrix:
31
+ python-version: ["3.11", "3.12", "3.13"]
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: ${{ matrix.python-version }}
37
+ - name: Install dependencies
38
+ run: pip install -e ".[dev]"
39
+ - name: Run fixture verification
40
+ run: python refactor/verify-fixtures.py || true
41
+ - name: Run tests
42
+ run: pytest tests/ -v || echo "No pytest tests yet"
43
+
44
+ build-verify:
45
+ runs-on: ubuntu-latest
46
+ needs: [lint, test]
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+ - uses: actions/setup-python@v5
50
+ with:
51
+ python-version: "3.12"
52
+ - name: Build
53
+ run: |
54
+ pip install build twine
55
+ python -m build
56
+ - name: Verify metadata
57
+ run: twine check dist/*
58
+ - name: Verify wheel installs
59
+ run: |
60
+ python -m venv /tmp/test-venv
61
+ /tmp/test-venv/bin/pip install dist/*.whl
62
+ /tmp/test-venv/bin/python -c "import visionlog_md; print(visionlog_md.__version__)"
@@ -0,0 +1,29 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ environment: pypi
11
+ permissions:
12
+ id-token: write
13
+ contents: read
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install build tools
23
+ run: pip install build
24
+
25
+ - name: Build package
26
+ run: python -m build
27
+
28
+ - name: Publish to PyPI
29
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,38 @@
1
+ # Node (TypeScript original)
2
+ node_modules/
3
+ dist/
4
+ *.js.map
5
+ *.tsbuildinfo
6
+ *.db
7
+
8
+ # Python (new primary)
9
+ __pycache__/
10
+ *.py[cod]
11
+ *$py.class
12
+ *.egg-info/
13
+ build/
14
+ *.egg
15
+ *.whl
16
+
17
+ .venv/
18
+ venv/
19
+ env/
20
+ .env
21
+ .env.local
22
+
23
+ .idea/
24
+ .vscode/
25
+ *.swp
26
+ *.swo
27
+ *~
28
+
29
+ .DS_Store
30
+ Thumbs.db
31
+
32
+ .pytest_cache/
33
+ .coverage
34
+ htmlcov/
35
+ .mypy_cache/
36
+ .ruff_cache/
37
+
38
+ .mcp.json
@@ -0,0 +1,25 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.8.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix, --exit-non-zero-on-fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/pre-commit-hooks
10
+ rev: v5.0.0
11
+ hooks:
12
+ - id: check-yaml
13
+ - id: check-toml
14
+ - id: end-of-file-fixer
15
+ - id: trailing-whitespace
16
+ - id: check-merge-conflict
17
+ - id: check-added-large-files
18
+ args: ['--maxkb=500']
19
+ - id: detect-private-key
20
+
21
+ - repo: https://github.com/codespell-project/codespell
22
+ rev: v2.3.0
23
+ hooks:
24
+ - id: codespell
25
+ args: [--skip, "*.lock,*.cast"]
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: "ADR-001"
3
+ type: "decision"
4
+ title: "The trilogy must remain composable and non-prescriptive"
5
+ status: "accepted"
6
+ date: "2026-03-21"
7
+ ---
8
+
9
+ ## Context
10
+
11
+ During a design session, an AI suggested adding an "Initiative" layer — a cross-cutting concept that would unify artifacts from all three trilogy tools under a single ID and lifecycle. The idea had genuine merit for observability and auditability.
12
+
13
+ The user's response: "we should be careful about becoming too opinionated."
14
+
15
+ This was not feedback on one feature. It was a design principle. The moment passed without being captured — which is itself the gap the trilogy exists to close.
16
+
17
+ ## Decision
18
+
19
+ The trilogy tools (research.md, visionlog, ike.md) must remain composable and non-prescriptive. Each tool has one job. No tool should impose a cross-cutting methodology on top of the primitives it provides.
20
+
21
+ Workflow conventions — like linking all artifacts under an initiative ID — belong in SOPs, not in schemas. A SOP recommends. A schema enforces. Enforcement should be reserved for things that are always true, not things that are useful in some contexts.
22
+
23
+ The test for any proposed new construct: **does it make the existing job of the tool clearer, or does it add a new job?** If it adds a new job, it belongs in a SOP or in a separate tool.
24
+
25
+ ## Consequences
26
+
27
+ - Feature proposals that add new cross-cutting abstractions must clear this bar before acceptance
28
+ - Linking conventions (e.g., initiative_id) should be documented as optional SOP guidance, not schema requirements
29
+ - The trilogy's value is in its simplicity — three focused tools with clear seams, not a framework
@@ -0,0 +1,3 @@
1
+ id: "80587952-9c97-401b-acdd-3d7378d7b6c7"
2
+ project: "visionlog.md"
3
+ created: "2026-03-21"
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: "GUARD-001"
3
+ type: "guardrail"
4
+ title: "No new cross-cutting abstractions without clearing the composability test"
5
+ status: "active"
6
+ date: "2026-03-21"
7
+ adr: "ADR-001"
8
+ ---
9
+
10
+ ## Rule
11
+
12
+ Before adding any new construct to visionlog, research.md, or ike.md schemas, apply this test:
13
+
14
+ **Does this make the existing job of the tool clearer, or does it add a new job?**
15
+
16
+ If it adds a new job — stop. Either (a) put the convention in a SOP, (b) build it as a separate optional tool, or (c) run it through research.md to earn the decision before touching a schema.
17
+
18
+ ## Why
19
+
20
+ The trilogy's strength is focused simplicity. Cross-cutting abstractions feel like improvements but are often methodology prescriptions in disguise. Once in a schema, they are enforced on every user. Once enforced, they are hard to remove. The cost compounds.
21
+
22
+ This guardrail exists because in a live design session, an AI proposed an "Initiative" layer with genuine merit — and the principle it violated had never been written down. An unwritten principle cannot be enforced.
23
+
24
+ ## Violation Examples
25
+
26
+ - Adding `initiative_id` as a field on ike.md tasks, visionlog goals, and research.md projects — prescribes a cross-cutting workflow not everyone needs
27
+ - Adding a `risk_level` field to guardrails "because it would be useful" — adds a new classification job to what is already a clear construct
28
+ - Adding a `confidence_score` to ADRs — imports a research.md concept into visionlog's domain
@@ -0,0 +1,36 @@
1
+ ---
2
+ id: "SOP-001"
3
+ type: "sop"
4
+ title: "Goal Decomposition"
5
+ status: "active"
6
+ date: "2026-03-21"
7
+ ---
8
+
9
+ ## When to use this
10
+
11
+ When a visionlog goal has no ike.md tasks yet, or when starting work on a goal that is `available` or `in-progress`. Do not create tasks without first consulting this SOP.
12
+
13
+ ## Steps
14
+
15
+ 1. **Read the goal** — call `visionlog.goal_view(id)`. Understand the exit criteria, dependencies, and what "complete" means.
16
+
17
+ 2. **Check guardrails** — call `visionlog.guardrail_list(status: active)`. Identify any guardrails that constrain how this goal is executed. If a proposed approach would violate one, stop and redesign before proceeding.
18
+
19
+ 3. **Propose milestones** — decompose the goal into 1–3 milestones. A milestone is a meaningful, demonstrable checkpoint — not a task list. Ask: what intermediate states of the world would prove we are on track?
20
+
21
+ 4. **Create milestones in ike.md** — call `ike.milestone_create` for each milestone. Name them after the outcome, not the activity.
22
+
23
+ 5. **Decompose each milestone into tasks** — for each milestone, identify the atomic work items. A task should be completable in one session. Call `ike.task_create` for each with:
24
+ - `visionlog_goal_id` set to the goal's ID
25
+ - `milestone` set to the milestone ID
26
+ - `priority` reflecting urgency
27
+ - `acceptance_criteria` defining what done looks like
28
+
29
+ 6. **Update goal status** — if the goal was `locked`, check whether its `depends_on` goals are complete. If yes, call `visionlog.goal_update(status: available)`. If you are starting work now, set `in-progress`.
30
+
31
+ ## Guards
32
+
33
+ - Never create tasks without reading the goal and active guardrails first
34
+ - A goal should have no more than 3 milestones unless the scope demands it — if it does, the goal is probably too large and should be split
35
+ - Every task must have `acceptance_criteria` — a task without a definition of done will never be verifiably complete
36
+ - Do not skip directly from goal to tasks — the milestone layer is what connects strategy to execution
@@ -0,0 +1,32 @@
1
+ ---
2
+ id: "SOP-002"
3
+ type: "sop"
4
+ title: "Completion Feedback"
5
+ status: "active"
6
+ date: "2026-03-21"
7
+ ---
8
+
9
+ ## When to use this
10
+
11
+ After completing an ike.md task. Completion is not just marking a task done — it is closing the loop back to the goal. Follow this SOP every time.
12
+
13
+ ## Steps
14
+
15
+ 1. **Complete the task** — call `ike.task_complete(task_id)`. Record completion notes describing what was done and any decisions made during execution.
16
+
17
+ 2. **Check the milestone** — call `ike.task_list(milestone: <milestone_id>)`. If all tasks in the milestone are complete, call `ike.milestone_close(milestone_id)`.
18
+
19
+ 3. **Check the goal** — if a milestone was closed, call `ike.task_list(visionlog_goal_id: <goal_id>, include_completed: false)`. If no open tasks remain for this goal:
20
+ - Call `visionlog.goal_view(id)` — review exit criteria
21
+ - If exit criteria are met, call `visionlog.goal_update(id, status: complete)`
22
+ - If exit criteria are not fully met, create the remaining tasks before updating status
23
+
24
+ 4. **Capture decisions made** — if any non-obvious decisions were made during execution that aren't recorded anywhere, call `visionlog.decision_create` with `status: accepted` to formalize them. A decision made in execution but not recorded is a contract that was never written.
25
+
26
+ 5. **Check unlocks** — call `visionlog.goal_unlockable()`. If completing this goal unlocks others, update their status to `available`.
27
+
28
+ ## Guards
29
+
30
+ - Never mark a goal complete without checking its exit criteria in visionlog
31
+ - If you made a decision during execution, write the ADR — do not leave it in task notes
32
+ - Do not skip step 5 — unlocking goals is how the DAG advances
@@ -0,0 +1,37 @@
1
+ ---
2
+ id: "SOP-003"
3
+ type: "sop"
4
+ title: "Blocked Task Escalation"
5
+ status: "active"
6
+ date: "2026-03-21"
7
+ ---
8
+
9
+ ## When to use this
10
+
11
+ When an ike.md task cannot proceed. A blocked task is a signal that the plan is misaligned with reality. Do not leave it blocked without diagnosing why and taking explicit action.
12
+
13
+ ## Steps
14
+
15
+ 1. **Record the blockage** — call `ike.task_edit(task_id, status: "In Progress")` and add a note with the reason. Name the reason precisely. Vague blocked reasons ("can't proceed") are not acceptable.
16
+
17
+ 2. **Diagnose the type** — determine which category applies:
18
+
19
+ **A. Dependency** — another task or goal must complete first.
20
+ Action: verify the dependency in ike.md or visionlog. Update `dependencies` on the task if not already set. Wait or switch to unblocked work.
21
+
22
+ **B. Information gap** — the task cannot be completed because knowledge is missing.
23
+ Action: open a research.md project to find the answer. Call `research.project_init` with a clear question. Update the blocked task's notes with the research project ID. Return to this task when the research project is decided.
24
+
25
+ **C. Contradiction** — the task conflicts with a visionlog guardrail or ADR.
26
+ Action: this is a serious escalation. The task as written is invalid. Either (a) redesign the task to comply, or (b) if the contract itself is wrong, open a research.md project to earn a new decision that supersedes the existing ADR. Do not proceed with a task that violates a guardrail.
27
+
28
+ **D. Resource or access constraint** — the agent lacks a tool, permission, or capability.
29
+ Action: create a high-priority task assigned to a human (`assignees: ["human"]`) describing the missing capability. The original task remains blocked until the human task is resolved.
30
+
31
+ 3. **Never leave a task blocked without a linked action** — every blocked task must have either a dependency link, a research project ID in its notes, a redesigned scope, or a human-assigned task waiting for it.
32
+
33
+ ## Guards
34
+
35
+ - A blocked task with no diagnosis is invisible debt — it will sit in the backlog forever
36
+ - Do not spawn a research.md project for questions that can be answered by reading existing visionlog ADRs or SOPs first
37
+ - A contradiction with a guardrail is never a blocker to work around — it is a signal to stop and govern
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: "visionlog.md — The Governance Layer"
3
+ type: "vision"
4
+ date: "2026-03-21"
5
+ ---
6
+
7
+ visionlog is the governance layer for AI-assisted projects. It holds the contracts that all execution must honor: vision, goals, guardrails, SOPs, and ADRs.
8
+
9
+ ## What it is
10
+
11
+ A place for decisions that have been earned, goals that have been committed to, and rules that must not be broken. It is the static layer — the part of the system that changes slowly and deliberately, because governance that changes fast is not governance.
12
+
13
+ ## What it is not
14
+
15
+ visionlog is not an orchestrator. It does not run agents, schedule work, or manage tasks. It does not tell you how to work — only what you have committed to and what you must not do.
16
+
17
+ ## Design philosophy
18
+
19
+ **Composable, not prescriptive.**
20
+
21
+ visionlog gives you primitives — goals, guardrails, SOPs, ADRs — and stays out of the way. It does not impose a methodology. It does not require you to use all of its constructs. It does not add cross-cutting concepts that prescribe how you organize work at a level above the tools.
22
+
23
+ The right test for any new feature: does it make the existing job of the tool clearer, or does it add a new job? New jobs belong elsewhere.
24
+
25
+ **Opinions go in SOPs, not in schemas.**
26
+
27
+ If a workflow pattern is valuable — like linking execution back to a research decision — that belongs in a SOP that recommends a convention. It does not belong in a required schema field that forces the convention on everyone.
28
+
29
+ **Contracts must be earned.**
30
+
31
+ No guardrail, ADR, or SOP should be created without a reason. The reason must be recorded. A contract without a recorded rationale is noise, not governance.
32
+
33
+ ## The trilogy
34
+
35
+ visionlog is the middle layer of a three-tool trilogy:
36
+
37
+ - **research.md** — earn decisions with evidence before committing
38
+ - **visionlog** — record what was decided and what must not be violated
39
+ - **ike.md** — execute within those contracts
40
+
41
+ The flow is one-way by design: research feeds visionlog, visionlog feeds ike. Each tool has one job. None of them reach into the others' domain.
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2026-03-22
11
+
12
+ ### Added
13
+ - Initial release
@@ -0,0 +1,50 @@
1
+ # Contributing to visionlog
2
+
3
+ Thanks for your interest in contributing.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ git clone https://github.com/eidos-agi/visionlog.md.git
9
+ cd visionlog.md
10
+ pip install -e ".[dev]"
11
+ ```
12
+
13
+ ## Development
14
+
15
+ We use [ruff](https://docs.astral.sh/ruff/) for linting and formatting:
16
+
17
+ ```bash
18
+ ruff check .
19
+ ruff format .
20
+ ```
21
+
22
+ Run tests:
23
+
24
+ ```bash
25
+ pytest
26
+ ```
27
+
28
+ ## For agent developers
29
+
30
+ If you're building tools that AI agents will use, pay special attention to:
31
+
32
+ 1. **Tool descriptions** — Every `@tool` decorator must have a description that explains *when* to use it, not just *what* it does. An agent choosing between 20 tools needs clear differentiation.
33
+ 2. **Parameter descriptions** — Every parameter needs a `description` field. Agents don't have UI tooltips — the description is all they get.
34
+ 3. **Error messages** — When something fails, the error message must tell the agent what to do next. "Invalid input" is useless. "Expected ISO 8601 date string (e.g., 2026-03-22), got: 'yesterday'" is actionable.
35
+ 4. **Typed everything** — Type hints on all public functions. Agents parse types to understand contracts.
36
+
37
+ ## Pull requests
38
+
39
+ - Keep PRs focused — one feature or fix per PR
40
+ - Include tests for new functionality
41
+ - Update CHANGELOG.md with your changes
42
+ - Ensure `ruff check .` and `pytest` pass
43
+
44
+ ## Reporting issues
45
+
46
+ Open an issue with:
47
+
48
+ 1. What you were trying to do
49
+ 2. What happened instead
50
+ 3. Steps to reproduce
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Daniel Shanklin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,146 @@
1
+ Metadata-Version: 2.4
2
+ Name: visionlog-md
3
+ Version: 0.2.0
4
+ Summary: The static St. Peter — vision, goals, guardrails, SOPs, ADRs for AI agent governance
5
+ Project-URL: Homepage, https://github.com/eidos-agi/visionlog.md
6
+ Project-URL: Repository, https://github.com/eidos-agi/visionlog.md
7
+ Author-email: Daniel Shanklin <daniel@eidosagi.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: agent-tools,governance,guardrails,mcp,vision
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: mcp>=1.0.0
19
+ Requires-Dist: pyyaml>=6.0
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
22
+ Description-Content-Type: text/markdown
23
+
24
+ # visionlog.md
25
+
26
+ MCP server for long-term project governance. Records vision, goals, guardrails, SOPs, and architectural decisions (ADRs) — the contracts that all execution must honor.
27
+
28
+ Part of the trilogy: **research.md → visionlog.md → ike.md**
29
+
30
+ - research.md earns decisions with evidence
31
+ - **visionlog.md** records them as binding contracts
32
+ - ike.md executes within those contracts
33
+
34
+ ## What it enforces
35
+
36
+ - Guardrails are active or deprecated — never deleted
37
+ - ADRs are permanent once accepted — a new ADR supersedes, never overwrites
38
+ - Goals form a DAG — dependencies must be resolved before a goal is available
39
+ - Vision is sticky — it does not drift session to session
40
+
41
+ ## Trilogy conventions
42
+
43
+ visionlog.md follows shared conventions with ike.md and research.md. See [CONVENTIONS.md](https://github.com/eidos-agi/ike.md/blob/main/CONVENTIONS.md) for the full standard.
44
+
45
+ - Config lives at `.visionlog/config.yaml` (committed to git)
46
+ - Tools: `project_init` (new project) and `project_set` (register existing for session)
47
+
48
+ ## Install
49
+
50
+ Not yet published to npm. Install from local path.
51
+
52
+ ```bash
53
+ npm install
54
+ npm run build
55
+ ```
56
+
57
+ Add to `.mcp.json`:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "visionlog": {
63
+ "command": "/absolute/path/to/visionlog.md/dist/visionlog",
64
+ "args": ["mcp", "start"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Session protocol
71
+
72
+ ```
73
+ project_set { path: "/path/to/project" } <- returns project_id
74
+ visionlog_boot { project_id: "..." } <- active guardrails + goal state
75
+ visionlog_guide { project_id: "..." } <- vision + decisions + goal map
76
+ ```
77
+
78
+ Read both `visionlog_boot` and `visionlog_guide` at the start of every session before touching any task or code.
79
+
80
+ ## Project structure
81
+
82
+ ```
83
+ my-project/
84
+ .visionlog/
85
+ config.yaml <- project GUID + metadata (commit this)
86
+ vision.md <- north star, anti-goals, success criteria
87
+ goals/ <- GOAL-NNNN.md — DAG of milestones
88
+ adr/ <- ADR-NNNN.md — architectural decisions
89
+ guardrails/ <- GUARD-NNNN.md — active constraints
90
+ sops/ <- SOP-NNNN.md — coordination protocols
91
+ ```
92
+
93
+ ## Tools
94
+
95
+ ### Session
96
+ | Tool | Description |
97
+ |------|-------------|
98
+ | `project_init` | Initialize visionlog in a new project |
99
+ | `project_set` | Register existing project for session, returns project_id |
100
+
101
+ ### Orientation (call at session start)
102
+ | Tool | Description |
103
+ |------|-------------|
104
+ | `visionlog_boot` | Active guardrails + current goal state + backlog check |
105
+ | `visionlog_guide` | Vision + key decisions + full goal map |
106
+ | `visionlog_status` | Counts: goals, decisions, guardrails, SOPs |
107
+
108
+ ### Vision
109
+ | Tool | Description |
110
+ |------|-------------|
111
+ | `vision_view` | Read the project vision |
112
+ | `vision_set` | Set or update the vision document |
113
+
114
+ ### Goals
115
+ | Tool | Description |
116
+ |------|-------------|
117
+ | `goal_create` | Add a goal to the DAG |
118
+ | `goal_list` | List all goals with status |
119
+ | `goal_view` | Read a goal |
120
+ | `goal_update` | Update goal status or body |
121
+ | `goal_unlockable` | List goals whose dependencies are met |
122
+
123
+ ### Decisions (ADRs)
124
+ | Tool | Description |
125
+ |------|-------------|
126
+ | `decision_create` | Record an architectural decision |
127
+ | `decision_list` | List all ADRs |
128
+ | `decision_view` | Read an ADR |
129
+ | `decision_update` | Update status or body |
130
+
131
+ ### Guardrails
132
+ | Tool | Description |
133
+ |------|-------------|
134
+ | `guardrail_create` | Add a guardrail |
135
+ | `guardrail_list` | List all guardrails |
136
+ | `guardrail_view` | Read a guardrail |
137
+ | `guardrail_update` | Update status or body |
138
+ | `guardrail_inject` | Inject guardrails into an existing prompt |
139
+
140
+ ### SOPs
141
+ | Tool | Description |
142
+ |------|-------------|
143
+ | `sop_create` | Add a standard operating procedure |
144
+ | `sop_list` | List all SOPs |
145
+ | `sop_view` | Read a SOP |
146
+ | `sop_update` | Update status or body |