Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
c4d621e
docs(next): mark PR #1 merged; buildout chapter closed; L4b is the ne…
claude May 22, 2026
c65b6ae
feat(orchestrator): adopt multi-agent framework reusing existing Hann…
claude May 25, 2026
6938858
checkpoint(orchestrator): first-principles review GOAL on disk; 7 sco…
claude May 29, 2026
3e04a1a
checkpoint(orchestrator): scout-architecture + scout-code-quality fin…
claude May 29, 2026
0e6036e
checkpoint(orchestrator): scout-security-rules + scout-tests findings…
claude May 29, 2026
97090d6
checkpoint(orchestrator): scout-docs + scout-lanes-schemas findings (…
claude May 29, 2026
3bddc08
checkpoint(orchestrator): scout phase 7/7 complete; PRD authored; awa…
claude May 29, 2026
59dbefb
fix(orchestrator): Phase 0 — resolve §7 self-violation; closes q013
claude May 30, 2026
5aea2bd
feat(phase1): pre-L4b unblockers — D010 rhythm-anchor + D011 platform…
claude May 30, 2026
96dc261
feat(phase2): test integrity — PoC integration + sub-render coverage …
claude May 30, 2026
5744142
feat(phase3): CI/compliance integrity — meaningful greens (closes c013)
claude May 30, 2026
3f9688b
fix(phase4): doc-drift sweep — RULES §34 to 2-layer, README layout re…
claude May 30, 2026
b95faa5
feat(phase5): operational substrate — logging + status + scheduler + …
claude May 30, 2026
2118024
feat(phase6): data hygiene + EXIT — ProductFile.parse faithful-surfac…
claude May 30, 2026
7a63288
chore(harness): FRAME ratified + SKETCH executed for the long-horizon…
claude May 30, 2026
fca02dd
chore(harness): DELIBERATE cycle 1 — D014/D015 ratified; Line C died …
claude May 30, 2026
a2d64cd
feat(arc-cycle1-line-A): src/channels/calendar.py + reconciliation + …
claude May 31, 2026
60aa009
feat(arc-cycle1): Line A critic[verify] PASS 36/36 → CHAMPION promote…
claude Jun 1, 2026
1000d2c
chore(harness): cycle 1 → cycle 2 REORGANIZE; q017 closed-pending-act…
claude Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .claude/agents/critic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
name: critic
description: Runs in exactly ONE mode per call — verify, red_team, or evaluate. Modes are never mixed.
tools: Read, Grep, Glob, Bash
---

You are the **critic** under the Hanna orchestrator (`ORCHESTRATOR.md`). In D002 terms you are
the **Compliance Reviewer** — mandatory, runs last and alone, never in parallel with workers.
Your delegation specifies exactly one MODE. Do not blend modes within a call.

## MODE: verify

Does the artifact meet ACCEPTANCE? Read each acceptance criterion literally, check it, and return
**pass** or **fail** with the specific criterion and per-item evidence. This is the EXIT gate —
the orchestrator runs `critic[verify]` against EXIT_CRITERIA before terminating.

## MODE: red_team

What could break this? Adversarial pass over the diff: edge cases, contract drift, dead code,
cross-file inconsistency, missed lockout / Rule 35 boundary gates, protocol desync. Return findings
classified **BLOCKER / MAJOR / MINOR**. Hanna precedent: a round-3 review found 4 latent bugs that
passing tests missed (belief c003) — assume the same and dig.

## MODE: evaluate

What is true given the evidence, and how confident? Return **claim + confidence (0.0–1.0) +
provenance**. This is how the orchestrator sources belief deltas it can trust.

## Hard constraints (inherited, D002 / §9)

- Audit against `RULES.md` (especially 18, 34, 35, 36, 37), `docs/DECISIONS.md`,
`HANNA_BLUEPRINT.md` contracts, and the compliance greps.
- Audit trailer hygiene: cloned files carry the attribution trailer (first 20 lines); fresh seeds
do not (D003/D004). Flag any model-id string in a committed artifact.
- Read-only. Return artifact path + one-paragraph summary. You MAY propose belief deltas in
`evaluate` mode; you never write `state/beliefs.md` yourself.
29 changes: 29 additions & 0 deletions .claude/agents/integrator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
name: integrator
description: Reconciles parallel diffs from N>1 concurrent workers into one coherent change. Only when N>1.
tools: Read, Edit, Write, Grep, Glob, Bash
---

You are the **integrator** under the Hanna orchestrator (`ORCHESTRATOR.md`). In D002 terms you
are step 5 — integration. You run ONLY when more than one worker ran concurrently and their diffs
must be reconciled. For a single-worker task there is no integrator.

## What you do

- Merge parallel worker diffs into one coherent change: resolve overlapping edits, reconcile
shared schemas / imports, ensure the cross-file consistency that no individual worker could see
(e.g. two workers both touching `src/schemas.py`).
- Do NOT introduce new behavior — you reconcile what workers produced. New behavior is a worker
task; surface it for the orchestrator instead of writing it.
- Hand the reconciled artifact to `critic[verify]` before the orchestrator commits.

## Hard constraints (inherited, D002 / §9)

- Rule 34 / 35 / 36 / 37; preserve D003/D004 trailer hygiene across every merged file.
- Canonical commit trailer (the orchestrator commits); no model-id in artifacts; no new
dependencies without a decision.

## Output

Reconciled artifact path + one-paragraph summary, naming any merge conflicts resolved and any
belief deltas about integration risk. You never write `state/beliefs.md` yourself.
32 changes: 32 additions & 0 deletions .claude/agents/planner.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: planner
description: Surveys the territory and produces a task graph with EXIT criteria. Runs on cold-start, stale plan, or belief reframe.
tools: Read, Grep, Glob, Bash
---

You are the **planner** under the Hanna orchestrator (`ORCHESTRATOR.md`). In Hanna's D002 MoE
taxonomy you are the **Architect** role, formalized as a Claude Code primitive.

## What you do

- Survey the territory: read `docs/ROADMAP.md` §5, `docs/DECISIONS.md`, `NEXT.md`,
`state/beliefs.md`, `state/open_questions.md`.
- Produce a task graph — nodes, dependencies, acceptance per node. For buildout work the graph
IS `docs/ROADMAP.md` §5; reference lane IDs, do not duplicate the table.
- Define GOAL + EXIT_CRITERIA (per-criterion, observable, verifiable) + CONFIDENCE_THRESHOLD
(default 0.8).
- Record design choices WITH rejected alternatives. These become `docs/DECISIONS.md` D###
entries authored by the orchestrator — you propose, you do not write DECISIONS.md.

## Hard constraints (inherited, D002 / §9)

- Rule 34 (family-first lockout), Rule 35 (Harlo read-only / Octavius request-only),
Rule 36 (surface, don't decide), Rule 37 (never raise patent topics).
- No new dependencies without a `docs/DECISIONS.md` entry.
- Read-only: you never edit `src/`, `tests/`, or `state/`.

## Output

Artifact path (a proposed plan / decision block) + a one-paragraph summary. You MAY propose
belief deltas `{claim, suggested_confidence, evidence}`; the orchestrator validates and writes
`state/beliefs.md`. You never write it yourself.
32 changes: 32 additions & 0 deletions .claude/agents/worker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: worker
description: Executes one bounded task — the smallest change that satisfies acceptance. The most common role.
tools: Read, Edit, Write, Grep, Glob, Bash
---

You are a **worker** under the Hanna orchestrator (`ORCHESTRATOR.md`). In D002 terms you are a
builder expert (Bridge / Computation / Stage / Brief-Composer / MCP-Surface) — your INPUTS tell
you which lens applies. You read cold: only your declared INPUTS, never the parent conversation.

## What you do

- Execute exactly ONE bounded task. Make the SMALLEST change that satisfies ACCEPTANCE.
- One concern per delegation. If you discover out-of-scope work, note it in your summary for
`parked.md` — do not do it.
- Write your diff / tests under `state/tasks/<TASK_ID>/` if the contract's OUTPUT says so;
otherwise edit in place per the contract.

## Hard constraints (inherited, D002 / §9)

- Rule 34 lockout gate at any publish / MCP-tool site; Rule 35 boundary (never call Harlo
`store`/`stage_reload`/`resolve_verifications`/`trigger_cognitive_recalibration`); Rule 36
voice (surface, don't decide); Rule 37 silence on patent topics.
- D003/D004 trailer hygiene: cloned-from-Harlo files carry the attribution trailer in their
first 20 lines; fresh-seed files with no Harlo ancestor carry NO trailer.
- The orchestrator commits, not you. Never place a model-id in any artifact.
- No new dependencies without a decision.

## Output

Artifact path + one-paragraph summary. Include belief deltas `{claim, suggested_confidence,
evidence}` when your work changes what is known. NEVER write `state/beliefs.md` yourself.
61 changes: 56 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,73 @@ jobs:
pip install -e ".[dev]"
- name: Run pytest
run: pytest tests/ -v
- name: Rule 35 — no forbidden Harlo writes
- name: Rule 35 — no forbidden Harlo writes (name-anchored first line of defense)
run: |
if grep -rE "harlo\.(write|store|author|mutate)" src/ scripts/ ; then
if grep -rE "harlo\.(write|store|author|mutate|commit|persist|save|update)" src/ scripts/ ; then
echo "::error::Rule 35 violation: write surface to Harlo found."
exit 1
fi
if grep -rE "octavius\.(write|store|author|mutate|commit|persist|save|update)" src/ scripts/ ; then
echo "::error::Rule 35 violation: write surface to Octavius found."
exit 1
fi
Comment on lines +30 to +33

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Rule 35 is still unenforced for the Octavius surface.

This only blocks a few write-like octavius.* verbs, while the authoritative allowlist exists only for src/harlo_bridge.py. A disallowed Octavius operation like cancel, list, or any future non-spawn/poll/harvest call would still pass CI. Mirror the bridge-surface allowlist check for src/octavius_bridge.py so the workflow enforces the same contract it documents.

As per coding guidelines, **/*.py: Request Octavius via src/octavius_bridge.py only; only spawn/poll/harvest operations allowed (Rule 35).

Also applies to: 40-59

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 30 - 33, CI currently only blocks a
few octavius.* write verbs; update .github/workflows/ci.yml to mirror the
harlo_bridge allowlist logic for src/octavius_bridge.py so that any octavius.*
usage outside that bridge is rejected unless it is one of the allowed verbs
(spawn|poll|harvest). Specifically, add the same file-scope allowlist check that
references src/octavius_bridge.py and enforces only spawn/poll/harvest calls
(Rule 35) by failing the job when other octavius.* operations are found in
source files.

- name: Rule 35 — no forbidden cognitive-twin store/stage/verify calls
run: |
if grep -rE "\b(stage_reload|resolve_verifications|trigger_cognitive_recalibration)\b" src/ scripts/ ; then
echo "::error::Rule 35 violation: forbidden cognitive-twin call."
exit 1
fi
- name: Rule 37 — no patent topics
- name: Rule 35 — enumerated bridge surface (authoritative allowlist per D001)
run: |
python3 - <<'PY'
import re, sys, pathlib
allowlist = {"status", "coach", "recall", "query_past_experience", "patterns"}
path = pathlib.Path("src/harlo_bridge.py")
text = path.read_text(encoding="utf-8")
# Match self._call_tool("X" — capture X.
pattern = re.compile(r'self\._call_tool\(\s*["\']([^"\']+)["\']')
found = set(pattern.findall(text))
violations = found - allowlist
if violations:
print(f"::error::Rule 35 violation: src/harlo_bridge.py invokes _call_tool with non-allowlisted tool(s): {sorted(violations)}")
print(f"Allowlist (per D001): {sorted(allowlist)}")
sys.exit(1)
if not found:
print(f"::error::Rule 35 check: no _call_tool sites found in src/harlo_bridge.py — pattern broken?")
sys.exit(1)
print(f"Rule 35 allowlist OK: found tools {sorted(found)}")
PY
- name: Rule 37 — no patent topics (code, scripts, tests, docs)
run: |
# Meta-references that discuss the rule itself (rather than raising patent
# topics as content) are exempted. The exemption pattern matches: explicit
# "Rule 37" mentions, the grep-recipe self-reference, the literal "patent
# topic(s)" / "patent-topic(s)" phrasing the rule uses to name itself, and
# the upstream PATENTS.md filename reference.
hits=$(grep -rEi "patent|provisional|uspto|claim[[:space:]]+language" src/ scripts/ tests/ docs/ \
| grep -vEi "Rule 37|grep.*patent|patent[- ]topic|patent[- ]adjacent|PATENTS\.md|no patent" \
|| true)
Comment on lines +67 to +69

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The Rule 37 exemption is broad enough to hide real violations.

Both filters drop any matching line that also contains Rule 37, so content like Rule 37: add patent triage would be exempted instead of failing CI. Narrow these exclusions to exact self-referential phrasings rather than a blanket Rule 37 substring.

Based on learnings, Rule 37: Never raise patent topics. No exceptions in any session, commit message, or doc generated under this repo.

Also applies to: 84-87

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 67 - 69, The exclusion using grep -vEi
that currently filters out any line containing the substring "Rule 37" is too
broad; update the negative filter(s) used when populating the hits variable (and
the similar filters at the later occurrences) to only exclude exact
self-referential phrasings such as the canonical rule text (e.g., "Rule 37:
Never raise patent topics", "Rule 37: Never raise patent topics. No exceptions")
or tightly scoped variants like lines that start with "Rule 37:" rather than any
line containing "Rule 37"; locate the grep -vEi expressions in the hits
assignment and the related blocks (the patterns that include "Rule 37|...") and
replace the broad "Rule 37" alternation with precise, anchor- or full-phrase
patterns so legitimate matches mentioning Rule 37 in context are not suppressed.

if [ -n "$hits" ]; then
echo "::error::Rule 37 violation: patent topic found in code or docs."
echo "$hits"
exit 1
fi
- name: Rule 37 — no patent topics in commit messages (last 50)
run: |
if grep -rEi "patent|provisional|uspto|claim[[:space:]]+language" src/ scripts/ tests/ ; then
echo "::error::Rule 37 violation: patent topic found in code."
# Need enough history; checkout above uses default depth=1, so fetch more.
git fetch --deepen=50 origin 2>/dev/null || true
# Same exemption posture as the docs grep: rule-discussion language is
# not a Rule 37 violation. Historical commits reference the brief
# composer's negative-space examples ("Patent-section paragraph",
# "Patent application formation") as rule-enforcement framing, not as
# patent-topic content.
hits=$(git log -50 --format=%B \
| grep -iE "patent|provisional|uspto|claim[[:space:]]+language" \
| grep -vEi "Rule 37|grep.*patent|patent[- ]topic|patent[- ]adjacent|patent[- ]section|patent application formation|no patent" \
|| true)
if [ -n "$hits" ]; then
echo "::error::Rule 37 violation: patent topic found in recent commit messages."
echo "$hits"
exit 1
fi
- name: Rule 1 — no sleep() calls
Expand Down
7 changes: 7 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ Hanna conventions accrete as sessions resolve open questions. See [`docs/CONVENT

---

## Orchestration

Multi-agent work in this repo runs under the orchestrator operating manual in [`ORCHESTRATOR.md`](ORCHESTRATOR.md). Subagent roles live in `.claude/agents/` (planner / worker / critic / integrator); durable belief and open-question state lives in `state/`. `/hanna-dispatch-next` is one workflow under that orchestrator (see ORCHESTRATOR.md §8). This file does not duplicate the manual; it points at it.

---

## Commit trailer (canonical)

Every commit in this repo ends with the canonical Claude Code format:
Expand Down Expand Up @@ -73,5 +79,6 @@ Session docs live under `docs/SESSION_NN_*.md`.
- Not a duplicate of the global `~/.claude/CLAUDE.md`. Behaviors, body-first protocols, coworker blend, RSD guidance — those live globally. This file is project scope only.
- Not a duplicate of `RULES.md`. Rules live there; this file points at them.
- Not a duplicate of `HANNA_BLUEPRINT.md`. Architecture lives there.
- Not a duplicate of `ORCHESTRATOR.md`. The orchestration manual lives there; this file points at it.

Each file has one job.
44 changes: 31 additions & 13 deletions NEXT.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
# NEXT — for tomorrow-you

## 2026-05-22 (post-merge) — buildout chapter closed

PR [#1](https://github.com/JosephOIbrahim/Hanna/pull/1) merged to `main` at `e08aebb619526c031b4d895484a1ae1bc1b51a23` (merge commit; method: merge — preserves the 18-commit lane-by-lane history). Branch `claude/hanna-mcp-review-ZsorY` is now consumed against `main`; 18 commits landed.

Buildout-session checkpoint preserved below as the source-of-truth handoff for the next session.
Comment on lines +3 to +7

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Separate the historical snapshot from the live handoff.

This file now mixes a preserved 2026-05-22 snapshot with a present-tense “Where you are” block, but this PR is being reviewed as PR #2 from claude/hanna-mcp-review-ZsorY. Leaving PR #1 merged / branch consumed / main HEAD = e08aebb as the live checkpoint will misdirect the next session. Either move those bullets under the historical section or append the actual current branch/PR/HEAD state.

Also applies to: 62-64

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@NEXT.md` around lines 3 - 7, The "2026-05-22 (post-merge) — buildout chapter
closed" section currently mixes a preserved historical snapshot with the live
"Where you are" handoff; separate them by moving the PR `#1` / branch consumed /
main HEAD = e08aebb619... bullets into a clearly labeled historical section
(under the existing "2026-05-22" heading) and ensure the present-tense "Where
you are" block contains the actual current PR/branch/HEAD info for PR `#2`
(claude/hanna-mcp-review-ZsorY), updating those bullets accordingly so the live
handoff reflects the current session state rather than the archived snapshot.


---

## 2026-05-22 session outcome — post-ratification buildout (L1–L4a + L3b)

The `/hanna-dispatch-next` harness advanced five lanes on `claude/hanna-mcp-review-ZsorY` via D002 MoE dispatches. PR [#1](https://github.com/JosephOIbrahim/Hanna/pull/1) covers the full buildout against `main`.
The `/hanna-dispatch-next` harness advanced five lanes on `claude/hanna-mcp-review-ZsorY` via D002 MoE dispatches; three rounds of CodeRabbit review landed in three separate fix batches.

### Lane commits (top of branch, in order)
### Lane commits (top of branch, in order before merge)

- `298f50c` — fix: CodeRabbit round 3 (4 latent bugs + 2 test polish) — HarloTimeout fallback in PoC, frame coalescing in bridge `_read_frame_with_timeout` (with new `self._recv_buffer`), ISO-datetime parsing in `_parse_forcing_function`, README §"Rules" layer-count contradiction, brittle wall-clock assertion removed, `FrozenInstanceError` narrowed.
- `8e83296` — docs: 4 doc/code contradictions reconciled (post-PR diagnostic — README Status table, CONVENTIONS delegate references, BLUEPRINT path, bin dangling reference).
- `2e68877` — docs: D003 + D008 contradictions in BLUEPRINT + README + RULES + NEXT.md refresh (CodeRabbit round 2).
- `8bafe27` — ci: pin actions/checkout + actions/setup-python to SHAs + persist-credentials false (CodeRabbit round 2).
- `06effc8` — **L3b** D005 bridge hardening (composition scope + selectors-based read timeout + stderr drainer with `deque(maxlen=64)`; **+21 tests**; ROADMAP §5 atomically updated).
- `0f35f33` — Composer voice fix (Rule 36 honesty: `_portfolio_line` surfaces counts by status; active-first display order; **+5 tests**).
- `ecd465b` — **L4a** D007 product files + composer rewrite (`ProductFile` + `BriefPayload` schemas + `compute_brief_priority` pure function + four `data/products/*.md` stubs; **+25 tests**; ROADMAP §5).
- `04af5da` — **L3a** Session 03 phase bodies (six branches complete; PoC `try/except NotImplementedError` catch deleted; **+18 tests**; ROADMAP §5).
- `2f44e52` — **L2** Substrate hygiene (`pyproject.toml` + `tests/conftest.py` + `.github/workflows/ci.yml` + `.gitignore` patches; ROADMAP §5).
- `ec6752a` — **L1** D008 propagation (BLUEPRINT §4 table renamed + §5 strikethroughs + §10 lane diagram; README mermaid; RULES.md applicability note).
- `413e7ad` — docs+fix: CodeRabbit PR #1 review batch 1 (D001 anchors, NEXT.md status alignment, midday/evening phase fallback).
- `413e7ad` — docs+fix: CodeRabbit PR #1 review round 1 (D001 anchors, NEXT.md status alignment, midday/evening phase fallback).

### Test count

73 tests pass on `06effc8` (52 baseline + 21 from L3b). Up from 7/7 at Session 02 close.
**74 tests pass on HEAD** (`298f50c`). Progression: 7 (Session 02) → ≥22 (post-L3a) → 47 (post-L4a) → 52 (voice fix) → 73 (L3b) → 74 (round-3 ISO datetime test).

### Substrate-decision tree at end of session

Expand All @@ -26,10 +38,10 @@ The `/hanna-dispatch-next` harness advanced five lanes on `claude/hanna-mcp-revi
| D002 | resolved | every MoE dispatch in this session followed the protocol |
| D003 | resolved | clones carry trailer only; fresh seeds carry no trailer |
| D004 | resolved | reviewer audits trailer placement within first 20 lines |
| D005 | resolved | **landed via L3b** (`src/harlo_bridge.py` + `tests/test_harlo_bridge.py`) |
| D005 | resolved | **landed via L3b** (`06effc8`); frame coalescing patched in `298f50c` (`self._recv_buffer` preserves trailing bytes across `_read_frame_with_timeout` calls) |
| D006 | resolved | **pending L4b implementation** (next lane) |
| D007 | resolved | **landed via L4a** (`src/schemas.py` `ProductFile` + `BriefPayload`; `data/products/*.md`; composer rewrite) |
| D008 | resolved | **landed via L1** (BLUEPRINT + README + RULES docs propagation) |
| D007 | resolved | **landed via L4a** (`ecd465b`); `_parse_forcing_function` ISO-datetime split patched in `298f50c` (canonical `: ` delimiter; preserves `2026-06-01T10:30:00-04:00` timezone offsets) |
| D008 | resolved | **landed via L1** (`ec6752a`) |

### ROADMAP §5 status

Expand All @@ -47,9 +59,9 @@ The `/hanna-dispatch-next` harness advanced five lanes on `claude/hanna-mcp-revi

## Where you are

- **Branch:** `claude/hanna-mcp-review-ZsorY`.
- **PR:** [#1](https://github.com/JosephOIbrahim/Hanna/pull/1) open against `main`. CI passing on `06effc8`. CodeRabbit reviewed; this session addressed the four open threads (CI workflow hardening + D003/D008 doc-contradiction reconciliation).
- **Branch is 14+ commits ahead of `main`.**
- **Branch:** `claude/hanna-mcp-review-ZsorY` — consumed against `main` at merge commit `e08aebb`. Branch still exists in the remote; not deleted (Joe's discretion).
- **PR:** [#1](https://github.com/JosephOIbrahim/Hanna/pull/1) **merged**. CI was green on HEAD `298f50c` (success in 13s). All 13 CodeRabbit threads addressed across 3 rounds.
- **`main` HEAD:** `e08aebb` (merge commit; 18 commits incorporated).

## Next session entry point — L4b

Expand All @@ -67,10 +79,16 @@ After L4b: L5 (schemas 2–5: `OverrideToken`, `JoeStateSnapshot`, `FormationReq
## Open questions still parked

- **§C.2** — Octavius IPC PoC (deferred until `octavius_bridge` lane / L7).
- **§C.3** — Harlo MCP-client precedent — **closed by L3b.** D001 + D005 ratifications + L3b implementation cover the surface; the bridge now sustains long-lived callers, hung-subprocess timeouts, and stderr backpressure.
- **§C.3** — Harlo MCP-client precedent — **closed by L3b + round-3 patch.** D001 + D005 ratifications + L3b implementation + `298f50c` frame-coalescing patch cover the surface; the bridge now sustains long-lived callers, hung-subprocess timeouts, stderr backpressure, and frame coalescing.
- **§C.4** — `LockoutResponse` shape (needed before L6 `mcp_tools` lane).
- **§C.6** — RED override in delegate dispatch — **void per D008.1** (delegate Cut; Layer 2 collapsed into Layer 3 per-tool lockout check in L6 `mcp_tools` lane).

## Staleness flag — carry forward
## Lessons from this session (for future buildout sessions)

- **Invocation surfaces what mocked tests miss.** The L4a Rule 36 voice bug ("4 threads in flight" when only 1 was) surfaced via `PYTHONPATH=. python3 scripts/first_hanna_brief.py`, not via the 47 passing tests. Always invoke the PoC at edges after each lane.
- **Deeper review catches what your own confidence misses.** CodeRabbit's round-3 scan caught 4 real bugs in L3b/L4a (frame coalescing, HarloTimeout fallback, ISO-datetime split, README contradiction). All 4 were latent — passing tests + my self-audit didn't surface them.
- **Doc-drift accumulates faster than code-drift.** The post-PR diagnostic survey caught 4 contradictions in README Status, CONVENTIONS, BLUEPRINT, and bin/ that CodeRabbit's grep missed. Plan for one diagnostic survey per multi-lane session, not just before PR creation.

## Staleness flag — resolved 2026-05-25

`docs/SESSION_01_RECON.md` §G claims the 33 rules "do not exist in Harlo, synthesize from distributed sources." Still wrong per Session 01.5's direct extraction from `Harlo/CLAUDE.md` lines 37–194. Joe's call: correct or leave as session-stamped historical artifact.
`docs/SESSION_01_RECON.md` §G (the "rules don't exist in Harlo" recon-time misread) was preserved as a session-stamped historical artifact during the Phase 4 doc-drift sweep — a `> Historical note` block at the top of §G points to the live state (Session 01.5's direct extraction from `Harlo/CLAUDE.md` lines 37–194). The narrative below the note stays unedited as the recon-time record. q003 / q009 closed.
Loading
Loading