Commit Graph
37 Commits
Author SHA1 Message Date
retoorandClaude Opus 4.8 d34db8f215 cpp-safety: add the playbook doc and AGENTS rule (missed by *.md ignore)
docs/cpp-safety.md (the four-layer safe-C++ playbook and design decisions) and
the AGENTS.md standing rule were skipped by taicpp/.gitignore's *.md pattern in
79ae6f2; force-add them so the policy is actually in the tree, matching how the
other docs are tracked.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-27 19:04:11 +01:00
retoorandClaude Opus 4.8 79ae6f27da cpp-safety: safe-C++ playbook, fix a second UB, and a sanitizer net
Response to incident WA-2026-10-27 (the std::vector max_size() crash). Deep
research archived under research/safe-cpp-practices (8 Tier 1, 37 Tier 2, 2
conclusions) on production-safe C++ that keeps development speed: OpenSSF
compiler hardening, the C++ Core Guidelines bounds profile, integer-overflow
practice, libFuzzer/sanitizer CI, the sanitizer overhead ladder, clang-tidy
ratchets.

The research prescribed an ASan+UBSan+_GLIBCXX_ASSERTIONS build of the parsers.
Standing it up immediately caught a second, independent undefined-behavior bug
that two manual reviews had missed: a protobuf varint loop that shifted by up
to 70 bits (shift >= 64 is UB) on malformed input. Fixed and guarded by a
deterministic test and the sanitizer net.

- src/whatsapp/wa_proto.cpp: guard the wire-0 varint shift (the UB).
- tests/whatsapp_test.cpp: add an overlong-varint hostile case.
- tools/san-whatsapp.sh: the standing sanitizer net for detz::wa parsers.
- WaClient frame capture: a frame that fails to decode/dispatch has its exact
  bytes recorded to <home>/whatsapp/last-error.log (bounded), so the still
  unreproduced live <iq> failure becomes a one-paste deterministic fix. Wired
  from the wizard and the whatsapp_send tool.
- docs/cpp-safety.md: the project-wide playbook and design decisions (four
  layers: overflow-safe checked-reader parsing, cheap release hardening, the
  sanitizer test net, capture). docs/whatsapp.md section 13.6 records the
  follow-up and the honest open item. AGENTS.md makes it a standing rule;
  cap.md and mcp.md inherit it for their wire parsers.

Verified: build, whatsapp_test (incl. hostile+fuzz), make lint, and
tools/san-whatsapp.sh all green; research audit PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-27 19:03:32 +01:00
retoorandClaude Opus 4.8 713f08dc31 whatsapp: document the length_error crash and guard it with a hostile-input test
Record incident WA-2026-10-27 in docs/whatsapp.md section 13: the symptom (a
std::length_error core dump during --whatsapp-link after the QR refreshed), the
root cause (an overflowable `pos + len > size` bounds check plus an unguarded
dispatch loop), the fix (commit f16c5c6), and the standing rule for all code
that parses untrusted bytes: overflow-safe bounds checks, no unchecked
allocation from an attacker-controlled count, and no exception escaping a
top-level loop. The goal is C++ that a hostile peer can never crash.

Prevention is enforced, not just written: tests/whatsapp_test.cpp gains a
test_hostile section that feeds the parsers the exact shapes that crashed (a
4GB length field, an oversized protobuf varint, truncated frames, 2000 random
inputs) and fails if std::length_error is ever thrown again. Runs under
build/whatsapp_test / whatsapp.unit / make test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-27 18:36:14 +01:00
retoorandClaude Opus 4.8 115e403e67 whatsapp: native C++ client + terminal-screenshot tool
Native WhatsApp Web multi-device client in C++ (src/whatsapp/, namespace
detz::wa), built on OpenSSL plus a vendored public-domain ed25519 ref10
(third_party/ed25519, zlib) for XEdDSA and the nayuki QR generator
(third_party/qrcodegen, MIT); no new runtime dependency.

- WaCrypto, WaBinary, WaProto, WaNoise, WaSignal, WaDevice, WaSocket,
  WaClient, WaStore, WaQr, WaWizard.
- Verified offline against golden vectors captured from the real Baileys
  client (tests/whatsapp_data, from jfelipesjc/wa-go, MIT): HKDF/PBKDF2 RFC
  vectors, XEdDSA roundtrips, codec battery 19/19, ClientPayload byte-exact,
  the Noise handshake, and a 4-exchange Signal session byte-exact. Unit test
  build/whatsapp_test (16/16), run_all step whatsapp.unit.
- Verified live against web.whatsapp.com: `detz --whatsapp-link` connects,
  completes the Noise handshake, receives pair-device, renders a scannable QR
  in the terminal, and persists the device to the vault (whatsapp/<profile>.db).
  Also --whatsapp-status / --whatsapp-unlink.
- Agent tools whatsapp_send and whatsapp_contacts (detz-only, in DetzTools).
- Pairing completion after the phone scans, and the message send path
  (usync + prekey fetch + Signal encrypt + send node), are ported faithfully
  from whatsmeow but unverified in-tree (no linked account in development).
  send_image and own-device fan-out are not wired yet. See docs/whatsapp.md.

Also in this snapshot: the terminal-screenshot tool (src/termshot/,
terminal_screenshot, docs/termshot.md, research/terminal-screenshot-rendering)
and a concurrent session's in-progress llm/muse failover changes carried along
in the shared files.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-27 18:22:24 +01:00
retoorandClaude Opus 5.5 1a1448ddd0 docs: WhatsApp research and native C++ build spec
No native Python WhatsApp library exists (neonize is whatsmeow over
ctypes, yowsup is dead) and no browser is needed. Spec for detz::wa:
native C++ transpiled from wa-go (MIT, golden vectors) with whatsmeow as
referee, libcurl WebSocket plus OpenSSL, no new dependencies, build vs
deep-research table, caps, tests, phases, and a whatsapp-mcp shortcut.
Research archive: research/whatsapp-automation (70 sources, 3
conclusions). Nothing built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:55:18 +01:00
retoorandClaude Sonnet 5.5 4b43660e2b docs: cap agents and models, fuzzy matcher, orchestration, feed panes, README overview
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 19:16:18 +01:00
retoorandClaude Sonnet 5.5 ec9c471780 orchestration: sub agents render in live panels on the multiplexer screen
Feed panes in the multiplexer (vpane_* control commands, main-vertical layout, header row),
src/orch (board, panel, formatter, transport, CAP adapter), Agent observer and cancel flag,
supervision (idle warn/cancel, user close cancels, soft then hard stop), CAP answers collected
through the spill path. Research archived under background-work-limits.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 18:58:22 +01:00
retoorandClaude Sonnet 5.5 0ac0584a96 fuzzy: generic FuzzyMatcher, fuzzy @agent/@model mention resolution, research archive
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 18:13:20 +01:00
retoorandClaude Sonnet 5.5 c5acc2249f cap: resolve @agent and @agent:model mentions via CapModelCatalog
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 18:01:34 +01:00
retoorandClaude Sonnet 5.5 20dc51e928 merge: worktree-agent-abfaf52b5a22064d5 (glue, main.cpp)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:24:24 +01:00
retoorandClaude Sonnet 5.5 e384fe5e46 merge: worktree-agent-ad389a7af758a1e42 (mplex final)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:24:18 +01:00
retoorandClaude Sonnet 5.5 ad500b0327 glue: profile switch test, issues doc updated with the smoke results
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:23:43 +01:00
retoorandClaude Sonnet 5.5 0122771350 mplex: wiring doc notes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:20:48 +01:00
retoorandClaude Sonnet 5.5 9f790e3177 glue: wire every port, flag dispatch and REPL host so build/detz runs the real agent
Adapters in src/glue for all ports of agent/ports.h (store, runtime, shell, ui, mcp, skills,
plexer, tui, ops, scheduler db), llm log sink and box, repl::ReplHost over agent::Agent, cap-speak,
serve-mcp, telegram and tui-local seams. main.cpp dispatches the flags in tai.py main() order.
Tests: tests/glue_persist.py (real model, restart persistence, one-shot shell call), tests/glue_flags.py,
tests/glue_ports.cpp. Spec: docs/glue.md, gaps: docs/glue-issues.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:20:01 +01:00
retoorandClaude Sonnet 5.5 9cc3415983 merge: worktree-agent-a34f619fc37ce62ae (cli argparse port)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:02:29 +01:00
retoorandClaude Sonnet 5.5 c8f6818997 cli: faithful argparse port (single flag table, HelpFormatter, textwrap, abbreviations, usage on error)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:02:03 +01:00
retoorandClaude Sonnet 5.5 c3440ffacd taicpp: port Seal subsystem (byte-compatible tai1$ envelope, rotation, boot upgrade factory)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:56:55 +01:00
retoorandClaude Sonnet 5.5 2308e9e3df merge: worktree-agent-a3a407ad414d619b4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:27 +01:00
retoorandClaude Sonnet 5.5 c1205649ba merge: ad389a7af758a1e42
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:27 +01:00
retoorandClaude Sonnet 5.5 a40556e0fd merge: worktree-agent-acc4f10dc5bae68cf
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:27 +01:00
retoorandClaude Sonnet 5.5 c04eee107c merge: worktree-agent-af1d14a13e54d3c51
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:27 +01:00
retoorandClaude Sonnet 5.5 fe9b49d2c0 merge: ae8675943507c4843
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:27 +01:00
retoorandClaude Sonnet 5.5 7a6d0ff326 merge: worktree-agent-a7652b893d520b1a0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:20 +01:00
retoorandClaude Sonnet 5.5 96ca726c5b merge: worktree-agent-ad68a64045d79e2de (shell, util)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:44:20 +01:00
retoorandClaude Sonnet 5.5 bbdc927215 tui: grr terminal client (Grr* classes), control socket, entry points, spec test, parity docs
Port of the grr client of tai.py: client, SSE stream, session, store, router, shell, views,
chat, panes, file viewer and the unix control socket; GrrTui::run is the --tui entry.
Verified against tai.py --tui on a real grr server over a pty: 236 steps, screen text and
per-cell styles identical except clocks, spinner frames and server-made ids.
docs/tui.md holds the symbol table and gaps, docs/wiring/tui.md the integrator hooks.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:15:05 +01:00
retoorandClaude Sonnet 5.5 24caef9ce4 taicpp: spec and wiring docs for the misc modules
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 05:06:43 +01:00
retoorandClaude Sonnet 5.5 7237e152c5 taicpp: port CAP and MCP (wire layer, drivers, fleet, CLI, client, OAuth, bridge, vault tables, tools, server)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 05:04:11 +01:00
retoorandClaude Sonnet 5.5 caba117750 taicpp foundation: real tmux ask, SIGINT and terminate-hook tests
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 05:03:39 +01:00
retoorandClaude Sonnet 5.5 084f76e3cc agent+llm: docs (agent, llm, wiring)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 05:03:08 +01:00
retoorandClaude Sonnet 5.5 ed2bfade80 taicpp: port shell, sandbox, pty, glow, markdown, diff and speech helpers from tai.py
Differentially verified against tai.py (4890 cases incl. real pty runs).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 05:02:18 +01:00
retoorandClaude Sonnet 5.5 0b7dae2207 mplex: headers, generated tables, spec test, spec delta doc; fix set_active aliasing, version from generated header
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 02:04:47 +02:00
retoorandClaude Sonnet 5.5 4583265122 taicpp foundation: vault, settings, debug log, sessions keyed by shell/pane, REPL, plexer
Full port of the Store (17 tables, FTS5, per-profile slices, sessions, turn state,
bots, settings, MCP registry), DebugLog, SETTINGS_CATALOG and boot_settings,
ShellSession (as ShellContext), Conversation persistence, Repl/Boot, and the
PlexerController family with FlowValidator/PlexerFlow. Verified by replaying 643
operations through tai.py and the C++ code (results, tables, FTS, schema, files
identical) and by restarting the REPL under per-pane shells and checking the vault.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 02:02:31 +02:00
retoorandClaude Sonnet 5.5 6b28c0d80a mplex: client, cli, plexer flow controllers and validators, wiring doc, differential tests
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 01:35:12 +02:00
retoorandClaude Sonnet 5.5 55b879718b taicpp parity: differential harness, ledger-generated PARITY.md with verified status, test_tai.py coverage map, seed cases
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 01:21:03 +02:00
retoor 8090638119 detz: M3 store 2026-10-24 06:45:50 +02:00
retoor 96d57385a7 detz: M6-M9 remaining 2026-10-24 06:45:18 +02:00
retoor ac4df725ef detz: release v0.1.1 2026-10-24 06:43:45 +02:00