observed-knowledge-ledger 0.7.2__tar.gz → 0.7.4__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 (269) hide show
  1. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agents/architecture-reviewer.md +3 -1
  2. observed_knowledge_ledger-0.7.4/.claude/commands/record.md +63 -0
  3. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/hooks/stop-okl-encode.sh +27 -2
  4. {observed_knowledge_ledger-0.7.2/src/okl/scaffold → observed_knowledge_ledger-0.7.4/.claude}/hooks/userpromptsubmit-okl-check.sh +28 -2
  5. {observed_knowledge_ledger-0.7.2/src/okl/scaffold/claude → observed_knowledge_ledger-0.7.4/.claude}/skills/encoding-loop/SKILL.md +6 -2
  6. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/marketplace.json +1 -1
  7. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/plugin.json +4 -2
  8. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.gitignore +3 -0
  9. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/AGENTS.md +4 -4
  10. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CHANGELOG.md +36 -0
  11. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CLAUDE.md +4 -4
  12. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CONTRIBUTING.md +17 -9
  13. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/PKG-INFO +174 -89
  14. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/README.md +173 -88
  15. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/SECURITY.md +17 -7
  16. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/review-agent.sh +3 -3
  17. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/DEPLOY.md +3 -3
  18. observed_knowledge_ledger-0.7.4/docs/GETTING-STARTED.md +317 -0
  19. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/decisions/2026-07-17-flat-retrieval-until-scale.md +7 -0
  20. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/decisions/2026-07-21-subject-tags-controlled-vocabulary.md +3 -0
  21. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/okl-how-it-works.excalidraw +20 -20
  22. observed_knowledge_ledger-0.7.4/docs/okl-how-it-works.svg +2 -0
  23. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/okl-retrieval-pipeline.svg +5 -5
  24. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/01-memory-that-outlives-the-run.md +1 -1
  25. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/02-dont-let-a-step-grade-itself.md +2 -2
  26. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/render_pipeline_diagram.py +5 -5
  27. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/README.md +23 -6
  28. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/REPORT.md +3 -3
  29. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/README.md +23 -18
  30. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/arms.txt +2 -0
  31. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-briefed.patch +75 -0
  32. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-control.patch +72 -0
  33. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/session-briefed.txt +13 -0
  34. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/session-control.txt +16 -0
  35. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/arms.txt +2 -0
  36. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/diff-briefed.patch +76 -0
  37. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/price_tamper/diff-control.patch +13 -16
  38. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/session-briefed.txt +13 -0
  39. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/session-control.txt +10 -0
  40. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/arms.txt +2 -0
  41. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/diff-briefed.patch +103 -0
  42. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/rate_limiter/diff-control.patch +8 -12
  43. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/session-briefed.txt +12 -0
  44. observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/session-control.txt +5 -0
  45. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/run_demo.sh +8 -2
  46. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Program.cs +2 -4
  47. observed_knowledge_ledger-0.7.4/examples/python-fastapi/README.md +57 -0
  48. observed_knowledge_ledger-0.7.4/examples/python-fastapi/app/__init__.py +4 -0
  49. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/pyproject.toml +1 -1
  50. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/arms.txt +2 -0
  51. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/diff-briefed.patch +17 -0
  52. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/idor_endpoint/diff-control.patch +2 -2
  53. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/session-briefed.txt +5 -0
  54. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/session-control.txt +5 -0
  55. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/arms.txt +2 -0
  56. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/diff-briefed.patch +106 -0
  57. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/diff-control.patch +53 -0
  58. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/session-briefed.txt +12 -0
  59. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/session-control.txt +7 -0
  60. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/arms.txt +2 -0
  61. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/diff-briefed.patch +52 -0
  62. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/diff-control.patch +55 -0
  63. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/session-briefed.txt +12 -0
  64. observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/session-control.txt +16 -0
  65. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/run_demo.sh +8 -2
  66. {observed_knowledge_ledger-0.7.2/src/okl/scaffold → observed_knowledge_ledger-0.7.4}/hooks/stop-okl-encode.sh +27 -2
  67. {observed_knowledge_ledger-0.7.2/.claude → observed_knowledge_ledger-0.7.4}/hooks/userpromptsubmit-okl-check.sh +28 -2
  68. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/okl-drift.json +63 -18
  69. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/pyproject.toml +1 -1
  70. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/cli.py +246 -35
  71. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/core.py +33 -1
  72. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/mcp_server.py +18 -6
  73. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/MANIFEST.md +12 -8
  74. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/method-gates.yml +18 -6
  75. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/review-agent.sh +3 -3
  76. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/agents/architecture-reviewer.md +3 -1
  77. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/check-rules.md +9 -5
  78. observed_knowledge_ledger-0.7.4/src/okl/scaffold/claude/commands/record.md +63 -0
  79. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/seed-from-codebase.md +2 -2
  80. observed_knowledge_ledger-0.7.4/src/okl/scaffold/claude/skills/encoding-loop/SKILL.md +63 -0
  81. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/README.md +9 -4
  82. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/run_evals.py +11 -3
  83. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4/src/okl/scaffold}/hooks/stop-okl-encode.sh +27 -2
  84. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4/src/okl/scaffold}/hooks/userpromptsubmit-okl-check.sh +28 -2
  85. observed_knowledge_ledger-0.7.4/src/okl/scaffold/plugin/plugin.json +9 -0
  86. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/geospatial/rules/geospatial-ml.md +1 -1
  87. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/react/README.md +2 -2
  88. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/react/rules/frontend.md +2 -2
  89. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/registries/RETRACTIONS.md +2 -1
  90. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/root/CLAUDE.md +2 -1
  91. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/root/METHOD.md +2 -2
  92. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold_cmd.py +3 -1
  93. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/seed.py +34 -0
  94. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/service.py +13 -1
  95. observed_knowledge_ledger-0.7.4/src/okl/starter.json +85 -0
  96. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/store.py +1 -1
  97. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/tests/test_okl.py +271 -5
  98. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/tests/test_scaffold.py +92 -1
  99. observed_knowledge_ledger-0.7.2/.coverage +0 -0
  100. observed_knowledge_ledger-0.7.2/docs/okl-how-it-works.svg +0 -2
  101. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-briefed.patch +0 -60
  102. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-control.patch +0 -61
  103. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/session-briefed.txt +0 -10
  104. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/session-control.txt +0 -17
  105. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/diff-briefed.patch +0 -103
  106. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/session-briefed.txt +0 -10
  107. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/session-control.txt +0 -21
  108. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/diff-briefed.patch +0 -144
  109. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/session-briefed.txt +0 -13
  110. observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/session-control.txt +0 -17
  111. observed_knowledge_ledger-0.7.2/examples/python-fastapi/README.md +0 -55
  112. observed_knowledge_ledger-0.7.2/examples/python-fastapi/app/__init__.py +0 -6
  113. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/diff-briefed.patch +0 -58
  114. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/session-briefed.txt +0 -5
  115. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/session-control.txt +0 -1
  116. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/diff-briefed.patch +0 -99
  117. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/diff-control.patch +0 -90
  118. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/session-briefed.txt +0 -13
  119. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/session-control.txt +0 -10
  120. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/diff-briefed.patch +0 -120
  121. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/diff-control.patch +0 -56
  122. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/session-briefed.txt +0 -12
  123. observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/session-control.txt +0 -11
  124. observed_knowledge_ledger-0.7.2/src/okl/scaffold/plugin/plugin.json +0 -10
  125. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agent-memory/architecture-reviewer/MEMORY.md +0 -0
  126. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agent-memory/architecture-reviewer/review_findings_log.md +0 -0
  127. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/settings.json +0 -0
  128. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  129. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  130. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/dependabot.yml +0 -0
  131. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/pull_request_template.md +0 -0
  132. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/ci.yml +0 -0
  133. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/okl-verify.yml +0 -0
  134. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/publish.yml +0 -0
  135. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.mcp.json +0 -0
  136. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/LICENSE +0 -0
  137. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/check-diagram-figures.sh +0 -0
  138. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/okl-verify.yml +0 -0
  139. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/03-enforcement-or-good-intentions.md +0 -0
  140. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/04-the-elegant-change-was-the-wrong-one.md +0 -0
  141. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/ab_harness.py +0 -0
  142. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/layout_preflight.py +0 -0
  143. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/preflight.py +0 -0
  144. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260829-2300.json +0 -0
  145. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260829-2315.json +0 -0
  146. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260830-0003.json +0 -0
  147. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260830-0148.json +0 -0
  148. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260901-0133.json +0 -0
  149. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260901-1238.json +0 -0
  150. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260902-0538.json +0 -0
  151. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260902-1216.json +0 -0
  152. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-0157.json +0 -0
  153. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-0308.json +0 -0
  154. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-1214.json +0 -0
  155. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-1323.json +0 -0
  156. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260926-0528.json +0 -0
  157. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/README.md +0 -0
  158. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/briefed-userpromptsubmit-lint.yml +0 -0
  159. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/control-lint.yml +0 -0
  160. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/hook.log +0 -0
  161. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/service-record-500.log +0 -0
  162. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-briefed-pretooluse.txt +0 -0
  163. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-briefed-userpromptsubmit.txt +0 -0
  164. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-control.txt +0 -0
  165. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/README.md +0 -0
  166. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/briefed-lint-after-loop.yml +0 -0
  167. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/briefed-lint.yml +0 -0
  168. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/command.txt +0 -0
  169. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/okl-drift-scratch.json +0 -0
  170. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-briefed.txt +0 -0
  171. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-control.txt +0 -0
  172. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-envtest.txt +0 -0
  173. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-briefed.jsonl +0 -0
  174. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-control.jsonl +0 -0
  175. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-envtest.jsonl +0 -0
  176. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/README.md +0 -0
  177. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/session-plugin.txt +0 -0
  178. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/transcript-plugin.jsonl +0 -0
  179. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/README.md +0 -0
  180. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/captured-tool-uses.txt +0 -0
  181. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/doctor.txt +0 -0
  182. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/session-task.txt +0 -0
  183. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/transcript-smoke.jsonl +0 -0
  184. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/transcript-task.jsonl +0 -0
  185. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/worker-log-excerpt.txt +0 -0
  186. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/README.md +0 -0
  187. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/doctor-in-okl-repo.txt +0 -0
  188. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/session.txt +0 -0
  189. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-control-main-hook.jsonl +0 -0
  190. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-probe-last.jsonl +0 -0
  191. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-rerun-live.jsonl +0 -0
  192. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript.jsonl +0 -0
  193. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/tasks.jsonl +0 -0
  194. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/.gitignore +0 -0
  195. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/OrdersApi.slnx +0 -0
  196. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/idor_endpoint/briefing.md +0 -0
  197. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/price_tamper/briefing.md +0 -0
  198. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/rate_limiter/briefing.md +0 -0
  199. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/OrdersApi.csproj +0 -0
  200. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Properties/launchSettings.json +0 -0
  201. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Store.cs +0 -0
  202. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/appsettings.Development.json +0 -0
  203. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/appsettings.json +0 -0
  204. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tasks.jsonl +0 -0
  205. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tests/ApiTests.cs +0 -0
  206. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tests/OrdersApi.Tests.csproj +0 -0
  207. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/app/main.py +0 -0
  208. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/app/store.py +0 -0
  209. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/idor_endpoint/briefing.md +0 -0
  210. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/price_tamper/briefing.md +0 -0
  211. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/rate_limiter/briefing.md +0 -0
  212. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/tasks.jsonl +0 -0
  213. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/tests/test_app.py +0 -0
  214. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-canon-size.sh +0 -0
  215. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-diagram-pairs.sh +0 -0
  216. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-doc-orphans.sh +0 -0
  217. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-links.sh +0 -0
  218. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-retractions.sh +0 -0
  219. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-tombstones.sh +0 -0
  220. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/run-gates.sh +0 -0
  221. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/hooks/hooks.json +0 -0
  222. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/packaging/org-knowledge-layer/README.md +0 -0
  223. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/packaging/org-knowledge-layer/pyproject.toml +0 -0
  224. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-canon.json +0 -0
  225. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-decisions.json +0 -0
  226. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-defects.json +0 -0
  227. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-review-surfaces.json +0 -0
  228. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/frontend-canon.json +0 -0
  229. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-deeptime-defects.json +0 -0
  230. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-defects.json +0 -0
  231. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-enforcement-defects.json +0 -0
  232. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-eval-defects.json +0 -0
  233. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/rag-defects.json +0 -0
  234. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/react-defects.json +0 -0
  235. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/__init__.py +0 -0
  236. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/__main__.py +0 -0
  237. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/bootstrap.py +0 -0
  238. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/client.py +0 -0
  239. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/coexist.py +0 -0
  240. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/drift.py +0 -0
  241. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/ownership.py +0 -0
  242. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/dependabot.yml +0 -0
  243. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/okl-verify.yml +0 -0
  244. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/feature-spec.md +0 -0
  245. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/seed-from-docs.md +0 -0
  246. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/rules/example-area.md +0 -0
  247. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/skills/RECOMMENDED-COMPANIONS.md +0 -0
  248. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/skills/verify-before-claiming/SKILL.md +0 -0
  249. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/cases.jsonl +0 -0
  250. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-canon-size.sh +0 -0
  251. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-diagram-pairs.sh +0 -0
  252. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-doc-orphans.sh +0 -0
  253. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-links.sh +0 -0
  254. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-retractions.sh +0 -0
  255. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-tombstones.sh +0 -0
  256. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/run-gates.sh +0 -0
  257. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/hooks/hooks.json +0 -0
  258. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/README.md +0 -0
  259. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/architecture.md +0 -0
  260. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/messaging.md +0 -0
  261. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/performance-and-data.md +0 -0
  262. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/security.md +0 -0
  263. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/geospatial/README.md +0 -0
  264. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/README.md +0 -0
  265. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/fastapi-backend.md +0 -0
  266. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/project-structure.md +0 -0
  267. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/rag-pipeline.md +0 -0
  268. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/registries/tombstones.txt +0 -0
  269. {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/tests/conftest.py +0 -0
@@ -12,6 +12,8 @@ skills:
12
12
 
13
13
  You are a reviewer, not an implementer. You read the change and judge it against the encoded body —
14
14
  you do not rewrite it. Your output is a checklist verdict with specific file:line findings.
15
+ Needs the method kit that `okl scaffold .` installs (`registries/`, `.claude/rules/`, the
16
+ `encoding-loop` skill); where it is missing, say which checks you could not run.
15
17
 
16
18
  ## Before you start
17
19
  1. Run `okl check --task "<one-line summary of the change under review>"` and treat the returned
@@ -23,7 +25,7 @@ you do not rewrite it. Your output is a checklist verdict with specific file:lin
23
25
  with exactly one implementation and no test substitution and no concrete second impl on the
24
26
  roadmap? If so, flag it as speculative — the concrete class should be used directly.
25
27
  - **Assert-from-memory** — does any spec/config/scaffold claim something is "correct"/"valid"
26
- without a mechanical `validate` step? Flag it; this is the #14-class defect.
28
+ without a mechanical `validate` step? Flag it; this is the assert-from-memory defect class.
27
29
  - **Retracted claim restated** — does any prose restate a claim in `registries/RETRACTIONS.md`
28
30
  without also retracting it? Fail.
29
31
  - **Resurrected identifier** — does the diff reintroduce anything in `registries/tombstones.txt`? Fail.
@@ -0,0 +1,63 @@
1
+ ---
2
+ description: Turn what this session just learned (a decision, a convention, a bug fixed) into an okl lesson — drafted from the conversation, recorded after you confirm.
3
+ argument-hint: "[what to record, in your own words — optional]"
4
+ ---
5
+
6
+ # /record — add a lesson to the store from plain language
7
+
8
+ The person wants to keep something so the next session does not relearn it. They may
9
+ have said it in `$ARGUMENTS`; if that is empty, take it from the last few turns of this
10
+ conversation (the bug just fixed, the choice just made, the convention just followed).
11
+
12
+ ## 1. Draft it
13
+
14
+ Pick the type from what it is:
15
+
16
+ - **Decision** — chosen on purpose; should not be quietly reversed. Body starts `why:`.
17
+ - **Rule** — a convention. Needs a `symptom` (what an agent would see or do that should
18
+ trigger it) and a `fix` (what to do instead). Cause goes in `body`.
19
+ - **Defect** — a bug that was fixed. `symptom` is how it showed up, `fix` is the repair,
20
+ `body` is the cause.
21
+
22
+ Then fill in, from evidence in this session only:
23
+
24
+ - **id** — a short kebab-case key (`discount-single-use`). Reusing an id updates that
25
+ lesson; search first (`okl_search`) and reuse the id if this refines an existing one.
26
+ - **scope** — `repo` unless the lesson is true in every codebase that shares the store.
27
+ If unsure, `repo`.
28
+ - **files** — the files the lesson governs, if it governs specific code. This is what
29
+ makes `okl drift` notice when that code changes. Omit for pure decisions.
30
+ - **tags** — only from the vocabulary `okl_record` names; omit if none fits.
31
+ - **applies_to** — leave unset. Only set it if the lesson is *false* off one stack.
32
+
33
+ Do not invent a cause, a number or a file you have not seen in this session.
34
+
35
+ ## 2. Show it, then record it
36
+
37
+ Show the draft as a short block (type, id, scope, title, symptom → fix, files) and ask
38
+ the person to confirm or correct it. On a yes, record it with the `okl_record` MCP tool.
39
+ If that tool is not available, run the equivalent `okl record --type … --id … --scope …`
40
+ command instead.
41
+
42
+ ## 3. Decide how hard it must be enforced
43
+
44
+ Use the softest level that holds, and say which you chose:
45
+
46
+ - **Briefing only** — every lesson reaches the per-task briefing. Most need nothing more.
47
+ - **Watched by CI** — the lesson governs specific code (`files` is set). Offer to prove it
48
+ with a check that fails when the lesson is broken:
49
+
50
+ ```bash
51
+ okl verify <id> --run "<that check>" --expect "<text its passing output contains>"
52
+ ```
53
+
54
+ CI's drift gate then goes red when that code changes, until the check is re-run. Remind
55
+ the person to commit `okl-drift.json` after the verify. Never mark a lesson verified any
56
+ other way.
57
+ - **Build-breaking** — the same mistake has happened before, or it is costly when it
58
+ happens (security, data loss, a published number). Propose a test or CI check that
59
+ fails the build; a sterner lesson will not stop a repeat.
60
+ - **Always-on** — only if every session needs it regardless of task, propose a line for
61
+ `CLAUDE.md` / `AGENTS.md`. This is rare; the briefing already delivers the rest.
62
+
63
+ The `encoding-loop` skill has the full table.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # okl-fingerprint: sha256:5c21a4ef0db1d9f64175040ae313e04c97cf6008654c8941bd5864c946708867
2
+ # okl-fingerprint: sha256:330e6e866e80cbd1d07bb8c4425e9473e1df4e78126d01f9a1ea72eaf249783a
3
3
  # Stop hook — the write-side mechanical catch for the encoding loop.
4
4
  #
5
5
  # The read side (okl check) is enforced by the UserPromptSubmit hook; nothing enforced the WRITE
@@ -27,7 +27,23 @@ fi
27
27
  # the operator makes explicitly, never a fallback the hook takes on its own.
28
28
  case ",${OKL_DISABLED_HOOKS:-}," in *,encode,*) exit 0 ;; esac
29
29
 
30
- # Same resolver as pretooluse-okl-check.sh (env → pinned config → PATH → python3 -m okl);
30
+ # Not enrolled: step aside. okl's Claude Code plugin is installed per user, so these hooks
31
+ # run in EVERY repo the user opens, and most were never set up with `okl init`. There the
32
+ # pre-task hook blocked every prompt as "OKL NOT CONFIGURED" and the Stop hook asked
33
+ # "what did we learn?" of repos with no store to record into (found by a docs audit,
34
+ # 2026-09-29, before any user hit it). Only when Claude Code names the project: with no
35
+ # CLAUDE_PROJECT_DIR the hook cannot tell an unenrolled repo from a session that drifted
36
+ # out of an enrolled one, and fail-closed still wins there.
37
+ if [ -n "${CLAUDE_PROJECT_DIR:-}" ] && [ -z "${OKL_SERVICE_URL:-}${OKL_DATABASE_URL:-}" ]; then
38
+ enrolled=0; d="$PWD"
39
+ while [ "$d" != "/" ]; do
40
+ if [ -f "$d/.okl/config.json" ]; then enrolled=1; break; fi
41
+ d=$(dirname "$d")
42
+ done
43
+ [ "$enrolled" = 1 ] || exit 0
44
+ fi
45
+
46
+ # Same resolver as userpromptsubmit-okl-check.sh (env → pinned config → PATH → python3 -m okl);
31
47
  # the reminder is best-effort, so an unresolvable okl silently disables it rather than blocking.
32
48
  # A layer is used only if its command can actually run. A pinned path goes stale when the
33
49
  # venv that held it is recreated; running it anyway produced the shell's own "No such file
@@ -117,6 +133,15 @@ silently reversed? If yes, record it now. Three independent axes, each chosen de
117
133
  --id "<stable-key>" --title "..." --symptom "..." --body "cause: ..." --fix "..." \
118
134
  [--applies-to <stack>] # ONLY for a genuinely framework-bound lesson
119
135
 
136
+ Then decide how hard it must be enforced (softest that holds):
137
+ - Every lesson reaches the per-task briefing; most need nothing more.
138
+ - Governs specific code? Add --files "<paths>" and prove it:
139
+ okl verify <id> --run "<check that fails if broken>" --expect "<success text>"
140
+ CI's drift gate then goes red when that code changes.
141
+ - Broken more than once, or costly when broken? Propose a test or CI check that
142
+ fails the build, rather than a sterner lesson.
143
+ - Needed in every session regardless of task? Only then CLAUDE.md / AGENTS.md.
144
+
120
145
  --id is what makes the write idempotent, and leaving it off is the common mistake.
121
146
  Without it every record is minted a fresh random id, so the same lesson recorded in two
122
147
  sessions becomes two rows, which `okl dedup` will report but cannot remove: there is no
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # okl-fingerprint: sha256:cb169accaa93f9e91efb99027845847d17497de9c68e1b88d76dc7beef55780b
2
+ # okl-fingerprint: sha256:7bd1125f0adc50f1b805a80228727b54b093ec0b8c974a3d1da3838cab3f762b
3
3
  # UserPromptSubmit hook — inject the org's relevant lessons into the model's context
4
4
  # BEFORE it starts the task. This event is the only correct one for delivery: its stdout
5
5
  # (exit 0) is added to Claude's context, and its stdin carries the actual prompt text, so
@@ -32,6 +32,22 @@ fi
32
32
  # the operator makes explicitly, never a fallback the hook takes on its own.
33
33
  case ",${OKL_DISABLED_HOOKS:-}," in *,briefing,*) exit 0 ;; esac
34
34
 
35
+ # Not enrolled: step aside. okl's Claude Code plugin is installed per user, so these hooks
36
+ # run in EVERY repo the user opens, and most were never set up with `okl init`. There the
37
+ # pre-task hook blocked every prompt as "OKL NOT CONFIGURED" and the Stop hook asked
38
+ # "what did we learn?" of repos with no store to record into (found by a docs audit,
39
+ # 2026-09-29, before any user hit it). Only when Claude Code names the project: with no
40
+ # CLAUDE_PROJECT_DIR the hook cannot tell an unenrolled repo from a session that drifted
41
+ # out of an enrolled one, and fail-closed still wins there.
42
+ if [ -n "${CLAUDE_PROJECT_DIR:-}" ] && [ -z "${OKL_SERVICE_URL:-}${OKL_DATABASE_URL:-}" ]; then
43
+ enrolled=0; d="$PWD"
44
+ while [ "$d" != "/" ]; do
45
+ if [ -f "$d/.okl/config.json" ]; then enrolled=1; break; fi
46
+ d=$(dirname "$d")
47
+ done
48
+ [ "$enrolled" = 1 ] || exit 0
49
+ fi
50
+
35
51
  # Resolve how to invoke okl (env → pinned config → PATH → python3 -m okl); hooks run in
36
52
  # whatever environment the harness spawns, which often lacks the venv/pipx bin dir.
37
53
  # A layer is used only if its command can actually run. A pinned path goes stale when the
@@ -101,8 +117,18 @@ TASK="${OKL_TASK:-${prompt:-$(git log -1 --pretty=%s 2>/dev/null || echo 'genera
101
117
  # No guessable fallback path: a fixed name under /tmp could be pre-planted as a symlink by
102
118
  # another local user. Without a private temp file the reason is lost, not the check.
103
119
  errf=$(mktemp 2>/dev/null) || errf=""
104
- out=$($OKL check --task "$TASK" --format agent 2>"${errf:-/dev/null}")
120
+ # --format hook: the briefing for the model's context plus one line the person can see,
121
+ # as the JSON Claude Code reads from a UserPromptSubmit hook. Without that line nobody
122
+ # could tell okl helping from okl doing nothing.
123
+ out=$($OKL check --task "$TASK" --format hook 2>"${errf:-/dev/null}")
105
124
  rc=$? # read here: after an if-block, $? is the if's own status, not okl's
125
+ if [ "$rc" -eq 2 ] && [ -n "$errf" ] && grep -q "invalid choice" "$errf" 2>/dev/null; then
126
+ # An okl older than this hook has no --format hook. The plugin updates from main and the
127
+ # CLI only when upgraded, so the two can differ: brief the old way rather than block.
128
+ : > "$errf"
129
+ out=$($OKL check --task "$TASK" --format agent 2>"${errf:-/dev/null}")
130
+ rc=$?
131
+ fi
106
132
  if [ "$rc" -eq 0 ]; then
107
133
  [ -n "$errf" ] && rm -f "$errf"
108
134
  printf '%s\n' "$out" # stdout → the model's context
@@ -16,7 +16,7 @@ A trigger surfaced a candidate rule. The response is always the same two moves.
16
16
  | 2 | `.claude/rules/<area>.md` with `paths:` glob | scoped to a file category (loads only in context) |
17
17
  | 3 | `.claude/skills/` or `.claude/commands/` | a multi-step procedure with real logic |
18
18
  | 4 | `.coderabbit.yaml` path_instructions / `architecture-reviewer` checklist | catch at PR-review time |
19
- | 5 | a gate in `gates/` + CI | mechanical, build-breaking — for rules that keep being broken |
19
+ | 5 | a test or a CI check (`gates/` if you ran `okl scaffold`) | mechanical, build-breaking — for rules that keep being broken |
20
20
 
21
21
  Default to the *softest* surface that could hold the rule. **Promote down (toward 5) only as it
22
22
  earns it** — a rule that keeps being violated moves to a sterner tier, not a sterner paragraph.
@@ -40,12 +40,16 @@ okl verify <stable-key> --run "<a check that fails if the lesson is broken>" --e
40
40
  reports but cannot remove, there being no delete subcommand. Where a repo keeps its lessons in
41
41
  a seed file, use the id that file derives, `seed:<seed-file-stem>:<key>`, so a later
42
42
  `okl seed` upserts the same row.
43
+ - **`--files`** — the code the lesson governs. With it, and once `okl verify` has passed,
44
+ CI's drift gate goes red whenever that code changes until the check is re-run. This is
45
+ what sits between tier 1 and a gate: watched, but not build-breaking on its own.
43
46
  - **`scope=org`** — a fact about the world: prior art, an API contract, a data-source gotcha, a
44
47
  portable gate. It will surface in every connected repo's `okl check`.
45
48
  - **`scope=repo`** — a quirk true only of this codebase. Stays local.
46
49
 
47
50
  If the finding retracts a prior claim, also add it to `registries/RETRACTIONS.md`; if it retires an
48
- identifier, add it to `registries/tombstones.txt`. The CI gates then fail any doc that contradicts.
51
+ identifier, add it to `registries/tombstones.txt`. The CI gates then fail any doc that restates
52
+ the quoted retracted claim verbatim, or reintroduces the tombstoned identifier.
49
53
 
50
54
  ## 3. Verify the gate (if you made one)
51
55
 
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "okl",
11
11
  "source": "./",
12
- "description": "Observed Knowledge Ledger: the pre-task briefing and end-of-session hooks, MCP tools and seeding commands. Requires the okl CLI (pipx install 'observed-knowledge-ledger[mcp]')."
12
+ "description": "Observed Knowledge Ledger: the pre-task briefing and end-of-session hooks, MCP tools and seeding commands. Requires the okl CLI (pipx install 'observed-knowledge-ledger[mcp]') and `okl init` in each repo to brief (or OKL_SERVICE_URL); repos without it are left alone."
13
13
  }
14
14
  ]
15
15
  }
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "okl",
3
- "version": "0.7.2",
4
- "description": "Observed Knowledge Ledger: lessons your coding agents can trust. A pre-task briefing hook, an end-of-session 'what did we learn?' hook, the okl MCP tools, and the seeding commands. Needs the okl CLI with the MCP extra: pipx install 'observed-knowledge-ledger[mcp]'",
3
+ "version": "0.7.4",
4
+ "description": "Observed Knowledge Ledger: lessons your coding agents can trust. A pre-task briefing hook, an end-of-session 'what did we learn?' hook, the okl MCP tools, the /record and seeding commands, and the encoding-loop skill. Needs the okl CLI (pipx install 'observed-knowledge-ledger[mcp]'), and `okl init` in each repo to brief (or OKL_SERVICE_URL); repos without it are left alone.",
5
5
  "author": { "name": "Joshua Dell", "url": "https://github.com/emeraldleaf/okl" },
6
6
  "hooks": "./hooks/hooks.json",
7
7
  "mcpServers": "./.mcp.json",
8
8
  "commands": [
9
9
  "./src/okl/scaffold/claude/commands/check-rules.md",
10
+ "./src/okl/scaffold/claude/commands/record.md",
10
11
  "./src/okl/scaffold/claude/commands/seed-from-codebase.md",
11
12
  "./src/okl/scaffold/claude/commands/seed-from-docs.md"
12
13
  ],
14
+ "skills": ["./src/okl/scaffold/claude/skills/encoding-loop"],
13
15
  "agents": ["./src/okl/scaffold/claude/agents/architecture-reviewer.md"]
14
16
  }
@@ -21,3 +21,6 @@ e2e/
21
21
  .github/instructions/codacy.instructions.md
22
22
  okl.db-wal
23
23
  okl.db-shm
24
+
25
+ # test output
26
+ .coverage
@@ -27,8 +27,7 @@ and editing `KNOWN_TAGS` changes the floor every store ships with.
27
27
  verification left uncommitted fails CI. Verifying before the code commit re-drifts.
28
28
  Give a rule `--files` only when CI does not already run its check (#39).
29
29
  - The local store (`.okl/okl.db`, gitignored) should hold all 11 seed files plus
30
- recorded nodes; `okl seed seed/` loads the `*-defects.json` set, while
31
- `dotnet-{canon,decisions,review-surfaces}.json` and `frontend-canon.json` load explicitly.
30
+ recorded nodes; `okl seed seed/` (or `okl seed --all`) loads all 11 packs.
32
31
 
33
32
  ## Commands
34
33
 
@@ -44,7 +43,8 @@ okl drift # rules whose governed source changed after v
44
43
  - **Mirror files are byte-identical, test-enforced**: `ci/okl-verify.yml` ==
45
44
  `.github/workflows/okl-verify.yml` == `src/okl/scaffold/ci/okl-verify.yml`,
46
45
  `hooks/*.sh` == `src/okl/scaffold/hooks/*.sh`, and
47
- `gates/*.sh` == `src/okl/scaffold/gates/*.sh`. The scaffold copies are what consumers
46
+ `gates/*.sh` == `src/okl/scaffold/gates/*.sh`; `.claude/hooks`, `.claude/commands/record.md`
47
+ and `.claude/skills/encoding-loop` mirror theirs too. The scaffold copies are what consumers
48
48
  receive; the repo copies are the dogfood. Edit ONE, copy to the others in the same
49
49
  change — `tests/test_scaffold.py::test_mirror_files_identical` fails otherwise.
50
50
  - **ruff `E702` is ignored deliberately** (semicolon one-liners): the tests use a
@@ -67,7 +67,7 @@ okl drift # rules whose governed source changed after v
67
67
 
68
68
  `src/okl/` is the package (store/core/client/cli/service/mcp + scaffold templates);
69
69
  `seed/` is the curated 161-node corpus (real lessons, real project names — deliberate);
70
- `evals/` is the A/B harness and receipts; `docs/posts/` is the 3-part write-up;
70
+ `evals/` is the A/B harness and receipts; `docs/posts/` is the 4-part write-up;
71
71
  `e2e/` (gitignored) holds scratch repos for end-to-end loop tests.
72
72
 
73
73
  This file stays lean — always-on rules only. Everything conditionally relevant belongs
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.4
4
+
5
+ - **`okl verify` / `okl reverify` treat a timeout as a failed check.** A check that
6
+ outlived `--timeout` raised an uncaught error, so `okl reverify` stopped in a traceback
7
+ and every later lesson went unchecked.
8
+ - **`okl_search` results lead with the lesson id**, so an agent can pass it to
9
+ `okl_record` to update the lesson instead of adding a near-duplicate.
10
+ - `.coverage` is no longer tracked.
11
+
12
+ ## 0.7.3
13
+
14
+ - **A first run that works with no choices.** `okl init` detects the stack and sets
15
+ interests from it, and seeds an empty local store with 20 portable starter lessons plus
16
+ the bundled packs for that stack, so the first prompt is briefed. `--no-seed` opts out.
17
+ Starter lessons are references into the packs, so importing a full pack later updates
18
+ the same rows.
19
+ - **You can see okl working.** Each briefed prompt shows one line, *okl · briefed N
20
+ lesson(s): …*, via `okl check --format hook`; `OKL_QUIET=1` hides it. The hook falls back
21
+ to the plain briefing if the installed okl predates the format.
22
+ - **Record by saying it.** The `okl_record` MCP tool takes `id` (re-recording updates the
23
+ lesson) and `applies_to`, so any MCP agent can record what the CLI can; a new `/record`
24
+ command drafts a lesson from the conversation and records it once you confirm. The
25
+ getting-started guide leads with this, covers other agents, and keeps the CLI as the
26
+ mechanism underneath.
27
+ - **Choosing how hard to enforce a lesson.** The Stop hook's question, `/record` and the
28
+ guide now walk the same levels — briefing only, watched by CI (`--files` + `okl verify`),
29
+ build-breaking (a test or CI check), always-on (`CLAUDE.md`/`AGENTS.md`) — and the plugin
30
+ now ships the `encoding-loop` skill that holds the full table.
31
+ - **`okl reverify`** re-runs the stored check of every drifted lesson after listing the
32
+ commands and getting a confirmation (or `--yes`).
33
+ - **`okl verify` creates `okl-drift.json`** the first time a lesson that governs files is
34
+ verified, so there is no separate export step.
35
+ - **The plugin's hooks step aside in repos never set up with `okl init`**; Decisions reach
36
+ the briefing; the service keeps `applies_to`; a getting-started guide
37
+ (docs/GETTING-STARTED.md); a docs audit's ~74 corrections; clean example re-runs.
38
+
3
39
  ## 0.7.2
4
40
 
5
41
  - **`okl record --verified` is refused.** It stamped a lesson verified with no evidence,
@@ -27,8 +27,7 @@ and editing `KNOWN_TAGS` changes the floor every store ships with.
27
27
  verification left uncommitted fails CI. Verifying before the code commit re-drifts.
28
28
  Give a rule `--files` only when CI does not already run its check (#39).
29
29
  - The local store (`.okl/okl.db`, gitignored) should hold all 11 seed files plus
30
- recorded nodes; `okl seed seed/` loads the `*-defects.json` set, while
31
- `dotnet-{canon,decisions,review-surfaces}.json` and `frontend-canon.json` load explicitly.
30
+ recorded nodes; `okl seed seed/` (or `okl seed --all`) loads all 11 packs.
32
31
 
33
32
  ## Commands
34
33
 
@@ -44,7 +43,8 @@ okl drift # rules whose governed source changed after v
44
43
  - **Mirror files are byte-identical, test-enforced**: `ci/okl-verify.yml` ==
45
44
  `.github/workflows/okl-verify.yml` == `src/okl/scaffold/ci/okl-verify.yml`,
46
45
  `hooks/*.sh` == `src/okl/scaffold/hooks/*.sh`, and
47
- `gates/*.sh` == `src/okl/scaffold/gates/*.sh`. The scaffold copies are what consumers
46
+ `gates/*.sh` == `src/okl/scaffold/gates/*.sh`; `.claude/hooks`, `.claude/commands/record.md`
47
+ and `.claude/skills/encoding-loop` mirror theirs too. The scaffold copies are what consumers
48
48
  receive; the repo copies are the dogfood. Edit ONE, copy to the others in the same
49
49
  change — `tests/test_scaffold.py::test_mirror_files_identical` fails otherwise.
50
50
  - **ruff `E702` is ignored deliberately** (semicolon one-liners): the tests use a
@@ -67,7 +67,7 @@ okl drift # rules whose governed source changed after v
67
67
 
68
68
  `src/okl/` is the package (store/core/client/cli/service/mcp + scaffold templates);
69
69
  `seed/` is the curated 161-node corpus (real lessons, real project names — deliberate);
70
- `evals/` is the A/B harness and receipts; `docs/posts/` is the 3-part write-up;
70
+ `evals/` is the A/B harness and receipts; `docs/posts/` is the 4-part write-up;
71
71
  `e2e/` (gitignored) holds scratch repos for end-to-end loop tests.
72
72
 
73
73
  This file stays lean — always-on rules only. Everything conditionally relevant belongs
@@ -17,7 +17,7 @@ Try it end to end in a scratch directory before changing anything:
17
17
  ```bash
18
18
  mkdir /tmp/try && cd /tmp/try && git init
19
19
  okl init --repo try --interests security
20
- okl seed
20
+ okl seed dotnet-defects # bare `okl seed` only lists the packs
21
21
  okl check --task "add an endpoint that returns an order for the logged-in user"
22
22
  ```
23
23
 
@@ -27,9 +27,15 @@ Read [CLAUDE.md](CLAUDE.md) (identical to AGENTS.md) before a first PR. It is sh
27
27
  it is the actual contract. The parts that will fail your build if you miss them:
28
28
 
29
29
  - **Mirror files are byte-identical.** `ci/okl-verify.yml`, `.github/workflows/okl-verify.yml`
30
- and `src/okl/scaffold/ci/okl-verify.yml` must match, as must `hooks/*.sh` and their
31
- `src/okl/scaffold/hooks/` twins. Edit one, copy to the others in the same change.
32
- `tests/test_scaffold.py::test_mirror_files_identical` enforces it.
30
+ and `src/okl/scaffold/ci/okl-verify.yml` must match, as must `hooks/*.sh` and
31
+ `hooks/hooks.json` and their `src/okl/scaffold/hooks/` twins, `gates/*.sh` and their
32
+ `src/okl/scaffold/gates/` twins, and `CLAUDE.md` and `AGENTS.md`. Edit one, copy to the
33
+ others in the same change. `tests/test_scaffold.py::test_mirror_files_identical`
34
+ enforces it.
35
+ - **CI runs more than the tests.** `ruff check .`, `mypy src/okl`, `pytest -q --cov=okl`
36
+ (the coverage floor is `fail_under` in `pyproject.toml`, currently 66%),
37
+ `./ci/check-diagram-figures.sh` and `bash gates/run-gates.sh` all gate the build; see
38
+ `.github/workflows/ci.yml`. Run them locally before pushing.
33
39
  - **The `okl-verify` check can fail on your PR, and that is not yours to fix.** CI reads
34
40
  the committed `okl-drift.json`: the rules that govern files, and when each was last
35
41
  verified. Change a governed file and CI names the rules that need re-checking. The
@@ -52,8 +58,10 @@ it is the actual contract. The parts that will fail your build if you miss them:
52
58
  commit keeps the branch's commits and their times; a squash or rebase creates new
53
59
  commits stamped at merge time, which makes every rule the PR touched look stale and
54
60
  turns `main` red. Do not re-enable them without changing how drift reads time.
55
- - **Tags come from a closed vocabulary** (`store.KNOWN_TAGS`). Growing it is a deliberate
56
- edit to that set plus a note in the tags ADR, not an ad-hoc string.
61
+ - **Tags come from a closed vocabulary** (`store.KNOWN_TAGS`), never an ad-hoc string.
62
+ A store can declare a tag for itself with
63
+ `okl record --type Vocabulary --scope org --title <tag>`. Editing `KNOWN_TAGS`, plus a
64
+ note in the tags ADR, is for a tag every store should ship with.
57
65
  - **Evaluation claims need a committed receipt.** If you change the harness or quote a
58
66
  number, the run that produced it belongs in `evals/results/`. Never cite a run the
59
67
  harness marked RESULTS NOT USABLE.
@@ -62,9 +70,9 @@ it is the actual contract. The parts that will fail your build if you miss them:
62
70
 
63
71
  - **Bug reports with a reproduction.** Especially anything where the tool reports success
64
72
  it did not earn; that class of defect is the project's whole subject.
65
- - **The open work in the store.** `okl check --task "improve retrieval precision"` will
66
- show you the recorded defects against the tool itself, including the briefing relevance
67
- cutoff that is still unfinished.
73
+ - **The known gaps.** They are tracked as
74
+ [GitHub issues](https://github.com/emeraldleaf/okl/issues); the maintainer's store is
75
+ not in the repo (`.okl/` is gitignored), so a clone has no recorded defects to query.
68
76
  - **Portability fixes.** Hooks, path resolution, and CI have been exercised on macOS and
69
77
  GitHub Actions and nowhere else.
70
78
  - **Hook wiring for another agent.** `okl init` auto-registers hooks for Claude Code