#2780 gatorwalk-factory: `--log` prints every method's output twice, and writes don't print the status that follows
Opened by skunk-ape · 9/30/2026· Shipped 10/1/2026
In the cue trial (work item cue-er7koww5), the driver filtered every work-item call it made. The first status it piped through grep 'INF' (22:06:32 UTC, jsonl line 47). That kept only the first line, "cue-er7koww5: active at stage 'plan' cycle 1\n" +, and dropped the expectation and exits. The next call used sed -n '/INF/,/Completed/p' | grep -v INF (line 50). It showed the status twice, once as a quoted "..." + string and once as plain text, followed by an empty ── Report: @swamp/gatorwalk-factory/work-item-summary ── box. After that, every call went through sed -n '/^ cue-/,/work:/p', grep -E "INF|rror" or grep -m1 "dispatch [0-9]". The last of these threw away the rendered dispatch prompt and led to the placeholder leak in the dispatch-prompt issue. Writes were also chained with no status between them, against rule 1. One Bash call ran dispatch (plan), record_artifact, advance submit and dispatch (plan-review) in a row (line 232, 22:28:02). Lines 304, 358 and 476 do the same.
The output is doubled because of --log, which the skill requires. A method's logger.info is wrapped by swamp (swamp src/domain/models/in_process_executor.ts:65-107) and always shown as a method-output line (src/presentation/renderers/model_method_run.ts, method_output). --log also sends the same record to LogTape's console sink (src/infrastructure/logging/logger.ts:239-241), which prints the {summary} property as an inspected string: the [INF] line, with each later line quoted and joined with +. I checked this with swamp 20260929.202912.0 in a scratch repo. status without --log prints the status once, cleanly, and refusals still print as Error: .... So SKILL.md:31 ("--log on every call. Methods report through the log") and driving.md:44-45 ("without it you see only that the method succeeded") are wrong for current swamp, and they cause the noise. There are two other sources:
- The empty report box.
work_item.ts:66declares the summary report for the whole model type. The report returns empty markdown for every method exceptsummary(work_item_summary_report.ts, the early return inexecute), but swamp draws the header and separators anyway (model_method_run.ts:150-166). That part is swamp's. It should skip an empty report and deserves its own swamp issue. - Writes print one line, such as "took 'submit' to stage 'plan-review' cycle 3". So rule 1 costs an extra
statuscall after every write, and that extra call is what the driver skipped.
--json is no way around this. It prints the method-run record (log file path, reports) and not the status text. The status view exists only as a log property (work_item_ops.ts:1015).
Fix direction:
- Skill: drop
--logfrom rule 2,driving.mdand every command (integration/skill_commands.tsandskill_test.tscheck them). Tell the driver to read a method's output whole and never filter it with grep or sed. - Engine: have every write end its log with the status that follows it (the same block
statusprints, from the view the write already built). Then rule 1 can say "the status a write prints counts as reading status". Decision for the implementer: print the full status block, or only theexpectline and the exits. - swamp (separate issue): skip rendering a report whose markdown is empty.
Acceptance: status, dispatch and every write, run as the skill writes them, print their text once, and a write shows the resulting expectation and exits. The skill's commands have no --log. In a trial transcript, work-item calls are not piped through grep or sed.
Shipped
Click a lifecycle step above to view its details.