Skip to content

v1.3.0: style system, tests, hybrid search, /council, pre-mortem gate - #26

Merged
chacosoldier merged 4 commits into
mainfrom
release/1.3
Sep 25, 2026
Merged

chacosoldier merged 4 commits into
mainfrom
release/1.3

Conversation

@chacosoldier

Copy link
Copy Markdown
Owner

Second half of the maintenance pass. v1.2.0 (fixes, simplification) is already on main.

What changes

  • Style system: Direct output style rewritten (and it keeps Claude Code's coding instructions now); a Stop hook flags em dashes and paragraph walls (style_gate: warn by default, block/off in the user config); all 325 em dashes removed from the kit; the constitution drops its duplicated style and quality sections and gains a stopping rule.
  • Safer hooks: prompt-injection defender scans MCP output and skips kit files; session start shows notices (scheduled output, recent failures, oversized MEMORY.md, missing config keys) and stops loading stale handovers; scheduled runs announce that nobody is watching.
  • Skills: two-way description boundaries; /reflect now writes the format /memory-debt reads; /chart-tufte is called by /visual-explainer.
  • Tests + CI: tests/run-all.sh (syntax, shellcheck, hook behaviour, frontmatter, docs vs tree, pre-mortem gate); CI runs it and adds a macOS job.
  • Ports: hybrid memory search (FTS5 + Ollama vectors, reciprocal rank fusion, heading breadcrumbs), /council (advisors + mandatory dissenter), pre-mortem gate on ExitPlanMode.

Verified

  • bash tests/run-all.sh passes on each commit's tree (fresh checkout-index copy).
  • Em dash sweep: a script checked that every changed line held an em dash, line counts are unchanged, and no file outside the sweep scope was touched.
  • Hybrid search tested against a local Ollama: a paraphrased query finds the right note, exact names still rank first, and a dead Ollama falls back to keywords with a note.
  • Pre-mortem gate: 13 cases, including one proving it never reads a plan the current session did not name.

🤖 Generated with Claude Code

chacosoldier and others added 4 commits September 25, 2026 11:10
…eep)

- .claude/output-styles/direct.md rewritten from the upstream setup's current
  version, generalized: never-emit list, generic-filler test, long-form rules,
  artifact floors, run-end report shape. Adds keep-coding-instructions: true
  (without it a custom style drops Claude Code's built-in coding instructions)
- hooks/hook-style-gate.py (Stop): flags em dashes used as connectors and
  paragraph walls in long replies. style_gate: warn (default) | block | off in
  config/user.config.yaml. Skips code, blockquotes, and dialogue dashes; fails open
- all 325 em dashes swept out of the kit, so the instructions stop modelling the
  behaviour they ban; every changed line was checked to have held a dash
- CONSTITUTION.md: style section is a pointer to direct.md (one source), adds the
  stopping rule, drops the Quality Standards duplicate (kept in analyst.md)
- prompt-injection defender: also scans MCP tool output; skips the kit's own
  files (vault/, reports/, data/ are still scanned)
- session-start hook: handover only when under 7 days old; notices for today's
  scheduled output, recent scheduled failures, MEMORY.md over 12KB, and
  missing config keys
- scheduled runs export COMPABOB_RUN_CONTEXT=scheduled; hook-inject-now.sh tells
  the assistant nobody is watching
- migrate-config.sh carries a new top-level key's comment block with it

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…teeth

- skill descriptions name their neighbour both ways (morning-brief/tasks,
  reflect/memory-debt/handover, mcp-debug/system-audit, meeting-prep/post-call);
  chart-tufte is a post-build grader that visual-explainer now actually calls
- /reflect records unapproved memory proposals as `- [ ]` items under
  `## Suggested Memory Updates` in vault/Daily, the exact format /memory-debt
  scans, so the loop between them works
- frontmatter values containing ": " are quoted (two were invalid YAML)
- comms-guard blocks running telegram/send.sh, no longer reading it
- tests/: run-all.sh (syntax, shellcheck, JSON, no em dashes, hook behaviour,
  frontmatter, docs vs tree); hook-smoke.sh feeds sample calls to every hook
- CI: runs tests/run-all.sh, re-runs setup to prove it keeps files, and adds a
  macOS job (bash 3.2 syntax, setup, launchd plist lint)
- shellcheck-clean: `cd ... || exit 1` everywhere

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- memory-search: always builds the FTS5 keyword index; with Ollama it also
  stores vectors, and query.py merges both rankings with reciprocal rank fusion
  (meaning-level matches without losing exact names). Falls back to keywords
  when Ollama is down at query time. Chunks carry their heading path.
- /council: strategy-advisor + first-principles + an assigned dissenter in
  parallel; the synthesis must answer each dissent point. Seats run on Sonnet
  to stay affordable; recall reads vault/Decisions from /log-decision.
- hooks/hook-plan-premortem.py (PreToolUse ExitPlanMode): holds an
  irreversible, wide-blast, or multi-week plan until it has a pre-mortem from
  strategy-advisor. Reads the plan file named in this session's own transcript,
  never another session's plan. tests/test-plan-premortem.sh covers both ways.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@chacosoldier
chacosoldier merged commit 917572f into main Sep 25, 2026
2 checks passed
@chacosoldier
chacosoldier deleted the release/1.3 branch September 25, 2026 09:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant