- Plexer: always-active terminal multiplexing. NativePlexerController/ TmuxPlexerController share one interface, chosen by which env var is already set (TAI_PLEXER_SOCKET vs TMUX_PANE); NativePlexerBackend is the pty.fork()-based wrapper (raw mode, SIGWINCH resize forwarding, a Unix-socket control protocol, continuous session logging, a Ctrl+A prefix key distinct from tmux's own Ctrl+B). Auto-wraps new interactive shells via a .bashrc hook mirroring the existing command-not-found install pattern, gated on $TMUX/$TAI_PLEXER_ACTIVE/ a $HOME/.tai-no-plexer bypass. New plexer_send/read/type/status tools, env-gated on a detected controller. - tests/container.py + docker-compose.yml + tests/docker/Dockerfile: a disposable podman/docker image for the tests that must never touch a real machine (installing the plexer hook into a real ~/.bashrc, a live tmux session). Required suite (test_seal.py, test_tai.py, tests/plexer.py, tests/bashrc.py) gates the result; tests/rag.py runs as best-effort since its real-LLM dependency can't be satisfied inside a disposable container with no nested engine. - tests/bashrc.py: real end-to-end hook install + bash -i auto-wrap, anti-recursion, tmux-active skip, non-interactive skip, a live TmuxPlexerController test, and an install/uninstall round-trip. - tests/plexer.py: NativePlexerBackend under a real pty, plus a dedicated robustness pass (file permissions, >64KB payload framing, a malformed control request, a genuine self-deadlock fix in the write-to-child path). - tai_test.py: the shared async process-driving framework (pipe/pty transport, group-wide kill-and-reap, a StdinBridge for --interactive) both test files build on. - ChatClient last-resort backend: when there's no local opencode CLI but the sandbox box is already running, install opencode into it (official Node tarball, not apt -- apt's nodejs/npm pull in webpack/babel/jest as transitive deps) and route through it instead of giving up. Only reachable after the first retry round already failed everything else; never creates the box itself. TmuxPlexerController.status() fixed to use `list-panes` instead of `display-message -p`, which silently fell back to the default pane instead of erroring against a dead target. - Fix 4 pre-existing test_tai.py bugs surfaced by running it in a clean environment for the first time: two stale mock signatures (subprocess.run's stdout= kwarg, Chat.complete's deadline= kwarg), one $TMUX-dependent catalog assertion, one tty-dependent color assertion. - research/: a sourced research archive (Source Dossier/Citation Card/Conclusion tiers) backing the above design decisions, with its own audit.py consistency checker. - .gitignore: fix a blanket *.md rule that was about to silently drop the entire research/ archive from version control; add __pycache__/ and the one-off debug transcript this session started from. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.9 KiB
4.9 KiB
Research Archive Index
Molodetz Institute — Research & Retrieval Division. This is the living registry of every subject in research/. It is updated in the same pass as any new research, per the standing rule in README.md §4. Never edit a subject's documents without also updating its row here.
Global statistics
| Metric | Value |
|---|---|
| Subjects | 4 |
| Total source documents | 225 |
| — Tier 1 (Source Dossier, independently analyzed) | 84 |
| — Tier 2 (Source Citation Card, listed only) | 141 |
| Total conclusion documents | 4 |
| Archive opened | 2026-10-09 |
| Last updated | 2026-10-09 |
Subjects
| Subject | Sources (T1 / T2) | Conclusions | Opened | Last updated | Driving task |
|---|---|---|---|---|---|
sqlite-rag-hybrid-search |
32 (10 / 22) | 1 | 2026-10-09 | 2026-10-09 | Designing tmux-log export + chunked retrieval; settled on BM25-only, no vector DB |
agent-memory-recency-tracking |
63 (16 / 47) | 1 | 2026-10-09 | 2026-10-09 | Designing an LRU-style last-used/use-count tracker for vault records and chunks |
async-pty-process-testing |
59 (20 / 39) | 1 | 2026-10-09 | 2026-10-09 | Designing tai_test.py (pty vs. pipes, non-blocking stdin, process-group cleanup, test-framework shape) — backfilled after it was initially skipped, see activity log |
shell-multiplexer-auto-attach |
71 (38 / 33) | 1 | 2026-10-09 | 2026-10-09 | Designing a tai-managed terminal multiplexer + bashrc auto-attach: tmux-as-substrate recommendation, interactive-vs-automation shell detection |
Recent activity log
| Date | Subject | Event |
|---|---|---|
| 2026-10-09 | — | Archive created: specification (README.md), index (this file), and both subjects above backfilled from the day's research in full, per explicit instruction to retroactively capture every source consulted that day. |
| 2026-10-09 | sqlite-rag-hybrid-search |
32 sources (10 Tier 1 / 22 Tier 2) + 1 conclusion recorded (the conclusion: pure SQLite FTS5/BM25 chunked search, deliberately no embeddings/vector DB — see conclusions/). Counts verified directly against the written files, not taken from the authoring agent's self-report. |
| 2026-10-09 | — | Spec change: Tier split into its own standalone metadata row (1 / 2 / N/A) instead of a parenthetical inside Document type, so it's directly filterable. All 97 existing documents across both subjects backfilled to match in the same pass; counts re-verified afterward (unchanged: 26 Tier 1, 69 Tier 2, 2 Conclusions). |
| 2026-10-09 | agent-memory-recency-tracking |
63 sources (16 Tier 1 / 47 Tier 2) + 1 conclusion recorded (the conclusion: last_used/use_count tracking proposal for records and chunks, throttled-write pattern, no eviction policy yet — see conclusions/). One source (glama-code-index-mcp-bm25-hybrid.md) was promoted from the originally-planned Tier 2 to Tier 1 by the authoring agent mid-task because it contained specific attributable numeric findings — exactly the judgment call §3 of README.md calls for, logged here rather than silently absorbed. Counts verified directly against the written files. |
| 2026-10-09 | async-pty-process-testing |
New subject, opened as a correction: the eight WebSearch calls behind tai_test.py's design (pty vs. pipes, non-blocking stdin, process-group cleanup, test-framework patterns) were initially skipped from the archive under the reasoning "informal engineering reference, not a design decision" — a silent, unilateral exception to the Research Rule, and wrong (see README.md §4's added "no exception, ever" paragraph). Backfilled: 59 sources (20 Tier 1 / 39 Tier 2) + 1 conclusion (conclusions/tai-test-framework-design.md). Counts verified directly against the written files via research/audit.py, not taken from the authoring agent's self-report alone. A PostToolUse/WebSearch hook (.claude/settings.json) was also added the same day specifically to stop this from recurring. |
| 2026-10-09 | shell-multiplexer-auto-attach |
71 sources (38 Tier 1 / 33 Tier 2) + 1 conclusion recorded (the conclusion: build on tmux as a substrate rather than a from-scratch multiplexer; reliable human-vs-automation shell detection has no single solution, only a combination of weaker signals plus a safety-file escape hatch). Counts verified directly against the written files via research/audit.py. Hook fired correctly for all 8 underlying WebSearch calls during this task. |
How to use this index
- Before starting new research, search this table for an existing subject before opening a new one (see
README.md§2, "one subject, one home"). - Every subject folder is self-contained: its sources live flat inside it, its conclusions live in its
conclusions/subfolder. - Tier 1 vs Tier 2 is a statement about how deeply a source was actually read, not about its importance — see
README.md§3 for the exact distinction.