coherence-cli 0.4.1__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. coherence_cli-0.5.0/.eidetic/memory/coherence-cli__public.jsonl +7 -0
  2. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.gitignore +5 -0
  3. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.markdownlint-cli2.yaml +3 -0
  4. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/CHANGELOG.md +11 -0
  5. coherence_cli-0.5.0/PKG-INFO +170 -0
  6. coherence_cli-0.5.0/README.md +151 -0
  7. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/__init__.py +2 -0
  8. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/learn.py +6 -0
  9. coherence_cli-0.5.0/coherence/cli/_commands/meaning.py +264 -0
  10. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/overview.py +2 -0
  11. coherence_cli-0.5.0/coherence/explain/catalog.py +251 -0
  12. coherence_cli-0.5.0/coherence/meaning/__init__.py +12 -0
  13. coherence_cli-0.5.0/coherence/meaning/anchors/affordance.high.txt +5 -0
  14. coherence_cli-0.5.0/coherence/meaning/anchors/affordance.low.txt +5 -0
  15. coherence_cli-0.5.0/coherence/meaning/anchors/agency.high.txt +5 -0
  16. coherence_cli-0.5.0/coherence/meaning/anchors/agency.low.txt +5 -0
  17. coherence_cli-0.5.0/coherence/meaning/anchors/causality.high.txt +5 -0
  18. coherence_cli-0.5.0/coherence/meaning/anchors/causality.low.txt +5 -0
  19. coherence_cli-0.5.0/coherence/meaning/anchors/consequence.high.txt +5 -0
  20. coherence_cli-0.5.0/coherence/meaning/anchors/consequence.low.txt +5 -0
  21. coherence_cli-0.5.0/coherence/meaning/anchors/future_constraint.high.txt +5 -0
  22. coherence_cli-0.5.0/coherence/meaning/anchors/future_constraint.low.txt +5 -0
  23. coherence_cli-0.5.0/coherence/meaning/anchors/meaning.high.txt +6 -0
  24. coherence_cli-0.5.0/coherence/meaning/anchors/meaning.low.txt +6 -0
  25. coherence_cli-0.5.0/coherence/meaning/axis.py +137 -0
  26. coherence_cli-0.5.0/coherence/meaning/compare.py +88 -0
  27. coherence_cli-0.5.0/coherence/meaning/diagnostics.py +171 -0
  28. coherence_cli-0.5.0/coherence/meaning/embed.py +137 -0
  29. coherence_cli-0.5.0/coherence/meaning/score.py +147 -0
  30. coherence_cli-0.5.0/coherence/meaning/trend.py +267 -0
  31. coherence_cli-0.5.0/docs/meaning-gradient-live-tests.md +155 -0
  32. coherence_cli-0.5.0/examples/experiments/issue-priority.yaml +91 -0
  33. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/pyproject.toml +5 -2
  34. coherence_cli-0.5.0/scripts/refresh_meaning_vectors.py +110 -0
  35. coherence_cli-0.5.0/tests/_meaning_recorded.py +68 -0
  36. coherence_cli-0.5.0/tests/_meaning_synthetic.py +31 -0
  37. coherence_cli-0.5.0/tests/conftest.py +46 -0
  38. coherence_cli-0.5.0/tests/fixtures/meaning/auth_middleware.high.txt +1 -0
  39. coherence_cli-0.5.0/tests/fixtures/meaning/auth_middleware.low.txt +1 -0
  40. coherence_cli-0.5.0/tests/fixtures/meaning/cache_stampede.high.txt +1 -0
  41. coherence_cli-0.5.0/tests/fixtures/meaning/cache_stampede.low.txt +1 -0
  42. coherence_cli-0.5.0/tests/fixtures/meaning/db_migration.high.txt +1 -0
  43. coherence_cli-0.5.0/tests/fixtures/meaning/db_migration.low.txt +1 -0
  44. coherence_cli-0.5.0/tests/fixtures/meaning/payment_webhook.high.txt +1 -0
  45. coherence_cli-0.5.0/tests/fixtures/meaning/payment_webhook.low.txt +1 -0
  46. coherence_cli-0.5.0/tests/fixtures/meaning/recorded_vectors.json +73874 -0
  47. coherence_cli-0.5.0/tests/fixtures/meaning/series/v1.txt +1 -0
  48. coherence_cli-0.5.0/tests/fixtures/meaning/series/v2.txt +1 -0
  49. coherence_cli-0.5.0/tests/fixtures/meaning/series/v3.txt +1 -0
  50. coherence_cli-0.5.0/tests/test_meaning_axis.py +166 -0
  51. coherence_cli-0.5.0/tests/test_meaning_cli.py +350 -0
  52. coherence_cli-0.5.0/tests/test_meaning_compare.py +250 -0
  53. coherence_cli-0.5.0/tests/test_meaning_diagnostics.py +138 -0
  54. coherence_cli-0.5.0/tests/test_meaning_embed.py +209 -0
  55. coherence_cli-0.5.0/tests/test_meaning_example_config.py +61 -0
  56. coherence_cli-0.5.0/tests/test_meaning_experiment_features.py +59 -0
  57. coherence_cli-0.5.0/tests/test_meaning_ordering.py +86 -0
  58. coherence_cli-0.5.0/tests/test_meaning_scaffold.py +28 -0
  59. coherence_cli-0.5.0/tests/test_meaning_schema.py +232 -0
  60. coherence_cli-0.5.0/tests/test_meaning_score.py +255 -0
  61. coherence_cli-0.5.0/tests/test_meaning_trend.py +314 -0
  62. coherence_cli-0.5.0/tests/test_refresh_vectors.py +67 -0
  63. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/uv.lock +137 -1
  64. coherence_cli-0.4.1/.eidetic/memory/coherence-cli__public.jsonl +0 -1
  65. coherence_cli-0.4.1/PKG-INFO +0 -75
  66. coherence_cli-0.4.1/README.md +0 -58
  67. coherence_cli-0.4.1/coherence/explain/catalog.py +0 -130
  68. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/agent-config/SKILL.md +0 -0
  69. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  70. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
  71. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
  72. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  73. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  74. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  75. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  76. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  77. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  78. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/SKILL.md +0 -0
  79. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  80. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  81. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  82. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  83. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  84. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/SKILL.md +0 -0
  85. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  86. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  87. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  88. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  89. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  90. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  91. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  92. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  93. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  94. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  95. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/recall/SKILL.md +0 -0
  96. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/recall/scripts/recall.sh +0 -0
  97. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/remember/SKILL.md +0 -0
  98. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/remember/scripts/remember.sh +0 -0
  99. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/run-tests/SKILL.md +0 -0
  100. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  101. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  102. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  103. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  104. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  105. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/think/SKILL.md +0 -0
  106. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/think/scripts/think.sh +0 -0
  107. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/version-bump/SKILL.md +0 -0
  108. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  109. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.claude/skills.local.yaml.example +0 -0
  110. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.devague/current +0 -0
  111. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.devague/current_plan +0 -0
  112. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.devague/frames/coherence-cli-ships-meaning-gradient-as-a-measurab.json +0 -0
  113. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.devague/plans/coherence-cli-ships-meaning-gradient-as-a-measurab.json +0 -0
  114. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.flake8 +0 -0
  115. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.github/workflows/publish.yml +0 -0
  116. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/.github/workflows/tests.yml +0 -0
  117. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/CLAUDE.md +0 -0
  118. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/LICENSE +0 -0
  119. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/__init__.py +0 -0
  120. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/__main__.py +0 -0
  121. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/__init__.py +0 -0
  122. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/cli.py +0 -0
  123. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/doctor.py +0 -0
  124. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/explain.py +0 -0
  125. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_commands/whoami.py +0 -0
  126. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_errors.py +0 -0
  127. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/cli/_output.py +0 -0
  128. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/coherence/explain/__init__.py +0 -0
  129. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/culture.yaml +0 -0
  130. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/docs/plans/2026-07-04-coherence-cli-ships-meaning-gradient-as-a-measurab.md +0 -0
  131. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/docs/skill-sources.md +0 -0
  132. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/docs/specs/2026-07-04-coherence-cli-ships-meaning-gradient-as-a-measurab.md +0 -0
  133. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/sonar-project.properties +0 -0
  134. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/tests/__init__.py +0 -0
  135. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/tests/test_cli.py +0 -0
  136. {coherence_cli-0.4.1 → coherence_cli-0.5.0}/tests/test_cli_introspection.py +0 -0
@@ -0,0 +1,7 @@
1
+ {"id": "devague-converge-gate-all-claims", "hash": "84fd98b0e0d94229ece87b13a1ff64e9d2a04223daed7b036c019b0e6cb388fc", "content": "devague converge gate: the rule \"a confirmed honesty condition on every spec-affecting claim\" covers ALL core frame claims \u2014 audience, before_state, after_state, why_it_matters, boundary, success_signal \u2014 not just kind=requirement claims. Interrogate + confirm a condition on each, or converge fails with one gap per frame claim. Also: devague auto-adds .devague/reviews/ to .gitignore on first review; frames + specs are committed, review artifacts are working state. (Learned scoping coherence-cli issue #4, 2026-07-04.)", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"source": "coherence-cli spec session", "topic": "devague usage", "date": "2026-07-04"}, "created": "2026-07-04T07:21:59.005289+00:00", "last_recall": null, "recall_count": 0, "links": [], "supersedes": null, "lifecycle": "active", "added_by": null}}
2
+ {"id": "meaning-gradient-continuation-2026-07-04", "hash": "7e590a120f07f1dfe9bad3d76d14115ac4fa28099beabfcec03c29c90672e847", "content": "Meaning Gradient (issue #4) scoping complete 2026-07-04; PR #5 MERGED \u2014 spec, plan, frame state all on main. Implementation tracker with full continuation guidance (serial path, /assign-to-workforce path with per-task model split, roadmap, paid-for gotchas): https://github.com/agentculture/coherence-cli/issues/6. Resume: recall this record, read issue #6, branch feat/meaning-gradient, work waves 0-5 TDD-first. Key confirmed decisions: coherence meaning noun (not separate CLI); anchor-axis projection, 5 subdimensions (consequence, agency, causality, affordance, future_constraint); trend verb with f-prime/f-double-prime of scores AND embedding drift; numpy+httpx first runtime deps; COHERENCE_EMBED_URL/_MODEL env contract (eidetic gear default); offline CI via recorded-vector fixtures.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"source": "issue-6 implementation tracker", "topic": "meaning gradient", "issue": "6", "pr": "5", "date": "2026-07-04"}, "created": "2026-07-04T08:16:15.263629+00:00", "last_recall": null, "recall_count": 0, "links": ["devague-converge-gate-all-claims"], "supersedes": null, "lifecycle": "shadowed", "added_by": null}}
3
+ {"id": "colleague-toolcall-format-bug-2026-07", "hash": "088fa4a396dd6f5249035400ab4ace35fada8e4cc5dd72d75bbfb543c56f2308", "content": "GOTCHA (paid for): the `colleague` backend (vllm-openai + Qwen3.6-27B at localhost:8001) reliably FAILS `ask-colleague write` on any non-trivial task. Root cause: the model emits tool calls as TEXT content (markdown ```bash <tool>``` fences or `<tool>{json}` XML) instead of native OpenAI tool_calls, so the harness parses 0 steps, burns the whole --max-steps budget, and returns status:incomplete with steps:[]. A trivial scaffold task (t1) worked; 3/3 medium tasks failed identically, even with a lean brief and 40 steps. `colleague doctor --probe` passes (single-shot tool-call OK) because the probe is too simple to trigger it. Why: filed as agentculture/colleague#289. How to apply: when using /assign-to-workforce with colleague as the worker, expect failure beyond trivial tasks \u2014 swap the worker to Claude general-purpose subagents (still in isolated worktrees, \u2264N parallel, TDD-gated merges) rather than retrying colleague. Verified 2026-07-04 during the Meaning Gradient build.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"topic": "assign-to-workforce / colleague", "issue": "agentculture/colleague#289", "date": "2026-07-04", "source": "meaning-gradient build session"}, "created": "2026-07-04T15:34:16.511073+00:00", "last_recall": null, "recall_count": 0, "links": ["meaning-gradient-mvp-shipped-2026-07-04"], "supersedes": null, "lifecycle": "active", "added_by": null}}
4
+ {"id": "embed-gear-at-8001-lazyload-2026-07", "hash": "48c7ae4ee962ff1aae7746c6b88e07d37adb8aadb6bca7bf7ad70c689e7d4908", "content": "INFRA FACT: this machine's OpenAI-compatible embedding gear is the multi-lobe router at http://localhost:8001/v1 (same server as the colleague chat model), NOT the coherence/eidetic default http://localhost:8002/v1 (which is down). `GET localhost:8001/v1/models` lists Qwen/Qwen3-Embedding-0.6B (dim 1024) + Qwen3-Reranker-0.6B alongside the chat models, owned_by 'lobes'. The lobes LAZY-LOAD on first request, so a cold embeddings call can exceed 30s (times out). How to apply: to run `coherence meaning score/compare/trend` live or to run scripts/refresh_meaning_vectors.py, set COHERENCE_EMBED_URL=http://localhost:8001/v1, COHERENCE_EMBED_MODEL=Qwen/Qwen3-Embedding-0.6B, COHERENCE_EMBED_TIMEOUT=120 (the timeout knob added in coherence-cli 0.5.0 for exactly this cold-start case). Same applies to eidetic recall: set EIDETIC_EMBED_URL=http://localhost:8001/v1.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"topic": "embed gear / infra", "date": "2026-07-04", "source": "meaning-gradient build session"}, "created": "2026-07-04T15:34:16.512575+00:00", "last_recall": null, "recall_count": 0, "links": ["colleague-toolcall-format-bug-2026-07"], "supersedes": null, "lifecycle": "active", "added_by": null}}
5
+ {"id": "venv-markdownlint-ci-gotcha-2026-07", "hash": "0634779a88819e172f3f6b319791d997ba24617ce355fa92ca5f05a898154404", "content": "GOTCHA (paid for): in AgentCulture repos whose CI lint runs `markdownlint-cli2 \"**/*.md\"`, adding the FIRST runtime dependency flips this check red. Before: `dependencies = []` means CI's `uv sync` installs nothing, so `.venv` has no markdown and the glob passes. After adding deps (e.g. numpy/httpx), `uv sync` populates `.venv/lib/.../*.dist-info/licenses/LICENSE.md` (numpy has ~9), which trip markdownlint (70 errors) because `.venv/**` was not in the ignore list. Fix: add `- \".venv/**\"` to `.markdownlint-cli2.yaml` `ignores:`. How to apply: when introducing runtime deps to a zero-dep AgentCulture repo, pre-empt this by adding `.venv/**` to the markdownlint ignores in the same PR. Fixed in coherence-cli PR #7.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"topic": "CI / markdownlint", "date": "2026-07-04", "source": "meaning-gradient PR #7"}, "created": "2026-07-04T15:34:16.522095+00:00", "last_recall": null, "recall_count": 0, "links": [], "supersedes": null, "lifecycle": "active", "added_by": null}}
6
+ {"id": "sonar-pr-quality-gate-2026-07", "hash": "03491653b0008ba66083221b47cad276364d89a74f546959106d96fffec38cd1", "content": "REFERENCE (paid for): coherence-cli's CI has a SonarCloud quality gate on NEW CODE that blocks the PR (project key agentculture_coherence-cli). Two traps: (1) the /sonarclaude `status` verb queries the MAIN-branch gate, which can read PASSED while the PR gate is ERROR \u2014 query the PR gate directly: `curl -u \"$SONAR_TOKEN:\" \"https://sonarcloud.io/api/qualitygates/project_status?projectKey=agentculture_coherence-cli&pullRequest=<PR>\"`, and PR bugs: `.../api/issues/search?componentKeys=...&pullRequest=<PR>&types=BUG&resolved=false`. (2) Rule python:S1244 (no `== 0.0` on floats) fires on zero-norm guards like `if norm == 0.0:` \u2014 new_reliability_rating jumps to 3 and fails the gate. Fix: guard with a small epsilon (`norm <= 1e-12`), which is also more robust. SONAR_TOKEN is available in this environment. How to apply: after opening a PR here, check the PR-scoped Sonar gate, not just CI red/green or the main-branch status.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"topic": "CI / SonarCloud", "date": "2026-07-04", "source": "meaning-gradient PR #7"}, "created": "2026-07-04T15:34:16.522259+00:00", "last_recall": null, "recall_count": 0, "links": [], "supersedes": null, "lifecycle": "active", "added_by": null}}
7
+ {"id": "meaning-gradient-mvp-shipped-2026-07-04", "hash": "2b5657f62b8bfa1ef9905e4e98a9ee4c4fecfad30699b180b7fca4a54869c027", "content": "Meaning Gradient MVP is BUILT and in review as coherence-cli PR #7 (branch feat/meaning-gradient, v0.5.0), superseding the continuation pointer. All 10 plan tasks / 6 waves done via /assign-to-workforce (workers were Claude subagents after colleague failed \u2014 see colleague-toolcall-format-bug-2026-07). Ships: `coherence meaning score/compare/trend` (--json, exit 0/1/2), the coherence/meaning engine (embed/axis+12 anchors/diagnostics/score/compare/trend), README + examples/experiments/issue-priority.yaml, and offline tests (133 passing) with committed recorded-vector fixtures + scripts/refresh_meaning_vectors.py. FALSIFIABILITY CONFIRMED: with real Qwen3-Embedding vectors the ordering test passes out of the box \u2014 every high-meaning fixture strictly outranks its paired low one, rewrite series monotonic, NO anchor tuning needed. numpy+httpx are the first runtime deps. Deferred (issue #6 roadmap, no code paths): experiment runner, LLM judge, doctor/certify --dimension meaning, pluggable providers, routing-policy output.", "scope": {"name": "coherence-cli", "visibility": "public"}, "metadata": {"type": "note", "record_metadata": {"topic": "meaning gradient", "pr": "7", "issue": "6", "date": "2026-07-04", "source": "meaning-gradient build session"}, "created": "2026-07-04T15:34:16.522572+00:00", "last_recall": null, "recall_count": 0, "links": ["colleague-toolcall-format-bug-2026-07", "embed-gear-at-8001-lazyload-2026-07"], "supersedes": "meaning-gradient-continuation-2026-07-04", "lifecycle": "active", "added_by": null}}
@@ -231,3 +231,8 @@ skills.local.yaml
231
231
 
232
232
  # devague working state (not committed by default)
233
233
  .devague/reviews/
234
+
235
+ # Recorded embedding vectors for the offline meaning tests ARE committed (see
236
+ # tests/fixtures/meaning/recorded_vectors.json) so the falsifiability ordering
237
+ # test runs in CI with zero network. Regenerate against a live embed gear with
238
+ # scripts/refresh_meaning_vectors.py after changing anchors or fixtures.
@@ -16,6 +16,9 @@ config:
16
16
 
17
17
  ignores:
18
18
  - "node_modules/**"
19
+ # The virtualenv holds third-party package LICENSE.md files (numpy, httpx, …)
20
+ # that trip markdownlint; it is created by `uv sync` in CI. Never our source.
21
+ - ".venv/**"
19
22
  - ".local/**"
20
23
  - ".afi/**"
21
24
  - ".teken/**"
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.0] - 2026-07-04
9
+
10
+ ### Added
11
+
12
+ - **Meaning Gradient coherence dimension** — a `coherence meaning` noun with `score <file>`, `compare <before> <after>`, and `trend <f1> <f2> …` verbs (all `--json`, exit codes 0/1/2). Measures a global `meaning_score` plus five subdimensions (consequence, agency, causality, affordance, future_constraint) via anchor-axis projection, with rule-based diagnostics (missing_consequence / missing_owner / missing_next_action). Implements issue #4 phases 1-2 + the trend extension (issue #6).
13
+ - Anchor-axis scoring engine (`coherence/meaning/`): env-configured OpenAI-compatible embedding client (`COHERENCE_EMBED_URL` / `COHERENCE_EMBED_MODEL`, EmbedUnavailable → exit 2 with a hint; diagnostics still run offline), in-repo plain-text anchor fixtures, score/compare/trend engines, and an open `subdimensions` map.
14
+ - `trend` trajectory signals — per-step first (f', velocity) and second (f'', acceleration) differences of the score signals and of embedding drift over an ordered measurement-point series (2+ points → f', 3+ → f'').
15
+ - Example phase-3 experiment config `examples/experiments/issue-priority.yaml` and a README "Meaning Gradient" section (anchor-axis method, JSON contract, steward/eidetic/taskmaster consumer map, scope boundary).
16
+ - Offline integration tests + recorded-vector fixture mechanism (`scripts/refresh_meaning_vectors.py`) so CI runs with zero network access; the high>low falsifiability ordering test is gated on committed recorded vectors.
17
+ - `numpy` and `httpx` as the package's first runtime dependencies.
18
+
8
19
  ## [0.4.1] - 2026-07-04
9
20
 
10
21
  ### Added
@@ -0,0 +1,170 @@
1
+ Metadata-Version: 2.4
2
+ Name: coherence-cli
3
+ Version: 0.5.0
4
+ Summary: Maintains information quality for agentic workflows — assesses the freshness, provenance, fidelity, and task-specific validity of claims, then refreshes or repairs degraded ones before agents consume them.
5
+ Project-URL: Homepage, https://github.com/agentculture/coherence-cli
6
+ Project-URL: Issues, https://github.com/agentculture/coherence-cli/issues
7
+ Author: Ori Nachum
8
+ License-Expression: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: Apache Software License
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Topic :: Software Development
15
+ Requires-Python: >=3.12
16
+ Requires-Dist: httpx>=0.27
17
+ Requires-Dist: numpy>=1.26
18
+ Description-Content-Type: text/markdown
19
+
20
+ # coherence-cli
21
+
22
+ Maintains information quality for agentic workflows — assesses the freshness, provenance, fidelity, and task-specific validity of claims, then refreshes or repairs degraded ones before agents consume them.
23
+
24
+ ## What you get
25
+
26
+ - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
27
+ (`afi-cli`) — the runtime package has no third-party dependencies.
28
+ - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
29
+ prompt file (`CLAUDE.md` for `backend: claude`).
30
+ - **The canonical guildmaster skill kit** (11 skills) under `.claude/skills/`,
31
+ vendored cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
32
+ - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
33
+ PyPI Trusted Publishing wired into GitHub Actions.
34
+
35
+ ## Quickstart
36
+
37
+ ```bash
38
+ uv sync
39
+ uv run pytest -n auto # run the test suite
40
+ uv run coherence-cli whoami # identity from culture.yaml
41
+ uv run coherence-cli learn # self-teaching prompt (add --json)
42
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
43
+ ```
44
+
45
+ ## CLI
46
+
47
+ | Verb | What it does |
48
+ |------|--------------|
49
+ | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
50
+ | `learn` | Print a structured self-teaching prompt. |
51
+ | `explain <path>` | Markdown docs for any noun/verb path. |
52
+ | `overview` | Read-only descriptive snapshot of the agent. |
53
+ | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
54
+ | `cli overview` | Describe the CLI surface itself. |
55
+
56
+ Every command supports `--json`. Results go to stdout, errors/diagnostics to
57
+ stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
58
+ error, `3+` reserved.
59
+
60
+ ## Meaning Gradient
61
+
62
+ **Meaning Gradient is a coherence dimension of coherence-cli, not a separate
63
+ CLI.** It ships as the `coherence meaning` noun — same binary, same `--json`
64
+ and exit-code conventions as every other verb. It asks one question: *how
65
+ strongly does this artifact constrain future interpretation and action?*
66
+
67
+ ### How it scores — the anchor axis
68
+
69
+ Scoring is anchor-axis projection over sentence embeddings, with the anchor
70
+ sets shipped in-repo as editable fixtures so the whole claim stays falsifiable:
71
+
72
+ ```text
73
+ axis = mean(high-anchor embeddings) - mean(low-anchor embeddings)
74
+ score = cosine(embedding(artifact), axis), rescaled from [-1, 1] to [0, 1]
75
+ ```
76
+
77
+ A parallel artifact scores `1.0`, orthogonal `0.5`, anti-parallel `0.0`. The
78
+ global `meaning` axis yields the scalar `meaning_score`; five subdimensions
79
+ each get their own high/low anchor pair:
80
+
81
+ | Subdimension | Asks |
82
+ |--------------|------|
83
+ | `consequence` | Does this change what happens next? |
84
+ | `agency` | Who can act because of this? |
85
+ | `causality` | Does this explain why something happened? |
86
+ | `affordance` | Does this reveal what action is possible? |
87
+ | `future_constraint` | Does this reduce the space of valid next actions? |
88
+
89
+ Alongside the embedding scores, three rule-based diagnostics run fully offline
90
+ (no network call, so they still work when the embed endpoint is down):
91
+ `missing_consequence`, `missing_owner`, `missing_next_action`.
92
+
93
+ ### The three commands
94
+
95
+ | Command | What it does |
96
+ |---------|--------------|
97
+ | `coherence meaning score <file>` | Score one artifact → the JSON below. |
98
+ | `coherence meaning compare <before> <after>` | Signed per-subdimension deltas across a rewrite (the 2-point case). |
99
+ | `coherence meaning trend <f1> <f2> <f3> …` | Trajectory over an ordered series: first differences (f′, velocity) and second differences (f″, acceleration) of each score plus embedding drift. |
100
+
101
+ All three support `--json` and follow the CLI exit-code policy: `0` success,
102
+ `1` user-input error (missing file, or fewer than 2 files for `trend`), `2`
103
+ environment error — an unreachable embedding endpoint makes `score` exit `2`
104
+ with a hint naming `COHERENCE_EMBED_URL`, while the offline diagnostics still
105
+ run.
106
+
107
+ `coherence meaning score <file> --json` emits exactly:
108
+
109
+ ```json
110
+ {
111
+ "meaning_score": 0.73,
112
+ "subdimensions": {
113
+ "consequence": 0.81,
114
+ "agency": 0.62,
115
+ "causality": 0.78,
116
+ "affordance": 0.69,
117
+ "future_constraint": 0.75
118
+ },
119
+ "diagnostics": [
120
+ {"code": "missing_owner", "message": "No responsible party named — name an owner (e.g. @name, 'owned by', 'assigned to')."}
121
+ ]
122
+ }
123
+ ```
124
+
125
+ Every value is in `[0, 1]`. `subdimensions` is an open map: registering a sixth
126
+ subdimension adds a key here without breaking existing consumers.
127
+
128
+ ### Consumer map — which field drives which decision
129
+
130
+ The score JSON is designed so a mesh consumer can act on it without human
131
+ translation. Each field maps to a concrete routing or memory decision:
132
+
133
+ | Consumer | Reads | Decision |
134
+ |----------|-------|----------|
135
+ | **steward** | `meaning_score` | Low `meaning_score` → route the artifact back for clarification / owner assignment before it flows downstream; high `meaning_score` with unclear ownership → ask steward to assign an owner. |
136
+ | **eidetic** | `subdimensions.consequence`, `subdimensions.future_constraint` | Gate memory writes: high on either → store (memory-worthy); low on both → compress or drop rather than persist. |
137
+ | **taskmaster** | `meaning_score`, `subdimensions.agency` | Prioritize the backlog: high `meaning_score` × high `agency` (someone can act) → surface for execution; low `agency` → hold, it needs an owner first. |
138
+
139
+ The `diagnostics` list is the always-available fallback: even with no embedding
140
+ endpoint, a fired `missing_consequence` / `missing_owner` / `missing_next_action`
141
+ is enough for a consumer to ask for clarification before acting.
142
+
143
+ ### Scope boundary
144
+
145
+ This MVP ships scoring, comparison, and trend only. **The experiment runner,
146
+ the LLM-judge fallback, and doctor/certify integration are tracked follow-ups
147
+ with no code paths in this repo.** The committed
148
+ [`examples/experiments/issue-priority.yaml`](examples/experiments/issue-priority.yaml)
149
+ is the config *contract* for the deferred phase-3 experiment — every meaning
150
+ feature it names is already emitted by `coherence meaning score`, but nothing
151
+ executes it yet.
152
+
153
+ ## Make it your own
154
+
155
+ 1. Rename the package `coherence/` and the `coherence-cli`
156
+ CLI/dist name throughout `pyproject.toml`, the package, `tests/`,
157
+ `sonar-project.properties`, and this `README.md`. The name is hard-coded in
158
+ ~100 places, so list every occurrence first — see the `git grep` discovery
159
+ command in [`CLAUDE.md`](CLAUDE.md), the authoritative rename procedure.
160
+ 2. Edit `culture.yaml` with your `suffix` and `backend`.
161
+ 3. Rewrite `CLAUDE.md` for your agent and run `/init`.
162
+ 4. Re-vendor only the skills you need from guildmaster (see
163
+ [`docs/skill-sources.md`](docs/skill-sources.md)).
164
+
165
+ See [`CLAUDE.md`](CLAUDE.md) for the full conventions (version-bump-every-PR,
166
+ the `cicd` PR lane, deploy setup).
167
+
168
+ ## License
169
+
170
+ Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -0,0 +1,151 @@
1
+ # coherence-cli
2
+
3
+ Maintains information quality for agentic workflows — assesses the freshness, provenance, fidelity, and task-specific validity of claims, then refreshes or repairs degraded ones before agents consume them.
4
+
5
+ ## What you get
6
+
7
+ - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
8
+ (`afi-cli`) — the runtime package has no third-party dependencies.
9
+ - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
10
+ prompt file (`CLAUDE.md` for `backend: claude`).
11
+ - **The canonical guildmaster skill kit** (11 skills) under `.claude/skills/`,
12
+ vendored cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
13
+ - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
14
+ PyPI Trusted Publishing wired into GitHub Actions.
15
+
16
+ ## Quickstart
17
+
18
+ ```bash
19
+ uv sync
20
+ uv run pytest -n auto # run the test suite
21
+ uv run coherence-cli whoami # identity from culture.yaml
22
+ uv run coherence-cli learn # self-teaching prompt (add --json)
23
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
24
+ ```
25
+
26
+ ## CLI
27
+
28
+ | Verb | What it does |
29
+ |------|--------------|
30
+ | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
31
+ | `learn` | Print a structured self-teaching prompt. |
32
+ | `explain <path>` | Markdown docs for any noun/verb path. |
33
+ | `overview` | Read-only descriptive snapshot of the agent. |
34
+ | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
35
+ | `cli overview` | Describe the CLI surface itself. |
36
+
37
+ Every command supports `--json`. Results go to stdout, errors/diagnostics to
38
+ stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
39
+ error, `3+` reserved.
40
+
41
+ ## Meaning Gradient
42
+
43
+ **Meaning Gradient is a coherence dimension of coherence-cli, not a separate
44
+ CLI.** It ships as the `coherence meaning` noun — same binary, same `--json`
45
+ and exit-code conventions as every other verb. It asks one question: *how
46
+ strongly does this artifact constrain future interpretation and action?*
47
+
48
+ ### How it scores — the anchor axis
49
+
50
+ Scoring is anchor-axis projection over sentence embeddings, with the anchor
51
+ sets shipped in-repo as editable fixtures so the whole claim stays falsifiable:
52
+
53
+ ```text
54
+ axis = mean(high-anchor embeddings) - mean(low-anchor embeddings)
55
+ score = cosine(embedding(artifact), axis), rescaled from [-1, 1] to [0, 1]
56
+ ```
57
+
58
+ A parallel artifact scores `1.0`, orthogonal `0.5`, anti-parallel `0.0`. The
59
+ global `meaning` axis yields the scalar `meaning_score`; five subdimensions
60
+ each get their own high/low anchor pair:
61
+
62
+ | Subdimension | Asks |
63
+ |--------------|------|
64
+ | `consequence` | Does this change what happens next? |
65
+ | `agency` | Who can act because of this? |
66
+ | `causality` | Does this explain why something happened? |
67
+ | `affordance` | Does this reveal what action is possible? |
68
+ | `future_constraint` | Does this reduce the space of valid next actions? |
69
+
70
+ Alongside the embedding scores, three rule-based diagnostics run fully offline
71
+ (no network call, so they still work when the embed endpoint is down):
72
+ `missing_consequence`, `missing_owner`, `missing_next_action`.
73
+
74
+ ### The three commands
75
+
76
+ | Command | What it does |
77
+ |---------|--------------|
78
+ | `coherence meaning score <file>` | Score one artifact → the JSON below. |
79
+ | `coherence meaning compare <before> <after>` | Signed per-subdimension deltas across a rewrite (the 2-point case). |
80
+ | `coherence meaning trend <f1> <f2> <f3> …` | Trajectory over an ordered series: first differences (f′, velocity) and second differences (f″, acceleration) of each score plus embedding drift. |
81
+
82
+ All three support `--json` and follow the CLI exit-code policy: `0` success,
83
+ `1` user-input error (missing file, or fewer than 2 files for `trend`), `2`
84
+ environment error — an unreachable embedding endpoint makes `score` exit `2`
85
+ with a hint naming `COHERENCE_EMBED_URL`, while the offline diagnostics still
86
+ run.
87
+
88
+ `coherence meaning score <file> --json` emits exactly:
89
+
90
+ ```json
91
+ {
92
+ "meaning_score": 0.73,
93
+ "subdimensions": {
94
+ "consequence": 0.81,
95
+ "agency": 0.62,
96
+ "causality": 0.78,
97
+ "affordance": 0.69,
98
+ "future_constraint": 0.75
99
+ },
100
+ "diagnostics": [
101
+ {"code": "missing_owner", "message": "No responsible party named — name an owner (e.g. @name, 'owned by', 'assigned to')."}
102
+ ]
103
+ }
104
+ ```
105
+
106
+ Every value is in `[0, 1]`. `subdimensions` is an open map: registering a sixth
107
+ subdimension adds a key here without breaking existing consumers.
108
+
109
+ ### Consumer map — which field drives which decision
110
+
111
+ The score JSON is designed so a mesh consumer can act on it without human
112
+ translation. Each field maps to a concrete routing or memory decision:
113
+
114
+ | Consumer | Reads | Decision |
115
+ |----------|-------|----------|
116
+ | **steward** | `meaning_score` | Low `meaning_score` → route the artifact back for clarification / owner assignment before it flows downstream; high `meaning_score` with unclear ownership → ask steward to assign an owner. |
117
+ | **eidetic** | `subdimensions.consequence`, `subdimensions.future_constraint` | Gate memory writes: high on either → store (memory-worthy); low on both → compress or drop rather than persist. |
118
+ | **taskmaster** | `meaning_score`, `subdimensions.agency` | Prioritize the backlog: high `meaning_score` × high `agency` (someone can act) → surface for execution; low `agency` → hold, it needs an owner first. |
119
+
120
+ The `diagnostics` list is the always-available fallback: even with no embedding
121
+ endpoint, a fired `missing_consequence` / `missing_owner` / `missing_next_action`
122
+ is enough for a consumer to ask for clarification before acting.
123
+
124
+ ### Scope boundary
125
+
126
+ This MVP ships scoring, comparison, and trend only. **The experiment runner,
127
+ the LLM-judge fallback, and doctor/certify integration are tracked follow-ups
128
+ with no code paths in this repo.** The committed
129
+ [`examples/experiments/issue-priority.yaml`](examples/experiments/issue-priority.yaml)
130
+ is the config *contract* for the deferred phase-3 experiment — every meaning
131
+ feature it names is already emitted by `coherence meaning score`, but nothing
132
+ executes it yet.
133
+
134
+ ## Make it your own
135
+
136
+ 1. Rename the package `coherence/` and the `coherence-cli`
137
+ CLI/dist name throughout `pyproject.toml`, the package, `tests/`,
138
+ `sonar-project.properties`, and this `README.md`. The name is hard-coded in
139
+ ~100 places, so list every occurrence first — see the `git grep` discovery
140
+ command in [`CLAUDE.md`](CLAUDE.md), the authoritative rename procedure.
141
+ 2. Edit `culture.yaml` with your `suffix` and `backend`.
142
+ 3. Rewrite `CLAUDE.md` for your agent and run `/init`.
143
+ 4. Re-vendor only the skills you need from guildmaster (see
144
+ [`docs/skill-sources.md`](docs/skill-sources.md)).
145
+
146
+ See [`CLAUDE.md`](CLAUDE.md) for the full conventions (version-bump-every-PR,
147
+ the `cicd` PR lane, deploy setup).
148
+
149
+ ## License
150
+
151
+ Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -66,6 +66,7 @@ def _build_parser() -> argparse.ArgumentParser:
66
66
  from coherence.cli._commands import doctor as _doctor_cmd
67
67
  from coherence.cli._commands import explain as _explain_cmd
68
68
  from coherence.cli._commands import learn as _learn_cmd
69
+ from coherence.cli._commands import meaning as _meaning_cmd
69
70
  from coherence.cli._commands import overview as _overview_cmd
70
71
  from coherence.cli._commands import whoami as _whoami_cmd
71
72
 
@@ -88,6 +89,7 @@ def _build_parser() -> argparse.ArgumentParser:
88
89
  _overview_cmd.register(sub)
89
90
  _doctor_cmd.register(sub)
90
91
  _cli_group.register(sub)
92
+ _meaning_cmd.register(sub)
91
93
  # Register your own noun groups here:
92
94
  # from coherence.cli._commands import my_noun as _my_noun_group
93
95
  # _my_noun_group.register(sub)
@@ -29,6 +29,9 @@ Commands
29
29
  coherence-cli overview Descriptive snapshot of the agent.
30
30
  coherence-cli doctor Check the agent-identity invariants.
31
31
  coherence-cli cli overview Describe the CLI surface itself.
32
+ coherence meaning score <file> Score an artifact's meaning gradient.
33
+ coherence meaning compare <a> <b> Signed before/after meaning delta.
34
+ coherence meaning trend <f>... Per-step f'/f'' across a series.
32
35
 
33
36
  Machine-readable output
34
37
  -----------------------
@@ -60,6 +63,9 @@ def _as_json_payload() -> dict[str, object]:
60
63
  {"path": ["overview"], "summary": "Descriptive snapshot of the agent."},
61
64
  {"path": ["doctor"], "summary": "Check the agent-identity invariants."},
62
65
  {"path": ["cli", "overview"], "summary": "Describe the CLI surface."},
66
+ {"path": ["meaning", "score"], "summary": "Score an artifact's meaning gradient."},
67
+ {"path": ["meaning", "compare"], "summary": "Signed before/after meaning delta."},
68
+ {"path": ["meaning", "trend"], "summary": "Per-step f'/f'' across a series."},
63
69
  ],
64
70
  "exit_codes": {
65
71
  "0": "success",