Sync v0.2.0: family closure, report workflow, and tmux dotted-path fix - #3
Sync v0.2.0: family closure, report workflow, and tmux dotted-path fix#3LehengChen wants to merge 25 commits into
Conversation
Introduce iteris family for parallel sibling North-Star runs with shared verified-fact pool and max_concurrent scheduling, plus iteris report for LaTeX/PDF drafts from verified project evidence. Existing monitor, doctor, run, and evolve commands remain unchanged; family integrates via a thin CLI typer and lazy goal-prompt context. Co-authored-by: Cursor <cursoragent@cursor.com>
Expose iteris family and iteris report in English and Chinese READMEs, user guide, and GUIDE_INDEX so open-source users can discover the new workflows. Co-authored-by: Cursor <cursoragent@cursor.com>
…e-and-report Add family closure scheduling and report workflow
Match the natural workflow order: generalize from one verified result first, then parallel sibling North-Star closure. Co-authored-by: Cursor <cursoragent@cursor.com>
…workflow Merges frenzymath#2 (Zihao-Liu-Leo). The report half of that PR is already present in main via local development (identical tree), so this merge effectively lands the family-closure feature: iteris family init/ status/schedule/export/pool, shared verified-fact pool, sibling markers, and .iteris/FAMILY.json wrapper scheduling with max_concurrent. Supersedes PR frenzymath#1, whose family files appear here in revised form.
PR frenzymath#2 dropped the mode bit (100755 -> 100644) as an unintended side effect.
…paths) A project directory containing a dot produced a session Iteris could create but never address again. `tmux new-session -s iteris-2.15` silently STORES the session as `iteris-2_15`, because tmux target syntax reads `.` as a pane separator. Every later `-t iteris-2.15` was then parsed as pane 15 of session `iteris-2` and failed with `can't find pane: 15`, leaving a live worker that could not be attached, logged, messaged, or stopped. This is general, not incidental: it hits any project whose directory name contains a dot, and lands squarely on family closure, whose documented use case is sibling ids 2.15-2.19. Fixed at two chokepoints: - `project.tmux_safe_name` folds `.` and `:` to `_`, applied inside `session_slug` before the length check so the collision digest stays stable. Covers every Iteris-generated name. - `tmux.tmux_target` applies the same fold at each tmux invocation, so a name passed by hand via `--session` is normalized too. Folding matches tmux's own behavior: it reports `duplicate session` for `2.15` when `2_15` exists, so no two names collapse that tmux kept apart. Both helpers are idempotent, so layering them is safe. Creation and lookup sites were changed together — normalizing only one side would have recreated the original mismatch. Verified end-to-end on an isolated tmux socket with a real `2.15` project: create, has-session, capture-pane, send-keys, and kill-session all succeed. Dot-free names keep their historical session names unchanged.
Interactive monitor sessions invoke Iteris again for read-only lookups and user-approved project actions, but Codex tool shells may reset PATH and lose a user-local Iteris installation. Pin the console-scripts directory the same way worker and verification sessions already do.
A manifest written to match the documented `--sibling id=...` CLI spec scaffolded successfully but stored `sibling_id: None`. The family looked healthy — `family status` listed every sibling — yet each id-addressed command failed far from the cause: `family start --sibling 2.15` reported `unknown sibling id: 2.15`, because `sibling_by_id` matches on `sibling_id`. `normalize_sibling_entries` now runs at both scaffolding entry points (`perform_family_new` and `perform_family_init`) and: - accepts `id` as an alias for `sibling_id`, matching what `parse_sibling_spec` already does for the CLI surface - raises when neither spelling is present, instead of storing None - coerces ids to str, so a bare numeric id in JSON still resolves - rejects duplicate ids, which would have left the second sibling unreachable via `sibling_by_id` Verified live: a manifest using `id` now yields an addressable sibling and `family start --sibling 2.15` resolves it.
|
Pushed one more fix, replacing the "known nit" noted at the end of the description.
Tests are now 416 passed (8 more in |
Two report tests asserted on literal substrings of rendered CLI output and failed in CI while passing locally. CI enables color; a plain local run does not, and Rich styles message fragments independently: - `--source` is emitted as `\x1b[1;36m-\x1b[0m\x1b[1;36m-source\x1b[0m`, so the literal `--source` is absent from the output entirely. - An exported path is split into a styled parent directory and filename, and may wrap between them. Rich also hard-wraps inside error boxes and pads lines to the terminal width with `│` borders, so where a phrase breaks depends on terminal width and on the length of interpolated paths — CI's `tmp_path` is longer than a local one. Adds a `plain` fixture in `tests/conftest.py` that strips ANSI escapes and box borders and collapses whitespace, and uses it in both tests. The assertions now check the message text, which is what they were meant to verify; the product code was correct and is unchanged. Verified 416 passed across four combinations: local and CI dependency versions (typer 0.27 / click 8.4), each with color off and on. The colored CI-dependency run reproduces the original failure before this change.
Brings the public repo up to the current v0.2.0 development state. Upstream
mainis still at the initial public snapshot, so this carries 23 commits across 64 files rather than a single feature.What is in here
Family closure (from #2 by @Zihao-Liu-Leo, which this supersedes) —
iteris family new/init/status/schedule/start/run/stop/export/pool: joint scheduling and a shared verified-fact pool for parallel sibling North-Star tracks, via an.iteris/FAMILY.jsonwrapper withmax_concurrentcontrol.Report workflow —
iteris report new/draft/build/export/config/feedback/doctor/statusplus the dashboard Reports UI: versioned LaTeX reports drafted from verified project evidence.Fix: dotted project paths break tmux sessions. Reported by a user who found that a working directory could not contain a
.. The cause is not path handling but tmux target syntax:tmux new-session -s iteris-2.15silently STORES the session asiteris-2_15, because.is a pane separator. Every later-t iteris-2.15was then parsed as pane 15 of sessioniteris-2and failed withcan't find pane: 15— leaving a live worker that could not be attached, logged, messaged, or stopped.This is general (any project directory containing a dot) and it lands squarely on family closure, whose documented use case is sibling ids
2.15–2.19. Fixed at two chokepoints:project.tmux_safe_nameinsidesession_slugcovers every generated name, andtmux.tmux_targetcovers names passed by hand via--session. Creation and lookup sites were changed together — normalizing only one side reproduces the original mismatch. Folding./:to_matches tmux's own behavior (it reportsduplicate sessionfor2.15when2_15exists), so no two names collapse that tmux kept apart.Also: PATH pinning for interactive monitor sessions, and restoring the executable bit on
scripts/deploy.shthat #2 dropped.Testing
python -m pytest -q— 408 passed (8 new regression tests intests/test_tmux_target_names.py)tmux -L) with a real2.15project: create,has-session,capture-pane,send-keys,kill-sessionall succeed; dot-free names keep their historical session names unchanged.2.15/2.16/2.17) scaffolds correctly,family statusreports all three, andschedule --dry-runrespectsmax_concurrent=2.report new/draftwork in a dotted project directory and with a dotted report id (report paths are filesystem-only and were never affected).Note for reviewers
#1 was closed as superseded — it is the same feature from the same author in an earlier form, fully contained in #2. Original commit authorship from both contributors is preserved in the history.
Known nit, not fixed here
iteris family new --manifestexpectssibling_idfor each sibling, while the--siblingCLI spec usesid=. Passingidin a manifest silently yieldssibling_id: nullinstead of erroring. Left for a follow-up since it is a validation gap, not a regression.