Skip to content

docs: split README into docs/, add Related section and a runnable demo - #73

Merged
jsirish merged 2 commits into
mainfrom
feature/readme-related-work-and-docs-split
Sep 1, 2026
Merged

docs: split README into docs/, add Related section and a runnable demo#73
jsirish merged 2 commits into
mainfrom
feature/readme-related-work-and-docs-split

Conversation

@jsirish

@jsirish jsirish commented Sep 1, 2026

Copy link
Copy Markdown
Member

Summary

Prompted by a competitive read of adrrr/persistent-handoff, a new plugin in throughline's
exact problem space (see the linked issues for the full analysis).

  • README split: 492 → 231 lines. Configuration, git worktrees, opt-out, the kill switch,
    housekeeping, and the layout tree move to new docs/REFERENCE.md. Full per-harness install
    detail (requirements, updating, Codex's trust step, OpenCode's local-path install) moves to
    new docs/INSTALL.md. README keeps the pitch, comparison table, capability matrix, and
    one-liner install commands.
  • Related section: names 9 verified alternative tools (persistent-handoff, claude-mem,
    thepushkarp/handoff, REMvisual/claude-handoff, who96/claude-code-context-handoff,
    Sting25/claude-code-handoff, blader/baton, rupaut98/unforget, mattpocock/skills), one honest
    line each on how they differ.
  • Trust boundary note: docs/REFERENCE.md now states plainly that a tracked HANDOFF.md is
    input the agent acts on, not passive documentation - anyone who can push to a repo that tracks
    it writes into every future session's context.
  • Demo project: demo/homelab/ is a fictional link-checker with a real investigation history
    • a populated HANDOFF.md, a prior session log, and a live unconsumed capture buffer - wired
      via a project-scoped .claude/settings.json. demo/setup.sh copies the real hooks/skills in
      (gitignored copies, rebuilt fresh, so the demo never drifts from the canonical versions) and
      prints a walkthrough.

Recording the actual demo GIF is still open (needs a real terminal session); #68 stays open for
that.

Test plan

  • sh tests/run.sh: 167/167 pass, no regressions
  • shellcheck -s bash clean on the two new demo scripts
  • local-ci.sh --strict: all 5 checks PASS (shellcheck, manifest validation, plugin version
    agreement, hook tests, opencode plugin)
  • Ran demo/setup.sh for real, then invoked the copied session-onboard.sh against
    demo/homelab with a live payload: correctly injects the HANDOFF.md pointer and flags the
    unconsumed capture buffer
  • git add -A --dry-run confirms only the intended demo files get tracked - copied
    hooks/skills, buffer/archive/, and .capture-errors stay gitignored as designed
  • All internal README anchor links (#claude-code, #codex-cli, etc.) still resolve after
    the split
  • JSON validation + version agreement across all plugin manifests unaffected

Closes #69
Closes #70
Closes #65

jsirish and others added 2 commits September 1, 2026 10:46
…e demo

README.md drops from 492 to 231 lines: per-harness install detail moves to
docs/INSTALL.md, and Configuration/worktrees/opt-out/housekeeping/layout move
to docs/REFERENCE.md (which also documents the handoff-as-executable-input
trust boundary). Adds a Related section naming 9 verified alternative tools,
and a demo/homelab/ fictional project with a real HANDOFF.md, session log,
and unconsumed capture buffer, wired via demo/setup.sh so someone can try
throughline in under a minute without installing into a real repo.

Prompted by a competitive read of adrrr/persistent-handoff, whose README
structure (pitch -> demo -> install, reference material pushed to docs/) and
named "Related" section this borrows the shape of.

Closes #69
Closes #70
Closes #65
Addresses #68 - docs split and demo are done, the recorded demo GIF is not

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UXL2ffVDsAp4P7387Nr18G
…comment

/review-pr on PR #73 found four real issues:
- demo/homelab/scripts/check-links.sh still sent a HEAD request (curl -I),
  contradicting the demo's own HANDOFF.md and session log, both of which
  claim the fix (switch to GET) already landed.
- demo/homelab/README.md linked ../README.md, which resolves to a
  nonexistent demo/README.md - needed ../../README.md.
- README.md's OpenCode session-end cross-reference pointed at the README's
  own (now content-free) #opencode section instead of docs/INSTALL.md#opencode,
  where the session.idle explanation actually moved to.
- demo/homelab/.gitignore's negation comment claimed the root .gitignore's
  .claude/throughline/ pattern matches at every depth; it doesn't (it's
  repo-relative), so six negation lines were dead weight and the comment
  taught something untrue about gitignore anchoring. Removed the no-op
  lines, corrected the comment.

Also: the demo's link-check.log ended at Aug 29 with no third clean night
logged, so the walkthrough's own scripted prompt ("update the handoff if the
third clean night landed") always resolved to "not yet" - a no-op. Added the
Aug 30 clean run so trying the demo as documented produces a real distill.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UXL2ffVDsAp4P7387Nr18G
@jsirish
jsirish merged commit 79f39a6 into main Sep 1, 2026
2 checks passed
@jsirish
jsirish deleted the feature/readme-related-work-and-docs-split branch September 1, 2026 15:58
jsirish added a commit that referenced this pull request Sep 1, 2026
…rbage

/review-pr on PR #74 diffed the days_from_civil awk function against
Python's calendar for every date from 1899-01-01 to 2100-12-31 (73,779
dates, zero mismatches) - the arithmetic itself was right - but found the
regex extraction only validated that hf_date/commit_date were digit-shaped,
not that they were real calendar dates. A hand-edited "**Last Updated:**
2026-00-00" computed a confident wrong answer ("275 day(s) before") instead
of the "say nothing when unparseable" this check already promises elsewhere.
days() now range-checks month/day/leap-February itself and sets a `bad` flag
rather than returning a number for garbage input.

Also (same review): `head -20` on `git status -s` bounds live git state's
LINE COUNT but not each line's WIDTH - one modified tracked file's path can
be arbitrarily long regardless of `head`, and a 20-modified-file monorepo
fixture with ~8-segment paths measured over 2KB with nothing bounding it.
Since issue #64 moved this block to render first specifically because it
was "small and bounded", it needed the same per-line truncation discipline
the buffer-tail inline already has. Added TL_GIT_STATUS_LINE_CHARS=200 with
the same awk truncation pattern.

Also updates CHANGELOG.md (this PR and the already-merged #73 docs/demo/
Related-work PR both landed without an entry) and adds one line to
README.md's capture-point table describing the new stale-handoff warning.

3 new test cases (171 -> 174 passing).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UXL2ffVDsAp4P7387Nr18G
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant