Catch code drift.
You asked for one thing. The agent shipped it. Probably.
Read what your AI just built.
Tours walk you through the code your agent just generated. Tern mines your Claude Code logs and markdown plans, then attaches each change to the prompt or plan that asked for it. Code with no match? Left unattached. Draw your own conclusions.
- →▾Add a `tern pr-review` subcommand that opens a browser-based tour for a GitHub PR.(session 7a2b9c4f#4)What the user said“Add a `tern pr-review` subcommand. It should take a GitHub PR URL, resolve my org, and open the review page in the browser.”Context
- [assistant #3]I can wire this as a new top-level cobra command. Should the org be inferred from the current repo or passed explicitly?
- →▸Use exec.Cmd.Run instead of Start so the URL handler exits cleanly.(session 7a2b9c4f#12)
return fmt.Errorf("unsupported platform") } return cmd.Start() // Run (not Start): the URL handlers all // exit quickly after handing off to the OS. return cmd.Run() }From agent stop to tour in thirty seconds.
From agent stop to tour in thirty seconds.
The agent says it's done. You have to check.
Your agent shipped a PR. 23 files, +614 lines. The summary at the top says it's done.
"Done" is the agent's word. The diff is the record. Did the second thing actually do what the first thing asked for?
The summary won't tell you. The diff would, but reading 23 files of unfamiliar code is the part everyone skips.
One slash command. Tern does the mining.
/tour, from inside the Claude Code session you ran the work in. Tern reads your recent Claude Code logs and any markdown plans in the repo.
It pulls out the directives you typed and matches each one against the changed files. Six stops: five with matching directives, one without.
Read by intent, not by file.
The tour opens in your browser. Each stop is one group of changes — the OAuth flow, the session wiring, the test fixtures — with the directive that asked for it quoted at the top.
You're not scrolling 23 files of unfamiliar code. You're reading six directives, each followed by the code that did it. When the code matches the directive, you move on. When it doesn't, you don't.
func mkPRReview() *cobra.Command { var orgSlug string cmd := &cobra.Command{ Use: "pr-review <url>", Short: "Open a PR review tour",Install Tern.
30 seconds. No email. No code leaves your machine.



