coherence-cli 0.3.0__tar.gz → 0.4.1__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 (82) hide show
  1. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/recall/scripts/recall.sh +35 -13
  2. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/remember/scripts/remember.sh +39 -13
  3. coherence_cli-0.4.1/.devague/current +1 -0
  4. coherence_cli-0.4.1/.devague/current_plan +1 -0
  5. coherence_cli-0.4.1/.devague/frames/coherence-cli-ships-meaning-gradient-as-a-measurab.json +367 -0
  6. coherence_cli-0.4.1/.devague/plans/coherence-cli-ships-meaning-gradient-as-a-measurab.json +382 -0
  7. coherence_cli-0.4.1/.eidetic/memory/coherence-cli__public.jsonl +1 -0
  8. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.github/workflows/tests.yml +1 -1
  9. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.gitignore +3 -0
  10. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.markdownlint-cli2.yaml +6 -0
  11. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/CHANGELOG.md +51 -0
  12. coherence_cli-0.4.1/CLAUDE.md +56 -0
  13. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/PKG-INFO +1 -1
  14. coherence_cli-0.4.1/docs/plans/2026-07-04-coherence-cli-ships-meaning-gradient-as-a-measurab.md +106 -0
  15. coherence_cli-0.4.1/docs/specs/2026-07-04-coherence-cli-ships-meaning-gradient-as-a-measurab.md +73 -0
  16. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/pyproject.toml +1 -1
  17. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/uv.lock +1 -1
  18. coherence_cli-0.3.0/CLAUDE.md +0 -28
  19. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/agent-config/SKILL.md +0 -0
  20. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  21. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
  22. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/ask-colleague/SKILL.md +0 -0
  23. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  24. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  25. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  26. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  27. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  28. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  29. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/SKILL.md +0 -0
  30. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  31. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  32. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  33. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  34. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  35. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/SKILL.md +0 -0
  36. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  37. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  38. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  39. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  40. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  41. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  42. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  43. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  44. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  45. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  46. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/recall/SKILL.md +0 -0
  47. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/remember/SKILL.md +0 -0
  48. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/run-tests/SKILL.md +0 -0
  49. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  50. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  51. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  52. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  53. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  54. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/think/SKILL.md +0 -0
  55. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/think/scripts/think.sh +0 -0
  56. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/version-bump/SKILL.md +0 -0
  57. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  58. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.claude/skills.local.yaml.example +0 -0
  59. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.flake8 +0 -0
  60. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/.github/workflows/publish.yml +0 -0
  61. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/LICENSE +0 -0
  62. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/README.md +0 -0
  63. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/__init__.py +0 -0
  64. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/__main__.py +0 -0
  65. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/__init__.py +0 -0
  66. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/__init__.py +0 -0
  67. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/cli.py +0 -0
  68. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/doctor.py +0 -0
  69. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/explain.py +0 -0
  70. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/learn.py +0 -0
  71. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/overview.py +0 -0
  72. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_commands/whoami.py +0 -0
  73. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_errors.py +0 -0
  74. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/cli/_output.py +0 -0
  75. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/explain/__init__.py +0 -0
  76. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/coherence/explain/catalog.py +0 -0
  77. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/culture.yaml +0 -0
  78. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/docs/skill-sources.md +0 -0
  79. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/sonar-project.properties +0 -0
  80. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/tests/__init__.py +0 -0
  81. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/tests/test_cli.py +0 -0
  82. {coherence_cli-0.3.0 → coherence_cli-0.4.1}/tests/test_cli_introspection.py +0 -0
@@ -6,10 +6,11 @@
6
6
  # forwards every flag verbatim — so `recall.sh "<query>" --mode hybrid --json`
7
7
  # is exactly `eidetic recall "<query>" --mode hybrid --json`.
8
8
  #
9
- # The store is the files backend at ~/.eidetic/memory by default — a home-dir
10
- # path OUTSIDE any git worktree, so Claude and the colleague backend (which runs
11
- # in throwaway worktrees) read the SAME memories. Set EIDETIC_DATA_DIR to opt out
12
- # of sharing; set EIDETIC_MONGO_URI / NEO4J_URI + --backend for a server store.
9
+ # The store is the files backend. Default location resolves per-operation:
10
+ # PUBLIC records inside a git repo <repo-root>/.eidetic/memory (committed,
11
+ # team-shared); PRIVATE records, or any record outside a git repo
12
+ # $HOME/.eidetic/memory (never committed). Recall reads both stores and merges.
13
+ # An explicit EIDETIC_DATA_DIR wins and short-circuits to that single dir.
13
14
 
14
15
  set -euo pipefail
15
16
 
@@ -34,12 +35,10 @@ resolve_eidetic() {
34
35
  fi
35
36
  dir=$(dirname "$dir")
36
37
  done
37
- cat >&2 <<'EOF'
38
- error: eidetic CLI not found.
39
- hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
40
- or run from inside the eidetic-cli checkout with `uv` available.
41
- The console script is `eidetic` (dist name: eidetic-cli).
42
- EOF
38
+ # In a vendored copy there is no eidetic-cli checkout to fall back to, so the
39
+ # only honest remedy is to install the CLI. One `error:` + one `hint:` line.
40
+ printf 'error: eidetic CLI not found.\n' >&2
41
+ printf 'hint: install it with: uv tool install eidetic-cli (or pipx install eidetic-cli); the console script is eidetic.\n' >&2
43
42
  return 1
44
43
  }
45
44
 
@@ -65,10 +64,17 @@ EOF
65
64
  }
66
65
 
67
66
  case "${1:-}" in
68
- -h | --help | help | "")
67
+ -h | --help)
69
68
  usage
70
69
  exit 0
71
70
  ;;
71
+ "")
72
+ # A missing query is a usage error, not success. The bareword `help` is
73
+ # a legitimate search term, so it is intentionally NOT a usage alias.
74
+ printf 'error: no query given.\n' >&2
75
+ printf 'hint: recall.sh "<query>" [--mode ...] [--json]; run recall.sh --help for usage.\n' >&2
76
+ exit 1
77
+ ;;
72
78
  esac
73
79
 
74
80
  resolve_eidetic || exit 2
@@ -100,9 +106,12 @@ resolve_scope() {
100
106
  # inline `# comment` or trailing space can't bleed into the scope),
101
107
  # then strip surrounding quotes only — matching the canonical parser
102
108
  # in .claude/skills/cicd/scripts/_resolve-nick.sh.
109
+ # `|| true`: under `set -o pipefail`, `head -n1` closing the pipe
110
+ # early can SIGPIPE `sed`, making the substitution non-zero and
111
+ # aborting the script. An empty parse must yield "" here, not exit.
103
112
  suffix=$(sed -n \
104
113
  's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
105
- "$dir/culture.yaml" | head -n1 | tr -d "\"'")
114
+ "$dir/culture.yaml" | head -n1 | tr -d "\"'" || true)
106
115
  break
107
116
  fi
108
117
  dir=$(dirname "$dir")
@@ -127,7 +136,20 @@ if ! has_flag --scope "$@"; then
127
136
  EIDETIC_SCOPE=$(resolve_scope)
128
137
  if [ -n "$EIDETIC_SCOPE" ]; then
129
138
  SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
130
- has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
139
+ # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
140
+ # upstream private default): default to PUBLIC, so a plain recall queries
141
+ # the in-repo public pool (<repo>/.eidetic/memory) this repo writes to.
142
+ # Pass --visibility private to also surface this agent's private ($HOME)
143
+ # notes. The two-store read model reads both dirs regardless.
144
+ has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
145
+ elif ! has_flag --visibility "$@"; then
146
+ # No suffix AND no explicit --visibility: the query runs against
147
+ # eidetic's own default (scope=default, visibility=public), not this
148
+ # agent's private personal scope — so an empty result isn't silently
149
+ # misread. Warn on stderr (stdout stays clean for --json). Warn ONLY
150
+ # here: an explicit --scope (outer guard) or --visibility (this guard) is
151
+ # a deliberate choice, honored verbatim, so either flag silences this.
152
+ printf 'warning: no culture.yaml suffix resolved; querying the public default scope rather than a private personal scope. Pass --scope or --visibility to target deliberately.\n' >&2
131
153
  fi
132
154
  fi
133
155
 
@@ -12,10 +12,11 @@
12
12
  # Upsert is idempotent by id (and dedups by content hash): re-remembering the
13
13
  # same record updates it in place, never duplicates.
14
14
  #
15
- # The store is the files backend at ~/.eidetic/memory by default — a home-dir
16
- # path OUTSIDE any git worktree, so a record Claude remembers is recallable by
17
- # the colleague backend (which runs in throwaway worktrees), and vice versa.
18
- # Set EIDETIC_DATA_DIR to opt out of sharing; use --backend mongo|neo4j (with
15
+ # The store is the files backend. Default location resolves per-operation:
16
+ # PUBLIC records inside a git repo <repo-root>/.eidetic/memory (committed,
17
+ # team-shared); PRIVATE records, or any record outside a git repo
18
+ # $HOME/.eidetic/memory (never committed). An explicit EIDETIC_DATA_DIR still
19
+ # wins and short-circuits to that single dir. Use --backend mongo|neo4j (with
19
20
  # EIDETIC_MONGO_URI / NEO4J_URI) for a server-backed shared store.
20
21
 
21
22
  set -euo pipefail
@@ -40,12 +41,10 @@ resolve_eidetic() {
40
41
  fi
41
42
  dir=$(dirname "$dir")
42
43
  done
43
- cat >&2 <<'EOF'
44
- error: eidetic CLI not found.
45
- hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
46
- or run from inside the eidetic-cli checkout with `uv` available.
47
- The console script is `eidetic` (dist name: eidetic-cli).
48
- EOF
44
+ # In a vendored copy there is no eidetic-cli checkout to fall back to, so the
45
+ # only honest remedy is to install the CLI. One `error:` + one `hint:` line.
46
+ printf 'error: eidetic CLI not found.\n' >&2
47
+ printf 'hint: install it with: uv tool install eidetic-cli (or pipx install eidetic-cli); the console script is eidetic.\n' >&2
49
48
  return 1
50
49
  }
51
50
 
@@ -60,7 +59,9 @@ Usage:
60
59
 
61
60
  A record needs `id`, `text`, and `type`; `hash` and `metadata` are recommended
62
61
  (hash is derived from text when omitted). Upsert is idempotent by id.
63
- Public data only. Every flag is forwarded verbatim to `eidetic remember`.
62
+ Records default to this agent's PRIVATE personal scope (--scope from the
63
+ culture.yaml suffix); pass --visibility public to contribute to the shared
64
+ public pool. Every flag is forwarded verbatim to `eidetic remember`.
64
65
  See `eidetic explain remember`.
65
66
  EOF
66
67
  }
@@ -72,6 +73,16 @@ case "${1:-}" in
72
73
  ;;
73
74
  esac
74
75
 
76
+ # No record argument AND stdin is an interactive terminal → `eidetic remember`
77
+ # would block forever waiting for NDJSON. Show usage instead of hanging. A piped
78
+ # or redirected stdin (`cat records.ndjson | remember.sh`) is not a TTY and
79
+ # proceeds to the batch path normally.
80
+ if [ "$#" -eq 0 ] && [ -t 0 ]; then
81
+ usage >&2
82
+ printf 'hint: pass a JSON record as an argument, or pipe NDJSON on stdin.\n' >&2
83
+ exit 1
84
+ fi
85
+
75
86
  resolve_eidetic || exit 2
76
87
 
77
88
  # ── default to this agent's PERSONAL, PRIVATE scope (culture.yaml `suffix`) ──
@@ -100,9 +111,12 @@ resolve_scope() {
100
111
  # inline `# comment` or trailing space can't bleed into the scope),
101
112
  # then strip surrounding quotes only — matching the canonical parser
102
113
  # in .claude/skills/cicd/scripts/_resolve-nick.sh.
114
+ # `|| true`: under `set -o pipefail`, `head -n1` closing the pipe
115
+ # early can SIGPIPE `sed`, making the substitution non-zero and
116
+ # aborting the script. An empty parse must yield "" here, not exit.
103
117
  suffix=$(sed -n \
104
118
  's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
105
- "$dir/culture.yaml" | head -n1 | tr -d "\"'")
119
+ "$dir/culture.yaml" | head -n1 | tr -d "\"'" || true)
106
120
  break
107
121
  fi
108
122
  dir=$(dirname "$dir")
@@ -127,7 +141,19 @@ if ! has_flag --scope "$@"; then
127
141
  EIDETIC_SCOPE=$(resolve_scope)
128
142
  if [ -n "$EIDETIC_SCOPE" ]; then
129
143
  SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
130
- has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
144
+ # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
145
+ # upstream private default): default to PUBLIC so a plain remember lands
146
+ # in <repo>/.eidetic/memory — committed, team- and mesh-shared. Pass
147
+ # --visibility private to keep a record in $HOME (uncommitted).
148
+ has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
149
+ elif ! has_flag --visibility "$@"; then
150
+ # No suffix AND no explicit --visibility: the record falls back to
151
+ # eidetic's own default (scope=default, visibility=public). Don't let an
152
+ # expected-private record go public silently — warn on stderr (stdout
153
+ # stays clean for --json). Warn ONLY here: an explicit --scope (outer
154
+ # guard) or --visibility (this guard) means the caller chose deliberately
155
+ # and is honored verbatim, so either flag silences this.
156
+ printf 'warning: no culture.yaml suffix resolved; this record falls back to the public default scope. Pass --scope or --visibility to place it deliberately.\n' >&2
131
157
  fi
132
158
  fi
133
159
 
@@ -0,0 +1 @@
1
+ coherence-cli-ships-meaning-gradient-as-a-measurab
@@ -0,0 +1 @@
1
+ coherence-cli-ships-meaning-gradient-as-a-measurab
@@ -0,0 +1,367 @@
1
+ {
2
+ "slug": "coherence-cli-ships-meaning-gradient-as-a-measurab",
3
+ "title": "coherence-cli ships Meaning Gradient as a measurable coherence dimension: 'coherence meaning score <file>' returns a scalar meaning score plus per-subdimension scores and rule-based diagnostics as JSON, and 'coherence meaning compare <before> <after>' shows whether a rewrite gained or lost meaning \u2014 with the anchor sets shipped in-repo so the whole claim stays falsifiable.",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-07-04T07:08:00Z",
7
+ "updated": "2026-07-04T07:21:10Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "coherence-cli ships Meaning Gradient as a measurable coherence dimension: 'coherence meaning score <file>' returns a scalar meaning score plus per-subdimension scores and rule-based diagnostics as JSON, and 'coherence meaning compare <before> <after>' shows whether a rewrite gained or lost meaning \u2014 with the anchor sets shipped in-repo so the whole claim stays falsifiable.",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h6",
18
+ "text": "Both commands exist and emit valid JSON matching the documented schema; the README states Meaning Gradient is a coherence dimension of coherence-cli, not a separate tool; issue #4's minimum-tier acceptance boxes are all checkable.",
19
+ "status": "confirmed"
20
+ }
21
+ ],
22
+ "hard_questions": [],
23
+ "links": []
24
+ },
25
+ {
26
+ "id": "c2",
27
+ "kind": "audience",
28
+ "text": "Agents and operators in the AgentCulture mesh that route, remember, compress, or gate artifacts (steward, eidetic, taskmaster, colleague) \u2014 plus humans triaging issues and reviewing rewrites.",
29
+ "origin": "llm",
30
+ "status": "confirmed",
31
+ "honesty_conditions": [
32
+ {
33
+ "id": "h8",
34
+ "text": "At least one named mesh consumer can act on the score JSON without human translation \u2014 schema fields map directly to a routing or memory decision.",
35
+ "status": "confirmed"
36
+ }
37
+ ],
38
+ "hard_questions": [],
39
+ "links": []
40
+ },
41
+ {
42
+ "id": "c3",
43
+ "kind": "before_state",
44
+ "text": "coherence-cli is a bare scaffold (whoami/learn/explain/doctor only, zero runtime deps); meaning of artifacts is judged by vibes \u2014 no measurable signal, no way to test whether a rewrite added meaning, no instrumentation to falsify the Meaning Gradient thesis.",
45
+ "origin": "llm",
46
+ "status": "confirmed",
47
+ "honesty_conditions": [
48
+ {
49
+ "id": "h9",
50
+ "text": "Before this lands the repo has no 'meaning' noun and no scoring code \u2014 verifiable against the scaffold at the spec's base commit.",
51
+ "status": "confirmed"
52
+ }
53
+ ],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "after_state",
60
+ "text": "'coherence meaning score <file>' emits JSON with meaning_score, at least 4 subdimension scores, and rule-based diagnostics (missing_consequence / missing_owner / missing_next_action); 'coherence meaning compare before after' emits per-subdimension deltas; anchor sets live in-repo as editable fixtures.",
61
+ "origin": "llm",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [
64
+ {
65
+ "id": "h10",
66
+ "text": "Running both commands on the shipped fixtures reproduces the documented JSON shape exactly, validated in tests.",
67
+ "status": "confirmed"
68
+ }
69
+ ],
70
+ "hard_questions": [],
71
+ "links": []
72
+ },
73
+ {
74
+ "id": "c5",
75
+ "kind": "why_it_matters",
76
+ "text": "Routing, memory, compression, and certification policies need a signal that predicts what humans and agents remember, prioritize, and execute \u2014 and the claim must stay empirical: instrumentation first, so the phase-3 experiment can prove or disprove predictive value.",
77
+ "origin": "llm",
78
+ "status": "confirmed",
79
+ "honesty_conditions": [
80
+ {
81
+ "id": "h11",
82
+ "text": "Every meaning feature the phase-3 experiment YAML names is emitted by 'coherence meaning score' \u2014 the MVP output is a sufficient input for the deferred experiment.",
83
+ "status": "confirmed"
84
+ }
85
+ ],
86
+ "hard_questions": [],
87
+ "links": []
88
+ },
89
+ {
90
+ "id": "c6",
91
+ "kind": "boundary",
92
+ "text": "This spec covers issue #4 phases 1-2 only (score + compare). No separate meaning-cli, no LLM judge, no experiment runner execution, no doctor/certify integration, no pluggable embedding providers \u2014 those are tracked follow-ups, not silent scope.",
93
+ "origin": "llm",
94
+ "status": "rejected",
95
+ "honesty_conditions": [
96
+ {
97
+ "id": "h12",
98
+ "text": "No MVP code path executes an experiment, calls an LLM judge, or touches doctor/certify; each deferred phase is a tracked follow-up, not silent scope.",
99
+ "status": "rejected"
100
+ }
101
+ ],
102
+ "hard_questions": [],
103
+ "links": []
104
+ },
105
+ {
106
+ "id": "c7",
107
+ "kind": "success_signal",
108
+ "text": "On repo fixtures, score orders each high-meaning rewrite above its low-meaning original (e.g. the issue's auth-middleware pair); the JSON contract and each diagnostic rule are exercised by tests; README documents Meaning Gradient as a coherence dimension.",
109
+ "origin": "llm",
110
+ "status": "confirmed",
111
+ "honesty_conditions": [
112
+ {
113
+ "id": "h13",
114
+ "text": "CI runs the fixture-ordering and diagnostic tests; a failing high/low ordering fails the build.",
115
+ "status": "confirmed"
116
+ }
117
+ ],
118
+ "hard_questions": [],
119
+ "links": []
120
+ },
121
+ {
122
+ "id": "c8",
123
+ "kind": "requirement",
124
+ "text": "Scoring uses anchor-axis projection: embed the artifact, build meaning_axis = mean(high-anchor embeddings) - mean(low-anchor embeddings), score = cosine(artifact, axis) normalized to [0,1]; each subdimension gets its own high/low anchor pair set.",
125
+ "origin": "llm",
126
+ "status": "confirmed",
127
+ "honesty_conditions": [
128
+ {
129
+ "id": "h1",
130
+ "text": "Scoring is deterministic for a fixed anchor set + embedding endpoint, and on the shipped fixtures every high-meaning artifact scores strictly above its paired low-meaning artifact.",
131
+ "status": "confirmed"
132
+ }
133
+ ],
134
+ "hard_questions": [],
135
+ "links": []
136
+ },
137
+ {
138
+ "id": "c9",
139
+ "kind": "requirement",
140
+ "text": "Embeddings come from an OpenAI-compatible /v1/embeddings endpoint configured via env (COHERENCE_EMBED_URL / COHERENCE_EMBED_MODEL, defaulting to the same local embed gear eidetic uses); when unreachable, score exits with the CLI's environment-error code and a clear hint, while rule-based diagnostics still run offline.",
141
+ "origin": "llm",
142
+ "status": "confirmed",
143
+ "honesty_conditions": [
144
+ {
145
+ "id": "h2",
146
+ "text": "With the embed endpoint down, 'coherence meaning score' exits with the environment-error code and an actionable hint, and a diagnostics-only invocation still succeeds; with it up, no non-stdlib import is needed.",
147
+ "status": "rejected"
148
+ },
149
+ {
150
+ "id": "h7",
151
+ "text": "With the embed endpoint down, 'coherence meaning score' exits with the environment-error code and an actionable hint, and a diagnostics-only invocation still succeeds offline.",
152
+ "status": "confirmed"
153
+ }
154
+ ],
155
+ "hard_questions": [],
156
+ "links": []
157
+ },
158
+ {
159
+ "id": "c10",
160
+ "kind": "requirement",
161
+ "text": "Rule-based diagnostics detect missing_consequence, missing_owner, and missing_next_action without any embedding call, and land in the JSON output as a diagnostics list.",
162
+ "origin": "llm",
163
+ "status": "confirmed",
164
+ "honesty_conditions": [
165
+ {
166
+ "id": "h3",
167
+ "text": "Each diagnostic rule fires on a fixture artifact that lacks the property and stays silent on a fixture that has it \u2014 one positive and one negative test per rule.",
168
+ "status": "confirmed"
169
+ }
170
+ ],
171
+ "hard_questions": [],
172
+ "links": []
173
+ },
174
+ {
175
+ "id": "c11",
176
+ "kind": "requirement",
177
+ "text": "MVP ships 5 subdimensions \u2014 consequence, agency, causality, affordance, future_constraint \u2014 chosen from the issue's 'most important for Culture.dev' list; the JSON schema leaves room to add more without breaking consumers.",
178
+ "origin": "llm",
179
+ "status": "confirmed",
180
+ "honesty_conditions": [
181
+ {
182
+ "id": "h4",
183
+ "text": "All 5 subdimensions appear in the score JSON with values in [0,1], and compare emits a signed delta per subdimension; adding a 6th subdimension later requires no schema change for existing consumers.",
184
+ "status": "confirmed"
185
+ }
186
+ ],
187
+ "hard_questions": [],
188
+ "links": []
189
+ },
190
+ {
191
+ "id": "c12",
192
+ "kind": "decision",
193
+ "text": "Runtime dependencies stay zero: HTTP via stdlib urllib, cosine/mean in pure Python, anchors as plain text fixtures. The scaffold's agent-first CLI conventions (exit codes 0/1/2, --json, explain catalog entry) apply to the new noun.",
194
+ "origin": "llm",
195
+ "status": "rejected",
196
+ "honesty_conditions": [],
197
+ "hard_questions": [],
198
+ "links": []
199
+ },
200
+ {
201
+ "id": "c13",
202
+ "kind": "requirement",
203
+ "text": "An example experiment config (issue-priority YAML, per issue #4 phase 3 shape) ships under examples/ as a committed artifact so the falsifiability path is visible \u2014 but the runner itself is out of scope.",
204
+ "origin": "llm",
205
+ "status": "confirmed",
206
+ "honesty_conditions": [
207
+ {
208
+ "id": "h5",
209
+ "text": "The example experiment YAML parses against the documented config shape and is referenced from the README; no code path executes it.",
210
+ "status": "confirmed"
211
+ }
212
+ ],
213
+ "hard_questions": [],
214
+ "links": []
215
+ },
216
+ {
217
+ "id": "c14",
218
+ "kind": "assumption",
219
+ "text": "Anchor-axis projection yields a signal that is not just length or sentiment in disguise \u2014 this is exactly what the phase-3 experiment must test; the MVP makes no predictive-validity claim.",
220
+ "origin": "llm",
221
+ "status": "confirmed",
222
+ "honesty_conditions": [],
223
+ "hard_questions": [],
224
+ "links": []
225
+ },
226
+ {
227
+ "id": "c15",
228
+ "kind": "non_goal",
229
+ "text": "The MVP does not claim meaning is 'solved' or predictive; it ships the instrumentation needed to prove or disprove the thesis empirically.",
230
+ "origin": "llm",
231
+ "status": "confirmed",
232
+ "honesty_conditions": [],
233
+ "hard_questions": [],
234
+ "links": []
235
+ },
236
+ {
237
+ "id": "c16",
238
+ "kind": "decision",
239
+ "text": "Runtime deps for the meaning engine: numpy (vector math) and httpx (embedding HTTP) are allowed as the package's first runtime dependencies \u2014 chosen over stdlib-only because phase 3 (experiments, cross-validation) lands in this same package next. Anchors stay plain-text fixtures; the scaffold's agent-first CLI conventions (exit codes 0/1/2, --json, explain catalog entry) apply to the new noun.",
240
+ "origin": "user",
241
+ "status": "confirmed",
242
+ "honesty_conditions": [],
243
+ "hard_questions": [],
244
+ "links": []
245
+ },
246
+ {
247
+ "id": "c17",
248
+ "kind": "requirement",
249
+ "text": "Meaning is also measured as a trajectory: given an ordered series of measurement points (versions of an artifact), compute first differences (f' \u2014 velocity of change) and second differences (f'' \u2014 acceleration, the change of the change) between consecutive points.",
250
+ "origin": "user",
251
+ "status": "confirmed",
252
+ "honesty_conditions": [
253
+ {
254
+ "id": "h14",
255
+ "text": "On a 3+ point fixture series, trend emits f' for every consecutive pair and f'' for every consecutive f' pair; with exactly 2 points it emits f' only and marks f'' unavailable instead of erroring.",
256
+ "status": "confirmed"
257
+ }
258
+ ],
259
+ "hard_questions": [],
260
+ "links": []
261
+ },
262
+ {
263
+ "id": "c18",
264
+ "kind": "requirement",
265
+ "text": "Two trajectory signals per step: (a) score derivatives \u2014 f'/f'' of meaning_score and of each subdimension score; (b) embedding drift \u2014 cosine distance moved in embedding space between consecutive points, with its own f' and f'' \u2014 so a rewrite series shows both where meaning went and how fast the artifact itself is moving.",
266
+ "origin": "llm",
267
+ "status": "confirmed",
268
+ "honesty_conditions": [
269
+ {
270
+ "id": "h15",
271
+ "text": "Both signals appear per step in trend JSON \u2014 score deltas (meaning_score + every subdimension) and embedding-drift distance \u2014 each with its own velocity and acceleration series, computed from the same one-embed-call-per-point vectors used for scoring.",
272
+ "status": "confirmed"
273
+ }
274
+ ],
275
+ "hard_questions": [],
276
+ "links": []
277
+ },
278
+ {
279
+ "id": "c19",
280
+ "kind": "requirement",
281
+ "text": "New verb 'coherence meaning trend <f1> <f2> <f3> [...]' takes an ordered series (2+ points for f', 3+ for f''); 'compare' stays the 2-point special case; JSON output lists per-step deltas plus per-signal velocity/acceleration series.",
282
+ "origin": "llm",
283
+ "status": "confirmed",
284
+ "honesty_conditions": [
285
+ {
286
+ "id": "h16",
287
+ "text": "compare and trend agree on the same two files (identical deltas); trend with fewer than 2 inputs is a user-input error with a hint.",
288
+ "status": "confirmed"
289
+ }
290
+ ],
291
+ "hard_questions": [],
292
+ "links": []
293
+ },
294
+ {
295
+ "id": "c20",
296
+ "kind": "boundary",
297
+ "text": "This spec covers issue #4 phases 1-2 (score + compare) plus the trend/trajectory extension (f'/f'' over measurement-point series \u2014 beyond issue #4's text). Still excluded: separate meaning-cli, LLM judge, experiment runner execution, doctor/certify integration, pluggable embedding providers \u2014 tracked follow-ups, not silent scope.",
298
+ "origin": "user",
299
+ "status": "confirmed",
300
+ "honesty_conditions": [
301
+ {
302
+ "id": "h17",
303
+ "text": "No MVP code path executes an experiment, calls an LLM judge, or touches doctor/certify; each deferred phase is a tracked follow-up, not silent scope.",
304
+ "status": "confirmed"
305
+ }
306
+ ],
307
+ "hard_questions": [],
308
+ "links": []
309
+ }
310
+ ],
311
+ "open_vagueness": [
312
+ {
313
+ "id": "v1",
314
+ "text": "Exact anchor texts per subdimension \u2014 seed from issue #4's high/low lists, expect iteration once real scores are observed; anchors are fixtures precisely so tuning them is a data change, not a code change.",
315
+ "kind": "unknown_nonblocking",
316
+ "claim_id": null
317
+ },
318
+ {
319
+ "id": "v2",
320
+ "text": "Whether the 5 subdimension axes are actually independent signals or collapse into one factor (or into length/sentiment) \u2014 answerable only by the phase-3 experiment.",
321
+ "kind": "unknown_nonblocking",
322
+ "claim_id": null
323
+ },
324
+ {
325
+ "id": "v3",
326
+ "text": "Score normalization choice (raw cosine vs rescaled [0,1] vs percentile against anchors) may need revisiting once distributions on real artifacts are visible.",
327
+ "kind": "unknown_nonblocking",
328
+ "claim_id": null
329
+ },
330
+ {
331
+ "id": "v4",
332
+ "text": "Phase 3: 'coherence meaning experiment run' + a 100-300 issue human-rated dataset (needs human raters and outcome labels).",
333
+ "kind": "follow_up",
334
+ "claim_id": null
335
+ },
336
+ {
337
+ "id": "v5",
338
+ "text": "Phases 4-5: 'coherence doctor --dimension meaning' and 'coherence certify --dimension meaning' \u2014 integrate once scoring is trusted.",
339
+ "kind": "follow_up",
340
+ "claim_id": null
341
+ },
342
+ {
343
+ "id": "v6",
344
+ "text": "LLM-judge fallback and pluggable embedding providers (issue #4 stretch tier).",
345
+ "kind": "follow_up",
346
+ "claim_id": null
347
+ },
348
+ {
349
+ "id": "v7",
350
+ "text": "Culture.dev routing policy output (route_to / memory_candidate recommendations) \u2014 depends on validated scores.",
351
+ "kind": "follow_up",
352
+ "claim_id": null
353
+ },
354
+ {
355
+ "id": "v8",
356
+ "text": "Derivative denominator: MVP uses per-step differences (unitless, ordered series); time-normalized derivatives (divide by delta-t from git dates or mtimes) revisit when git-history sampling lands.",
357
+ "kind": "unknown_nonblocking",
358
+ "claim_id": null
359
+ },
360
+ {
361
+ "id": "v9",
362
+ "text": "Git-history sampling as measurement-point source ('coherence meaning trend --git <path>' walking commits) \u2014 natural follow-up once explicit file series works.",
363
+ "kind": "follow_up",
364
+ "claim_id": null
365
+ }
366
+ ]
367
+ }