Repository navigation
Command logs: each command keeps a file of what it printed, in a log tree under logs.dir - #319
Merged
Merged
Conversation
…tree under logs.dir (#259) Every Run, Spec run, Architect run and Pickup run writes its stderr and stdout, in order, to commands/<issue|pickup|architect>/ under logs.dir, and Session logs move to sessions/. Stamps are local time with the UTC offset, made once per command and passed to child Runs, so a command and all its Session logs share one. A command's first line is dated, a Failed run ends naming its Command log, and the Run notification carries a Command log: line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ups (#259) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Every Run, Spec run, Architect run and Pickup run now keeps a Command log under
logs.dir. It holds what the command printed on stderr and stdout, in the order printed. Session logs move intosessions/, and all of a command's logs share one local-time stamp.thirdshift: 12:00:01 Pickup run starting, 2026-10-03 -0400.session log: …and thencommand log: ….Command log:line.warning:line, and the outcome is unchanged.logs.dircomment written bysetup, the README's Logs section and the site's Failed run example are updated.Evidence
…Zstamps, and a Ticket's Run or a Base fix made a stamp of its own.After:
tests/command_logs.rshas 11 tests and all pass, withTZ=XYZ+4so stamps end in-0400. They cover:#21:and#22:lines are in the Spec run's file, its Tickets keep none, and their Session logs share the stamp#8:lines are in the Run's filelogging this command tologs/folderCommand log:linecommands/: exactly onewarning:, exit 0, stdout unchangedcargo testpasses on all 31 targets, andcargo clippy --all-targetsis clean. Existing tests changed in three ways:sessions/.support::after_start.command log:line, viasupport::before_command_log.Merge Danger
Door: two-way
Nothing is moved or deleted. Existing flat Session logs stay where they are, and new ones go to
sessions/.Blast Radius: output
--stampargument. Parent and child are always the same binary, so the two can't disagree about it.Unaddressed findings
Standards
command_log(static LOGandSTARTED), andLogs::pathreading the stamp from it. Skipped: there is one stamp and one Command log per process, by the spec's design ("made once and given to everything under it"). Passing them throughBaseFix,spec_runandchild_runwould widen several signatures for no behaviour gain.command_loginterface breadth. It has threeof_*path functions pluskeep. Skipped: folding them intokeepwould only move the three-way choice around. The path builders keep naming separate from keeping the file.<owner>-<repo>-issue-<n>) betweencommand_log::issue_nameandLogs::of_run. Skipped: one short format string, owned by two different log kinds. Sharing it would couple Session log names to Command log names.childcheck inmain(begin/begin_child, thenkeeponly if not a child). Skipped: the two checks sit on either side of loading the User config, which supplieslogs.dir.RunArgs.stamptravels withchild. It could live inKindor be its own type. Skipped:Kindis the child Run's role and Base branch, while the stamp is about logging and is the same for every kind. A newtype would wrap one string passed through two places.notification.rseach gainedcommand_log: None. Skipped: this follows the existing pattern there.Spec
logs.dirisn't known until the User config loads, so there is nowhere to put the file. The failure still prints to stderr and to any crontab catch-all log.Closes #259
🤖 Generated with Claude Code