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.
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agents/architecture-reviewer.md +3 -1
- observed_knowledge_ledger-0.7.4/.claude/commands/record.md +63 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/hooks/stop-okl-encode.sh +27 -2
- {observed_knowledge_ledger-0.7.2/src/okl/scaffold → observed_knowledge_ledger-0.7.4/.claude}/hooks/userpromptsubmit-okl-check.sh +28 -2
- {observed_knowledge_ledger-0.7.2/src/okl/scaffold/claude → observed_knowledge_ledger-0.7.4/.claude}/skills/encoding-loop/SKILL.md +6 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/marketplace.json +1 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/plugin.json +4 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.gitignore +3 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/AGENTS.md +4 -4
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CHANGELOG.md +36 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CLAUDE.md +4 -4
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/CONTRIBUTING.md +17 -9
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/PKG-INFO +174 -89
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/README.md +173 -88
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/SECURITY.md +17 -7
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/review-agent.sh +3 -3
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/DEPLOY.md +3 -3
- observed_knowledge_ledger-0.7.4/docs/GETTING-STARTED.md +317 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/decisions/2026-07-17-flat-retrieval-until-scale.md +7 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/decisions/2026-07-21-subject-tags-controlled-vocabulary.md +3 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/okl-how-it-works.excalidraw +20 -20
- observed_knowledge_ledger-0.7.4/docs/okl-how-it-works.svg +2 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/okl-retrieval-pipeline.svg +5 -5
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/01-memory-that-outlives-the-run.md +1 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/02-dont-let-a-step-grade-itself.md +2 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/render_pipeline_diagram.py +5 -5
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/README.md +23 -6
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/REPORT.md +3 -3
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/README.md +23 -18
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-briefed.patch +75 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-control.patch +72 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/session-briefed.txt +13 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/idor_endpoint/session-control.txt +16 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/diff-briefed.patch +76 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/price_tamper/diff-control.patch +13 -16
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/session-briefed.txt +13 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/price_tamper/session-control.txt +10 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/diff-briefed.patch +103 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/rate_limiter/diff-control.patch +8 -12
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/session-briefed.txt +12 -0
- observed_knowledge_ledger-0.7.4/examples/dotnet-minimal-api/receipts/rate_limiter/session-control.txt +5 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/run_demo.sh +8 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Program.cs +2 -4
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/README.md +57 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/app/__init__.py +4 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/pyproject.toml +1 -1
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/diff-briefed.patch +17 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/idor_endpoint/diff-control.patch +2 -2
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/session-briefed.txt +5 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/idor_endpoint/session-control.txt +5 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/diff-briefed.patch +106 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/diff-control.patch +53 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/session-briefed.txt +12 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/price_tamper/session-control.txt +7 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/arms.txt +2 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/diff-briefed.patch +52 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/diff-control.patch +55 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/session-briefed.txt +12 -0
- observed_knowledge_ledger-0.7.4/examples/python-fastapi/receipts/rate_limiter/session-control.txt +16 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/run_demo.sh +8 -2
- {observed_knowledge_ledger-0.7.2/src/okl/scaffold → observed_knowledge_ledger-0.7.4}/hooks/stop-okl-encode.sh +27 -2
- {observed_knowledge_ledger-0.7.2/.claude → observed_knowledge_ledger-0.7.4}/hooks/userpromptsubmit-okl-check.sh +28 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/okl-drift.json +63 -18
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/pyproject.toml +1 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/cli.py +246 -35
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/core.py +33 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/mcp_server.py +18 -6
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/MANIFEST.md +12 -8
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/method-gates.yml +18 -6
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/review-agent.sh +3 -3
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/agents/architecture-reviewer.md +3 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/check-rules.md +9 -5
- observed_knowledge_ledger-0.7.4/src/okl/scaffold/claude/commands/record.md +63 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/seed-from-codebase.md +2 -2
- observed_knowledge_ledger-0.7.4/src/okl/scaffold/claude/skills/encoding-loop/SKILL.md +63 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/README.md +9 -4
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/run_evals.py +11 -3
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4/src/okl/scaffold}/hooks/stop-okl-encode.sh +27 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4/src/okl/scaffold}/hooks/userpromptsubmit-okl-check.sh +28 -2
- observed_knowledge_ledger-0.7.4/src/okl/scaffold/plugin/plugin.json +9 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/geospatial/rules/geospatial-ml.md +1 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/react/README.md +2 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/react/rules/frontend.md +2 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/registries/RETRACTIONS.md +2 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/root/CLAUDE.md +2 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/root/METHOD.md +2 -2
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold_cmd.py +3 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/seed.py +34 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/service.py +13 -1
- observed_knowledge_ledger-0.7.4/src/okl/starter.json +85 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/store.py +1 -1
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/tests/test_okl.py +271 -5
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/tests/test_scaffold.py +92 -1
- observed_knowledge_ledger-0.7.2/.coverage +0 -0
- observed_knowledge_ledger-0.7.2/docs/okl-how-it-works.svg +0 -2
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-briefed.patch +0 -60
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/diff-control.patch +0 -61
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/session-briefed.txt +0 -10
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/idor_endpoint/session-control.txt +0 -17
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/diff-briefed.patch +0 -103
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/session-briefed.txt +0 -10
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/price_tamper/session-control.txt +0 -21
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/diff-briefed.patch +0 -144
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/session-briefed.txt +0 -13
- observed_knowledge_ledger-0.7.2/examples/dotnet-minimal-api/receipts/rate_limiter/session-control.txt +0 -17
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/README.md +0 -55
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/app/__init__.py +0 -6
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/diff-briefed.patch +0 -58
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/session-briefed.txt +0 -5
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/idor_endpoint/session-control.txt +0 -1
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/diff-briefed.patch +0 -99
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/diff-control.patch +0 -90
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/session-briefed.txt +0 -13
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/price_tamper/session-control.txt +0 -10
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/diff-briefed.patch +0 -120
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/diff-control.patch +0 -56
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/session-briefed.txt +0 -12
- observed_knowledge_ledger-0.7.2/examples/python-fastapi/receipts/rate_limiter/session-control.txt +0 -11
- observed_knowledge_ledger-0.7.2/src/okl/scaffold/plugin/plugin.json +0 -10
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agent-memory/architecture-reviewer/MEMORY.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/agent-memory/architecture-reviewer/review_findings_log.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/settings.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/dependabot.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/pull_request_template.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/ci.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/okl-verify.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.github/workflows/publish.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.mcp.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/LICENSE +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/check-diagram-figures.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/ci/okl-verify.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/docs/posts/03-enforcement-or-good-intentions.md +0 -0
- {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
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/ab_harness.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/layout_preflight.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/preflight.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260829-2300.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260829-2315.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260830-0003.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260830-0148.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260901-0133.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260901-1238.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260902-0538.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260902-1216.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-0157.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-0308.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-1214.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260903-1323.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/ab-20260926-0528.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/briefed-userpromptsubmit-lint.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/control-lint.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/hook.log +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/service-record-500.log +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-briefed-pretooluse.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-briefed-userpromptsubmit.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260830/session-control.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/briefed-lint-after-loop.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/briefed-lint.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/command.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/okl-drift-scratch.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-briefed.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-control.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/session-envtest.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-briefed.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-control.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926/transcript-envtest.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/session-plugin.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260926-plugin/transcript-plugin.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/captured-tool-uses.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/doctor.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/session-task.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/transcript-smoke.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/transcript-task.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-coexist/worker-log-excerpt.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/doctor-in-okl-repo.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/session.txt +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-control-main-hook.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-probe-last.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript-rerun-live.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/results/e2e-20260927-marketplace/transcript.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/evals/tasks.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/.gitignore +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/OrdersApi.slnx +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/idor_endpoint/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/price_tamper/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/receipts/rate_limiter/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/OrdersApi.csproj +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Properties/launchSettings.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/Store.cs +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/appsettings.Development.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/src/appsettings.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tasks.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tests/ApiTests.cs +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/dotnet-minimal-api/tests/OrdersApi.Tests.csproj +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/app/main.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/app/store.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/idor_endpoint/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/price_tamper/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/receipts/rate_limiter/briefing.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/tasks.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/examples/python-fastapi/tests/test_app.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-canon-size.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-diagram-pairs.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-doc-orphans.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-links.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-retractions.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/check-tombstones.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/gates/run-gates.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/hooks/hooks.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/packaging/org-knowledge-layer/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/packaging/org-knowledge-layer/pyproject.toml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-canon.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-decisions.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/dotnet-review-surfaces.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/frontend-canon.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-deeptime-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-enforcement-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/geospatial-eval-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/rag-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/seed/react-defects.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/__init__.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/__main__.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/bootstrap.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/client.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/coexist.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/drift.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/ownership.py +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/dependabot.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/ci/okl-verify.yml +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/feature-spec.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/commands/seed-from-docs.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/rules/example-area.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/skills/RECOMMENDED-COMPANIONS.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/claude/skills/verify-before-claiming/SKILL.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/evals/cases.jsonl +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-canon-size.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-diagram-pairs.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-doc-orphans.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-links.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-retractions.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/check-tombstones.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/gates/run-gates.sh +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/hooks/hooks.json +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/architecture.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/messaging.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/performance-and-data.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/dotnet/rules/security.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/geospatial/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/README.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/fastapi-backend.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/project-structure.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/profiles/python-rag/rules/rag-pipeline.md +0 -0
- {observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/src/okl/scaffold/registries/tombstones.txt +0 -0
- {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
|
|
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.
|
{observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude/hooks/stop-okl-encode.sh
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# okl-fingerprint: sha256:
|
|
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
|
-
#
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
{observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/marketplace.json
RENAMED
|
@@ -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
|
}
|
{observed_knowledge_ledger-0.7.2 → observed_knowledge_ledger-0.7.4}/.claude-plugin/plugin.json
RENAMED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "okl",
|
|
3
|
-
"version": "0.7.
|
|
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
|
|
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
|
}
|
|
@@ -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/`
|
|
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`.
|
|
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
|
|
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/`
|
|
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`.
|
|
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
|
|
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
|
|
31
|
-
`src/okl/scaffold/hooks/` twins
|
|
32
|
-
`
|
|
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`)
|
|
56
|
-
|
|
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
|
|
66
|
-
|
|
67
|
-
|
|
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
|