From 82943bf61d6c912c0eda3b9b534eed185d77e77e Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Wed, 14 Oct 2026 13:44:35 -0500 Subject: [PATCH] docs: row 116 round 1 packet, land-work build, mutants, gate and 19/265 replay (#1610) Co-Authored-By: Claude Opus 5.5 --- agents/darkwing/work/queue-116/r1/build.md | 259 ++++ agents/darkwing/work/queue-116/r1/build.patch | 1051 +++++++++++++++++ .../queue-116/r1/candidate-manifest.sha256 | 6 + .../darkwing/work/queue-116/r1/gate-run.log | 5 + agents/darkwing/work/queue-116/r1/gate.sh | 18 + .../work/queue-116/r1/gate/pkg-bus.log | 164 +++ .../r1/gate/pkg-webui-pinned-copy.log | 18 + .../queue-116/r1/gate/script-conductor.log | 55 + .../queue-116/r1/gate/script-land-work.log | 80 ++ .../work/queue-116/r1/mutants-run.log | 170 +++ .../work/queue-116/r1/mutants-stdout.log | 49 + agents/darkwing/work/queue-116/r1/mutants.py | 101 ++ .../r1/mutants/mutant-r01-schema-digest.log | 80 ++ .../r1/mutants/mutant-r02-schema-meta.log | 80 ++ .../r1/mutants/mutant-r03-read-only.log | 80 ++ .../r1/mutants/mutant-r04-business-scope.log | 80 ++ .../r1/mutants/mutant-r05-one-raise.log | 80 ++ .../r1/mutants/mutant-r06-not-a-merge.log | 80 ++ .../r1/mutants/mutant-r07-resolved-op.log | 80 ++ .../r1/mutants/mutant-r08-human-by.log | 80 ++ .../r1/mutants/mutant-r09-human-via.log | 80 ++ .../r1/mutants/mutant-r10-human-answer.log | 80 ++ .../r1/mutants/mutant-r11-merge-option.log | 80 ++ .../r1/mutants/mutant-r12-one-work-ref.log | 80 ++ .../r1/mutants/mutant-r13-work-ref-shape.log | 80 ++ .../r1/mutants/mutant-r14-task-ref-agrees.log | 80 ++ .../r1/mutants/mutant-r15-target.log | 80 ++ .../mutants/mutant-r16-later-supersedes.log | 80 ++ .../r1/mutants/mutant-r17-later-task.log | 80 ++ .../r1/mutants/mutant-r18-later-question.log | 80 ++ .../r1/mutants/mutant-r19-no-verdict.log | 80 ++ .../r1/mutants/mutant-r20-latest-verdict.log | 83 ++ .../r1/mutants/mutant-r21-approve.log | 80 ++ .../r1/mutants/mutant-r22-verdict-task.log | 80 ++ .../r1/mutants/mutant-r23-full-oid.log | 80 ++ .../r1/mutants/mutant-s01-base-early.log | 80 ++ .../r1/mutants/mutant-s02-ref-moved.log | 80 ++ .../r1/mutants/mutant-s03-merge-base.log | 80 ++ .../r1/mutants/mutant-s04-empty-diff.log | 80 ++ .../r1/mutants/mutant-s05-root-top-file.log | 80 ++ .../r1/mutants/mutant-s06-root-new-dir.log | 80 ++ .../r1/mutants/mutant-s07-root-src-v1.log | 80 ++ .../r1/mutants/mutant-s08-dirty-changed.log | 80 ++ .../r1/mutants/mutant-s09-dirty-staged.log | 80 ++ .../r1/mutants/mutant-s10-dirty-untracked.log | 80 ++ .../r1/mutants/mutant-s11-dirty-recheck.log | 80 ++ .../r1/mutants/mutant-s12-apply-conflict.log | 80 ++ .../r1/mutants/mutant-s13-patch-drift.log | 80 ++ .../mutants/mutant-s14-gate-node-modules.log | 80 ++ .../r1/mutants/mutant-s15-gate-step-fails.log | 80 ++ .../mutants/mutant-s16-gate-skips-queue.log | 80 ++ .../r1/mutants/mutant-s17-gate-scripts.log | 80 ++ .../r1/mutants/mutant-s18-base-moved-cas.log | 80 ++ .../r1/mutants/mutant-s19-dry-run.log | 80 ++ .../r1/mutants/mutant-s20-checkout-sync.log | 80 ++ .../r1/mutants/mutant-s21-subject.log | 80 ++ .../r1/mutants/mutant-s22-attribution.log | 80 ++ .../mutants/mutant-s23-cleanup-worktree.log | 80 ++ .../r1/mutants/mutant-s24-cleanup-network.log | 80 ++ .../r1/mutants/mutant-s25-cleanup-scratch.log | 80 ++ .../r1/mutants/mutant-s26-cleanup-link.log | 80 ++ .../work/queue-116/r1/replay-1/gate.log | 3 + .../work/queue-116/r1/replay-1/pkg-cli.log | 307 +++++ .../work/queue-116/r1/replay-1/replay-run.log | 11 + .../queue-116/r1/replay-1c9a/after-dry.txt | 75 ++ .../work/queue-116/r1/replay-1c9a/before.txt | 75 ++ .../work/queue-116/r1/replay-1c9a/dry.err | 24 + .../work/queue-116/r1/replay-1c9a/dry.out | 15 + .../land-work-logs.2vWgxG/gate.log | 23 + .../land-work-logs.QTBGn3/gate.log | 23 + .../work/queue-116/r1/replay-1c9a/land.err | 24 + .../work/queue-116/r1/replay-1c9a/land.out | 2 + .../work/queue-116/r1/replay-1c9a/r229.err | 1 + .../work/queue-116/r1/replay-1c9a/r229.out | 0 .../queue-116/r1/replay-1c9a/replay-run.log | 98 ++ .../work/queue-116/r1/replay-1c9a/replay.sh | 73 ++ .../r1/replay-1c9a/working-before.txt | 3 + .../queue-116/r1/replay-4bc9/after-dry.txt | 75 ++ .../work/queue-116/r1/replay-4bc9/before.txt | 75 ++ .../work/queue-116/r1/replay-4bc9/dry.err | 24 + .../work/queue-116/r1/replay-4bc9/dry.out | 15 + .../land-work-logs.ASEJp9/gate.log | 23 + .../land-work-logs.ASEJp9/pkg-bus.log | 156 +++ .../land-work-logs.ASEJp9/pkg-business.log | 75 ++ .../land-work-logs.ASEJp9/pkg-cli.log | 194 +++ .../pkg-control-board.log | 132 +++ .../pkg-conversation.log | 190 +++ .../land-work-logs.ASEJp9/pkg-discord.log | 186 +++ .../land-work-logs.ASEJp9/pkg-harness.log | 88 ++ .../land-work-logs.ASEJp9/pkg-ledger.log | 94 ++ .../land-work-logs.ASEJp9/pkg-mosaic.log | 77 ++ .../land-work-logs.ASEJp9/pkg-runs.log | 51 + .../land-work-logs.ASEJp9/pkg-seat.log | 132 +++ .../land-work-logs.ASEJp9/pkg-tasks.log | 100 ++ .../land-work-logs.ASEJp9/pkg-webui.log | 117 ++ .../land-work-logs.ASEJp9/script-auth.log | 17 + .../script-conductor.log | 23 + .../land-work-logs.ASEJp9/script-config.log | 26 + .../land-work-logs.ASEJp9/script-discord.log | 70 ++ .../script-extension-package.log | 21 + .../script-foundation.log | 53 + .../land-work-logs.ASEJp9/script-queue.log | 36 + .../land-work-logs.ASEJp9/script-release.log | 16 + .../land-work-logs.ASEJp9/script-task.log | 101 ++ .../land-work-logs.adiLIr/gate.log | 23 + .../land-work-logs.adiLIr/pkg-bus.log | 156 +++ .../land-work-logs.adiLIr/pkg-business.log | 75 ++ .../land-work-logs.adiLIr/pkg-cli.log | 194 +++ .../pkg-control-board.log | 132 +++ .../pkg-conversation.log | 190 +++ .../land-work-logs.adiLIr/pkg-discord.log | 186 +++ .../land-work-logs.adiLIr/pkg-harness.log | 88 ++ .../land-work-logs.adiLIr/pkg-ledger.log | 94 ++ .../land-work-logs.adiLIr/pkg-mosaic.log | 77 ++ .../land-work-logs.adiLIr/pkg-runs.log | 51 + .../land-work-logs.adiLIr/pkg-seat.log | 132 +++ .../land-work-logs.adiLIr/pkg-tasks.log | 100 ++ .../land-work-logs.adiLIr/pkg-webui.log | 117 ++ .../land-work-logs.adiLIr/script-auth.log | 17 + .../script-conductor.log | 23 + .../land-work-logs.adiLIr/script-config.log | 26 + .../land-work-logs.adiLIr/script-discord.log | 70 ++ .../script-extension-package.log | 21 + .../script-foundation.log | 53 + .../land-work-logs.adiLIr/script-queue.log | 36 + .../land-work-logs.adiLIr/script-release.log | 16 + .../land-work-logs.adiLIr/script-task.log | 101 ++ .../work/queue-116/r1/replay-4bc9/land.err | 24 + .../work/queue-116/r1/replay-4bc9/land.out | 2 + .../work/queue-116/r1/replay-4bc9/r229.err | 1 + .../work/queue-116/r1/replay-4bc9/r229.out | 0 .../queue-116/r1/replay-4bc9/replay-run.log | 99 ++ .../work/queue-116/r1/replay-4bc9/replay.sh | 80 ++ .../r1/replay-4bc9/target-refs-before.txt | 63 + .../r1/replay-4bc9/working-before.txt | 3 + .../work/queue-116/r1/replay/replay.sh | 80 ++ .../work/queue-116/r1/replay/rows.mjs | 38 + agents/darkwing/work/queue-116/r1/repro.sh | 9 + 138 files changed, 11200 insertions(+) create mode 100644 agents/darkwing/work/queue-116/r1/build.md create mode 100644 agents/darkwing/work/queue-116/r1/build.patch create mode 100644 agents/darkwing/work/queue-116/r1/candidate-manifest.sha256 create mode 100644 agents/darkwing/work/queue-116/r1/gate-run.log create mode 100755 agents/darkwing/work/queue-116/r1/gate.sh create mode 100644 agents/darkwing/work/queue-116/r1/gate/pkg-bus.log create mode 100644 agents/darkwing/work/queue-116/r1/gate/pkg-webui-pinned-copy.log create mode 100644 agents/darkwing/work/queue-116/r1/gate/script-conductor.log create mode 100644 agents/darkwing/work/queue-116/r1/gate/script-land-work.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants-run.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants-stdout.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants.py create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r01-schema-digest.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r02-schema-meta.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r03-read-only.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r04-business-scope.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r05-one-raise.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r06-not-a-merge.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r07-resolved-op.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r08-human-by.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r09-human-via.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r10-human-answer.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r11-merge-option.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r12-one-work-ref.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r13-work-ref-shape.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r14-task-ref-agrees.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r15-target.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r16-later-supersedes.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r17-later-task.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r18-later-question.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r19-no-verdict.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r20-latest-verdict.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r21-approve.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r22-verdict-task.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-r23-full-oid.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s01-base-early.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s02-ref-moved.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s03-merge-base.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s04-empty-diff.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s05-root-top-file.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s06-root-new-dir.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s07-root-src-v1.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s08-dirty-changed.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s09-dirty-staged.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s10-dirty-untracked.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s11-dirty-recheck.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s12-apply-conflict.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s13-patch-drift.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s14-gate-node-modules.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s15-gate-step-fails.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s16-gate-skips-queue.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s17-gate-scripts.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s18-base-moved-cas.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s19-dry-run.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s20-checkout-sync.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s21-subject.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s22-attribution.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s23-cleanup-worktree.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s24-cleanup-network.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s25-cleanup-scratch.log create mode 100644 agents/darkwing/work/queue-116/r1/mutants/mutant-s26-cleanup-link.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1/gate.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1/pkg-cli.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1/replay-run.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/after-dry.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/before.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/dry.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/dry.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.2vWgxG/gate.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.QTBGn3/gate.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/land.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/land.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/r229.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/r229.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/replay-run.log create mode 100755 agents/darkwing/work/queue-116/r1/replay-1c9a/replay.sh create mode 100644 agents/darkwing/work/queue-116/r1/replay-1c9a/working-before.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/after-dry.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/before.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/dry.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/dry.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/gate.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-bus.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-business.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-cli.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-control-board.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-conversation.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-discord.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-harness.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-ledger.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-mosaic.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-runs.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-seat.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-tasks.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-webui.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-auth.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-conductor.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-config.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-discord.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-extension-package.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-foundation.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-queue.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-release.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-task.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/gate.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-bus.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-business.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-cli.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-control-board.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-conversation.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-discord.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-harness.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-ledger.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-mosaic.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-runs.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-seat.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-tasks.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-webui.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-auth.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-conductor.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-config.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-discord.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-extension-package.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-foundation.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-queue.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-release.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-task.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/land.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/r229.err create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/r229.out create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/replay-run.log create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/replay.sh create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/target-refs-before.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay-4bc9/working-before.txt create mode 100644 agents/darkwing/work/queue-116/r1/replay/replay.sh create mode 100644 agents/darkwing/work/queue-116/r1/replay/rows.mjs create mode 100755 agents/darkwing/work/queue-116/r1/repro.sh diff --git a/agents/darkwing/work/queue-116/r1/build.md b/agents/darkwing/work/queue-116/r1/build.md new file mode 100644 index 000000000..8ab694640 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/build.md @@ -0,0 +1,259 @@ +# Row 116 (#1610) round 1: a resolved merge decision lands as a gated local commit + +Brief: docs/plans/2026-10-14_merge-path-for-approved-work.md, round 2 at 68ce7f354 (blob 7a610f379, queue rev 1148). Sage's rulings sage-0195 (the read path and the rules) and sage-0196 (the digest check) apply where they differ from the brief's text, and are cited below where they do. + +BASE: 1223a0f37. Nothing on refactor since then touches a candidate path. `git diff --stat 1223a0f37 02494c3ed` over scripts/, docs/TOOLS.md, docs/plans/CONDUCTOR.md and packages/bus/ shows one line: 7eb5ad0cb (PRD 1.2) changed the requirement count in packages/bus/tests/requirements.test.mjs from 30 to 38. packages/bus/src, which read.mjs imports, is unchanged. The candidate is build.patch against BASE, and candidate-manifest.sha256 lists the 6 files. `repro.sh` exports BASE with `git archive`, applies build.patch and checks every manifest digest: DIGESTS_OK. + +## What changed + +All new except the two docs. Nothing under packages/bus/src, packages/harness or roles/ changes, and no broker verb was added. + +| File | What | +|---|---| +| scripts/land-work.sh | the tool | +| scripts/land-work/read.mjs | every bus query, all SELECTs, and the schema check | +| scripts/land-work/fixture.mjs | writes test rows through the real Store | +| scripts/test-land-work.sh | the suite, 78 cases | +| docs/TOOLS.md | a "Conductor (landing approved work)" entry and the Maintenance row | +| docs/plans/CONDUCTOR.md | a "Landing approved work" section | + +I chose a new script over a `land` verb in an existing CLI. The brief allows either. `scripts/mosaic` verbs run as the human or a seat through the broker, and this tool is conductor-only and host-side, the same footing as `scripts/conductor-apply.sh`. A script also keeps the read path out of packages/bus. + +### The read, scripts/land-work/read.mjs + +It opens `/bus/bus.sqlite` with `node:sqlite` `readOnly: true` after an lstat (a regular file owned by the user, not a symlink), and every query lives in its `queries` object. It imports `schemaDigest` and `SCHEMA_SHA256` from packages/bus/src/store.mjs. + +The schema check follows sage-0196, which overrides the brief's sentence that `schemaDigest(db)` should equal `SCHEMA_SHA256`. Those two are different hashes (one of schema.sql's text, one of sqlite_master), so that sentence could never hold. Sage: "This message is the lead ruling Filbert can cite against the brief's literal sentence." The check is the Store's own: + +1. schema.sql is read and re-hashed against the imported `SCHEMA_SHA256`. +2. It is executed into a `:memory:` database, and `schemaDigest` of that is the expected digest. store.mjs doesn't export its expected digest, so this builds it the way the Store does. +3. `schemaDigest(db)` must equal it, and meta must say `schema_version` '3b' and `schema_digest` equal to it. + +The '3b' is a copy of the Store's literal (read.mjs header names it). A schema bump changes the Store's value, and until someone changes read.mjs too, every read refuses `bus-schema`. That fails closed, and the header says where to look. + +The rules follow sage-0195: + +- action `git.merge.protected`, on the decision and on its one raise event (`action.allowed`, operation `decision.raise`, subject the decision id); +- exactly one close, and it is `resolved`; +- resolved by the business file's `human`, `via` `cli`, with exactly one `human.input` answer whose actor role and run are null and whose choice matches; +- the choice is the raise's `approvalChoice`; +- the question names exactly one work ref, and it matches `work/vikunja-

-`. The task is `vikunja:

/`, and the decision's or the raise's `task_ref`, if set, must agree; +- the raise's `target` is exactly `refactor`, and so is `--base`; +- no later `git.merge.protected` decision in the business supersedes this one, has this task_ref, or names this work ref in its question; +- the latest `review.verdict` for the task (by seq) is `approve`, its body's task_ref is the task, and its commit is a full object id. + +Each query is scoped to the business, so one business's rows can't answer for another's. I dropped the "into " text check from the question. The target comes from the raise (sage-0195). + +The subject is the merge option's text, first line (f71c73c9: "Squash-merge work/vikunja-19-265 into refactor"). The brief says "the decision title", and decisions have no title column. Sage agreed with the option text in sage-0196. + +### The tool, scripts/land-work.sh + +The header lists every refusal in order. After the read: + +- `ref-moved`: `refs/heads/` in `/working//.git` must be C. git runs there with no hooks, no fsmonitor and file transport only. +- The target fetches C's objects with no refspec destination and no FETCH_HEAD, so no ref moves. +- The reviewed diff is `git diff $(merge-base refactor C) C` in a fixed format (`--no-ext-diff --no-textconv --binary --no-renames`, no prefix overrides). No merge base or an empty diff refuses `base-conflict`. +- `root-file`: an added top-level file, an added file in a top-level directory the base doesn't have, or one under `src/` or `v1/`. The brief says "any added file at the repository root" and gives 010d30cbe's `src/parse-requirement-id.mjs` as the case, but `src/` already exists at the root with legacy files, so a top-level-only rule would pass it. I count the legacy `src/` and the archived `v1/` as the root. +- `checkout-dirty`: if `refactor` is checked out somewhere, the reviewed paths there must have no changes, nothing staged, and no untracked file at a path the commit adds. The check runs before the worktree and again right before the commit, because the landing rewrites those paths. An unrelated local edit stays. +- The squash is `git apply --index` in a detached worktree at the base (`base-conflict` if it doesn't apply). `patch-drift` compares `git patch-id --stable` of the worktree's cached diff with the reviewed one. +- The gate, then one `git commit` in the worktree and a compare-and-swap `update-ref` of `refs/heads/refactor` from OLD. A base that moved during the gate refuses `base-moved` and writes nothing. Where refactor is checked out, the reviewed paths are reset and checked out from the new commit. +- It prints `land-work: committed ... NOT pushed` and the PM line, and sends nothing. + +The gate is Sage's landing gate template: every `packages/*/tests` suite except queue, then every `scripts/test-*.sh`, each with pipefail and its own log in `$TMPDIR/land-work-logs.*`, plus gate.log. The first failure refuses `gate-failed` and names its log. There is no switch to skip or shorten it, and no flake case. I removed the MOSAIC_LAND_GATE override I had in an early draft, so the suite runs the real gate loop over its fixture repo's packages and scripts. + +Cleanup runs from an EXIT trap on every path: the `node_modules` link, `worktree remove --force` (or `rm -rf`) and `worktree prune`, `docker network rm _default` when it exists, and the scratch directory. The log directory stays unless it is empty. + +`--subject` and `--attribution` override the subject and the last line (`Applied-under: scripts/land-work.sh (conductor)`). `--business` and `--project` are needed only when the config has more than one business file or the business more than one project. + +### Things a reviewer should know + +- A readOnly open of a WAL database whose writer is closed creates `bus.sqlite-shm` and `-wal` beside it. The fixture db has no writer after fixture.mjs closes, so the suite sees this. The database file itself is unchanged (the landing case checks its sha256). On the live bus the writer keeps those files open anyway. +- The gate inherits the caller's environment, as Sage's template does. Every scripts/test-*.sh that uses MOSAIC_CONFIG sets its own. +- `git patch-id --stable` ignores whitespace and line numbers, so a whitespace-only drift can't be made with `apply.whitespace=fix`. The patch-drift case uses a PATH git wrapper that appends a line to README.md and stages it right after `git -C apply`. +- The gate inherits `TMPDIR`, and the cli suite builds unix socket paths under it (`/mosaic-launch-XXXXXX/data/launches//r<12 hex>/tools.sock`, refused over 107 bytes). My first replay used a 46-byte `TMPDIR`, and 8 cli tests failed with "data root path too long for a socket". land-work refused `gate-failed`, wrote no ref and cleaned up; replay-1/ has that run. It is deterministic, not a flake. The TOOLS.md entry says to keep `TMPDIR` short, and the replay now uses `~/darkwing-scratch/rt` (33 bytes). I didn't add a length check to land-work: the limit belongs to the cli suite and could change with it. +- The working repository has the coder's history. A work ref whose history carries an unlanded commit and its revert (19/265 carries 010d30cbe and its revert) still squashes to the reviewed diff, which is the point of squashing. + +## Tests + +scripts/test-land-work.sh, 78 cases, all passing. It runs in a sandbox under `$TMPDIR` with a fake `docker` on PATH that logs its calls, and builds a fixture project repository, a working repository holding the coder's commits, and a bus written through the real Store by fixture.mjs, in the live rows' shape. Each case gets its own copy of all three. It never opens `~/.mosaic-dev` or `~/.t3`. + +| Group | Cases | +|---|---| +| Arguments and config | `--base next` and `--base main` refuse `target-branch`, before the config is read; a bad id, an unknown flag and a two-line `--subject` exit 4; a missing system config and a missing bus exit 3 | +| The bus database | a changed table and changed meta each refuse `bus-schema`; `openBus` opens read-only | +| The decision | 20 variants: other business, no raise, not a merge, open, withdrawn, resolved by an agent, via webui, no human answer, chose no, two work refs, a bad ref, a disagreeing task_ref, target main, superseded by question, by task and by `supersedes`, no verdict, a later changes verdict, a short commit, a verdict body for another task; plus an unknown id | +| The work ref and the diff | `ref-moved`; `root-file` for a top-level file, a new top-level directory and `src/`; `base-conflict` for unrelated history, an empty diff and an apply conflict; `checkout-dirty` for a changed, a staged and an untracked path, and for a path dirtied during the gate (no ref moves); `patch-drift` through the tamper wrapper | +| The gate | a failing package suite and a failing `scripts/test-*.sh` each refuse `gate-failed` and name an existing log; no ref moves; a target without node_modules exits 4; `base-moved` keeps the base where it moved to | +| A dry run | writes no ref, prints the commit with `--subject` and `--attribution`, runs the gate | +| A landing | one commit on the old base; its diff is the reviewed diff by patch-id; its tree is the dry run's; the message has the option's subject, the citations and the attribution last; the PM line prints; the checked-out base gets the reviewed paths and keeps an unrelated edit; only `refs/heads/refactor` exists; the work ref and the bus file are unchanged; the gate ran every package suite but queue and every `scripts/test-*.sh` | +| Cleanup | after a refusal past the worktree, patch-drift, gate-failed, no node_modules, a dry run and a landing: no worktree and no scratch; the Docker network is looked for and removed; the target's node_modules is still there | + +## Mutants + +mutants.py applies 49 mutants, one at a time, to a copy of the file, runs the whole suite under `timeout 600` in its own process group, and restores the file from `.orig` with a sha256 check. The run ended `restored: True`. 48 of 49 are killed; mutants-run.log has each one's failing cases. + +| Mutant | Change | Result | +|---|---|---| +| r01-schema-digest | skip the schema digest compare | killed, 1 of 78 fail | +| r02-schema-meta | skip the meta version and digest check | killed, 1 of 78 fail | +| r03-read-only | open read-write | killed, 2 of 78 fail | +| r04-business-scope | drop `business = ?` from every query | killed, 1 of 78 fail | +| r05-one-raise | accept zero or several raises | killed, 1 of 78 fail | +| r06-not-a-merge | skip the action check | killed, 1 of 78 fail | +| r07-resolved-op | accept any single close op | killed, 1 of 78 fail | +| r08-human-by | skip resolved-by == human | killed, 1 of 78 fail | +| r09-human-via | skip via == cli | killed, 1 of 78 fail | +| r10-human-answer | accept a missing human answer | killed, 1 of 78 fail | +| r11-merge-option | skip choice == approvalChoice | killed, 1 of 78 fail | +| r12-one-work-ref | accept several work refs | killed, 1 of 78 fail | +| r13-work-ref-shape | loosen the work ref pattern | killed, 1 of 78 fail | +| r14-task-ref-agrees | skip the task_ref agreement | killed, 1 of 78 fail | +| r15-target | skip the target check | killed, 1 of 78 fail | +| r16-later-supersedes | ignore `supersedes` | killed, 1 of 78 fail | +| r17-later-task | ignore a later decision on the task | killed, 1 of 78 fail | +| r18-later-question | ignore a later question naming the ref | killed, 1 of 78 fail | +| r19-no-verdict | skip the no-verdict refusal | killed, 1 of 78 fail | +| r20-latest-verdict | take the earliest verdict | killed, 30 of 78 fail | +| r21-approve | skip verdict == approve | killed, 1 of 78 fail | +| r22-verdict-task | skip the verdict body's task_ref | killed, 1 of 78 fail | +| r23-full-oid | accept a short commit | killed, 1 of 78 fail | +| s01-base-early | skip the early `--base` check | killed, 1 of 78 fail | +| s02-ref-moved | skip ref-moved | killed, 1 of 78 fail | +| s03-merge-base | ignore a missing merge base | killed, 1 of 78 fail | +| s04-empty-diff | accept an empty diff | killed, 1 of 78 fail | +| s05-root-top-file | allow a top-level file | killed, 1 of 78 fail | +| s06-root-new-dir | allow a new top-level directory | killed, 1 of 78 fail | +| s07-root-src-v1 | allow `src/` and `v1/` | killed, 1 of 78 fail | +| s08-dirty-changed | skip the changed-path check | killed, 3 of 78 fail | +| s09-dirty-staged | skip the staged check | killed, 1 of 78 fail | +| s10-dirty-untracked | skip the untracked check | killed, 1 of 78 fail | +| s11-dirty-recheck | skip the recheck before the commit | killed, 2 of 78 fail | +| s12-apply-conflict | ignore an apply failure | killed, 1 of 78 fail | +| s13-patch-drift | skip the patch-id compare | killed, 1 of 78 fail | +| s14-gate-node-modules | skip the node_modules check | killed, 1 of 78 fail | +| s15-gate-step-fails | ignore a failing gate step | killed, 5 of 78 fail | +| s16-gate-skips-queue | run the queue suite too | killed, 15 of 78 fail | +| s17-gate-scripts | run no scripts/test-*.sh | killed, 8 of 78 fail | +| s18-base-moved-cas | update-ref without the old value | killed, 2 of 78 fail | +| s19-dry-run | ignore `--dry-run` | killed, 3 of 78 fail | +| s20-checkout-sync | skip the checkout sync | killed, 1 of 78 fail | +| s21-subject | a fixed subject | killed, 1 of 78 fail | +| s22-attribution | drop the attribution line | killed, 2 of 78 fail | +| s23-cleanup-worktree | keep the worktree | killed, 6 of 78 fail | +| s24-cleanup-network | keep the Docker network | killed, 1 of 78 fail | +| s25-cleanup-scratch | keep the scratch directory | killed, 6 of 78 fail | +| s26-cleanup-link | skip the explicit node_modules unlink | survived | + +s26 is an equivalent mutant. `git worktree remove --force` and the `rm -rf` fallback both delete the `node_modules` symlink without following it, so the target's node_modules survives with or without the explicit unlink, and the suite's "the target's node_modules is still there" case passes either way. I kept the unlink so cleanup never depends on how a git version treats a symlinked directory. r23 is killed by the wrong refusal: with a short commit, `ref-moved` fires in land-work.sh after read.mjs lets the verdict through, so the case gets exit 2 but not `not-approved`. + +## Gate + +A targeted builder gate under #271 (pkt/gate.sh, logs in gate/). The candidate changes no package; read.mjs and fixture.mjs import packages/bus/src/store.mjs, so the bus package runs. test-conductor.sh is the conductor suite beside the new one. I searched every `scripts/test-*.sh` and `packages/*/tests` file for anything that reads `scripts/` as a whole, land-work, TOOLS.md or CONDUCTOR.md; only packages/webui/tests/pinned-copy.test.mjs walks a scripts directory, so it ran too. Sage's landing gate stays full. + +| Step | Result | +|---|---| +| packages/bus `node --test tests/*.test.mjs` | 156 pass, 0 fail | +| scripts/test-land-work.sh | 78 passed, 0 failed | +| scripts/test-conductor.sh | 17 passed, 0 failed | +| packages/webui pinned-copy.test.mjs | 10 pass, 0 fail | + +GATE_PASSED. No flake in this gate. + +## Replay + +replay/replay.sh runs land-work from the candidate worktree against scratch copies, with `bash replay.sh [BASE0]`. It clones the canonical repository into a target with `refactor` at BASE0 and copies the live working repository (`~/.mosaic-dev/working/mosaic-stack/stack.git`) once per case. It loads Sage's dump of the live rows (agents/sage/work/row116/live-rows.json) into a fresh bus through fixture.mjs, which uses the real Store. The live bus and the canonical repository are only read. Each run's sandbox config points at its own data root, and TMPDIR is a short scratch path. + +replay/rows.mjs leaves out the `task.created` rows. The schema's `events_task_created_body` trigger needs the `human.input` request each one cites, and the dump doesn't carry that request event (6870b3ca), so the Store refuses the insert. land-work never reads `task.created`, so the read sees the same decision, raise, close, answer and verdict rows the live bus has. + +### The brief's base and tree can't both hold + +The acceptance line says base 1c9a4910d and a resulting tree equal to `f7c8537b3^{tree}`. f7c8537b3's parent is 4bc908991, not 1c9a4910d. Between them sit b3fca1f1a (my row 115 round 1 packet) and 4bc908991 (its SESSIONS line), 34 files under agents/darkwing/work/queue-115/r1/ and docs/SESSIONS.md. A squash on 1c9a4910d can't produce a tree that has those files, and nothing in the reviewed diff should add them. So I ran it twice: + +- at 1c9a4910d, the brief's base, where the check is that the landed diff equals `git diff f7c8537b3^ f7c8537b3`; +- at 4bc908991, f7c8537b3's real parent, where the tree must match exactly. + +I'm asking Sage for a ruling Filbert can cite, the same kind as sage-0196. + +### Run 1: TMPDIR too long (replay-1/) + +The first attempt at 1c9a4910d used TMPDIR=~/darkwing-scratch/r116/replay/tmp (46 bytes). The dry-run's gate refused `gate-failed: pkg-cli`, rc 2, and wrote no ref. 8 cli tests failed with `data root path too long for a socket`. That suite builds `/mosaic-launch-XXXXXX/data/launches//r<12 hex>/tools.sock`, and a unix socket path holds 107 bytes. The gate inherits TMPDIR, so this was the environment and not the candidate. I kept the logs, moved the replay TMPDIR to `~/darkwing-scratch/rt-`, and added one sentence to the TOOLS.md entry. That edit is in the candidate (TOOLS.md +25, was +23), and build.patch and the manifest were rebuilt after it. + +### Run 2: base 1c9a4910d (replay-1c9a/) + +| Check | Result | +|---|---| +| dry-run rc | 0, gate GATE_PASSED (land-work-logs.2vWgxG) | +| dry-run wrote no ref (refs, reflog, status, worktrees, working repo refs, bus sha256) | yes | +| dry-run tree | 3ca4beda9, not f7c8537b3's, as explained above | +| landing rc | 0, full gate GATE_PASSED (land-work-logs.QTBGn3) | +| new commit | b295e3002, parent 1c9a4910d, tree equal to the dry-run tree | +| landed diff equals f7c8537b3's own diff, as text | yes | +| canonical repository lacks the commit | yes | +| working repo refs unchanged | yes | +| bus.sqlite sha256 unchanged | yes | +| target status after | `?? node_modules` only (the replay's own link) | +| worktrees after | 1 | +| 19/229 (010d30cbe), fixture decision over verdict 1fbd1ed1 | rc 2, `refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs` | +| land-work scratch left in TMPDIR | 0 | + +The commit message is run 3's below with this base in its Base line and first paragraph. + +The PM line it printed and did not send: `work/vikunja-19-265 (vikunja:19/265) is merged to refactor as b295e3002; push pending.` + +Three corrections on this run: + +- replay-1c9a/replay.sh is the script as it ran. It had no diff check. I compared the diffs by hand after the run (`diff <(git -C target diff --binary b295e3002^ b295e3002) <(git -C canonical diff --binary f7c8537b3^ f7c8537b3)`, no output), and the current replay.sh does it as a check. +- Its line `remote-tracking refs unchanged: NO` was a bug in the check, not a change. It grepped the saved snapshot for `' refs/remotes/'` with a leading space, but those lines begin with the ref name, so the before side was empty while the after side listed every remote ref. I compared the remote refs directly and they were identical, as was every target ref other than refactor. The current replay.sh checks "target refs other than refactor unchanged" instead. +- My slip: while the landing's gate ran, I fetched 4bc908991 and f7c8537b3 into the replay's target clone by hand to look at the tree difference. That wrote FETCH_HEAD and objects into the target. No ref moved, and land-work had already fetched C and built its diff by then. The current replay.sh compares the diffs as text so the target never fetches from the canonical repository, and run 3 has no such fetch. + +### Run 3: base 4bc908991 (replay-4bc9/) + +Same scripts, `bash replay.sh 4bc908991`, TMPDIR ~/darkwing-scratch/rt-4bc9. replay-4bc9/replay.sh is the script as it ran and equals replay/replay.sh. + +| Check | Result | +|---|---| +| dry-run rc | 0, full gate GATE_PASSED (land-work-logs.adiLIr) | +| dry-run tree | cdd3a62c2, equal to `f7c8537b3^{tree}` | +| dry-run wrote no ref | yes | +| landing rc | 0, full gate GATE_PASSED (land-work-logs.ASEJp9, 13 package suites and 9 scripts) | +| new commit | 1c0e5e723, parent 4bc908991 | +| tree equals `f7c8537b3^{tree}` | yes | +| landed diff equals f7c8537b3's own diff, as text | yes | +| canonical repository lacks the commit | yes | +| target refs other than refactor unchanged | yes | +| working repo refs unchanged | yes | +| bus.sqlite sha256 unchanged | yes | +| target status after | `?? node_modules` only | +| worktrees after | 1 | +| 19/229 | rc 2, `refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs` | +| land-work scratch left in TMPDIR | 0 | + +The commit message: + +``` +Squash-merge work/vikunja-19-265 into refactor + +Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, +the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + +Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 +Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 +Work-ref: work/vikunja-19-265 +Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 +Base: refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 +Gate: full, every package suite and every scripts/test-*.sh +Applied-under: scripts/land-work.sh (conductor) +``` + +The PM line: `work/vikunja-19-265 (vikunja:19/265) is merged to refactor as 1c0e5e723; push pending.` + +Across runs 2 and 3, four full gates ran (two dry-runs, two landings), and none had a nonzero step, so the flake rule had nothing to count. + +### Leftovers outside land-work + +After runs 2 and 3, TMPDIR held 347 and 344 entries that aren't land-work's (`mosaic-business-*`, `mosaic-launch-*`). The base suites the gate runs leave them, and land-work's own scratch count was 0. I removed each replay TMPDIR after saving the evidence. Not this row's to fix; I note it for whoever owns those suites. + +## Going live + +Nothing goes live. The tool is a conductor command run by hand; no service, role or session calls it, and I ran it only against scratch copies. Push, the merge to next or main, re-pins and restarts stay out of this row. diff --git a/agents/darkwing/work/queue-116/r1/build.patch b/agents/darkwing/work/queue-116/r1/build.patch new file mode 100644 index 000000000..1bfb7c540 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/build.patch @@ -0,0 +1,1051 @@ +diff --git a/docs/TOOLS.md b/docs/TOOLS.md +index 404dd9391..cd7f145c9 100644 +--- a/docs/TOOLS.md ++++ b/docs/TOOLS.md +@@ -118,6 +118,30 @@ succeeded run → clean target tree → path allowlist → syntax gates → + apply → policy suites → attribution commit. Any failure reverts. + Push is never automatic. + ++## Conductor (landing approved work) ++ ++```bash ++scripts/land-work.sh [--base refactor] [--dry-run] [--subject TEXT] ++``` ++ ++Turns a merge decision the human resolved into one gated local commit on ++`refactor` (#1610). It reads `/bus/bus.sqlite` read-only through ++`scripts/land-work/read.mjs` and checks that the human picked the raise's ++approval option, that the question names one `work/vikunja-

-`, and ++that the task's latest `review.verdict` approves a commit C that the work ++ref in the working repository still points at. It then applies ++`git diff $(merge-base refactor C) C` in a detached worktree, checks the ++patch-id, runs every package suite except `queue` and every ++`scripts/test-*.sh`, and commits. The subject is the approval option's ++text unless `--subject` overrides it. The tool prints the line for the PM ++and doesn't send it. `--dry-run` runs every check and the gate and writes ++no ref. A refusal names its reason and exits 2; the reasons are listed at ++the top of the script. The worktree, its `node_modules` link and its Docker ++network are removed on every exit. The gate log directory stays and the ++tool names it. Keep `TMPDIR` short: the gate inherits it, the cli suite ++puts unix sockets under it, and a 46-byte `TMPDIR` failed 8 of those tests. ++Push is a separate act. ++ + ## Maintenance + + | Command | Purpose | Notes | +@@ -128,6 +152,7 @@ Push is never automatic. + | `scripts/test-release.sh` | Release selftests | 14 cases | + | `scripts/test-conductor.sh` | Auto-apply selftests (sandboxed) | 17 cases | + | `scripts/test-auth.sh` | Auth checkpoint selftests (no Docker) | 13 cases | ++| `scripts/test-land-work.sh` | Land-work selftests (sandboxed, fake Docker) | 78 cases | + | `scripts/gitea-api.sh [body]` | Gitea API helper; reads the JSON credential file or a raw per-seat token file | Token never on argv/stdout | + + ## Seat launch with registration (`scripts/mosaic`) +diff --git a/docs/plans/CONDUCTOR.md b/docs/plans/CONDUCTOR.md +index 0d5deff5c..bab3525a6 100644 +--- a/docs/plans/CONDUCTOR.md ++++ b/docs/plans/CONDUCTOR.md +@@ -43,6 +43,33 @@ tracked, versioned files whose changes arrive as reviewed commits. + - Verification is mechanical: suites + `node --check` / `bash -n` gates. + - Recursive decomposition = "fail → smaller task", never "hope." + ++## Landing approved work ++ ++A stack coder pushes `work/vikunja-

-` to the working repository, the ++reviewer approves a commit on it, and the PM raises a `git.merge.protected` ++decision for the human. After the human resolves it with the merge option, ++the conductor runs: ++ ++```bash ++scripts/land-work.sh --dry-run ++scripts/land-work.sh ++``` ++ ++The tool binds the commit to what was reviewed and decided. It reads the ++decision, its raise and the latest verdict from the bus database ++read-only, requires the work ref to be at the approved commit, squashes ++the reviewed diff onto `refactor` in a detached worktree, checks the ++patch-id, runs the full gate and commits once, locally. It refuses work ++that adds a file at the repository root, in a new top-level directory, or ++under `src/` or `v1/`. Each ++refusal names its reason (`docs/TOOLS.md`). Don't work around one; fix the ++cause or go back to the PM. ++ ++The conductor then reviews the commit, pushes it as a separate act and ++sends the PM the line the tool printed. Only `refactor` lands this way. ++Merges to `next` or `main`, re-pins and restarts keep their own authority, ++and no stack role runs this tool. ++ + ## Worker task template + + ```json +diff --git a/scripts/land-work.sh b/scripts/land-work.sh +new file mode 100644 +index 000000000..8c8ff6e80 +--- /dev/null ++++ b/scripts/land-work.sh +@@ -0,0 +1,280 @@ ++#!/usr/bin/env bash ++# Land approved work: turn a resolved merge decision into one gated local ++# commit on the base branch (row 116, #1610). ++# ++# Usage: scripts/land-work.sh [--base refactor] [--dry-run] ++# [--subject TEXT] [--attribution LINE] [--business ID] ++# [--project ID] ++# ++# Checks, in order; each refusal names its reason on stderr and exits 2: ++# bus-schema the bus database's schema isn't the Store's ++# decision-not-found no decision with that id and one raise in the business ++# not-a-merge the decision's action isn't git.merge.protected ++# not-resolved the decision is open, withdrawn or expired ++# not-human not resolved by the business's human through the CLI ++# not-merge-option the choice isn't the raise's approval option ++# work-ref the question doesn't name exactly one ++# work/vikunja-

-, or a task_ref disagrees with it ++# target-branch the raise's target or --base isn't refactor (next and ++# main always refuse) ++# superseded a later merge decision on the same work ref or task, ++# or one that supersedes this one ++# no-verdict no review.verdict for the task ++# not-approved the latest verdict isn't approve on a full commit id ++# ref-moved the work ref in the working repository isn't at C ++# root-file the reviewed diff adds a file at the repository root ++# checkout-dirty the base is checked out with changes on a reviewed path ++# base-conflict the reviewed diff doesn't apply cleanly to the base ++# patch-drift the applied diff's patch-id isn't the reviewed one ++# gate-failed a gate step failed; the log is named ++# base-moved the base branch moved while the gate ran ++# ++# Reads: /bus/bus.sqlite, opened readOnly by ++# scripts/land-work/read.mjs, which holds every query and runs SELECTs only. ++# The live bus can stay up: it runs in WAL mode and a reader doesn't block it. ++# ++# Writes, on a pass and without --dry-run: one commit on refs/heads/, ++# made by `git commit` in a detached worktree, then moved onto the base with ++# a compare-and-swap update-ref. If the base is checked out, the reviewed ++# paths there are brought up to the new commit. Nothing is pushed. ++# ++# The worktree goes under $TMPDIR and is removed on every exit. The gate logs ++# stay in $TMPDIR/land-work-logs.* and the tool names the directory. ++set -euo pipefail ++ ++SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ++REPO="$(cd "$SCRIPT_DIR/.." && pwd)" ++ ++usage() { echo "usage: land-work.sh [--base refactor] [--dry-run] [--subject TEXT] [--attribution LINE] [--business ID] [--project ID]" >&2; exit 4; } ++fail() { echo "land-work: $1" >&2; exit "${2:-1}"; } ++refuse() { echo "land-work: refused: $1${2:+: $2}" >&2; exit 2; } ++ ++DECISION=""; BASE="refactor"; DRY_RUN="no"; SUBJECT=""; ATTRIBUTION="" ++BUSINESS=""; PROJECT="" ++while [ $# -gt 0 ]; do ++ case "$1" in ++ --base) [ $# -ge 2 ] || usage; BASE="$2"; shift 2 ;; ++ --dry-run) DRY_RUN="yes"; shift ;; ++ --subject) [ $# -ge 2 ] || usage; SUBJECT="$2"; shift 2 ;; ++ --attribution) [ $# -ge 2 ] || usage; ATTRIBUTION="$2"; shift 2 ;; ++ --business) [ $# -ge 2 ] || usage; BUSINESS="$2"; shift 2 ;; ++ --project) [ $# -ge 2 ] || usage; PROJECT="$2"; shift 2 ;; ++ -*) usage ;; ++ *) [ -z "$DECISION" ] || usage; DECISION="$1"; shift ;; ++ esac ++done ++[ -n "$DECISION" ] || usage ++[[ "$DECISION" =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ ]] || fail "not a decision id: $DECISION" 4 ++case "$SUBJECT$ATTRIBUTION" in *$'\n'*) fail "--subject and --attribution take one line" 4 ;; esac ++# Exactly refactor (#1610): next and main always refuse, as does anything else. ++[ "$BASE" = "refactor" ] || refuse target-branch "--base must be refactor, not $BASE" ++ ++# ---- temporary space: the worktree goes, the gate logs stay ---- ++TMP_ROOT="${TMPDIR:-/tmp}" ++LOGS="$(mktemp -d "$TMP_ROOT/land-work-logs.XXXXXX")" ++SCRATCH="$(mktemp -d "$TMP_ROOT/land-work.XXXXXX")" ++# Lowercase digits and a dash: Compose names a network

_default as is. ++WT_NAME="lw-$$-$(date -u +%s)" ++WT="" ++TARGET="" ++cleanup() { ++ local rc=$? ++ if [ -n "$WT" ]; then ++ [ -L "$WT/node_modules" ] && rm -f "$WT/node_modules" ++ git -C "$TARGET" worktree remove --force "$WT" >/dev/null 2>&1 || rm -rf "$WT" ++ git -C "$TARGET" worktree prune >/dev/null 2>&1 || true ++ fi ++ if command -v docker >/dev/null 2>&1 && docker network inspect "${WT_NAME}_default" >/dev/null 2>&1; then ++ docker network rm "${WT_NAME}_default" >/dev/null 2>&1 || echo "land-work: could not remove Docker network ${WT_NAME}_default" >&2 ++ fi ++ rm -rf "$SCRATCH" ++ rmdir "$LOGS" 2>/dev/null || true ++ exit "$rc" ++} ++trap cleanup EXIT ++ ++# ---- configuration: data root, business, project ---- ++DATA_ROOT="$(node "$REPO/scripts/mosaic-config.mjs" validate | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>console.log(JSON.parse(d).dataRoot))')" \ ++ || fail "system config is missing or invalid" 3 ++CONFIG_DIR="$(dirname "${MOSAIC_CONFIG:-$HOME/.config/mosaic-dev/config.json}")" ++if [ -z "$BUSINESS" ]; then ++ shopt -s nullglob ++ files=("$CONFIG_DIR"/businesses/*.json) ++ shopt -u nullglob ++ [ "${#files[@]}" -eq 1 ] || fail "name the business with --business (${#files[@]} business files)" 4 ++ BUSINESS="$(basename "${files[0]}" .json)" ++fi ++BUSINESS_FILE="$CONFIG_DIR/businesses/$BUSINESS.json" ++[ -f "$BUSINESS_FILE" ] || fail "no business file: $BUSINESS_FILE" 3 ++ ++# ---- the decision and the verdict, read-only from the bus ---- ++READ_RC=0 ++node "$SCRIPT_DIR/land-work/read.mjs" "$DATA_ROOT" "$BUSINESS_FILE" "$DECISION" "$BASE" > "$SCRATCH/read.txt" || READ_RC=$? ++value() { awk -F'\t' -v k="$1" '$1 == k { sub(/^[^\t]*\t/, ""); print; exit }' "$SCRATCH/read.txt"; } ++if [ "$READ_RC" -eq 2 ] && grep -q '^refuse' "$SCRATCH/read.txt"; then ++ line="$(value refuse)" ++ refuse "${line%% *}" "${line#* }" ++fi ++[ "$READ_RC" -eq 0 ] || fail "could not read the decision from the bus (exit $READ_RC)" "$READ_RC" ++TASK_REF="$(value task_ref)" ++WORK_REF="$(value work_ref)" ++C="$(value commit)" ++VERDICT="$(value verdict)" ++CHOICE="$(value choice)" ++RESOLVED_BY="$(value by)" ++RESOLVED_AT="$(value resolved_at)" ++[ -n "$SUBJECT" ] || SUBJECT="$(value subject)" ++[ -n "$SUBJECT" ] || fail "the decision gives no subject; pass --subject" 4 ++[ -n "$PROJECT" ] || PROJECT="$(value project)" ++ ++# ---- the project's repository and the working repository ---- ++PROJECT_ROOT="$(node -e ' ++const b = JSON.parse(require("fs").readFileSync(process.argv[1], "utf8")); ++const ids = Object.keys(b.projects ?? {}); ++const p = process.argv[2] || (ids.length === 1 ? ids[0] : ""); ++if (!p || !b.projects?.[p]?.root) process.exit(3); ++console.log(`${p}\t${b.projects[p].root}`); ++' "$BUSINESS_FILE" "$PROJECT")" || fail "name the project with --project; the decision names none that $BUSINESS has" 4 ++PROJECT="${PROJECT_ROOT%% *}" ++TARGET="${PROJECT_ROOT#* }" ++[ -d "$TARGET/.git" ] || [ -f "$TARGET/.git" ] || fail "project root is not a git checkout: $TARGET" 4 ++WORKING="$DATA_ROOT/working/$BUSINESS/$PROJECT.git" ++[ -d "$WORKING" ] || fail "no working repository: $WORKING" 4 ++ ++# The working repository holds what sessions sent: no hooks, no fsmonitor, ++# file transport only, as packages/seat/src/working.mjs runs it. ++wgit() { git -c core.hooksPath=/dev/null -c core.fsmonitor=false -c protocol.allow=never -c protocol.file.allow=always -C "$WORKING" "$@"; } ++# A diff in one fixed format, whatever the user's diff config says. ++pdiff() { git -c diff.noprefix=false -c diff.mnemonicPrefix=false -C "$1" diff --no-ext-diff --no-textconv --no-color --binary --no-renames "${@:2}"; } ++ ++AT="$(wgit rev-parse --verify -q "refs/heads/$WORK_REF^{commit}" || true)" ++[ "$AT" = "$C" ] || refuse ref-moved "$WORK_REF is at ${AT:-nothing}, the verdict approved $C" ++ ++OLD="$(git -C "$TARGET" rev-parse --verify -q "refs/heads/$BASE^{commit}")" || fail "no branch $BASE in $TARGET" 4 ++# Objects only: no refspec destination and no FETCH_HEAD, so no ref moves. ++git -c protocol.allow=never -c protocol.file.allow=always -c transfer.fsckObjects=true \ ++ -c maintenance.auto=false -c gc.auto=0 -C "$TARGET" \ ++ fetch -q --no-tags --no-write-fetch-head "$WORKING" "refs/heads/$WORK_REF" \ ++ || fail "could not fetch $WORK_REF from $WORKING" ++git -C "$TARGET" cat-file -e "$C^{commit}" 2>/dev/null || fail "the fetch did not bring $C" ++ ++# ---- the reviewed diff ---- ++MB="$(git -C "$TARGET" merge-base "$OLD" "$C")" || refuse base-conflict "$C shares no history with $BASE" ++pdiff "$TARGET" "$MB" "$C" > "$SCRATCH/reviewed.patch" ++[ -s "$SCRATCH/reviewed.patch" ] || refuse base-conflict "the reviewed diff $MB..$C is empty" ++REVIEWED_ID="$(git -C "$TARGET" patch-id --stable < "$SCRATCH/reviewed.patch" | cut -d' ' -f1)" ++ ++# Invariant 1: nothing new at the root. A top-level file, a top-level ++# directory the base doesn't have, and the legacy src/ and archived v1/ ++# trees all count as the root. ++mapfile -d '' -t ADDED < <(git -C "$TARGET" diff -z --no-renames --name-only --diff-filter=A "$MB" "$C") ++mapfile -d '' -t TOP < <(git -C "$TARGET" ls-tree -z --name-only "$OLD") ++ROOT_HITS="" ++for f in "${ADDED[@]}"; do ++ case "$f" in ++ */*) top="${f%%/*}" ;; ++ *) ROOT_HITS="$ROOT_HITS $f"; continue ;; ++ esac ++ known="no" ++ for t in "${TOP[@]}"; do [ "$t" = "$top" ] && known="yes" && break; done ++ if [ "$known" = "no" ] || [ "$top" = "src" ] || [ "$top" = "v1" ]; then ROOT_HITS="$ROOT_HITS $f"; fi ++done ++[ -z "$ROOT_HITS" ] || refuse root-file "the reviewed diff adds$ROOT_HITS" ++ ++mapfile -d '' -t PATHS < <(git -C "$TARGET" diff -z --no-renames --name-only "$MB" "$C") ++# Paths go to git as they are, never as globs or pathspec magic. ++lgit() { git --literal-pathspecs -C "$@"; } ++ ++# Where the base is checked out, the reviewed paths there must be clean: the ++# landing rewrites them to the new commit. ++CHECKOUT="$(git -C "$TARGET" worktree list --porcelain | awk -v b="branch refs/heads/$BASE" '/^worktree /{w=substr($0,10)} $0==b{print w; exit}')" ++checkout_clean() { ++ [ -n "$CHECKOUT" ] || return 0 ++ local dirty="" ++ lgit "$CHECKOUT" diff --quiet HEAD -- "${PATHS[@]}" || dirty="changed" ++ lgit "$CHECKOUT" diff --cached --quiet HEAD -- "${PATHS[@]}" || dirty="staged" ++ for f in "${PATHS[@]}"; do ++ if ! git -C "$CHECKOUT" cat-file -e "HEAD:$f" 2>/dev/null && [ -e "$CHECKOUT/$f" ]; then dirty="untracked $f"; fi ++ done ++ [ -z "$dirty" ] || refuse checkout-dirty "$BASE is checked out at $CHECKOUT with a $dirty reviewed path" ++} ++checkout_clean ++ ++# ---- the squash, in a detached worktree on the base ---- ++WT="$SCRATCH/$WT_NAME" ++git -C "$TARGET" worktree add -q --detach "$WT" "$OLD" || fail "could not add a worktree at $WT" ++git -C "$WT" apply --index "$SCRATCH/reviewed.patch" 2> "$SCRATCH/apply.err" \ ++ || refuse base-conflict "$(tail -n1 "$SCRATCH/apply.err")" ++APPLIED_ID="$(pdiff "$WT" --cached "$OLD" | git -C "$WT" patch-id --stable | cut -d' ' -f1)" ++[ "$APPLIED_ID" = "$REVIEWED_ID" ] || refuse patch-drift "applied ${APPLIED_ID:-none}, reviewed $REVIEWED_ID" ++ ++# ---- the gate ---- ++echo "land-work: gate logs in $LOGS" >&2 ++# The full gate, as Sage's landing gate template runs it. There is no switch ++# to shorten or skip it. ++[ -d "$TARGET/node_modules" ] || fail "no node_modules in $TARGET for the gate" 4 ++ln -s "$TARGET/node_modules" "$WT/node_modules" ++gate_step() { # name dir command ++ local rc=0 ++ (cd "$WT/$2" && bash -c "set -o pipefail; $3") > "$LOGS/$1.log" 2>&1 || rc=$? ++ echo "$1 rc=$rc $(grep -E '^ℹ (pass|fail) [0-9]+' "$LOGS/$1.log" | tr '\n' ' ')" | tee -a "$LOGS/gate.log" >&2 ++ [ "$rc" -eq 0 ] || refuse gate-failed "$1, see $LOGS/$1.log" ++} ++# No pkg-queue step: scripts/test-queue.sh runs packages/queue/tests/ itself. ++for d in "$WT"/packages/*/; do ++ p="$(basename "$d")" ++ [ -d "$d/tests" ] || continue ++ [ "$p" = queue ] && continue ++ gate_step "pkg-$p" "packages/$p" 'node --test tests/*.test.mjs' ++done ++for s in "$WT"/scripts/test-*.sh; do ++ [ -f "$s" ] || continue ++ n="$(basename "$s" .sh)" ++ gate_step "script-${n#test-}" . "bash scripts/$n.sh" ++done ++echo "GATE_PASSED" | tee -a "$LOGS/gate.log" >&2 ++ ++# ---- the commit ---- ++SHORT_ID="${REVIEWED_ID:0:12}" ++cat > "$SCRATCH/message" </dev/null \ ++ || refuse base-moved "$BASE is no longer at $OLD; nothing was written" ++if [ -n "$CHECKOUT" ]; then ++ # HEAD is now NEW there: take the reviewed paths' index entries and files from it. ++ lgit "$CHECKOUT" reset -q -- "${PATHS[@]}" ++ for f in "${PATHS[@]}"; do ++ if git -C "$CHECKOUT" cat-file -e "HEAD:$f" 2>/dev/null; then ++ lgit "$CHECKOUT" checkout -q -- "$f" ++ else ++ rm -f "$CHECKOUT/$f" ++ fi ++ done ++fi ++echo "land-work: committed $NEW on $BASE (parent $OLD), patch-id $SHORT_ID. NOT pushed - push remains an explicit act." ++echo "$WORK_REF ($TASK_REF) is merged to $BASE as ${NEW:0:9}; push pending." +diff --git a/scripts/land-work/fixture.mjs b/scripts/land-work/fixture.mjs +new file mode 100644 +index 000000000..d7288a343 +--- /dev/null ++++ b/scripts/land-work/fixture.mjs +@@ -0,0 +1,57 @@ ++#!/usr/bin/env node ++// Test fixture for land-work (row 116, #1610): writes rows into a bus ++// database through the real Store, so the schema and its digest are the ++// Store's own and land-work's read check passes. ++// ++// node scripts/land-work/fixture.mjs ++// ++// rows.json is an array of { "table": "decisions" | "decision_events" | ++// "events", ...columns }. Rows go in in array order, in one transaction. ++// Object values (body, options) are stored as JSON text. A missing `at` is ++// now, a missing events or decisions `id` is a fresh UUID, and decisions ++// default to the shape a PM's merge raise has. The data root is made if ++// missing. Tests only: the Store's writer lock refuses a database that ++// already has a writer. ++import { readFileSync, mkdirSync } from 'node:fs'; ++import { randomUUID } from 'node:crypto'; ++import { pathToFileURL } from 'node:url'; ++import { Store } from '../../packages/bus/src/store.mjs'; ++ ++const TABLES = { ++ decisions: ['seq', 'id', 'at', 'business', 'project', 'raised_by_role', 'raised_by_run', 'class', 'action', ++ 'route_to', 'question', 'options', 'recommendation', 'task_ref', 'requirement_ref', 'blocking', 'supersedes'], ++ decision_events: ['seq', 'decision', 'at', 'op', 'by', 'choice', 'note', 'via'], ++ events: ['seq', 'id', 'at', 'business', 'kind', 'actor_role', 'actor_run', 'subject', 'corrects', 'body'], ++}; ++const DEFAULTS = { ++ decisions: { raised_by_role: 'pm', raised_by_run: 'rfixture', class: 'gated', route_to: 'human', ++ recommendation: 'yes', blocking: 0 }, ++ decision_events: {}, ++ events: {}, ++}; ++ ++export function writeRows(dataRoot, rows) { ++ mkdirSync(dataRoot, { recursive: true, mode: 0o700 }); ++ const store = new Store(dataRoot); ++ try { ++ store.transaction(() => { ++ for (const row of rows) { ++ const columns = TABLES[row.table]; ++ if (!columns) throw Error(`unknown table ${row.table}`); ++ const r = { ...DEFAULTS[row.table], ...row }; ++ r.at ??= new Date().toISOString(); ++ if (row.table !== 'decision_events') r.id ??= randomUUID(); ++ const used = columns.filter((c) => r[c] !== undefined); ++ const values = used.map((c) => (r[c] !== null && typeof r[c] === 'object' ? JSON.stringify(r[c]) : r[c])); ++ store.run(`INSERT INTO ${row.table} (${used.join(',')}) VALUES (${used.map(() => '?').join(',')})`, ...values); ++ } ++ }); ++ } finally { ++ store.close(); ++ } ++} ++ ++if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { ++ const [dataRoot, file] = process.argv.slice(2); ++ writeRows(dataRoot, JSON.parse(readFileSync(file, 'utf8'))); ++} +diff --git a/scripts/land-work/read.mjs b/scripts/land-work/read.mjs +new file mode 100644 +index 000000000..495a069eb +--- /dev/null ++++ b/scripts/land-work/read.mjs +@@ -0,0 +1,224 @@ ++#!/usr/bin/env node ++// land-work's read of the bus (row 116, #1610). Every query land-work runs ++// against bus.sqlite is in this file, and every one is a SELECT. ++// ++// node scripts/land-work/read.mjs ++// ++// It opens /bus/bus.sqlite with readOnly: true and checks the ++// schema the way the Store does before reading anything. Output is one ++// "keyvalue" line per fact land-work needs, or one ++// "refusereasondetail" line and exit 2. A missing or unsafe ++// database or business file exits 3. ++// ++// Kept in step with packages/bus/src/store.mjs, which this imports from: ++// the schema_version literal '3b' below is a copy of the Store's. A schema ++// bump changes it there, and until it changes here every read refuses ++// bus-schema. ++import { DatabaseSync } from 'node:sqlite'; ++import { readFileSync, lstatSync } from 'node:fs'; ++import { join } from 'node:path'; ++import { pathToFileURL } from 'node:url'; ++import { createHash } from 'node:crypto'; ++import { schemaDigest, SCHEMA_SHA256 } from '../../packages/bus/src/store.mjs'; ++ ++const SCHEMA_VERSION = '3b'; ++const MERGE = 'git.merge.protected'; ++const WORK_REF = /^work\/vikunja-([1-9][0-9]*)-([1-9][0-9]*)$/; ++const ANY_WORK_REF = /\bwork\/[A-Za-z0-9._/-]*[A-Za-z0-9_]/g; ++const OID = /^[0-9a-f]{40}([0-9a-f]{24})?$/; ++ ++class Refusal extends Error { ++ constructor(reason, detail) { ++ super(detail); ++ this.reason = reason; ++ } ++} ++const refuse = (reason, detail) => { ++ throw new Refusal(reason, detail); ++}; ++const json = (text) => { ++ try { ++ return JSON.parse(text); ++ } catch { ++ return null; ++ } ++}; ++ ++export function openBus(dataRoot) { ++ const path = join(dataRoot, 'bus', 'bus.sqlite'); ++ let s; ++ try { ++ s = lstatSync(path); ++ } catch { ++ throw Object.assign(new Error(`no bus database at ${path}`), { exit: 3 }); ++ } ++ if (s.isSymbolicLink() || !s.isFile() || s.uid !== process.getuid()) ++ throw Object.assign(new Error(`unsafe bus database ${path}`), { exit: 3 }); ++ const db = new DatabaseSync(path, { readOnly: true, timeout: 5000 }); ++ try { ++ checkSchema(db); ++ } catch (e) { ++ db.close(); ++ throw e; ++ } ++ return db; ++} ++ ++// The Store's own open check (store.mjs), against a reference built from the ++// same schema.sql the import has already verified against SCHEMA_SHA256. ++export function checkSchema(db) { ++ const ddl = readFileSync(new URL('../../packages/bus/schema.sql', import.meta.url), 'utf8'); ++ if (createHash('sha256').update(ddl).digest('hex') !== SCHEMA_SHA256) ++ refuse('bus-schema', 'packages/bus/schema.sql does not match SCHEMA_SHA256'); ++ const reference = new DatabaseSync(':memory:'); ++ reference.exec(ddl); ++ const expected = schemaDigest(reference); ++ reference.close(); ++ const meta = (key) => db.prepare('SELECT value FROM meta WHERE key = ?').get(key)?.value; ++ let digest; ++ try { ++ digest = schemaDigest(db); ++ } catch (e) { ++ refuse('bus-schema', `cannot read the schema: ${e.message}`); ++ } ++ if (digest !== expected) refuse('bus-schema', `schema digest ${digest.slice(0, 12)}, the store expects ${expected.slice(0, 12)}`); ++ if (meta('schema_version') !== SCHEMA_VERSION || meta('schema_digest') !== expected) ++ refuse('bus-schema', `meta says version ${meta('schema_version')}, digest ${String(meta('schema_digest')).slice(0, 12)}`); ++} ++ ++// The queries. Each takes the business so one bus can't answer for another. ++const queries = { ++ decision: (db, b, id) => db.prepare('SELECT * FROM decisions WHERE business = ? AND id = ?').get(b, id), ++ raise: (db, b, id) => ++ db ++ .prepare( ++ `SELECT * FROM events WHERE business = ? AND kind = 'action.allowed' AND subject = ? ++ AND json_extract(body, '$.operation') = 'decision.raise' AND json_extract(body, '$.decision') = ? ++ ORDER BY seq`, ++ ) ++ .all(b, id, id), ++ closes: (db, id) => ++ db ++ .prepare( ++ `SELECT * FROM decision_events WHERE decision = ? AND op IN ('resolved','withdrawn','expired') ORDER BY seq`, ++ ) ++ .all(id), ++ answer: (db, b, id) => ++ db ++ .prepare( ++ `SELECT * FROM events WHERE business = ? AND kind = 'human.input' AND subject = ? ++ AND json_extract(body, '$.kind') = 'answer' AND json_extract(body, '$.decision') = ? ++ AND json_extract(body, '$.op') = 'resolved' ++ ORDER BY seq`, ++ ) ++ .all(b, id, id), ++ later: (db, b, d) => ++ db ++ .prepare( ++ `SELECT * FROM decisions WHERE business = ? AND id <> ? ++ AND (supersedes = ? OR (seq > ? AND action = ?)) ORDER BY seq`, ++ ) ++ .all(b, d.id, d.id, d.seq, MERGE), ++ verdict: (db, b, task) => ++ db ++ .prepare(`SELECT * FROM events WHERE business = ? AND kind = 'review.verdict' AND subject = ? ORDER BY seq DESC LIMIT 1`) ++ .get(b, task), ++}; ++ ++export function readLanding(db, business, id, base) { ++ const b = business.id; ++ const d = queries.decision(db, b, id); ++ const raises = queries.raise(db, b, id); ++ if (!d || raises.length !== 1) refuse('decision-not-found', `no decision ${id} with one raise in business ${b}`); ++ const raise = json(raises[0].body) ?? {}; ++ if (d.action !== MERGE || raise.action !== MERGE) refuse('not-a-merge', `action ${d.action}`); ++ ++ const closes = queries.closes(db, id); ++ if (closes.length !== 1 || closes[0].op !== 'resolved') ++ refuse('not-resolved', closes.length ? closes.map((r) => r.op).join(',') : 'open'); ++ const res = closes[0]; ++ const answers = queries.answer(db, b, id); ++ const answer = answers.length === 1 ? answers[0] : null; ++ if ( ++ res.by !== business.human || ++ res.via !== 'cli' || ++ !answer || ++ answer.actor_role !== null || ++ answer.actor_run !== null || ++ json(answer.body)?.choice !== res.choice ++ ) ++ refuse('not-human', `resolved by ${res.by} via ${res.via}, ${answers.length} human answer(s)`); ++ const options = json(d.options) ?? []; ++ const merge = options.find((o) => o?.key === raise.approvalChoice); ++ if (!raise.approvalChoice || !merge) refuse('not-merge-option', 'the raise names no approval option'); ++ if (res.choice !== raise.approvalChoice) ++ refuse('not-merge-option', `chose ${res.choice}, the merge option is ${raise.approvalChoice}`); ++ ++ // The work ref comes from the question: decisions don't carry it. ++ const named = [...new Set(d.question.match(ANY_WORK_REF) ?? [])]; ++ const m = named.length === 1 ? WORK_REF.exec(named[0]) : null; ++ if (!m) refuse('work-ref', `the question names ${named.join(', ') || 'no work ref'}`); ++ const workRef = named[0]; ++ const task = `vikunja:${m[1]}/${m[2]}`; ++ for (const ref of [d.task_ref, raise.task_ref]) ++ if (ref != null && ref !== task) refuse('work-ref', `the decision cites ${ref}, the question ${workRef}`); ++ ++ // The target is the raise's, and only refactor ever lands. ++ if (raise.target !== 'refactor' || raise.target !== base) ++ refuse('target-branch', `the raise targets ${raise.target}, the base is ${base}`); ++ ++ const later = queries.later(db, b, d).filter( ++ (r) => r.supersedes === id || r.task_ref === task || (r.question.match(ANY_WORK_REF) ?? []).includes(workRef), ++ ); ++ if (later.length) refuse('superseded', `later decision ${later.map((r) => r.id).join(', ')} on ${workRef}`); ++ ++ const v = queries.verdict(db, b, task); ++ if (!v) refuse('no-verdict', `no review.verdict for ${task}`); ++ const vb = json(v.body) ?? {}; ++ if (vb.verdict !== 'approve' || vb.task_ref !== task || !OID.test(vb.commit ?? '')) ++ refuse('not-approved', `latest verdict ${v.id} is ${vb.verdict} on ${vb.commit}`); ++ ++ return { ++ task_ref: task, ++ work_ref: workRef, ++ commit: vb.commit, ++ verdict: v.id, ++ project: d.project ?? '', ++ choice: res.choice, ++ by: res.by, ++ resolved_at: res.at, ++ subject: String(merge.text ?? '').split('\n')[0].trim(), ++ }; ++} ++ ++function main([dataRoot, businessFile, id, base]) { ++ const out = (k, v) => process.stdout.write(`${k}\t${String(v ?? '').replace(/[\t\n\r]/g, ' ')}\n`); ++ let business; ++ try { ++ business = JSON.parse(readFileSync(businessFile, 'utf8')); ++ } catch (e) { ++ process.stderr.write(`land-work: cannot read the business file ${businessFile}: ${e.message}\n`); ++ return 3; ++ } ++ if (typeof business?.id !== 'string' || typeof business?.human !== 'string' || !business.human) { ++ process.stderr.write(`land-work: ${businessFile} names no business id and human\n`); ++ return 3; ++ } ++ let db; ++ try { ++ db = openBus(dataRoot); ++ for (const [k, v] of Object.entries(readLanding(db, business, id, base))) out(k, v); ++ return 0; ++ } catch (e) { ++ if (e instanceof Refusal) { ++ out('refuse', `${e.reason}\t${e.message}`); ++ return 2; ++ } ++ process.stderr.write(`land-work: ${e.message}\n`); ++ return e.exit ?? 1; ++ } finally { ++ db?.close(); ++ } ++} ++ ++if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) process.exitCode = main(process.argv.slice(2)); +diff --git a/scripts/test-land-work.sh b/scripts/test-land-work.sh +new file mode 100644 +index 000000000..6e43ed667 +--- /dev/null ++++ b/scripts/test-land-work.sh +@@ -0,0 +1,385 @@ ++#!/usr/bin/env bash ++# Sandboxed selftests for scripts/land-work.sh (row 116, #1610). ++# ++# Builds a fixture project repository, a working repository holding the ++# coder's work refs, and per case a bus database written through the real ++# Store (scripts/land-work/fixture.mjs). Every refusal is exercised, then a ++# landing, a dry run, a gate failure and a base that moves during the gate. ++# Docker is a fake on PATH that logs its calls. Nothing here opens the real ++# config, data root or bus: MOSAIC_CONFIG always names a sandbox file. ++set -uo pipefail ++cd "$(dirname "$0")/.." ++REPO="$(pwd)" ++ ++SANDBOX="$(cd "$(mktemp -d)" && pwd -P)" ++trap 'rm -rf "$SANDBOX"' EXIT ++ ++PASS=0 ++FAIL=0 ++# Status colors: terminal-only, NO_COLOR-respecting; plain when piped. ++if [ -t 1 ] && [ -z "${NO_COLOR:-}" ]; then ++ C_OK=$'\033[0;32m'; C_FAIL=$'\033[0;31m'; C_RESET=$'\033[0m' ++else ++ C_OK=""; C_FAIL=""; C_RESET="" ++fi ++check() { ++ if [ "$2" = "0" ]; then PASS=$((PASS+1)); echo "${C_OK}OK${C_RESET} $1"; else FAIL=$((FAIL+1)); echo "${C_FAIL}FAIL${C_RESET} $1"; fi ++} ++ ++# Git sees no user or system config: no hooks path, no signing, a fixed identity. ++: > "$SANDBOX/gitconfig" ++export GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL="$SANDBOX/gitconfig" ++export GIT_AUTHOR_NAME=suite GIT_AUTHOR_EMAIL=suite@local GIT_COMMITTER_NAME=suite GIT_COMMITTER_EMAIL=suite@local ++REAL_GIT="$(command -v git)" ++ ++# ---- fakes: docker logs its calls; a git that tampers with the applied diff ---- ++mkdir -p "$SANDBOX/bin" "$SANDBOX/tamper" ++cat > "$SANDBOX/bin/docker" <> "$SANDBOX/docker.log" ++[ "\$1 \$2" != "network inspect" ] || [ "\${FAKE_NET_EXISTS:-}" = 1 ] ++EOF ++cat > "$SANDBOX/tamper/git" <> "\$2/README.md" && "$REAL_GIT" -C "\$2" add README.md ++fi ++exit "\$rc" ++EOF ++chmod +x "$SANDBOX/bin/docker" "$SANDBOX/tamper/git" ++ ++# ---- the project repository at the review's merge base ---- ++P="$SANDBOX/proto" ++T="$P/target" ++git init -q -b refactor "$T" ++printf 'line1\nline2\nline3\n' > "$T/README.md" ++mkdir -p "$T/packages/demo/tests" "$T/packages/queue/tests" "$T/scripts" "$T/src" ++cat > "$T/packages/demo/tests/demo.test.mjs" <<'EOF' ++import test from 'node:test'; ++import assert from 'node:assert/strict'; ++test('demo', () => assert.notEqual(process.env.LW_FAIL, 'pkg')); ++EOF ++cat > "$T/packages/queue/tests/never.test.mjs" <<'EOF' ++import test from 'node:test'; ++test('the gate runs no pkg-queue step', () => { throw new Error('pkg-queue ran'); }); ++EOF ++cat > "$T/scripts/test-demo.sh" <<'EOF' ++#!/usr/bin/env bash ++[ "${LW_FAIL:-}" != script ] || exit 1 ++[ -z "${LW_DIRTY:-}" ] || echo "during the gate" >> "$LW_DIRTY" ++if [ -n "${LW_MOVE_BASE:-}" ]; then ++ moved="$(git -C "$LW_MOVE_BASE" commit-tree "refactor^{tree}" -p refactor -m moved)" \ ++ && git -C "$LW_MOVE_BASE" update-ref refs/heads/refactor "$moved" ++fi ++echo "ℹ pass 1" ++EOF ++echo 'echo legacy' > "$T/src/legacy.sh" ++echo node_modules > "$T/.gitignore" ++git -C "$T" add -A && git -C "$T" commit -q -m base ++MB="$(git -C "$T" rev-parse HEAD)" ++ ++# ---- the coder's commits, pushed to the working repository ---- ++git clone -q "$T" "$P/coder" ++CO="$P/coder" ++commit_on() { # message: commit what's changed in the coder clone, print the id ++ git -C "$CO" add -A && git -C "$CO" commit -q -m "$1" && git -C "$CO" rev-parse HEAD ++} ++git -C "$CO" checkout -q -b w42 "$MB" ++printf 'line1\nline2 changed\nline3\n' > "$CO/README.md" ++echo feature > "$CO/packages/demo/feature.txt" ++W_OK="$(commit_on w42)" ++git -C "$CO" checkout -q -b w43 "$MB"; echo notes > "$CO/notes.txt" ++W_ROOT="$(commit_on w43)" ++git -C "$CO" checkout -q -b w44 "$MB"; mkdir "$CO/tools2"; echo x > "$CO/tools2/x.txt" ++W_NEWDIR="$(commit_on w44)" ++git -C "$CO" checkout -q -b w45 "$MB"; echo 'export {};' > "$CO/src/parse-requirement-id.mjs" ++W_SRC="$(commit_on w45)" ++git -C "$CO" checkout -q --orphan w46; git -C "$CO" rm -rfq .; echo o > "$CO/o.txt" ++W_ORPHAN="$(commit_on w46)" ++git init -q --bare "$P/working" ++for pair in "w42:42" "w43:43" "w44:44" "w45:45" "w46:46"; do ++ git -C "$CO" push -q "$P/working" "${pair%%:*}:refs/heads/work/vikunja-7-${pair#*:}" ++done ++git -C "$CO" push -q "$P/working" "$MB:refs/heads/work/vikunja-7-47" ++ ++# The base moves on after the review, on a path the work doesn't touch. ++echo docs > "$T/docs.txt" ++git -C "$T" add docs.txt && git -C "$T" commit -q -m "base moves" ++OLD="$(git -C "$T" rev-parse HEAD)" ++mkdir "$T/node_modules" ++ ++# ---- bus rows: one decision and its verdicts, in the live rows' shape ---- ++D="d0000000-0000-4000-8000-000000000001" ++V="e0000000-0000-4000-8000-000000000002" ++cat > "$SANDBOX/gen.mjs" <<'EOF' ++const [variant, p, t, commit] = process.argv.slice(2); ++const D = 'd0000000-0000-4000-8000-000000000001'; ++const L = 'd0000000-0000-4000-8000-000000000009'; ++const MERGE = 'git.merge.protected'; ++const biz = variant === 'other-business' ? 'other' : 'fx'; ++const ref = `work/vikunja-${p}-${t}`; ++const task = `vikunja:${p}/${t}`; ++const action = variant === 'not-a-merge' ? 'git.push.protected' : MERGE; ++const question = ++ { ++ 'two-refs': `Squash-merge ${ref} and work/vikunja-7-99 into refactor?`, ++ 'bad-ref': 'Squash-merge work/feature-x into refactor?', ++ }[variant] ?? `Squash-merge ${ref} into refactor? It carries task ${p}/${t}, approved by the reviewer.`; ++const options = [ ++ { key: 'yes', text: `Squash-merge ${ref} into refactor` }, ++ { key: 'no', text: "Don't merge yet" }, ++]; ++const rows = [ ++ { ++ table: 'decisions', id: D, business: biz, project: null, action, question, options, ++ ...(variant === 'task-ref-disagrees' ? { task_ref: 'vikunja:7/99' } : {}), ++ }, ++]; ++if (variant !== 'no-raise') ++ rows.push({ ++ table: 'events', business: biz, kind: 'action.allowed', actor_role: 'pm', actor_run: 'rfixture', subject: D, ++ body: { decision: D, action, operation: 'decision.raise', task_ref: null, ++ target: variant === 'target-main' ? 'main' : 'refactor', approvalChoice: 'yes', holderRun: null }, ++ }); ++const choice = variant === 'chose-no' ? 'no' : 'yes'; ++if (variant === 'withdrawn') rows.push({ table: 'decision_events', decision: D, op: 'withdrawn', by: 'pm', choice: null, via: null }); ++else if (variant !== 'open') { ++ rows.push({ table: 'decision_events', decision: D, op: 'resolved', by: variant === 'by-agent' ? 'pm' : 'jason', choice, ++ via: variant === 'via-webui' ? 'webui' : 'cli' }); ++ if (variant !== 'no-answer') ++ rows.push({ table: 'events', business: biz, kind: 'human.input', subject: D, body: { kind: 'answer', decision: D, op: 'resolved', choice } }); ++} ++const later = { ++ 'superseded-question': { action: MERGE, question: `Hold ${ref} back after all?` }, ++ 'superseded-task': { action: MERGE, task_ref: task, question: `Hold task ${p}/${t} back after all?` }, ++ 'superseded-by': { action: 'scope.change', supersedes: D, question: 'Replace the earlier merge decision' }, ++}[variant]; ++if (later) rows.push({ table: 'decisions', id: L, business: biz, project: null, options, ...later }); ++const verdict = (id, v, c, body = {}) => ({ ++ table: 'events', id, business: biz, kind: 'review.verdict', actor_role: 'reviewer', actor_run: 'rrev', subject: task, ++ body: { task_ref: task, request: 'f0000000-0000-4000-8000-000000000003', commit: c, verdict: v, message: 'fixture', ...body }, ++}); ++// An earlier changes verdict, as 19/265 had, so "latest" is what's read. ++if (variant !== 'no-verdict') { ++ rows.push(verdict('e0000000-0000-4000-8000-000000000001', 'changes', '1'.repeat(40))); ++ rows.push(verdict('e0000000-0000-4000-8000-000000000002', 'approve', variant === 'short-commit' ? commit.slice(0, 12) : commit, ++ variant === 'wrong-task-body' ? { task_ref: 'vikunja:7/99' } : {})); ++} ++if (variant === 'changes-later') rows.push(verdict('e0000000-0000-4000-8000-000000000004', 'changes', commit)); ++process.stdout.write(JSON.stringify(rows)); ++EOF ++ ++# ---- per case: a copy of the target and the working repository, and a bus ---- ++setup() { # name variant task commit ++ local c="$SANDBOX/c/$1" ++ mkdir -p "$c/businesses" "$c/tmp" "$c/data/working/fx" ++ chmod 700 "$c/data" ++ cp -a "$T" "$c/target" ++ cp -a "$P/working" "$c/data/working/fx/stack.git" ++ printf '{"configVersion":1,"environment":"development","dataRoot":"%s","execution":{"backend":"docker","provider":"zai","model":"m","adapter":"mock"}}\n' \ ++ "$c/data" > "$c/config.json" ++ printf '{"id":"fx","human":"jason","projects":{"stack":{"root":"%s"}}}\n' "$c/target" > "$c/businesses/fx.json" ++ node "$SANDBOX/gen.mjs" "$2" 7 "$3" "$4" > "$c/rows.json" \ ++ && node scripts/land-work/fixture.mjs "$c/data" "$c/rows.json" \ ++ || echo "setup failed for $1" >&2 ++} ++lw() { # name args... ++ local c="$SANDBOX/c/$1" ++ shift ++ MOSAIC_CONFIG="$c/config.json" TMPDIR="$c/tmp" PATH="${LW_PATH:+$LW_PATH:}$SANDBOX/bin:$PATH" \ ++ bash scripts/land-work.sh "$@" > "$c/out" 2> "$c/err" ++} ++expect() { # name rc reason args...: run land-work, check the exit and the refusal ++ local name="$1" want="$2" reason="$3" rc=0 ++ shift 3 ++ lw "$name" "$@" || rc=$? ++ if [ "$rc" -eq "$want" ] && { [ -z "$reason" ] || grep -q "refused: $reason\b" "$SANDBOX/c/$name/err"; }; then ++ PASS=$((PASS+1)); echo "${C_OK}OK${C_RESET} $name: exit $rc${reason:+, $reason}" ++ else ++ FAIL=$((FAIL+1)); echo "${C_FAIL}FAIL${C_RESET} $name: exit $rc, wanted $want${reason:+ $reason}: $(tail -n2 "$SANDBOX/c/$name/err" | tr '\n' ' ')" ++ fi ++} ++cleaned() { # name: one worktree left in the target, no scratch left in TMPDIR ++ local c="$SANDBOX/c/$1" ++ [ "$(git -C "$c/target" worktree list --porcelain | grep -c '^worktree ')" -eq 1 ] \ ++ && [ -z "$(find "$c/tmp" -maxdepth 1 -name 'land-work.*')" ] ++} ++ ++# ---- arguments and configuration ---- ++setup args ok 42 "$W_OK" ++expect args 2 target-branch "$D" --base next ++expect args 2 target-branch "$D" --base main ++expect args 4 "" "bad/../id" ++expect args 4 "" "$D" --unknown ++expect args 4 "" "$D" --subject $'two\nlines' ++rc=0; MOSAIC_CONFIG="$SANDBOX/missing.json" TMPDIR="$SANDBOX/c/args/tmp" bash scripts/land-work.sh "$D" --base next >/dev/null 2>&1 || rc=$? ++check "--base next refuses before the config is read (got $rc)" "$([ "$rc" -eq 2 ]; echo $?)" ++rc=0; MOSAIC_CONFIG="$SANDBOX/missing.json" TMPDIR="$SANDBOX/c/args/tmp" bash scripts/land-work.sh "$D" >/dev/null 2>&1 || rc=$? ++check "a missing system config exits 3 (got $rc)" "$([ "$rc" -eq 3 ]; echo $?)" ++mkdir -p "$SANDBOX/c/nobus/data/working/fx" "$SANDBOX/c/nobus/businesses" "$SANDBOX/c/nobus/tmp" ++chmod 700 "$SANDBOX/c/nobus/data" ++cp "$SANDBOX/c/args/businesses/fx.json" "$SANDBOX/c/nobus/businesses/" ++sed "s#$SANDBOX/c/args/data#$SANDBOX/c/nobus/data#" "$SANDBOX/c/args/config.json" > "$SANDBOX/c/nobus/config.json" ++expect nobus 3 "" "$D" ++ ++# ---- the bus database ---- ++setup schema-table ok 42 "$W_OK" ++node -e 'const {DatabaseSync}=require("node:sqlite"); const db=new DatabaseSync(process.argv[1]); db.exec("CREATE TABLE extra(x)"); db.close()' \ ++ "$SANDBOX/c/schema-table/data/bus/bus.sqlite" ++expect schema-table 2 bus-schema "$D" ++setup schema-meta ok 42 "$W_OK" ++# The same schema, so the digest matches, with meta saying another version. ++node -e ' ++const {DatabaseSync}=require("node:sqlite"); const db=new DatabaseSync(process.argv[1]); ++const sql=db.prepare("SELECT sql FROM sqlite_master WHERE name=?").get("meta_no_update").sql; ++db.exec("DROP TRIGGER meta_no_update"); db.exec("UPDATE meta SET value=\x273a\x27 WHERE key=\x27schema_version\x27"); db.exec(sql); db.close()' \ ++ "$SANDBOX/c/schema-meta/data/bus/bus.sqlite" ++expect schema-meta 2 bus-schema "$D" ++rc=0 ++node --input-type=module -e ' ++import { openBus } from "./scripts/land-work/read.mjs"; ++const db = openBus(process.argv[1]); ++try { db.exec("CREATE TABLE x(y)"); process.exit(1); } catch (e) { process.exit(/readonly/.test(e.message) ? 0 : 1); }' \ ++ "$SANDBOX/c/args/data" || rc=$? ++check "openBus opens the database read-only" "$rc" ++ ++# ---- the decision ---- ++for v in "decision-not-found:other-business" "decision-not-found:no-raise" "not-a-merge:not-a-merge" \ ++ "not-resolved:open" "not-resolved:withdrawn" "not-human:by-agent" "not-human:via-webui" \ ++ "not-human:no-answer" "not-merge-option:chose-no" "work-ref:two-refs" "work-ref:bad-ref" \ ++ "work-ref:task-ref-disagrees" "target-branch:target-main" "superseded:superseded-question" \ ++ "superseded:superseded-task" "superseded:superseded-by" "no-verdict:no-verdict" \ ++ "not-approved:changes-later" "not-approved:short-commit" "not-approved:wrong-task-body"; do ++ setup "${v#*:}" "${v#*:}" 42 "$W_OK" ++ expect "${v#*:}" 2 "${v%%:*}" "$D" ++done ++expect args 2 decision-not-found "d0000000-0000-4000-8000-00000000000f" ++ ++# ---- the work ref and the reviewed diff ---- ++setup ref-moved ok 42 "$W_OK" ++git -C "$SANDBOX/c/ref-moved/data/working/fx/stack.git" update-ref refs/heads/work/vikunja-7-42 "$W_ROOT" ++expect ref-moved 2 ref-moved "$D" ++setup root-top ok 43 "$W_ROOT" ++expect root-top 2 root-file "$D" ++setup root-newdir ok 44 "$W_NEWDIR" ++expect root-newdir 2 root-file "$D" ++setup root-src ok 45 "$W_SRC" ++expect root-src 2 root-file "$D" ++setup unrelated ok 46 "$W_ORPHAN" ++expect unrelated 2 base-conflict "$D" ++setup empty ok 47 "$MB" ++expect empty 2 base-conflict "$D" ++grep -q "is empty" "$SANDBOX/c/empty/err" ++check "an empty reviewed diff says so" "$?" ++ ++# The base is checked out in the target: a reviewed path there must be clean. ++setup dirty-changed ok 42 "$W_OK" ++echo local >> "$SANDBOX/c/dirty-changed/target/README.md" ++expect dirty-changed 2 checkout-dirty "$D" ++setup dirty-staged ok 42 "$W_OK" ++echo local >> "$SANDBOX/c/dirty-staged/target/README.md" ++git -C "$SANDBOX/c/dirty-staged/target" add README.md ++printf 'line1\nline2\nline3\n' > "$SANDBOX/c/dirty-staged/target/README.md" ++expect dirty-staged 2 checkout-dirty "$D" ++setup dirty-untracked ok 42 "$W_OK" ++echo local > "$SANDBOX/c/dirty-untracked/target/packages/demo/feature.txt" ++expect dirty-untracked 2 checkout-dirty "$D" ++ ++setup conflict ok 42 "$W_OK" ++printf 'line1\nline2 on the base\nline3\n' > "$SANDBOX/c/conflict/target/README.md" ++git -C "$SANDBOX/c/conflict/target" commit -q -am "base edits the reviewed line" ++expect conflict 2 base-conflict "$D" ++check "a refusal after the worktree is added leaves no worktree or scratch" "$(cleaned conflict; echo $?)" ++grep -q "network inspect lw-" "$SANDBOX/docker.log" 2>/dev/null ++check "cleanup looks for the worktree's Docker network" "$?" ++ ++setup dirty-during ok 42 "$W_OK" ++LW_DIRTY="$SANDBOX/c/dirty-during/target/README.md" expect dirty-during 2 checkout-dirty "$D" ++check "a reviewed path dirtied during the gate moves no ref" \ ++ "$([ "$(git -C "$SANDBOX/c/dirty-during/target" rev-parse refactor)" = "$OLD" ]; echo $?)" ++ ++setup drift ok 42 "$W_OK" ++LW_PATH="$SANDBOX/tamper" expect drift 2 patch-drift "$D" ++check "patch-drift leaves no worktree or scratch" "$(cleaned drift; echo $?)" ++ ++# ---- the gate ---- ++setup gate-pkg ok 42 "$W_OK" ++LW_FAIL=pkg expect gate-pkg 2 gate-failed "$D" ++log="$(sed -n 's/.*gate-failed: pkg-demo, see \(.*\)$/\1/p' "$SANDBOX/c/gate-pkg/err")" ++check "gate-failed names the failing step's log, and it exists" "$([ -n "$log" ] && [ -s "$log" ]; echo $?)" ++check "gate-failed leaves no worktree or scratch" "$(cleaned gate-pkg; echo $?)" ++setup gate-script ok 42 "$W_OK" ++LW_FAIL=script expect gate-script 2 gate-failed "$D" ++grep -q "gate-failed: script-demo" "$SANDBOX/c/gate-script/err" ++check "a failing scripts/test-*.sh fails the gate" "$?" ++check "a failed gate moves no ref" "$([ "$(git -C "$SANDBOX/c/gate-script/target" rev-parse refactor)" = "$OLD" ]; echo $?)" ++ ++setup nomods ok 42 "$W_OK" ++rm -rf "$SANDBOX/c/nomods/target/node_modules" ++expect nomods 4 "" "$D" ++check "a target without node_modules leaves no worktree or scratch" "$(cleaned nomods; echo $?)" ++ ++setup moved ok 42 "$W_OK" ++git -C "$SANDBOX/c/moved/target" checkout -q -b side ++LW_MOVE_BASE="$SANDBOX/c/moved/target" expect moved 2 base-moved "$D" ++check "base-moved keeps the base where it moved to" \ ++ "$([ "$(git -C "$SANDBOX/c/moved/target" log -1 --format=%s refactor)" = moved ]; echo $?)" ++ ++# ---- a dry run ---- ++setup dry ok 42 "$W_OK" ++before="$(git -C "$SANDBOX/c/dry/target" for-each-ref; git -C "$SANDBOX/c/dry/target" reflog refactor; git -C "$SANDBOX/c/dry/target" status --porcelain)" ++expect dry 0 "" "$D" --dry-run --subject "Custom subject" --attribution "Applied-under: suite (conductor)" ++after="$(git -C "$SANDBOX/c/dry/target" for-each-ref; git -C "$SANDBOX/c/dry/target" reflog refactor; git -C "$SANDBOX/c/dry/target" status --porcelain)" ++check "--dry-run writes no ref" "$([ "$before" = "$after" ]; echo $?)" ++grep -q "no ref was written" "$SANDBOX/c/dry/out" && grep -qx " Custom subject" "$SANDBOX/c/dry/out" \ ++ && grep -qx " Applied-under: suite (conductor)" "$SANDBOX/c/dry/out" ++check "--dry-run prints the commit with --subject and --attribution" "$?" ++grep -q "^GATE_PASSED" "$SANDBOX/c/dry/err" ++check "--dry-run runs the gate" "$?" ++check "--dry-run leaves no worktree or scratch" "$(cleaned dry; echo $?)" ++DRY_TREE="$(sed -n 's/.*would commit tree \([0-9a-f]*\) .*/\1/p' "$SANDBOX/c/dry/out")" ++ ++# ---- a landing ---- ++setup land ok 42 "$W_OK" ++L="$SANDBOX/c/land" ++echo "local edit" >> "$L/target/docs.txt" ++BUS_BEFORE="$(sha256sum "$L/data/bus/bus.sqlite")" ++: > "$SANDBOX/docker.log" ++FAKE_NET_EXISTS=1 expect land 0 "" "$D" ++NEW="$(git -C "$L/target" rev-parse refactor)" ++check "the landing is one commit on the old base" "$([ "$(git -C "$L/target" rev-parse "$NEW^")" = "$OLD" ]; echo $?)" ++pid() { git -C "$L/target" diff "$1" "$2" | git patch-id --stable | cut -d' ' -f1; } ++check "its diff is the reviewed diff by patch-id" "$([ "$(pid "$OLD" "$NEW")" = "$(pid "$MB" "$W_OK")" ]; echo $?)" ++check "its tree is the dry run's" "$([ -n "$DRY_TREE" ] && [ "$(git -C "$L/target" rev-parse "$NEW^{tree}")" = "$DRY_TREE" ]; echo $?)" ++msg="$(git -C "$L/target" log -1 --format=%B "$NEW")" ++PATCH_ID="$(pid "$MB" "$W_OK")" ++ok=0 ++[ "$(head -n1 <<<"$msg")" = "Squash-merge work/vikunja-7-42 into refactor" ] || ok=1 ++for line in "Decision: $D" "Verdict: $V" "Work-ref: work/vikunja-7-42" "Reviewed-commit: $W_OK" \ ++ "Base: refactor $OLD" "Patch-id: $PATCH_ID"; do ++ grep -qxF "$line" <<<"$msg" || ok=1 ++done ++[ "$(sed '/^$/d' <<<"$msg" | tail -n1)" = "Applied-under: scripts/land-work.sh (conductor)" ] || ok=1 ++check "the message has the option's subject, the citations and the attribution last" "$ok" ++check "it prints the line for the PM" \ ++ "$([ "$(tail -n1 "$L/out")" = "work/vikunja-7-42 (vikunja:7/42) is merged to refactor as ${NEW:0:9}; push pending." ]; echo $?)" ++check "the checked-out base has the reviewed paths and keeps the unrelated edit" \ ++ "$([ "$(git -C "$L/target" status --porcelain)" = " M docs.txt" ] && [ -f "$L/target/packages/demo/feature.txt" ]; echo $?)" ++check "only refs/heads/refactor exists in the target" \ ++ "$([ "$(git -C "$L/target" for-each-ref --format='%(refname)')" = refs/heads/refactor ]; echo $?)" ++check "the work ref is unchanged" \ ++ "$([ "$(git -C "$L/data/working/fx/stack.git" rev-parse refs/heads/work/vikunja-7-42)" = "$W_OK" ]; echo $?)" ++check "the bus database is unchanged" "$([ "$(sha256sum "$L/data/bus/bus.sqlite")" = "$BUS_BEFORE" ]; echo $?)" ++logs="$(sed -n 's/^land-work: gate logs in //p' "$L/err")" ++grep -q "^pkg-demo rc=0" "$logs/gate.log" && grep -q "^script-demo rc=0" "$logs/gate.log" \ ++ && grep -q "^GATE_PASSED" "$logs/gate.log" && ! grep -q "pkg-queue" "$logs/gate.log" ++check "the gate ran each package suite but queue, and each scripts/test-*.sh" "$?" ++check "the landing leaves no worktree or scratch" "$(cleaned land; echo $?)" ++check "the target's node_modules is still there" "$([ -d "$L/target/node_modules" ] && [ ! -L "$L/target/node_modules" ]; echo $?)" ++grep -q "^docker network rm lw-[0-9]*-[0-9]*_default$" "$SANDBOX/docker.log" ++check "the worktree's Docker network is removed" "$?" ++ ++echo "---" ++echo "land-work selftests: $PASS passed, $FAIL failed" ++[ "$FAIL" -eq 0 ] diff --git a/agents/darkwing/work/queue-116/r1/candidate-manifest.sha256 b/agents/darkwing/work/queue-116/r1/candidate-manifest.sha256 new file mode 100644 index 000000000..54db82bac --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/candidate-manifest.sha256 @@ -0,0 +1,6 @@ +388419cc58cdb267564402132ef92738bd4ac343026f5798b9194b91ec63834f scripts/land-work.sh +550b746de4e3d7778cd18a37b566034a8bc64e41e57c002fc0578a7a6ae26d9b scripts/land-work/read.mjs +cf5082cdcb835759e03211072affbf621c19c3845e35a1a73332932581f77c6b scripts/land-work/fixture.mjs +333b9d86ad67354823e42f63d3a7f1dd0bd48b55b8503c4a33676156e997adcc scripts/test-land-work.sh +dcfdfd2e2fc4d464bd7ccb78d302a1caa38027a90a4d80ac414784dccd34dff5 docs/TOOLS.md +5ff76c5e85c91ee99c22665343330deb8fe961cbe191006e71ca451fd5a92f69 docs/plans/CONDUCTOR.md diff --git a/agents/darkwing/work/queue-116/r1/gate-run.log b/agents/darkwing/work/queue-116/r1/gate-run.log new file mode 100644 index 000000000..af8f8f866 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate-run.log @@ -0,0 +1,5 @@ +base 1223a0f37 start 18:18:15 +pkg-bus rc=0 ℹ pass 156 ℹ fail 0 | ℹ duration_ms 4304.274017 +script-land-work rc=0 | land-work selftests: 78 passed, 0 failed +script-conductor rc=0 | selftest: 17 passed, 0 failed +GATE_PASSED 18:18:34 diff --git a/agents/darkwing/work/queue-116/r1/gate.sh b/agents/darkwing/work/queue-116/r1/gate.sh new file mode 100755 index 000000000..0518bc915 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Row 116 targeted builder gate (#271): the new suite, the bus package whose +# store.mjs read.mjs and fixture.mjs import, and the conductor suite beside it. +set -o pipefail +G=~/darkwing-scratch/r116/wt +OUT=~/darkwing-scratch/r116/pkt/gate +mkdir -p "$OUT" +cd "$G" || exit 9 +[ -d "$G/node_modules" ] || { echo "STOP no node_modules in $G"; exit 8; } +echo "base $(git rev-parse --short HEAD) start $(date -u +%H:%M:%S)" +run() { local name="$1" dir="$2" cmd="$3" + (cd "$G/$dir" && TMPDIR=~/darkwing-scratch/r116/tmp bash -c "$cmd") > "$OUT/$name.log" 2>&1; local rc=$? + echo "$name rc=$rc $(grep -E '^ℹ (pass|fail) [0-9]+' "$OUT/$name.log" | tr '\n' ' ') | $(tail -n1 "$OUT/$name.log")" + [ $rc -eq 0 ] || { echo "STOP $name"; exit $rc; }; } +run pkg-bus packages/bus 'node --test tests/*.test.mjs' +run script-land-work . 'bash scripts/test-land-work.sh' +run script-conductor . 'bash scripts/test-conductor.sh' +echo "GATE_PASSED $(date -u +%H:%M:%S)" diff --git a/agents/darkwing/work/queue-116/r1/gate/pkg-bus.log b/agents/darkwing/work/queue-116/r1/gate/pkg-bus.log new file mode 100644 index 000000000..787696adb --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate/pkg-bus.log @@ -0,0 +1,164 @@ +✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (141.378442ms) +✔ agents: working counts what the holder received and has not read; routed alone is not working (209.863517ms) +✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (340.042998ms) +✔ agents: working wins over waiting, and Input needed still shows (171.402667ms) +✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (212.856095ms) +✔ agents: state reads only its own business, even for a run name both use (214.822553ms) +✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (224.242227ms) +✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (219.47268ms) +✔ agents: stranded is oldest first and capped at 50 for a role (939.294327ms) +✔ agents: stranded is per role and per business (303.089905ms) +✔ agents: a message routed to a held role and not yet received is not stranded (130.552445ms) +✔ launch identity is stamped, payload identity is refused and stale holder cannot send (162.84644ms) +✔ decision classes route from policy; gated resolution is human-only, choice and target must match (283.135917ms) +✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (280.562111ms) +✔ launch events require a human CLI capability; generic emit cannot forge authority events (193.580421ms) +✔ within-role decisions close atomically and invalid options or blocking omissions refuse (177.513871ms) +✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (291.286266ms) +✔ observer capabilities read human inbox but cannot mutate or forge launch identity (189.772086ms) +✔ task action subjects and linked decision trail are complete and ordered (224.568529ms) +✔ launch binding is durable and reconnecting requires the identical trusted record (152.701728ms) +✔ business isolation includes inherited object names and cross-business message references (241.504901ms) +✔ authority never transfers between action, run, target, unresolved or replaced role holder (277.678169ms) +✔ task projection uses schema current view, skipping earlier and equal-start polls (117.336932ms) +✔ revocation permanently bars the old run from reclaiming first, including after broker restart (208.415349ms) +✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (137.853314ms) +✔ both arbiters require human resolution when their cross-role route is themselves (221.698301ms) +✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (142.142804ms) +✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (3.010751ms) +✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (104.885546ms) +✔ credentials refuses a role session and any argument (191.755236ms) +✔ credentials reads the status on each request, and a broker without one lists none (233.707091ms) +✔ the broker process answers credentials without a token, path or variable in its output, log or store (187.425878ms) +✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.654815ms) +✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (5.806943ms) +✔ expiry refuses use and env references never become client data (0.790443ms) +✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.254106ms) +✔ opaque tokens shorter than 16 characters refuse before use (0.276839ms) +✔ a human resolve sends the raising role one message from the human, and its request is the answer (243.172184ms) +✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (248.267522ms) +✔ a human withdraw sends one message with the note (237.211055ms) +✔ a human seen before the close leaves the request on the close's answer, not the seen (309.730015ms) +✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (302.837098ms) +✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (295.926124ms) +✔ a raising role nobody holds at the close gets the message on the next claim (337.003552ms) +✔ a human DECISION send keeps its own instruction as the request, not a close's answer (284.389241ms) +✔ roles lists open decisions routed to a role, and never the human inbox (228.712409ms) +✔ recent lists closed decisions of every route, newest close first, with how each closed (302.835415ms) +✔ recent gives the closing event as closed when the decision was seen first (285.599899ms) +✔ recent stops at RECENT rows (860.559977ms) +✔ every row is what trail already gives the same session for that id (335.539584ms) +✔ a role session can't list decisions, so it can't read another role's open decisions (427.991377ms) +✔ decisions is a read: one business, strict arguments, nothing written (354.730419ms) +✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (128.387402ms) +✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (164.323984ms) +✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (161.467839ms) +✔ endLaunch leaves a claim another run took alone (175.425167ms) +✔ refuse records action.refused against the caller with the code only (146.005955ms) +✔ launches off refuses role.launch with launch-revoked until launches on (206.423126ms) +✔ broker process: launch ops authorize role.launch, record refusals and end runs (280.177942ms) +✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.557928ms) +✔ process reader gets own kernel identity without exposing environment values (1.224116ms) +✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (1.068732ms) +✔ real pid 1 remains inspectable when its environment is protected (0.416407ms) +✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (186.832777ms) +✔ missing and foreign-business citations refuse and roll back message and grant (208.092814ms) +✔ cross-role sends still need a matching resolved decision and consume it once (242.814225ms) +✔ messages pages all human messages newest first without writes; read state is history (2708.418419ms) +✔ messages refuses role callers, invalid paging and cursors outside this human feed (239.335434ms) +✔ views messages passes only its paging arguments through (0.227318ms) +✔ messages isolates businesses even with a valid foreign cursor (168.93539ms) +✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (179.741954ms) +✔ startup token refusal returns safe code without value or partial listening broker (37.713199ms) +✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (180.495431ms) +✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (179.021925ms) +✔ trusted host registers later launches; socket clients never have a registration verb (183.673761ms) +✔ runtime excludes declared project roots even when host supplies no repoRoots (38.875742ms) +✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (195.740961ms) +✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (229.333288ms) +✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (215.217086ms) +✔ a message with no reply gives an empty list (170.756276ms) +✔ replies come oldest first and stop at REPLIES (798.286337ms) +✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (323.639126ms) +✔ strict arguments; a role session gets human-required (454.047718ms) +✔ views passes replies through as one call with the id (0.225515ms) +✔ requirements returns the committed list to a holding role session, and no one else (214.08446ms) +✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (170.970045ms) +✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (185.10198ms) +✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (246.99489ms) +✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (265.372189ms) +✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (298.325527ms) +✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (383.037797ms) +✔ reviewFetch answers only the addressed reviewer, for the request it cites (271.450947ms) +✔ review.verdict answers one request once, to the role that asked (360.07503ms) +✔ task.close on a pushed task needs an approve verdict for the latest push (430.748041ms) +✔ a refusal the host decided is filed on the task it names, and only a task ref counts (247.439214ms) +✔ v3b prototype refusals, views and append-only mutations (1105.896856ms) +✔ gated approval authorizes once, survives store reopen, and fresh approval works (274.230597ms) +✔ another run cannot consume an approval; a failed check leaves it usable (235.366538ms) +✔ two scheduled callers have exactly one grant and one consumed refusal (167.013859ms) +✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (346.158898ms) +✔ class drift gated to cross-role refuses before consumption (247.680845ms) +✔ class drift cross-role to gated refuses before consumption (270.352953ms) +✔ class drift gated to within-role refuses before consumption (266.340577ms) +✔ class drift cross-role to within-role refuses before consumption (274.954849ms) +✔ class drift within-role to gated refuses before consumption (240.237221ms) +✔ class drift within-role to cross-role refuses before consumption (177.976065ms) +✔ message.send consumes approval and prevents a later send or authorize (200.721614ms) +✔ role.revoke consumes approval and prevents a later revoke or authorize (236.917524ms) +✔ a business that never switched launches reads allowed with no time and no event (131.640053ms) +✔ launches revoked and then restored read allowed, with the restore time and event id (169.630619ms) +✔ a task closed on the tracker leaves the open list, and total counts the open ones (167.850357ms) +✔ a tombstone is not open (139.363939ms) +✔ the open list stops at the cap and says so; total still counts every open task (148.681319ms) +✔ a role and a reader session read state; arguments, and an unbound cap, refuse (152.770261ms) +✔ a human session reads the same state, with the same cap (148.235703ms) +✔ reading state writes nothing: every table keeps its row count (173.59683ms) +✔ creates private WAL store and excludes a second writer until explicit close (139.034488ms) +✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (177.483819ms) +✔ existing empty database and symlink runtime directory refuse, never initialize over damage (194.256003ms) +✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (200.275023ms) +✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (108.635743ms) +✔ async transactions refuse before invoking their function (103.33465ms) +✔ the session default fits under the reply cap and pages to the end with next (311.303731ms) +✔ the short form: no description, assignees by role, every listed key (255.906739ms) +✔ each filter, alone and together, and total counts every match (335.52456ms) +✔ task_ref reads one task in full, as the whole board has it (312.269426ms) +✔ no arguments is the read the Console and mosaic make, unchanged (286.710515ms) +✔ an unknown argument or a bad value refuses invalid-request (914.414213ms) +✔ tasks rows carry priority and requirement for every session that reads tasks (335.168533ms) +✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (360.662383ms) +✔ an empty business and one with snapshots but no task.created read cleanly (117.726953ms) +✔ recordTask keeps sync reads and a role write apart (182.276349ms) +✔ read_at must be one canonical UTC format, so the projection compares strings safely (125.427703ms) +✔ a bad entry refuses the whole record (103.085894ms) +✔ taskView reads the projection for one business (147.184974ms) +✔ requestTask hands only a holder and a task verb to the handler, and records refusals (307.499454ms) +✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (443.301149ms) +✔ without an adapter the server refuses every task verb (208.928722ms) +✔ the runtime refuses an invalid adapter and closes a valid one (186.672776ms) +✔ the process loads the S3 adapter from plain-data trackers (254.742134ms) +✔ the tester binds only when the business sets bus.tester to exactly true (925.653091ms) +✔ a business may not name a role tester, so the tester address is never a role (260.653748ms) +✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (512.503125ms) +✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (216.496134ms) +✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (243.430815ms) +✔ the tester reads the human views a reader reads (88.443548ms) +✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.214696ms) +✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.36765ms) +✔ testerNonce reads only the tester's variable and gives null on any read error (0.20659ms) +✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (55.76711ms) +✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (728.862989ms) +✔ socket capability stamps launch identity; shared views use wire, no SQL client (163.426922ms) +✔ two wire claims serialize; a lost reply never automatically retries (194.317894ms) +✔ malformed, oversized and identity-forging envelopes refuse without echoing input (147.013945ms) +✔ client preserves UTF-8 when a response divides a multibyte character (11.724783ms) +✔ committed mutation followed by dropped reply reports unknown and is never retried (172.298366ms) +ℹ tests 156 +ℹ suites 0 +ℹ pass 156 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4304.274017 diff --git a/agents/darkwing/work/queue-116/r1/gate/pkg-webui-pinned-copy.log b/agents/darkwing/work/queue-116/r1/gate/pkg-webui-pinned-copy.log new file mode 100644 index 000000000..e4876d07d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate/pkg-webui-pinned-copy.log @@ -0,0 +1,18 @@ +✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (579.518696ms) +✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (486.942548ms) +✔ copy writes nothing when an archived path is missing at the commit (172.332128ms) +✔ a copy that loses the rename race leaves no read-only temp directory behind (328.737ms) +✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (322.389912ms) +✔ a copy that meets a target holding files says exists: and moves nothing into it (317.256457ms) +✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (326.956374ms) +✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (608.381512ms) +✔ serve refuses a --checkout that is not an absolute directory path (206.383226ms) +✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (45.195307ms) +ℹ tests 10 +ℹ suites 0 +ℹ pass 10 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 3481.297139 diff --git a/agents/darkwing/work/queue-116/r1/gate/script-conductor.log b/agents/darkwing/work/queue-116/r1/gate/script-conductor.log new file mode 100644 index 000000000..b71eb81d0 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate/script-conductor.log @@ -0,0 +1,55 @@ +Note: switching to '1223a0f37d5267d8b8076759c5df4dcb5450994c'. + +You are in 'detached HEAD' state. You can look around, make experimental +changes and commit them, and you can discard any commits you make in this +state without impacting any branches by switching back to a branch. + +If you want to create a new branch to retain commits you create, you may +do so (now or later) by using -c with the switch command. Example: + + git switch -c + +Or undo this operation with: + + git switch - + +Turn off this advice by setting config variable advice.detachedHead to false + +Not currently on any branch. +nothing to commit, working tree clean +Note: switching to '1223a0f37d5267d8b8076759c5df4dcb5450994c'. + +You are in 'detached HEAD' state. You can look around, make experimental +changes and commit them, and you can discard any commits you make in this +state without impacting any branches by switching back to a branch. + +If you want to create a new branch to retain commits you create, you may +do so (now or later) by using -c with the switch command. Example: + + git switch -c + +Or undo this operation with: + + git switch - + +Turn off this advice by setting config variable advice.detachedHead to false + +OK dry-run: allowed change, exit 0, nothing committed (exit 0) +OK dry-run committed nothing +OK apply: allowed change exits 0 (exit 0) +OK apply: attribution in commit subject +OK apply: target tree clean after commit +OK disallowed path refused (exit 1) +OK disallowed path: target untouched +OK syntax gate refused broken .mjs (exit 1) +OK syntax gate: target untouched +OK suite failure refused (exit 1) +OK suite failure: target reverted to clean +OK disabled policy refused (exit 2) +OK disabled policy: target untouched +OK failed run refused (exit 1) +OK failed run: target untouched +OK missing run exits 4 (exit 4) +OK invalid policy exits 2 (exit 2) + +selftest: 17 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/gate/script-land-work.log b/agents/darkwing/work/queue-116/r1/gate/script-land-work.log new file mode 100644 index 000000000..4901a8d95 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/gate/script-land-work.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 78 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants-run.log b/agents/darkwing/work/queue-116/r1/mutants-run.log new file mode 100644 index 000000000..fa28822d9 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants-run.log @@ -0,0 +1,170 @@ +r01-schema-digest: killed (rc 1, 1 fail of 78) + schema-table: exit 0, wanted 2 bus-schema: script-demo rc=0 ℹ pass 1 GATE_PASSED +r02-schema-meta: killed (rc 1, 1 fail of 78) + schema-meta: exit 0, wanted 2 bus-schema: script-demo rc=0 ℹ pass 1 GATE_PASSED +r03-read-only: killed (rc 1, 2 fail of 78) + openBus opens the database read-only + args: exit 2, wanted 2 decision-not-found: land-work: refused: bus-schema schema digest dbf2c5dbc4c3, the store expects 52514a1173be: bus-schema schema digest dbf2c5dbc4c3, the store expects 52514a1173be +r04-business-scope: killed (rc 1, 1 fail of 78) + other-business: exit 0, wanted 2 decision-not-found: script-demo rc=0 ℹ pass 1 GATE_PASSED +r05-one-raise: killed (rc 1, 1 fail of 78) + no-raise: exit 1, wanted 2 decision-not-found: land-work: Cannot read properties of undefined (reading 'body') land-work: could not read the decision from the bus (exit 1) +r06-not-a-merge: killed (rc 1, 1 fail of 78) + not-a-merge: exit 0, wanted 2 not-a-merge: script-demo rc=0 ℹ pass 1 GATE_PASSED +r07-resolved-op: killed (rc 1, 1 fail of 78) + withdrawn: exit 2, wanted 2 not-resolved: land-work: refused: not-human resolved by pm via null, 0 human answer(s): not-human resolved by pm via null, 0 human answer(s) +r08-human-by: killed (rc 1, 1 fail of 78) + by-agent: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +r09-human-via: killed (rc 1, 1 fail of 78) + via-webui: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +r10-human-answer: killed (rc 1, 1 fail of 78) + no-answer: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +r11-merge-option: killed (rc 1, 1 fail of 78) + chose-no: exit 0, wanted 2 not-merge-option: script-demo rc=0 ℹ pass 1 GATE_PASSED +r12-one-work-ref: killed (rc 1, 1 fail of 78) + two-refs: exit 0, wanted 2 work-ref: script-demo rc=0 ℹ pass 1 GATE_PASSED +r13-work-ref-shape: killed (rc 1, 1 fail of 78) + bad-ref: exit 2, wanted 2 work-ref: land-work: refused: no-verdict no review.verdict for vikunja:x/: no-verdict no review.verdict for vikunja:x/ +r14-task-ref-agrees: killed (rc 1, 1 fail of 78) + task-ref-disagrees: exit 0, wanted 2 work-ref: script-demo rc=0 ℹ pass 1 GATE_PASSED +r15-target: killed (rc 1, 1 fail of 78) + target-main: exit 0, wanted 2 target-branch: script-demo rc=0 ℹ pass 1 GATE_PASSED +r16-later-supersedes: killed (rc 1, 1 fail of 78) + superseded-by: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +r17-later-task: killed (rc 1, 1 fail of 78) + superseded-task: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +r18-later-question: killed (rc 1, 1 fail of 78) + superseded-question: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +r19-no-verdict: killed (rc 1, 1 fail of 78) + no-verdict: exit 1, wanted 2 no-verdict: land-work: Cannot read properties of undefined (reading 'body') land-work: could not read the decision from the bus (exit 1) +r20-latest-verdict: killed (rc 1, 30 fail of 78) + ref-moved: exit 2, wanted 2 ref-moved: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + root-top: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + root-newdir: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + root-src: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + unrelated: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + empty: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + an empty reviewed diff says so + dirty-changed: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + dirty-staged: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + dirty-untracked: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + conflict: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + dirty-during: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + drift: exit 2, wanted 2 patch-drift: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + gate-pkg: exit 2, wanted 2 gate-failed: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + gate-failed names the failing step's log, and it exists + gate-script: exit 2, wanted 2 gate-failed: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + a failing scripts/test-*.sh fails the gate + nomods: exit 2, wanted 4: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + moved: exit 2, wanted 2 base-moved: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + base-moved keeps the base where it moved to + dry: exit 2, wanted 0: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + --dry-run prints the commit with --subject and --attribution + --dry-run runs the gate + land: exit 2, wanted 0: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 + the landing is one commit on the old base + its tree is the dry run's + the message has the option's subject, the citations and the attribution last + it prints the line for the PM + the checked-out base has the reviewed paths and keeps the unrelated edit + the gate ran each package suite but queue, and each scripts/test-*.sh +r21-approve: killed (rc 1, 1 fail of 78) + changes-later: exit 0, wanted 2 not-approved: script-demo rc=0 ℹ pass 1 GATE_PASSED +r22-verdict-task: killed (rc 1, 1 fail of 78) + wrong-task-body: exit 0, wanted 2 not-approved: script-demo rc=0 ℹ pass 1 GATE_PASSED +r23-full-oid: killed (rc 1, 1 fail of 78) + short-commit: exit 2, wanted 2 not-approved: land-work: refused: ref-moved: work/vikunja-7-42 is at 9f98c955acde3b5ffce5a6ae44497778030f7120, the verdict approved 9f98c955acde +s01-base-early: killed (rc 1, 1 fail of 78) + --base next refuses before the config is read (got 3) +s02-ref-moved: killed (rc 1, 1 fail of 78) + ref-moved: exit 1, wanted 2 ref-moved: land-work: the fetch did not bring 5f9b9fdf4402a26702c9c13e49fda9e7abc66dec +s03-merge-base: killed (rc 1, 1 fail of 78) + unrelated: exit 128, wanted 2 base-conflict: Use '--' to separate paths from revisions, like this: 'git [...] -- [...]' +s04-empty-diff: killed (rc 1, 1 fail of 78) + an empty reviewed diff says so +s05-root-top-file: killed (rc 1, 1 fail of 78) + root-top: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +s06-root-new-dir: killed (rc 1, 1 fail of 78) + root-newdir: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +s07-root-src-v1: killed (rc 1, 1 fail of 78) + root-src: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +s08-dirty-changed: killed (rc 1, 3 fail of 78) + dirty-changed: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED + dirty-during: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED + a reviewed path dirtied during the gate moves no ref +s09-dirty-staged: killed (rc 1, 1 fail of 78) + dirty-staged: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +s10-dirty-untracked: killed (rc 1, 1 fail of 78) + dirty-untracked: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +s11-dirty-recheck: killed (rc 1, 2 fail of 78) + dirty-during: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED + a reviewed path dirtied during the gate moves no ref +s12-apply-conflict: killed (rc 1, 1 fail of 78) + conflict: exit 2, wanted 2 base-conflict: land-work: refused: patch-drift: applied none, reviewed 82ae6d6dd0f84b6010da197c32195805e4dd1c19 +s13-patch-drift: killed (rc 1, 1 fail of 78) + drift: exit 0, wanted 2 patch-drift: script-demo rc=0 ℹ pass 1 GATE_PASSED +s14-gate-node-modules: killed (rc 1, 1 fail of 78) + nomods: exit 0, wanted 4: script-demo rc=0 ℹ pass 1 GATE_PASSED +s15-gate-step-fails: killed (rc 1, 5 fail of 78) + gate-pkg: exit 0, wanted 2 gate-failed: script-demo rc=0 ℹ pass 1 GATE_PASSED + gate-failed names the failing step's log, and it exists + gate-script: exit 0, wanted 2 gate-failed: script-demo rc=1 GATE_PASSED + a failing scripts/test-*.sh fails the gate + a failed gate moves no ref +s16-gate-skips-queue: killed (rc 1, 15 fail of 78) + dirty-during: exit 2, wanted 2 checkout-dirty: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/dirty-during/tmp/land-work-logs.rJrmrr/pkg-queue.log + a failing scripts/test-*.sh fails the gate + moved: exit 2, wanted 2 base-moved: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/moved/tmp/land-work-logs.wwWpms/pkg-queue.log + base-moved keeps the base where it moved to + dry: exit 2, wanted 0: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/dry/tmp/land-work-logs.zweQfa/pkg-queue.log + --dry-run prints the commit with --subject and --attribution + --dry-run runs the gate + land: exit 2, wanted 0: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/land/tmp/land-work-logs.BFiG4I/pkg-queue.log + the landing is one commit on the old base + its diff is the reviewed diff by patch-id + its tree is the dry run's + the message has the option's subject, the citations and the attribution last + it prints the line for the PM + the checked-out base has the reviewed paths and keeps the unrelated edit + the gate ran each package suite but queue, and each scripts/test-*.sh +s17-gate-scripts: killed (rc 1, 8 fail of 78) + dirty-during: exit 0, wanted 2 checkout-dirty: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED + a reviewed path dirtied during the gate moves no ref + gate-script: exit 0, wanted 2 gate-failed: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED + a failing scripts/test-*.sh fails the gate + a failed gate moves no ref + moved: exit 0, wanted 2 base-moved: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED + base-moved keeps the base where it moved to + the gate ran each package suite but queue, and each scripts/test-*.sh +s18-base-moved-cas: killed (rc 1, 2 fail of 78) + moved: exit 0, wanted 2 base-moved: script-demo rc=0 ℹ pass 1 GATE_PASSED + base-moved keeps the base where it moved to +s19-dry-run: killed (rc 1, 3 fail of 78) + --dry-run writes no ref + --dry-run prints the commit with --subject and --attribution + its tree is the dry run's +s20-checkout-sync: killed (rc 1, 1 fail of 78) + the checked-out base has the reviewed paths and keeps the unrelated edit +s21-subject: killed (rc 1, 1 fail of 78) + the message has the option's subject, the citations and the attribution last +s22-attribution: killed (rc 1, 2 fail of 78) + --dry-run prints the commit with --subject and --attribution + the message has the option's subject, the citations and the attribution last +s23-cleanup-worktree: killed (rc 1, 6 fail of 78) + a refusal after the worktree is added leaves no worktree or scratch + patch-drift leaves no worktree or scratch + gate-failed leaves no worktree or scratch + a target without node_modules leaves no worktree or scratch + --dry-run leaves no worktree or scratch + the landing leaves no worktree or scratch +s24-cleanup-network: killed (rc 1, 1 fail of 78) + the worktree's Docker network is removed +s25-cleanup-scratch: killed (rc 1, 6 fail of 78) + a refusal after the worktree is added leaves no worktree or scratch + patch-drift leaves no worktree or scratch + gate-failed leaves no worktree or scratch + a target without node_modules leaves no worktree or scratch + --dry-run leaves no worktree or scratch + the landing leaves no worktree or scratch +s26-cleanup-link: SURVIVED (rc 0, 0 fail of 78) +restored: True diff --git a/agents/darkwing/work/queue-116/r1/mutants-stdout.log b/agents/darkwing/work/queue-116/r1/mutants-stdout.log new file mode 100644 index 000000000..5fdfefe05 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants-stdout.log @@ -0,0 +1,49 @@ +r01-schema-digest killed 1 +r02-schema-meta killed 1 +r03-read-only killed 2 +r04-business-scope killed 1 +r05-one-raise killed 1 +r06-not-a-merge killed 1 +r07-resolved-op killed 1 +r08-human-by killed 1 +r09-human-via killed 1 +r10-human-answer killed 1 +r11-merge-option killed 1 +r12-one-work-ref killed 1 +r13-work-ref-shape killed 1 +r14-task-ref-agrees killed 1 +r15-target killed 1 +r16-later-supersedes killed 1 +r17-later-task killed 1 +r18-later-question killed 1 +r19-no-verdict killed 1 +r20-latest-verdict killed 30 +r21-approve killed 1 +r22-verdict-task killed 1 +r23-full-oid killed 1 +s01-base-early killed 1 +s02-ref-moved killed 1 +s03-merge-base killed 1 +s04-empty-diff killed 1 +s05-root-top-file killed 1 +s06-root-new-dir killed 1 +s07-root-src-v1 killed 1 +s08-dirty-changed killed 3 +s09-dirty-staged killed 1 +s10-dirty-untracked killed 1 +s11-dirty-recheck killed 2 +s12-apply-conflict killed 1 +s13-patch-drift killed 1 +s14-gate-node-modules killed 1 +s15-gate-step-fails killed 5 +s16-gate-skips-queue killed 15 +s17-gate-scripts killed 8 +s18-base-moved-cas killed 2 +s19-dry-run killed 3 +s20-checkout-sync killed 1 +s21-subject killed 1 +s22-attribution killed 2 +s23-cleanup-worktree killed 6 +s24-cleanup-network killed 1 +s25-cleanup-scratch killed 6 +s26-cleanup-link SURVIVED 0 diff --git a/agents/darkwing/work/queue-116/r1/mutants.py b/agents/darkwing/work/queue-116/r1/mutants.py new file mode 100644 index 000000000..568a750b3 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Row 116 mutants: one per check. Each edits land-work.sh or read.mjs, +runs scripts/test-land-work.sh, and restores the file from a .orig copy.""" +import hashlib, os, re, shutil, signal, subprocess, sys + +WT = os.path.expanduser('~/darkwing-scratch/r116/wt') +PKT = os.path.expanduser('~/darkwing-scratch/r116/pkt') +SH = 'scripts/land-work.sh' +RD = 'scripts/land-work/read.mjs' + +M = [ + # read.mjs + ('r01-schema-digest', RD, "if (digest !== expected) refuse(", "if (false) refuse("), + ('r02-schema-meta', RD, "if (meta('schema_version') !== SCHEMA_VERSION || meta('schema_digest') !== expected)", "if (false)"), + ('r03-read-only', RD, "{ readOnly: true, timeout", "{ readOnly: false, timeout"), + ('r04-business-scope', RD, "business = ?", "? IS NOT NULL", True), + ('r05-one-raise', RD, "if (!d || raises.length !== 1)", "if (!d)"), + ('r06-not-a-merge', RD, "if (d.action !== MERGE || raise.action !== MERGE)", "if (false)"), + ('r07-resolved-op', RD, "closes.length !== 1 || closes[0].op !== 'resolved'", "closes.length !== 1"), + ('r08-human-by', RD, "res.by !== business.human ||", ""), + ('r09-human-via', RD, "res.via !== 'cli' ||", ""), + ('r10-human-answer', RD, "const answer = answers.length === 1 ? answers[0] : null;", + "const answer = answers[0] ?? { actor_role: null, actor_run: null, body: JSON.stringify({ choice: res.choice }) };"), + ('r11-merge-option', RD, "if (res.choice !== raise.approvalChoice)", "if (false)"), + ('r12-one-work-ref', RD, "named.length === 1 ?", "named.length >= 1 ?"), + ('r13-work-ref-shape', RD, "WORK_REF.exec(named[0])", "/^work\\/[a-z]*-?([^-]*)-?(.*)$/.exec(named[0])"), + ('r14-task-ref-agrees', RD, "if (ref != null && ref !== task)", "if (false)"), + ('r15-target', RD, "if (raise.target !== 'refactor' || raise.target !== base)", "if (false)"), + ('r16-later-supersedes', RD, "(r) => r.supersedes === id ||", "(r) =>"), + ('r17-later-task', RD, "r.task_ref === task ||", ""), + ('r18-later-question', RD, " || (r.question.match(ANY_WORK_REF) ?? []).includes(workRef)", ""), + ('r19-no-verdict', RD, "if (!v) refuse('no-verdict'", "if (false) refuse('no-verdict'"), + ('r20-latest-verdict', RD, "ORDER BY seq DESC LIMIT 1", "ORDER BY seq LIMIT 1"), + ('r21-approve', RD, "vb.verdict !== 'approve' ||", ""), + ('r22-verdict-task', RD, "vb.task_ref !== task ||", ""), + ('r23-full-oid', RD, "!OID.test(vb.commit ?? '')", "false"), + # land-work.sh + ('s01-base-early', SH, '[ "$BASE" = "refactor" ] || refuse target-branch', 'true || refuse target-branch'), + ('s02-ref-moved', SH, '[ "$AT" = "$C" ] || refuse ref-moved', 'true || refuse ref-moved'), + ('s03-merge-base', SH, '|| refuse base-conflict "$C shares no history with $BASE"', '|| true'), + ('s04-empty-diff', SH, '[ -s "$SCRATCH/reviewed.patch" ] || refuse', 'true || refuse'), + ('s05-root-top-file', SH, '*) ROOT_HITS="$ROOT_HITS $f"; continue ;;', '*) continue ;;'), + ('s06-root-new-dir', SH, 'if [ "$known" = "no" ] || [ "$top" = "src" ]', 'if [ "$top" = "src" ]'), + ('s07-root-src-v1', SH, ' || [ "$top" = "src" ] || [ "$top" = "v1" ]; then', '; then'), + ('s08-dirty-changed', SH, 'lgit "$CHECKOUT" diff --quiet HEAD -- "${PATHS[@]}" || dirty="changed"', ':'), + ('s09-dirty-staged', SH, 'lgit "$CHECKOUT" diff --cached --quiet HEAD -- "${PATHS[@]}" || dirty="staged"', ':'), + ('s10-dirty-untracked', SH, '[ -e "$CHECKOUT/$f" ]; then dirty="untracked $f"; fi', 'false; then :; fi'), + ('s11-dirty-recheck', SH, '\ncheckout_clean\ngit -C "$WT" commit', '\ngit -C "$WT" commit'), + ('s12-apply-conflict', SH, '|| refuse base-conflict "$(tail -n1 "$SCRATCH/apply.err")"', '|| true'), + ('s13-patch-drift', SH, '[ "$APPLIED_ID" = "$REVIEWED_ID" ] || refuse', 'true || refuse'), + ('s14-gate-node-modules', SH, '[ -d "$TARGET/node_modules" ] || fail', 'true || fail'), + ('s15-gate-step-fails', SH, '[ "$rc" -eq 0 ] || refuse gate-failed', 'true || refuse gate-failed'), + ('s16-gate-skips-queue', SH, '[ "$p" = queue ] && continue', ':'), + ('s17-gate-scripts', SH, 'for s in "$WT"/scripts/test-*.sh; do', 'for s in; do'), + ('s18-base-moved-cas', SH, '"refs/heads/$BASE" "$NEW" "$OLD" 2>/dev/null', '"refs/heads/$BASE" "$NEW" 2>/dev/null'), + ('s19-dry-run', SH, 'if [ "$DRY_RUN" = "yes" ]; then', 'if false; then'), + ('s20-checkout-sync', SH, 'if [ -n "$CHECKOUT" ]; then\n # HEAD is now NEW', 'if false; then\n # HEAD is now NEW'), + ('s21-subject', SH, '[ -n "$SUBJECT" ] || SUBJECT="$(value subject)"', '[ -n "$SUBJECT" ] || SUBJECT="land work"'), + ('s22-attribution', SH, '${ATTRIBUTION:-Applied-under: scripts/land-work.sh (conductor)}\n', ''), + ('s23-cleanup-worktree', SH, 'git -C "$TARGET" worktree remove --force "$WT" >/dev/null 2>&1 || rm -rf "$WT"', ':'), + ('s24-cleanup-network', SH, 'docker network rm "${WT_NAME}_default" >/dev/null 2>&1 ||', 'false ||'), + ('s25-cleanup-scratch', SH, ' rm -rf "$SCRATCH"\n', '\n'), + ('s26-cleanup-link', SH, '[ -L "$WT/node_modules" ] && rm -f "$WT/node_modules"', ':'), +] + +def sha(p): + return hashlib.sha256(open(p, 'rb').read()).hexdigest() + +only = set(sys.argv[1:]) +os.chdir(WT) +env = dict(os.environ, TMPDIR=os.path.join(os.path.dirname(WT), 'tmp'), NO_COLOR='1') +base = {f: sha(f) for f in (SH, RD)} +log = open(os.path.join(PKT, 'mutants-run.log'), 'a') +for name, f, old, new, *rest in M: + if only and name not in only: + continue + src = open(f).read() + n = src.count(old) + if n == 0 or (n > 1 and not rest): + print(f'{name}: pattern found {n} times, skipped', file=log, flush=True); print(name, 'BAD PATTERN', n); continue + shutil.copy2(f, f + '.orig') + try: + open(f, 'w').write(src.replace(old, new)) + p = subprocess.Popen(['bash', 'scripts/test-land-work.sh'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=env, start_new_session=True, text=True) + try: + out, _ = p.communicate(timeout=600) + except subprocess.TimeoutExpired: + os.killpg(p.pid, signal.SIGKILL); out, _ = p.communicate(); out += '\nTIMEOUT\n' + open(os.path.join(PKT, 'mutants', f'mutant-{name}.log'), 'w').write(out) + fails = [l[5:] for l in out.splitlines() if l.startswith('FAIL')] + tally = (re.findall(r'selftests: (\d+) passed, (\d+) failed', out) or [('?', '?')])[-1] + verdict = 'killed' if p.returncode != 0 else 'SURVIVED' + print(f'{name}: {verdict} (rc {p.returncode}, {tally[1]} fail of {int(tally[0]) + int(tally[1]) if tally[0] != "?" else "?"})', file=log, flush=True) + for l in fails: + print(f' {l}', file=log, flush=True) + print(name, verdict, len(fails), flush=True) + finally: + shutil.move(f + '.orig', f) + assert sha(f) == base[f], f'{f} not restored' +print('restored:', all(sha(f) == base[f] for f in base), file=log, flush=True) diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r01-schema-digest.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r01-schema-digest.log new file mode 100644 index 000000000..28e8003ab --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r01-schema-digest.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +FAIL schema-table: exit 0, wanted 2 bus-schema: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r02-schema-meta.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r02-schema-meta.log new file mode 100644 index 000000000..75489d30e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r02-schema-meta.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +FAIL schema-meta: exit 0, wanted 2 bus-schema: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r03-read-only.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r03-read-only.log new file mode 100644 index 000000000..5cbf9e002 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r03-read-only.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +FAIL openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +FAIL args: exit 2, wanted 2 decision-not-found: land-work: refused: bus-schema schema digest dbf2c5dbc4c3, the store expects 52514a1173be: bus-schema schema digest dbf2c5dbc4c3, the store expects 52514a1173be +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 76 passed, 2 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r04-business-scope.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r04-business-scope.log new file mode 100644 index 000000000..cf94c6bc5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r04-business-scope.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +FAIL other-business: exit 0, wanted 2 decision-not-found: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r05-one-raise.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r05-one-raise.log new file mode 100644 index 000000000..d45282ee0 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r05-one-raise.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +FAIL no-raise: exit 1, wanted 2 decision-not-found: land-work: Cannot read properties of undefined (reading 'body') land-work: could not read the decision from the bus (exit 1) +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r06-not-a-merge.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r06-not-a-merge.log new file mode 100644 index 000000000..370840431 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r06-not-a-merge.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +FAIL not-a-merge: exit 0, wanted 2 not-a-merge: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r07-resolved-op.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r07-resolved-op.log new file mode 100644 index 000000000..f462aeb5e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r07-resolved-op.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +FAIL withdrawn: exit 2, wanted 2 not-resolved: land-work: refused: not-human resolved by pm via null, 0 human answer(s): not-human resolved by pm via null, 0 human answer(s) +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r08-human-by.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r08-human-by.log new file mode 100644 index 000000000..5378b117a --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r08-human-by.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +FAIL by-agent: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r09-human-via.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r09-human-via.log new file mode 100644 index 000000000..c76ee8a61 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r09-human-via.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +FAIL via-webui: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r10-human-answer.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r10-human-answer.log new file mode 100644 index 000000000..aa4c7fddc --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r10-human-answer.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +FAIL no-answer: exit 0, wanted 2 not-human: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r11-merge-option.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r11-merge-option.log new file mode 100644 index 000000000..604bba9b2 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r11-merge-option.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +FAIL chose-no: exit 0, wanted 2 not-merge-option: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r12-one-work-ref.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r12-one-work-ref.log new file mode 100644 index 000000000..b25d8a188 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r12-one-work-ref.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +FAIL two-refs: exit 0, wanted 2 work-ref: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r13-work-ref-shape.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r13-work-ref-shape.log new file mode 100644 index 000000000..ba79042a0 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r13-work-ref-shape.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +FAIL bad-ref: exit 2, wanted 2 work-ref: land-work: refused: no-verdict no review.verdict for vikunja:x/: no-verdict no review.verdict for vikunja:x/ +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r14-task-ref-agrees.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r14-task-ref-agrees.log new file mode 100644 index 000000000..f4f97f1df --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r14-task-ref-agrees.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +FAIL task-ref-disagrees: exit 0, wanted 2 work-ref: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r15-target.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r15-target.log new file mode 100644 index 000000000..53cb13576 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r15-target.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +FAIL target-main: exit 0, wanted 2 target-branch: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r16-later-supersedes.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r16-later-supersedes.log new file mode 100644 index 000000000..057f0decb --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r16-later-supersedes.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +FAIL superseded-by: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r17-later-task.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r17-later-task.log new file mode 100644 index 000000000..62e0791c4 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r17-later-task.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +FAIL superseded-task: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r18-later-question.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r18-later-question.log new file mode 100644 index 000000000..9dfcbd0bf --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r18-later-question.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +FAIL superseded-question: exit 0, wanted 2 superseded: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r19-no-verdict.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r19-no-verdict.log new file mode 100644 index 000000000..3dc121e52 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r19-no-verdict.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +FAIL no-verdict: exit 1, wanted 2 no-verdict: land-work: Cannot read properties of undefined (reading 'body') land-work: could not read the decision from the bus (exit 1) +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r20-latest-verdict.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r20-latest-verdict.log new file mode 100644 index 000000000..94c340e18 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r20-latest-verdict.log @@ -0,0 +1,83 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +FAIL ref-moved: exit 2, wanted 2 ref-moved: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL root-top: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL root-newdir: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL root-src: exit 2, wanted 2 root-file: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL unrelated: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL empty: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL an empty reviewed diff says so +FAIL dirty-changed: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL dirty-staged: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL dirty-untracked: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL conflict: exit 2, wanted 2 base-conflict: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +FAIL dirty-during: exit 2, wanted 2 checkout-dirty: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +OK a reviewed path dirtied during the gate moves no ref +FAIL drift: exit 2, wanted 2 patch-drift: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +OK patch-drift leaves no worktree or scratch +FAIL gate-pkg: exit 2, wanted 2 gate-failed: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +FAIL gate-script: exit 2, wanted 2 gate-failed: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +FAIL nomods: exit 2, wanted 4: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +OK a target without node_modules leaves no worktree or scratch +FAIL moved: exit 2, wanted 2 base-moved: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL base-moved keeps the base where it moved to +FAIL dry: exit 2, wanted 0: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +OK --dry-run writes no ref +FAIL --dry-run prints the commit with --subject and --attribution +FAIL --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +FAIL land: exit 2, wanted 0: land-work: refused: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111: not-approved latest verdict e0000000-0000-4000-8000-000000000001 is changes on 1111111111111111111111111111111111111111 +FAIL the landing is one commit on the old base +fatal: bad object 00c9fcb6023e6687eaedc29356f6622e4f31c0fb +OK its diff is the reviewed diff by patch-id +FAIL its tree is the dry run's +fatal: bad object 00c9fcb6023e6687eaedc29356f6622e4f31c0fb +FAIL the message has the option's subject, the citations and the attribution last +FAIL it prints the line for the PM +FAIL the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +grep: /gate.log: No such file or directory +FAIL the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 48 passed, 30 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r21-approve.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r21-approve.log new file mode 100644 index 000000000..843f3c961 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r21-approve.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +FAIL changes-later: exit 0, wanted 2 not-approved: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r22-verdict-task.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r22-verdict-task.log new file mode 100644 index 000000000..b7060eb96 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r22-verdict-task.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +FAIL wrong-task-body: exit 0, wanted 2 not-approved: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-r23-full-oid.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-r23-full-oid.log new file mode 100644 index 000000000..4d5c4da65 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-r23-full-oid.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +FAIL short-commit: exit 2, wanted 2 not-approved: land-work: refused: ref-moved: work/vikunja-7-42 is at 9f98c955acde3b5ffce5a6ae44497778030f7120, the verdict approved 9f98c955acde +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s01-base-early.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s01-base-early.log new file mode 100644 index 000000000..708bc79a6 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s01-base-early.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +FAIL --base next refuses before the config is read (got 3) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s02-ref-moved.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s02-ref-moved.log new file mode 100644 index 000000000..0995ffc21 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s02-ref-moved.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +FAIL ref-moved: exit 1, wanted 2 ref-moved: land-work: the fetch did not bring 5f9b9fdf4402a26702c9c13e49fda9e7abc66dec +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s03-merge-base.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s03-merge-base.log new file mode 100644 index 000000000..2fda20608 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s03-merge-base.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +FAIL unrelated: exit 128, wanted 2 base-conflict: Use '--' to separate paths from revisions, like this: 'git [...] -- [...]' +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s04-empty-diff.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s04-empty-diff.log new file mode 100644 index 000000000..2631fd3e2 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s04-empty-diff.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +FAIL an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s05-root-top-file.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s05-root-top-file.log new file mode 100644 index 000000000..e9fbc52cd --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s05-root-top-file.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +FAIL root-top: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s06-root-new-dir.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s06-root-new-dir.log new file mode 100644 index 000000000..e839caaa9 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s06-root-new-dir.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +FAIL root-newdir: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s07-root-src-v1.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s07-root-src-v1.log new file mode 100644 index 000000000..56135fdfc --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s07-root-src-v1.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +FAIL root-src: exit 0, wanted 2 root-file: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s08-dirty-changed.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s08-dirty-changed.log new file mode 100644 index 000000000..c10b274e4 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s08-dirty-changed.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +FAIL dirty-changed: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +FAIL dirty-during: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +FAIL a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 75 passed, 3 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s09-dirty-staged.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s09-dirty-staged.log new file mode 100644 index 000000000..d79c4dc79 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s09-dirty-staged.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +FAIL dirty-staged: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s10-dirty-untracked.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s10-dirty-untracked.log new file mode 100644 index 000000000..bc920253d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s10-dirty-untracked.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +FAIL dirty-untracked: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s11-dirty-recheck.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s11-dirty-recheck.log new file mode 100644 index 000000000..77d1bf36b --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s11-dirty-recheck.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +FAIL dirty-during: exit 0, wanted 2 checkout-dirty: script-demo rc=0 ℹ pass 1 GATE_PASSED +FAIL a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 76 passed, 2 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s12-apply-conflict.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s12-apply-conflict.log new file mode 100644 index 000000000..61be16b60 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s12-apply-conflict.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +FAIL conflict: exit 2, wanted 2 base-conflict: land-work: refused: patch-drift: applied none, reviewed 82ae6d6dd0f84b6010da197c32195805e4dd1c19 +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s13-patch-drift.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s13-patch-drift.log new file mode 100644 index 000000000..47f9595ff --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s13-patch-drift.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +FAIL drift: exit 0, wanted 2 patch-drift: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s14-gate-node-modules.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s14-gate-node-modules.log new file mode 100644 index 000000000..0f2d86750 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s14-gate-node-modules.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +FAIL nomods: exit 0, wanted 4: script-demo rc=0 ℹ pass 1 GATE_PASSED +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s15-gate-step-fails.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s15-gate-step-fails.log new file mode 100644 index 000000000..87622340e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s15-gate-step-fails.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +FAIL gate-pkg: exit 0, wanted 2 gate-failed: script-demo rc=0 ℹ pass 1 GATE_PASSED +FAIL gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +FAIL gate-script: exit 0, wanted 2 gate-failed: script-demo rc=1 GATE_PASSED +FAIL a failing scripts/test-*.sh fails the gate +FAIL a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 73 passed, 5 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s16-gate-skips-queue.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s16-gate-skips-queue.log new file mode 100644 index 000000000..d888681ad --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s16-gate-skips-queue.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +FAIL dirty-during: exit 2, wanted 2 checkout-dirty: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/dirty-during/tmp/land-work-logs.rJrmrr/pkg-queue.log +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +FAIL a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +FAIL moved: exit 2, wanted 2 base-moved: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/moved/tmp/land-work-logs.wwWpms/pkg-queue.log +FAIL base-moved keeps the base where it moved to +FAIL dry: exit 2, wanted 0: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/dry/tmp/land-work-logs.zweQfa/pkg-queue.log +OK --dry-run writes no ref +FAIL --dry-run prints the commit with --subject and --attribution +FAIL --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +FAIL land: exit 2, wanted 0: pkg-queue rc=1 ℹ pass 0 ℹ fail 1 land-work: refused: gate-failed: pkg-queue, see /home/jwoltje/darkwing-scratch/r116/tmp/tmp.hCUFEPr7CG/c/land/tmp/land-work-logs.BFiG4I/pkg-queue.log +FAIL the landing is one commit on the old base +FAIL its diff is the reviewed diff by patch-id +FAIL its tree is the dry run's +FAIL the message has the option's subject, the citations and the attribution last +FAIL it prints the line for the PM +FAIL the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +FAIL the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 63 passed, 15 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s17-gate-scripts.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s17-gate-scripts.log new file mode 100644 index 000000000..48bfe7a5e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s17-gate-scripts.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +FAIL dirty-during: exit 0, wanted 2 checkout-dirty: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED +FAIL a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +FAIL gate-script: exit 0, wanted 2 gate-failed: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED +FAIL a failing scripts/test-*.sh fails the gate +FAIL a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +FAIL moved: exit 0, wanted 2 base-moved: pkg-demo rc=0 ℹ pass 1 ℹ fail 0 GATE_PASSED +FAIL base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +FAIL the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 70 passed, 8 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s18-base-moved-cas.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s18-base-moved-cas.log new file mode 100644 index 000000000..0384eb789 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s18-base-moved-cas.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +FAIL moved: exit 0, wanted 2 base-moved: script-demo rc=0 ℹ pass 1 GATE_PASSED +FAIL base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 76 passed, 2 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s19-dry-run.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s19-dry-run.log new file mode 100644 index 000000000..9cedd3c52 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s19-dry-run.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +FAIL --dry-run writes no ref +FAIL --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +FAIL its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 75 passed, 3 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s20-checkout-sync.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s20-checkout-sync.log new file mode 100644 index 000000000..d5fc8df82 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s20-checkout-sync.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +FAIL the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s21-subject.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s21-subject.log new file mode 100644 index 000000000..917912016 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s21-subject.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +FAIL the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s22-attribution.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s22-attribution.log new file mode 100644 index 000000000..b1fb7cef7 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s22-attribution.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +FAIL --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +FAIL the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 76 passed, 2 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s23-cleanup-worktree.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s23-cleanup-worktree.log new file mode 100644 index 000000000..d41660cb6 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s23-cleanup-worktree.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +FAIL a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +FAIL patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +FAIL gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +FAIL a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +FAIL --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +FAIL the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 72 passed, 6 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s24-cleanup-network.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s24-cleanup-network.log new file mode 100644 index 000000000..e5f4ec415 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s24-cleanup-network.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +FAIL the worktree's Docker network is removed +--- +land-work selftests: 77 passed, 1 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s25-cleanup-scratch.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s25-cleanup-scratch.log new file mode 100644 index 000000000..d41660cb6 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s25-cleanup-scratch.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +FAIL a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +FAIL patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +FAIL gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +FAIL a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +FAIL --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +FAIL the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 72 passed, 6 failed diff --git a/agents/darkwing/work/queue-116/r1/mutants/mutant-s26-cleanup-link.log b/agents/darkwing/work/queue-116/r1/mutants/mutant-s26-cleanup-link.log new file mode 100644 index 000000000..4901a8d95 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/mutants/mutant-s26-cleanup-link.log @@ -0,0 +1,80 @@ +OK args: exit 2, target-branch +OK args: exit 2, target-branch +OK args: exit 4 +OK args: exit 4 +OK args: exit 4 +OK --base next refuses before the config is read (got 2) +OK a missing system config exits 3 (got 3) +OK nobus: exit 3 +OK schema-table: exit 2, bus-schema +OK schema-meta: exit 2, bus-schema +OK openBus opens the database read-only +OK other-business: exit 2, decision-not-found +OK no-raise: exit 2, decision-not-found +OK not-a-merge: exit 2, not-a-merge +OK open: exit 2, not-resolved +OK withdrawn: exit 2, not-resolved +OK by-agent: exit 2, not-human +OK via-webui: exit 2, not-human +OK no-answer: exit 2, not-human +OK chose-no: exit 2, not-merge-option +OK two-refs: exit 2, work-ref +OK bad-ref: exit 2, work-ref +OK task-ref-disagrees: exit 2, work-ref +OK target-main: exit 2, target-branch +OK superseded-question: exit 2, superseded +OK superseded-task: exit 2, superseded +OK superseded-by: exit 2, superseded +OK no-verdict: exit 2, no-verdict +OK changes-later: exit 2, not-approved +OK short-commit: exit 2, not-approved +OK wrong-task-body: exit 2, not-approved +OK args: exit 2, decision-not-found +OK ref-moved: exit 2, ref-moved +OK root-top: exit 2, root-file +OK root-newdir: exit 2, root-file +OK root-src: exit 2, root-file +OK unrelated: exit 2, base-conflict +OK empty: exit 2, base-conflict +OK an empty reviewed diff says so +OK dirty-changed: exit 2, checkout-dirty +OK dirty-staged: exit 2, checkout-dirty +OK dirty-untracked: exit 2, checkout-dirty +OK conflict: exit 2, base-conflict +OK a refusal after the worktree is added leaves no worktree or scratch +OK cleanup looks for the worktree's Docker network +OK dirty-during: exit 2, checkout-dirty +OK a reviewed path dirtied during the gate moves no ref +OK drift: exit 2, patch-drift +OK patch-drift leaves no worktree or scratch +OK gate-pkg: exit 2, gate-failed +OK gate-failed names the failing step's log, and it exists +OK gate-failed leaves no worktree or scratch +OK gate-script: exit 2, gate-failed +OK a failing scripts/test-*.sh fails the gate +OK a failed gate moves no ref +OK nomods: exit 4 +OK a target without node_modules leaves no worktree or scratch +OK moved: exit 2, base-moved +OK base-moved keeps the base where it moved to +OK dry: exit 0 +OK --dry-run writes no ref +OK --dry-run prints the commit with --subject and --attribution +OK --dry-run runs the gate +OK --dry-run leaves no worktree or scratch +OK land: exit 0 +OK the landing is one commit on the old base +OK its diff is the reviewed diff by patch-id +OK its tree is the dry run's +OK the message has the option's subject, the citations and the attribution last +OK it prints the line for the PM +OK the checked-out base has the reviewed paths and keeps the unrelated edit +OK only refs/heads/refactor exists in the target +OK the work ref is unchanged +OK the bus database is unchanged +OK the gate ran each package suite but queue, and each scripts/test-*.sh +OK the landing leaves no worktree or scratch +OK the target's node_modules is still there +OK the worktree's Docker network is removed +--- +land-work selftests: 78 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-1/gate.log b/agents/darkwing/work/queue-116/r1/replay-1/gate.log new file mode 100644 index 000000000..07f4c3cf4 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1/gate.log @@ -0,0 +1,3 @@ +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=1 ℹ pass 174 ℹ fail 8 diff --git a/agents/darkwing/work/queue-116/r1/replay-1/pkg-cli.log b/agents/darkwing/work/queue-116/r1/replay-1/pkg-cli.log new file mode 100644 index 000000000..afac01dc8 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1/pkg-cli.log @@ -0,0 +1,307 @@ +✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1167.678911ms) +✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (62.087121ms) +✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (149.967299ms) +✔ NO_COLOR: no escape codes, except reverse video on the selected row (235.980952ms) +✔ 1-9 shows the decide flow's own lines and question; only y resolves (233.470644ms) +✔ the app shows the same decide text as mosaic decide (125.066709ms) +✔ any key but y or Y at the question answers No; nothing is sent (3529.555385ms) +✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (472.427826ms) +✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1541.962499ms) +✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (169.077034ms) +✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (67.257341ms) +✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (610.076649ms) +✔ quitting at the question answers No and sends nothing, armed or not (209.689217ms) +✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (133.850671ms) +✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (180.40122ms) +✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (976.416796ms) +✔ at every size the decide box shows each line y depends on, or says it is hidden (8112.440462ms) +✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (155.362284ms) +✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (112.145065ms) +✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (57.42134ms) +✔ keys: views, moving, trail of a selection, the command line, help and quit (231.33975ms) +✔ one option: the status line says Press 1, not 1-1 (96.48178ms) +✔ no business: the app says so and :business picks one (49.304107ms) +✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.672094ms) +✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (166.858591ms) +✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.447051ms) +✔ decide with --note still asks; a No sends nothing (57.810508ms) +✔ the app's business comes from a live bus host only (0.922968ms) +✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.173103ms) +✔ draw is pure: same state, same frame (0.704513ms) +✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (284.880106ms) +✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (352.800471ms) +✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (126.717251ms) +✔ decide prints a declining choice as declining (157.367801ms) +✔ an unknown outcome is reported once and never resent (258.019852ms) +✔ a decision closed before the answer arrives exits 2 and points at its trail (120.320396ms) +✔ a prefix that matches two open decisions exits 2 and resolves neither (113.149909ms) +✔ without --business a command uses the live host's business, and a stale host.json is not a host (158.966753ms) +✔ every human command refuses inside an agent run before it touches the bus (160.635487ms) +✔ usage errors exit 4; no business and no host is a usage error (121.704339ms) +✔ agents and tasks print through the broker (110.065654ms) +✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.100269ms) +✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (80.969258ms) +✔ trackers come from the tracker.* variables of the one project that names a tracker project (65.432672ms) +✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (50.812226ms) +✔ two projects that each name a tracker project refuse, since the boot shape holds one (31.061334ms) +✔ a business without tracker.baseUrl gets no trackers entry (25.295653ms) +✔ an unknown business and a broken system config refuse with exit 3 (53.90155ms) +✔ follow prints an unsolicited message after plain talk returned (491.261054ms) +✔ talk --follow continues after reply and prints a later unsolicited message (260.139195ms) +✔ inbox lists all unread human messages under decisions, does not deliver or read them (4940.032014ms) +✔ follow refuses agent context and bad arguments (94.517554ms) +✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (79.262852ms) +✔ plain talk leaves the process SIGINT handlers unchanged (146.788989ms) +✔ empty views say so (3.470692ms) +✔ the trail keeps the broker's order and names a decision's task without its rows (1.380543ms) +✔ tasks print the tracker fields the snapshot carries (0.21834ms) +✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (1073.162764ms) +✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (741.679333ms) +✔ the size cap refuses a push before any byte (307.11892ms) +✔ a fetch over the cap refuses before any byte reaches the reviewer (844.572604ms) +✔ the socket refuses a request with no capability, an unknown one, and a bad request line (2283.205614ms) +✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (554.666109ms) +✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (462.537879ms) +✔ a review of a project the business no longer has refuses unknown-project (548.50525ms) +✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (311.360412ms) +✔ close() answers host-closing to a connection still sending its request line (333.615721ms) +✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (707.234202ms) +✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (558.216372ms) +✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (680.860619ms) +✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.63314ms) +✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (558.106287ms) +✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (43.236764ms) +✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.860367ms) +✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (416.577271ms) +✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1141.882679ms) +✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (236.599972ms) +✔ a second host for the same data root refuses with exit 3 while the first runs (215.778873ms) +✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (571.441632ms) +✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (3.518955ms) +✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.736091ms) +✔ a live host's lock stays, however old the file is (0.561969ms) +✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (909.184131ms) +✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (222.890482ms) +✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (38.581847ms) +✔ a broker fork that throws leaves no host.lock and no host.json (42.196286ms) +✔ a broker send that throws leaves no host.lock and no host.json (45.05507ms) +✔ a broker that misses its boot wait leaves no host.lock and no host.json (40.858668ms) +✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (1610.572774ms) +✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (198.881827ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (176.595783ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (189.078114ms) +✔ a host.json that can't be written stops both children and leaves no host.lock (304.721883ms) +✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (41.04616ms) +✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (174.055775ms) +✔ an error event on the broker while the notifier starts fails the start once the notifier replies (339.637523ms) +✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (281.465332ms) +✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (277.705053ms) +✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1204.274308ms) +✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (337.617204ms) +✔ a broker reply with no request waiting breaks the channel and the host exits 1 (193.752919ms) +✔ a notifier that refuses stops the broker and the host refuses with exit 3 (237.844751ms) +✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (194.66341ms) +✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (133.08081ms) +✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (208.066441ms) +✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (145.68496ms) +✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (184.071639ms) +✔ watchChildren reports a child that died before it was called, and one that dies later (20.967152ms) +✔ bus stop refuses to signal a live pid that is not a bus host (203.162882ms) +✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (243.265194ms) +✔ bus start refuses with exit 3 without a notifier config (98.949011ms) +✔ bus start runs until bus stop; status reports it while it runs (696.108947ms) +✔ bus-service.sh renders the unit and installs it into a given directory (52.186719ms) +✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (62.820634ms) +✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (13.739858ms) +✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.307909ms) +✖ bus start --pm: the PM runs under its own PID namespace, registered, with a manifest (325.730317ms) +✖ the PM launches a coder through its launch tool; the coder answers; refusals name their code (413.402969ms) +✖ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or kept and logged (348.007019ms) +✔ a project clone that can't be made refuses checkout-failed, from --pm and from a session, with no run and no clone left (244.085922ms) +✖ a runner that stops at once ends its launch with the runner's reason (263.054061ms) +✔ a Claude Code launch with no session credential refuses before it starts (242.35261ms) +✖ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (184.92566ms) +✖ a runner killed from the host ends its launch as killed, not failed (185.756847ms) +✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (198.415702ms) +✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (428.550658ms) +file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101 + if (Buffer.byteLength(join(runDir, "tools.sock")) > 107) throw new SeatError(`data root path too long for a socket: ${runDir}`, 2); + ^ + +SeatError: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-eXgGtj/data/launches/acme/rfb2bbea1aad7 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 +} + +Node.js v26.8.1 +✖ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (30014.022129ms) +file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101 + if (Buffer.byteLength(join(runDir, "tools.sock")) > 107) throw new SeatError(`data root path too long for a socket: ${runDir}`, 2); + ^ + +SeatError: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-Y9jzzP/data/launches/acme/r53acc1b66f57 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 +} + +Node.js v26.8.1 +✖ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (30000.824318ms) +✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (124.552615ms) +✔ an over-long launch request is refused at once, not at the 10 s idle timeout (126.266155ms) +✔ a launch client that never closes its side doesn't hold the host's close (124.98022ms) +✖ a runner that ignores SIGTERM is killed when the host closes (134.344926ms) +✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (3.771959ms) +✔ zoned uses the IANA zone across DST (23.065545ms) +✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (306.572612ms) +✔ two blocking decisions get two DMs with different nonces (319.222151ms) +✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.167079ms) +✔ a failed DM is journaled, backs off, and is retried until it lands (144.95739ms) +✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (142.950944ms) +✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (266.715655ms) +✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (121.876318ms) +✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (187.145442ms) +✔ a restart after the second refusal does not send before that refusal's 30 min are up (173.213978ms) +✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (189.24128ms) +✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (99.714291ms) +✔ an inbox read failure is logged and the next poll retries (0.668723ms) +✔ no Discord id reaches the journal or the log (113.835888ms) +✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (27.634481ms) +✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (44.761051ms) +✔ the journal: a whole file that is one torn line truncates to empty (30.96715ms) +✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (2.48818ms) +✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.588244ms) +✔ the journal: a line with a wrong type refuses with exit 3 and names the field (1.817933ms) +✔ the journal: a symlinked directory refuses and says it is a link (0.335209ms) +✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.568814ms) +✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.34776ms) +✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (2.047948ms) +✔ digest content stays within Discord's 2000 characters (0.275023ms) +✔ runLoop never overlaps ticks and stops after the one in flight (111.074235ms) +✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (576.712369ms) +✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (407.394474ms) +✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (496.634277ms) +✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (218.379603ms) +✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4880.391183ms) +✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (446.199542ms) +✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (176.771602ms) +✔ install never shows a template name on systemd 261; template drop-ins still refuse (193.104126ms) +✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (165.484975ms) +✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (308.211057ms) +✔ talk --tester refuses text without the [mos test] prefix before any call (346.387691ms) +✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (119.364721ms) +✔ decide, stop and launches take no --tester (140.280796ms) +✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.330995ms) +✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.57527ms) +task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200 +task.close on a missing task answered: task-not-found; it made GET /tasks/999 404 +✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (648.856911ms) +✔ the transport writes {business, verb, args} to the child and reads its JSON (73.537804ms) +✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2145.318781ms) +✔ busExit and refuseInsideAgent (0.447146ms) +✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (538.708126ms) +✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1193.59678ms) +✔ a late reply the Console has listed still reaches the next talk (2299.534915ms) +✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (1070.675075ms) +✔ launches off and on go to the broker and change the business's launch state (148.120094ms) +✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (102.304333ms) +ℹ tests 184 +ℹ suites 0 +ℹ pass 174 +ℹ fail 8 +ℹ cancelled 2 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 63495.328839 + +✖ failing tests: + +test at tests/launcher.test.mjs:130:1 +✖ bus start --pm: the PM runs under its own PID namespace, registered, with a manifest (325.730317ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-BqzTJy/data/launches/acme/r548578a7138c + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:203:1 +✖ the PM launches a coder through its launch tool; the coder answers; refusals name their code (413.402969ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-5wUEmQ/data/launches/acme/rf3d90afaa953 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:284:1 +✖ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or kept and logged (348.007019ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-1hVOUT/data/launches/acme/r3a2f89eaca08 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:353:1 +✖ a runner that stops at once ends its launch with the runner's reason (263.054061ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-gy5F5J/data/launches/acme/rdbd73d2a2c12 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:383:1 +✖ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (184.92566ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-TOjh2E/data/launches/acme/r5c87b37a9bb0 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:396:1 +✖ a runner killed from the host ends its launch as killed, not failed (185.756847ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-TCwNs4/data/launches/acme/r67c5a4e257f1 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:430:1 +✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (428.550658ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-Q3WIjl/data/launches/acme/r115a99a2aabd + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } + +test at tests/launcher.test.mjs:489:3 +✖ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (30014.022129ms) + 'test timed out after 30000ms' + +test at tests/launcher.test.mjs:489:3 +✖ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (30000.824318ms) + 'test timed out after 30000ms' + +test at tests/launcher.test.mjs:605:1 +✖ a runner that ignores SIGTERM is killed when the host closes (134.344926ms) + Error [SeatError]: data root path too long for a socket: /home/jwoltje/darkwing-scratch/r116/replay/tmp/mosaic-launch-XS3NAk/data/launches/acme/re6d727f90ce4 + at newRun (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/seat/src/session.mjs:101:68) + at start (file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:200:29) + at process.processTicksAndRejections (node:internal/process/task_queues:104:5) + at async file:///home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work.icIYy5/lw-3676026-1792001972/packages/cli/src/launcher.mjs:349:16 { + exitCode: 2 + } diff --git a/agents/darkwing/work/queue-116/r1/replay-1/replay-run.log b/agents/darkwing/work/queue-116/r1/replay-1/replay-run.log new file mode 100644 index 000000000..8a4c437df --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1/replay-run.log @@ -0,0 +1,11 @@ +base 1c9a4910d924e985dd4e9db3045e959079ea124d want tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f +== 19/265 --dry-run +land-work: gate logs in /home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work-logs.vyi4iD +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=1 ℹ pass 174 ℹ fail 8 +land-work: refused: gate-failed: pkg-cli, see /home/jwoltje/darkwing-scratch/r116/replay/tmp/land-work-logs.vyi4iD/pkg-cli.log +dry rc=2 +dry tree matches f7c8537b3^{tree}: NO +dry-run wrote no ref: yes +STOP dry-run rc=2 diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/after-dry.txt b/agents/darkwing/work/queue-116/r1/replay-1c9a/after-dry.txt new file mode 100644 index 000000000..a846328a3 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/after-dry.txt @@ -0,0 +1,75 @@ +refs/heads/refactor 1c9a4910d924e985dd4e9db3045e959079ea124d +refs/remotes/origin/HEAD bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/docs/1507-chat-01c-r2 f7fab8b64575e00d13654fa114abb74273e15b05 +refs/remotes/origin/feat/1311-credential-seat-store 87c12a27267c9ea8d06b71f249b191f6e08b766b +refs/remotes/origin/fix/retry-lineage-v1 afd5827db8af02cf03c514c605a9ef9ab763c467 +refs/remotes/origin/fix/roles-dir-v1 527bc581cada649fc1d503c309f19fc501b38cf8 +refs/remotes/origin/foundation/adapter-seam-v1 594b8d711c1238cbdbc5b13284a00f222e6cf9d2 +refs/remotes/origin/foundation/agent-seats-v1 9bd4f1c4056d28e3b0806d13289667c8d536d80e +refs/remotes/origin/foundation/config-v1 81f58b15c8497bb25e9a0d2fa9f22aa71db9cddb +refs/remotes/origin/foundation/interactive-agent-v1 7db4c5c2ed66254e6504ea9c40f7fcd971c2a63f +refs/remotes/origin/foundation/mission-policy-v1 2ff49adff432790149031443b978560585dfe697 +refs/remotes/origin/foundation/mission-task-v1 7f0408d417709b8f33b59a7094119e06cf947aeb +refs/remotes/origin/foundation/operator-ergonomics-v1 24bdef75fa096f2520efbdf4de670bcabae84101 +refs/remotes/origin/foundation/release-v1 35ea46466150602357256365e2a2b4c0e28cc9f4 +refs/remotes/origin/foundation/retention-v1 88eef507b0cfa80f4153afd566c4fed61e138eff +refs/remotes/origin/foundation/session-fork-v1 88d9cf750f3d20c30f0dad07562135e9b32db343 +refs/remotes/origin/foundation/sessions-v1 be555497009607cf0a5f75c174924d292febc5d4 +refs/remotes/origin/foundation/skill-lifecycle-v1 9fd16b9739fdafa331f4f872a94f2337ef9dc6e1 +refs/remotes/origin/foundation/user-context-v1 a7b612435b374f578364f7e065e0ba8b61b09d2d +refs/remotes/origin/foundation/workspaces-capabilities-v1 b017e66e175c8b7efa2be38fda89978914de72f0 +refs/remotes/origin/main 9a5fbdbda74b16adf488fe28138b2ba69ea5e669 +refs/remotes/origin/orchestration/conductor-v1 83c4e9851efd885c9e8b6af7e845c672780602f0 +refs/remotes/origin/refactor bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/worktree-agent-a1044a9b545fa3a36 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a44468a48c485520e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a4fe093597cbfbb5b 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a7038df8212b2da8a 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-aae703ffcabbad4b7 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-abe72e00ca2bcdf7e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/tags/adapter-seam-v1 d539744a51c1529c034aad0b6b6b25caa5618f1e +refs/tags/agent-seats-v1 e53d86d55344c8ac91e4403c1930d2d354193372 +refs/tags/archive/ms24-fork-20260823 328967705692db073c63a381ed3c406b6c7c2f68 +refs/tags/auto-apply-v1 ce1a28d6fbea7fb1cdfc06502b2bf8ab4788da7b +refs/tags/conductor-v1 ac665b360eb7abd17af7e7030ff764c0adb4f247 +refs/tags/config-hello-v1 8912dfb2c8ca43bd211b3607a2a06e2d8d11cf40 +refs/tags/fed-v0.1.0-m1 8650a7da2369f7bdea489f3749ca4657457ba5ed +refs/tags/fed-v0.2.0-m2 4ece6dc643126d3b763fc942301660b2a594d856 +refs/tags/interactive-agent-v1 661c954cc217ac847c04c33794e9de7b28b7a807 +refs/tags/mission-policy-v1 7ae1cee48ec036578b1c71d03cb5d985fe89bfc2 +refs/tags/mission-task-v1 6d51cc67874b23df762400f7b9f6b12d9ed3cb61 +refs/tags/mosaic-v0.0.24 f6cc91aa66470d2ecf006b56bd5ec81917be7dd2 +refs/tags/mosaic-v0.0.25 d5b1a92372244b38e6facb5d61d52a2bb456562f +refs/tags/mosaic-v0.0.26 56ebfa239910dbe4b4a5ecd988a9257ae7638cb5 +refs/tags/mosaic-v0.0.27 bd76df1a50d0ce650bbcf8ff3cf0d164ac3bbc03 +refs/tags/mosaic-v0.0.28 1bfd8570d6ea69b26db81655c120a3af4943987a +refs/tags/mosaic-v0.0.29 81c1775a03d14d1cf5babcbccab300e40eb0e348 +refs/tags/mosaic-v0.0.31 aa221bf92ea7da535153f782489978bf2085951f +refs/tags/onboarding-v1 f08298e1a8fbfbc98dfb721552bcd24fdacf9785 +refs/tags/operator-ergonomics-v1 744b19c5bea305bb63ac91539eae7b0a3f3ecc69 +refs/tags/poc-container-hello-v0 988007f34e5dcd756ee35dad73c76cbf72712364 +refs/tags/release-model-v1 5184afed6471548d44df449f29c39b8863f8f89c +refs/tags/retention-v1 99be1ef526bb9fa1347445bfb4033dcdc0072b33 +refs/tags/session-fork-v1 4a87942c2087c0f7129312e37985f432d7eed031 +refs/tags/sessions-v1 6fbe9f08b5fb211ca79cc76bda3ce43e6bf8c110 +refs/tags/skill-lifecycle-v1 91aa52e052c0886cf3ff93055ef6db905f02b997 +refs/tags/v0.0.39-alpha 528700ceea2d31ab781e08a8ea38232a2fbbbce1 +refs/tags/v0.0.4 b5325ad11afea129b8b88b2f7d7b9b05f7a27fb5 +refs/tags/v0.0.5 5ed69075c42543401e91929e01bac84329eadfe1 +refs/tags/v0.0.6 3f261b7d21297ff4cfe860b4f7e50a5993a497fd +refs/tags/v0.0.7 36ed6b19b229ab5621237b401b49784d165b05be +refs/tags/v0.0.8 5e54f099142310608ff83301232a7d3e5ca91d31 +refs/tags/v0.1.0 6da6e6dc24d806f02c8042783ee393acf8317942 +refs/tags/v0.2.0 a4537c90b7cd368161e86769dbadfe5d7d1342f1 +refs/tags/workspace-capabilities-v1 67d6e8ac44623d721e13b50a8a9d873eeebb23fc +1c9a4910d924e985dd4e9db3045e959079ea124d branch: Reset to 1c9a4910d +bea5dfa47fd57b49dc29c1aa781d99cde263acac clone: from /mnt/storage/src/mosaic-stack +?? node_modules +worktree /home/jwoltje/darkwing-scratch/r116/replay/target +HEAD 1c9a4910d924e985dd4e9db3045e959079ea124d +branch refs/heads/refactor + +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 +801017277d9e86cbdcf93eff3fff60b384a04ae3cdb029e0fc2d25b539db4d2b diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/before.txt b/agents/darkwing/work/queue-116/r1/replay-1c9a/before.txt new file mode 100644 index 000000000..a846328a3 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/before.txt @@ -0,0 +1,75 @@ +refs/heads/refactor 1c9a4910d924e985dd4e9db3045e959079ea124d +refs/remotes/origin/HEAD bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/docs/1507-chat-01c-r2 f7fab8b64575e00d13654fa114abb74273e15b05 +refs/remotes/origin/feat/1311-credential-seat-store 87c12a27267c9ea8d06b71f249b191f6e08b766b +refs/remotes/origin/fix/retry-lineage-v1 afd5827db8af02cf03c514c605a9ef9ab763c467 +refs/remotes/origin/fix/roles-dir-v1 527bc581cada649fc1d503c309f19fc501b38cf8 +refs/remotes/origin/foundation/adapter-seam-v1 594b8d711c1238cbdbc5b13284a00f222e6cf9d2 +refs/remotes/origin/foundation/agent-seats-v1 9bd4f1c4056d28e3b0806d13289667c8d536d80e +refs/remotes/origin/foundation/config-v1 81f58b15c8497bb25e9a0d2fa9f22aa71db9cddb +refs/remotes/origin/foundation/interactive-agent-v1 7db4c5c2ed66254e6504ea9c40f7fcd971c2a63f +refs/remotes/origin/foundation/mission-policy-v1 2ff49adff432790149031443b978560585dfe697 +refs/remotes/origin/foundation/mission-task-v1 7f0408d417709b8f33b59a7094119e06cf947aeb +refs/remotes/origin/foundation/operator-ergonomics-v1 24bdef75fa096f2520efbdf4de670bcabae84101 +refs/remotes/origin/foundation/release-v1 35ea46466150602357256365e2a2b4c0e28cc9f4 +refs/remotes/origin/foundation/retention-v1 88eef507b0cfa80f4153afd566c4fed61e138eff +refs/remotes/origin/foundation/session-fork-v1 88d9cf750f3d20c30f0dad07562135e9b32db343 +refs/remotes/origin/foundation/sessions-v1 be555497009607cf0a5f75c174924d292febc5d4 +refs/remotes/origin/foundation/skill-lifecycle-v1 9fd16b9739fdafa331f4f872a94f2337ef9dc6e1 +refs/remotes/origin/foundation/user-context-v1 a7b612435b374f578364f7e065e0ba8b61b09d2d +refs/remotes/origin/foundation/workspaces-capabilities-v1 b017e66e175c8b7efa2be38fda89978914de72f0 +refs/remotes/origin/main 9a5fbdbda74b16adf488fe28138b2ba69ea5e669 +refs/remotes/origin/orchestration/conductor-v1 83c4e9851efd885c9e8b6af7e845c672780602f0 +refs/remotes/origin/refactor bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/worktree-agent-a1044a9b545fa3a36 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a44468a48c485520e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a4fe093597cbfbb5b 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a7038df8212b2da8a 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-aae703ffcabbad4b7 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-abe72e00ca2bcdf7e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/tags/adapter-seam-v1 d539744a51c1529c034aad0b6b6b25caa5618f1e +refs/tags/agent-seats-v1 e53d86d55344c8ac91e4403c1930d2d354193372 +refs/tags/archive/ms24-fork-20260823 328967705692db073c63a381ed3c406b6c7c2f68 +refs/tags/auto-apply-v1 ce1a28d6fbea7fb1cdfc06502b2bf8ab4788da7b +refs/tags/conductor-v1 ac665b360eb7abd17af7e7030ff764c0adb4f247 +refs/tags/config-hello-v1 8912dfb2c8ca43bd211b3607a2a06e2d8d11cf40 +refs/tags/fed-v0.1.0-m1 8650a7da2369f7bdea489f3749ca4657457ba5ed +refs/tags/fed-v0.2.0-m2 4ece6dc643126d3b763fc942301660b2a594d856 +refs/tags/interactive-agent-v1 661c954cc217ac847c04c33794e9de7b28b7a807 +refs/tags/mission-policy-v1 7ae1cee48ec036578b1c71d03cb5d985fe89bfc2 +refs/tags/mission-task-v1 6d51cc67874b23df762400f7b9f6b12d9ed3cb61 +refs/tags/mosaic-v0.0.24 f6cc91aa66470d2ecf006b56bd5ec81917be7dd2 +refs/tags/mosaic-v0.0.25 d5b1a92372244b38e6facb5d61d52a2bb456562f +refs/tags/mosaic-v0.0.26 56ebfa239910dbe4b4a5ecd988a9257ae7638cb5 +refs/tags/mosaic-v0.0.27 bd76df1a50d0ce650bbcf8ff3cf0d164ac3bbc03 +refs/tags/mosaic-v0.0.28 1bfd8570d6ea69b26db81655c120a3af4943987a +refs/tags/mosaic-v0.0.29 81c1775a03d14d1cf5babcbccab300e40eb0e348 +refs/tags/mosaic-v0.0.31 aa221bf92ea7da535153f782489978bf2085951f +refs/tags/onboarding-v1 f08298e1a8fbfbc98dfb721552bcd24fdacf9785 +refs/tags/operator-ergonomics-v1 744b19c5bea305bb63ac91539eae7b0a3f3ecc69 +refs/tags/poc-container-hello-v0 988007f34e5dcd756ee35dad73c76cbf72712364 +refs/tags/release-model-v1 5184afed6471548d44df449f29c39b8863f8f89c +refs/tags/retention-v1 99be1ef526bb9fa1347445bfb4033dcdc0072b33 +refs/tags/session-fork-v1 4a87942c2087c0f7129312e37985f432d7eed031 +refs/tags/sessions-v1 6fbe9f08b5fb211ca79cc76bda3ce43e6bf8c110 +refs/tags/skill-lifecycle-v1 91aa52e052c0886cf3ff93055ef6db905f02b997 +refs/tags/v0.0.39-alpha 528700ceea2d31ab781e08a8ea38232a2fbbbce1 +refs/tags/v0.0.4 b5325ad11afea129b8b88b2f7d7b9b05f7a27fb5 +refs/tags/v0.0.5 5ed69075c42543401e91929e01bac84329eadfe1 +refs/tags/v0.0.6 3f261b7d21297ff4cfe860b4f7e50a5993a497fd +refs/tags/v0.0.7 36ed6b19b229ab5621237b401b49784d165b05be +refs/tags/v0.0.8 5e54f099142310608ff83301232a7d3e5ca91d31 +refs/tags/v0.1.0 6da6e6dc24d806f02c8042783ee393acf8317942 +refs/tags/v0.2.0 a4537c90b7cd368161e86769dbadfe5d7d1342f1 +refs/tags/workspace-capabilities-v1 67d6e8ac44623d721e13b50a8a9d873eeebb23fc +1c9a4910d924e985dd4e9db3045e959079ea124d branch: Reset to 1c9a4910d +bea5dfa47fd57b49dc29c1aa781d99cde263acac clone: from /mnt/storage/src/mosaic-stack +?? node_modules +worktree /home/jwoltje/darkwing-scratch/r116/replay/target +HEAD 1c9a4910d924e985dd4e9db3045e959079ea124d +branch refs/heads/refactor + +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 +801017277d9e86cbdcf93eff3fff60b384a04ae3cdb029e0fc2d25b539db4d2b diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.err b/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.err new file mode 100644 index 000000000..993351f1e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.err @@ -0,0 +1,24 @@ +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt/land-work-logs.2vWgxG +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.out b/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.out new file mode 100644 index 000000000..b45d54e99 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/dry.out @@ -0,0 +1,15 @@ +land-work (dry-run): would commit tree 3ca4beda9fb2aa2ad0249a0dfea77f9254094457 on refactor at 1c9a4910d924e985dd4e9db3045e959079ea124d, patch-id 26100825e412, with this message: + Squash-merge work/vikunja-19-265 into refactor + + Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 1c9a4910d924e985dd4e9db3045e959079ea124d, + the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + + Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 + Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 + Work-ref: work/vikunja-19-265 + Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 + Base: refactor 1c9a4910d924e985dd4e9db3045e959079ea124d + Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 + Gate: full, every package suite and every scripts/test-*.sh + Applied-under: scripts/land-work.sh (conductor) +land-work (dry-run): no ref was written. diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.2vWgxG/gate.log b/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.2vWgxG/gate.log new file mode 100644 index 000000000..6578a1e50 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.2vWgxG/gate.log @@ -0,0 +1,23 @@ +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.QTBGn3/gate.log b/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.QTBGn3/gate.log new file mode 100644 index 000000000..6578a1e50 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/land-work-logs.QTBGn3/gate.log @@ -0,0 +1,23 @@ +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/land.err b/agents/darkwing/work/queue-116/r1/replay-1c9a/land.err new file mode 100644 index 000000000..964093570 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/land.err @@ -0,0 +1,24 @@ +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt/land-work-logs.QTBGn3 +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/land.out b/agents/darkwing/work/queue-116/r1/replay-1c9a/land.out new file mode 100644 index 000000000..67f1d5e51 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/land.out @@ -0,0 +1,2 @@ +land-work: committed b295e3002f810aa909493dcddd667a5a7d714a37 on refactor (parent 1c9a4910d924e985dd4e9db3045e959079ea124d), patch-id 26100825e412. NOT pushed - push remains an explicit act. +work/vikunja-19-265 (vikunja:19/265) is merged to refactor as b295e3002; push pending. diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/r229.err b/agents/darkwing/work/queue-116/r1/replay-1c9a/r229.err new file mode 100644 index 000000000..eeb803232 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/r229.err @@ -0,0 +1 @@ +land-work: refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/r229.out b/agents/darkwing/work/queue-116/r1/replay-1c9a/r229.out new file mode 100644 index 000000000..e69de29bb diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/replay-run.log b/agents/darkwing/work/queue-116/r1/replay-1c9a/replay-run.log new file mode 100644 index 000000000..ec9f3b476 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/replay-run.log @@ -0,0 +1,98 @@ +base 1c9a4910d924e985dd4e9db3045e959079ea124d want tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f +== 19/265 --dry-run +land-work (dry-run): would commit tree 3ca4beda9fb2aa2ad0249a0dfea77f9254094457 on refactor at 1c9a4910d924e985dd4e9db3045e959079ea124d, patch-id 26100825e412, with this message: + Squash-merge work/vikunja-19-265 into refactor + + Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 1c9a4910d924e985dd4e9db3045e959079ea124d, + the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + + Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 + Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 + Work-ref: work/vikunja-19-265 + Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 + Base: refactor 1c9a4910d924e985dd4e9db3045e959079ea124d + Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 + Gate: full, every package suite and every scripts/test-*.sh + Applied-under: scripts/land-work.sh (conductor) +land-work (dry-run): no ref was written. +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt/land-work-logs.2vWgxG +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED +dry rc=0 +dry tree 3ca4beda9fb2aa2ad0249a0dfea77f9254094457 matches f7c8537b3^{tree}: NO +dry-run wrote no ref: yes +== 19/265 landing +land-work: committed b295e3002f810aa909493dcddd667a5a7d714a37 on refactor (parent 1c9a4910d924e985dd4e9db3045e959079ea124d), patch-id 26100825e412. NOT pushed - push remains an explicit act. +work/vikunja-19-265 (vikunja:19/265) is merged to refactor as b295e3002; push pending. +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt/land-work-logs.QTBGn3 +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED +land rc=0 +new b295e3002f810aa909493dcddd667a5a7d714a37 parent 1c9a4910d924e985dd4e9db3045e959079ea124d (want 1c9a4910d924e985dd4e9db3045e959079ea124d) +tree matches f7c8537b3^{tree}: NO +canonical lacks the commit (local only): yes +remote-tracking refs unchanged: NO +working repo refs unchanged: yes +target status after: [?? node_modules ] +worktrees after: 1 +bus unchanged: yes +Squash-merge work/vikunja-19-265 into refactor + +Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 1c9a4910d924e985dd4e9db3045e959079ea124d, +the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + +Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 +Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 +Work-ref: work/vikunja-19-265 +Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 +Base: refactor 1c9a4910d924e985dd4e9db3045e959079ea124d +Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 +Gate: full, every package suite and every scripts/test-*.sh +Applied-under: scripts/land-work.sh (conductor) + +== 19/229 (010d30cbe) must refuse root-file +land-work: refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs +229 rc=2 root-file: yes +land-work scratch left: 0, other tmp entries: 347 diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/replay.sh b/agents/darkwing/work/queue-116/r1/replay-1c9a/replay.sh new file mode 100755 index 000000000..5bf4751e3 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/replay.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# Row 116 replay (packet only): 19/265 against a scratch copy of the working +# repository and a target clone with refactor at 1c9a4910d, dry-run then +# real; then the 19/229 fixture decision, which must refuse root-file. +set -uo pipefail +WT=~/darkwing-scratch/r116/wt +CANON=/mnt/storage/src/mosaic-stack +LIVE_WORKING=$HOME/.mosaic-dev/working/mosaic-stack/stack.git +ROWS=$CANON/agents/sage/work/row116/live-rows.json +HERE="$(cd "$(dirname "$0")" && pwd)" +R=~/darkwing-scratch/r116/replay +# Short on purpose: the cli suite puts unix sockets under TMPDIR, and a +# sun_path holds 107 bytes. r116/replay/tmp (46 bytes) failed 8 cli tests. +T=~/darkwing-scratch/rt +D=f71c73c9-c759-4aca-98d9-3e22e8c42b36 +D229=d2290000-0000-4000-8000-000000000229 +BASE0=1c9a4910d +WANT_TREE="$(git -C "$CANON" rev-parse f7c8537b3^{tree})" +rm -rf "$R" "$T" +mkdir -p "$T" +git clone -q --no-checkout "$CANON" "$R/target" +git -C "$R/target" checkout -q -B refactor "$BASE0" +ln -s "$CANON/node_modules" "$R/target/node_modules" +for n in 265 229; do + mkdir -p "$R/cfg$n/businesses" "$R/data$n/working/mosaic-stack" + chmod 700 "$R/data$n" + cp -a "$LIVE_WORKING" "$R/data$n/working/mosaic-stack/stack.git" + printf '{"configVersion":1,"environment":"development","dataRoot":"%s","execution":{"backend":"docker","provider":"zai","model":"m","adapter":"mock"}}\n' \ + "$R/data$n" > "$R/cfg$n/config.json" + printf '{"id":"mosaic-stack","human":"jason","projects":{"stack":{"root":"%s"}}}\n' "$R/target" > "$R/cfg$n/businesses/mosaic-stack.json" + node "$HERE/rows.mjs" "$ROWS" "$n" > "$R/rows$n.json" && (cd "$WT" && node scripts/land-work/fixture.mjs "$R/data$n" "$R/rows$n.json") \ + || { echo "STOP fixture $n"; exit 9; } +done +lw() { (cd "$WT" && MOSAIC_CONFIG="$R/cfg$1/config.json" TMPDIR="$T" bash scripts/land-work.sh "${@:2}"); } +snap() { + git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' + git -C "$R/target" reflog --format='%H %gs' refactor + git -C "$R/target" status --porcelain=v1 --untracked-files=all + git -C "$R/target" worktree list --porcelain + git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' + sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1 +} +echo "base $(git -C "$R/target" rev-parse refactor) want tree $WANT_TREE" +echo "== 19/265 --dry-run" +snap > "$R/before.txt" +git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' > "$R/working-before.txt" +rc=0; lw 265 "$D" --dry-run > "$R/dry.out" 2> "$R/dry.err" || rc=$? +snap > "$R/after-dry.txt" +cat "$R/dry.out"; tail -n 40 "$R/dry.err" +echo "dry rc=$rc" +DRY_TREE="$(sed -n 's/^land-work (dry-run): would commit tree \([0-9a-f]*\) .*/\1/p' "$R/dry.out")" +echo "dry tree $DRY_TREE matches f7c8537b3^{tree}: $([ "$DRY_TREE" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "dry-run wrote no ref: $(cmp -s "$R/before.txt" "$R/after-dry.txt" && echo yes || echo NO)" +[ "$rc" -eq 0 ] || { echo "STOP dry-run rc=$rc"; exit 1; } +echo "== 19/265 landing" +rc=0; lw 265 "$D" > "$R/land.out" 2> "$R/land.err" || rc=$? +cat "$R/land.out"; tail -n 40 "$R/land.err" +echo "land rc=$rc" +NEW="$(git -C "$R/target" rev-parse refactor)" +echo "new $NEW parent $(git -C "$R/target" rev-parse "$NEW^") (want $(git -C "$CANON" rev-parse $BASE0))" +echo "tree matches f7c8537b3^{tree}: $([ "$(git -C "$R/target" rev-parse "$NEW^{tree}")" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "canonical lacks the commit (local only): $(git -C "$CANON" cat-file -e "$NEW" 2>/dev/null && echo NO || echo yes)" +echo "remote-tracking refs unchanged: $(diff <(grep ' refs/remotes/' "$R/before.txt") <(git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' refs/remotes) >/dev/null && echo yes || echo NO)" +echo "working repo refs unchanged: $(git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' | cmp -s - "$R/working-before.txt" && echo yes || echo NO)" +echo "target status after: [$(git -C "$R/target" status --porcelain=v1 --untracked-files=all | tr '\n' ' ')]" +echo "worktrees after: $(git -C "$R/target" worktree list | wc -l)" +echo "bus unchanged: $([ "$(sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1)" = "$(tail -n1 "$R/before.txt")" ] && echo yes || echo NO)" +git -C "$R/target" log -1 --format=%B "$NEW" +echo "== 19/229 (010d30cbe) must refuse root-file" +rc=0; lw 229 "$D229" --dry-run > "$R/r229.out" 2> "$R/r229.err" || rc=$? +cat "$R/r229.out" "$R/r229.err" +echo "229 rc=$rc root-file: $(grep -q 'refused: root-file' "$R/r229.err" && echo yes || echo NO)" +echo "land-work scratch left: $(ls -d "$T"/land-work.* 2>/dev/null | wc -l), other tmp entries: $(ls -A "$T" | grep -cv '^land-work')" diff --git a/agents/darkwing/work/queue-116/r1/replay-1c9a/working-before.txt b/agents/darkwing/work/queue-116/r1/replay-1c9a/working-before.txt new file mode 100644 index 000000000..c94303f3d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-1c9a/working-before.txt @@ -0,0 +1,3 @@ +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/after-dry.txt b/agents/darkwing/work/queue-116/r1/replay-4bc9/after-dry.txt new file mode 100644 index 000000000..15e00aa18 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/after-dry.txt @@ -0,0 +1,75 @@ +refs/heads/refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +refs/remotes/origin/HEAD bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/docs/1507-chat-01c-r2 f7fab8b64575e00d13654fa114abb74273e15b05 +refs/remotes/origin/feat/1311-credential-seat-store 87c12a27267c9ea8d06b71f249b191f6e08b766b +refs/remotes/origin/fix/retry-lineage-v1 afd5827db8af02cf03c514c605a9ef9ab763c467 +refs/remotes/origin/fix/roles-dir-v1 527bc581cada649fc1d503c309f19fc501b38cf8 +refs/remotes/origin/foundation/adapter-seam-v1 594b8d711c1238cbdbc5b13284a00f222e6cf9d2 +refs/remotes/origin/foundation/agent-seats-v1 9bd4f1c4056d28e3b0806d13289667c8d536d80e +refs/remotes/origin/foundation/config-v1 81f58b15c8497bb25e9a0d2fa9f22aa71db9cddb +refs/remotes/origin/foundation/interactive-agent-v1 7db4c5c2ed66254e6504ea9c40f7fcd971c2a63f +refs/remotes/origin/foundation/mission-policy-v1 2ff49adff432790149031443b978560585dfe697 +refs/remotes/origin/foundation/mission-task-v1 7f0408d417709b8f33b59a7094119e06cf947aeb +refs/remotes/origin/foundation/operator-ergonomics-v1 24bdef75fa096f2520efbdf4de670bcabae84101 +refs/remotes/origin/foundation/release-v1 35ea46466150602357256365e2a2b4c0e28cc9f4 +refs/remotes/origin/foundation/retention-v1 88eef507b0cfa80f4153afd566c4fed61e138eff +refs/remotes/origin/foundation/session-fork-v1 88d9cf750f3d20c30f0dad07562135e9b32db343 +refs/remotes/origin/foundation/sessions-v1 be555497009607cf0a5f75c174924d292febc5d4 +refs/remotes/origin/foundation/skill-lifecycle-v1 9fd16b9739fdafa331f4f872a94f2337ef9dc6e1 +refs/remotes/origin/foundation/user-context-v1 a7b612435b374f578364f7e065e0ba8b61b09d2d +refs/remotes/origin/foundation/workspaces-capabilities-v1 b017e66e175c8b7efa2be38fda89978914de72f0 +refs/remotes/origin/main 9a5fbdbda74b16adf488fe28138b2ba69ea5e669 +refs/remotes/origin/orchestration/conductor-v1 83c4e9851efd885c9e8b6af7e845c672780602f0 +refs/remotes/origin/refactor bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/worktree-agent-a1044a9b545fa3a36 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a44468a48c485520e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a4fe093597cbfbb5b 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a7038df8212b2da8a 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-aae703ffcabbad4b7 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-abe72e00ca2bcdf7e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/tags/adapter-seam-v1 d539744a51c1529c034aad0b6b6b25caa5618f1e +refs/tags/agent-seats-v1 e53d86d55344c8ac91e4403c1930d2d354193372 +refs/tags/archive/ms24-fork-20260823 328967705692db073c63a381ed3c406b6c7c2f68 +refs/tags/auto-apply-v1 ce1a28d6fbea7fb1cdfc06502b2bf8ab4788da7b +refs/tags/conductor-v1 ac665b360eb7abd17af7e7030ff764c0adb4f247 +refs/tags/config-hello-v1 8912dfb2c8ca43bd211b3607a2a06e2d8d11cf40 +refs/tags/fed-v0.1.0-m1 8650a7da2369f7bdea489f3749ca4657457ba5ed +refs/tags/fed-v0.2.0-m2 4ece6dc643126d3b763fc942301660b2a594d856 +refs/tags/interactive-agent-v1 661c954cc217ac847c04c33794e9de7b28b7a807 +refs/tags/mission-policy-v1 7ae1cee48ec036578b1c71d03cb5d985fe89bfc2 +refs/tags/mission-task-v1 6d51cc67874b23df762400f7b9f6b12d9ed3cb61 +refs/tags/mosaic-v0.0.24 f6cc91aa66470d2ecf006b56bd5ec81917be7dd2 +refs/tags/mosaic-v0.0.25 d5b1a92372244b38e6facb5d61d52a2bb456562f +refs/tags/mosaic-v0.0.26 56ebfa239910dbe4b4a5ecd988a9257ae7638cb5 +refs/tags/mosaic-v0.0.27 bd76df1a50d0ce650bbcf8ff3cf0d164ac3bbc03 +refs/tags/mosaic-v0.0.28 1bfd8570d6ea69b26db81655c120a3af4943987a +refs/tags/mosaic-v0.0.29 81c1775a03d14d1cf5babcbccab300e40eb0e348 +refs/tags/mosaic-v0.0.31 aa221bf92ea7da535153f782489978bf2085951f +refs/tags/onboarding-v1 f08298e1a8fbfbc98dfb721552bcd24fdacf9785 +refs/tags/operator-ergonomics-v1 744b19c5bea305bb63ac91539eae7b0a3f3ecc69 +refs/tags/poc-container-hello-v0 988007f34e5dcd756ee35dad73c76cbf72712364 +refs/tags/release-model-v1 5184afed6471548d44df449f29c39b8863f8f89c +refs/tags/retention-v1 99be1ef526bb9fa1347445bfb4033dcdc0072b33 +refs/tags/session-fork-v1 4a87942c2087c0f7129312e37985f432d7eed031 +refs/tags/sessions-v1 6fbe9f08b5fb211ca79cc76bda3ce43e6bf8c110 +refs/tags/skill-lifecycle-v1 91aa52e052c0886cf3ff93055ef6db905f02b997 +refs/tags/v0.0.39-alpha 528700ceea2d31ab781e08a8ea38232a2fbbbce1 +refs/tags/v0.0.4 b5325ad11afea129b8b88b2f7d7b9b05f7a27fb5 +refs/tags/v0.0.5 5ed69075c42543401e91929e01bac84329eadfe1 +refs/tags/v0.0.6 3f261b7d21297ff4cfe860b4f7e50a5993a497fd +refs/tags/v0.0.7 36ed6b19b229ab5621237b401b49784d165b05be +refs/tags/v0.0.8 5e54f099142310608ff83301232a7d3e5ca91d31 +refs/tags/v0.1.0 6da6e6dc24d806f02c8042783ee393acf8317942 +refs/tags/v0.2.0 a4537c90b7cd368161e86769dbadfe5d7d1342f1 +refs/tags/workspace-capabilities-v1 67d6e8ac44623d721e13b50a8a9d873eeebb23fc +4bc908991cacf77b04437cbab0a9c1c0d7eaa77c branch: Reset to 4bc908991 +bea5dfa47fd57b49dc29c1aa781d99cde263acac clone: from /mnt/storage/src/mosaic-stack +?? node_modules +worktree /home/jwoltje/darkwing-scratch/r116/replay-4bc908991/target +HEAD 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +branch refs/heads/refactor + +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 +801017277d9e86cbdcf93eff3fff60b384a04ae3cdb029e0fc2d25b539db4d2b diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/before.txt b/agents/darkwing/work/queue-116/r1/replay-4bc9/before.txt new file mode 100644 index 000000000..15e00aa18 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/before.txt @@ -0,0 +1,75 @@ +refs/heads/refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +refs/remotes/origin/HEAD bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/docs/1507-chat-01c-r2 f7fab8b64575e00d13654fa114abb74273e15b05 +refs/remotes/origin/feat/1311-credential-seat-store 87c12a27267c9ea8d06b71f249b191f6e08b766b +refs/remotes/origin/fix/retry-lineage-v1 afd5827db8af02cf03c514c605a9ef9ab763c467 +refs/remotes/origin/fix/roles-dir-v1 527bc581cada649fc1d503c309f19fc501b38cf8 +refs/remotes/origin/foundation/adapter-seam-v1 594b8d711c1238cbdbc5b13284a00f222e6cf9d2 +refs/remotes/origin/foundation/agent-seats-v1 9bd4f1c4056d28e3b0806d13289667c8d536d80e +refs/remotes/origin/foundation/config-v1 81f58b15c8497bb25e9a0d2fa9f22aa71db9cddb +refs/remotes/origin/foundation/interactive-agent-v1 7db4c5c2ed66254e6504ea9c40f7fcd971c2a63f +refs/remotes/origin/foundation/mission-policy-v1 2ff49adff432790149031443b978560585dfe697 +refs/remotes/origin/foundation/mission-task-v1 7f0408d417709b8f33b59a7094119e06cf947aeb +refs/remotes/origin/foundation/operator-ergonomics-v1 24bdef75fa096f2520efbdf4de670bcabae84101 +refs/remotes/origin/foundation/release-v1 35ea46466150602357256365e2a2b4c0e28cc9f4 +refs/remotes/origin/foundation/retention-v1 88eef507b0cfa80f4153afd566c4fed61e138eff +refs/remotes/origin/foundation/session-fork-v1 88d9cf750f3d20c30f0dad07562135e9b32db343 +refs/remotes/origin/foundation/sessions-v1 be555497009607cf0a5f75c174924d292febc5d4 +refs/remotes/origin/foundation/skill-lifecycle-v1 9fd16b9739fdafa331f4f872a94f2337ef9dc6e1 +refs/remotes/origin/foundation/user-context-v1 a7b612435b374f578364f7e065e0ba8b61b09d2d +refs/remotes/origin/foundation/workspaces-capabilities-v1 b017e66e175c8b7efa2be38fda89978914de72f0 +refs/remotes/origin/main 9a5fbdbda74b16adf488fe28138b2ba69ea5e669 +refs/remotes/origin/orchestration/conductor-v1 83c4e9851efd885c9e8b6af7e845c672780602f0 +refs/remotes/origin/refactor bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/worktree-agent-a1044a9b545fa3a36 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a44468a48c485520e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a4fe093597cbfbb5b 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a7038df8212b2da8a 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-aae703ffcabbad4b7 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-abe72e00ca2bcdf7e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/tags/adapter-seam-v1 d539744a51c1529c034aad0b6b6b25caa5618f1e +refs/tags/agent-seats-v1 e53d86d55344c8ac91e4403c1930d2d354193372 +refs/tags/archive/ms24-fork-20260823 328967705692db073c63a381ed3c406b6c7c2f68 +refs/tags/auto-apply-v1 ce1a28d6fbea7fb1cdfc06502b2bf8ab4788da7b +refs/tags/conductor-v1 ac665b360eb7abd17af7e7030ff764c0adb4f247 +refs/tags/config-hello-v1 8912dfb2c8ca43bd211b3607a2a06e2d8d11cf40 +refs/tags/fed-v0.1.0-m1 8650a7da2369f7bdea489f3749ca4657457ba5ed +refs/tags/fed-v0.2.0-m2 4ece6dc643126d3b763fc942301660b2a594d856 +refs/tags/interactive-agent-v1 661c954cc217ac847c04c33794e9de7b28b7a807 +refs/tags/mission-policy-v1 7ae1cee48ec036578b1c71d03cb5d985fe89bfc2 +refs/tags/mission-task-v1 6d51cc67874b23df762400f7b9f6b12d9ed3cb61 +refs/tags/mosaic-v0.0.24 f6cc91aa66470d2ecf006b56bd5ec81917be7dd2 +refs/tags/mosaic-v0.0.25 d5b1a92372244b38e6facb5d61d52a2bb456562f +refs/tags/mosaic-v0.0.26 56ebfa239910dbe4b4a5ecd988a9257ae7638cb5 +refs/tags/mosaic-v0.0.27 bd76df1a50d0ce650bbcf8ff3cf0d164ac3bbc03 +refs/tags/mosaic-v0.0.28 1bfd8570d6ea69b26db81655c120a3af4943987a +refs/tags/mosaic-v0.0.29 81c1775a03d14d1cf5babcbccab300e40eb0e348 +refs/tags/mosaic-v0.0.31 aa221bf92ea7da535153f782489978bf2085951f +refs/tags/onboarding-v1 f08298e1a8fbfbc98dfb721552bcd24fdacf9785 +refs/tags/operator-ergonomics-v1 744b19c5bea305bb63ac91539eae7b0a3f3ecc69 +refs/tags/poc-container-hello-v0 988007f34e5dcd756ee35dad73c76cbf72712364 +refs/tags/release-model-v1 5184afed6471548d44df449f29c39b8863f8f89c +refs/tags/retention-v1 99be1ef526bb9fa1347445bfb4033dcdc0072b33 +refs/tags/session-fork-v1 4a87942c2087c0f7129312e37985f432d7eed031 +refs/tags/sessions-v1 6fbe9f08b5fb211ca79cc76bda3ce43e6bf8c110 +refs/tags/skill-lifecycle-v1 91aa52e052c0886cf3ff93055ef6db905f02b997 +refs/tags/v0.0.39-alpha 528700ceea2d31ab781e08a8ea38232a2fbbbce1 +refs/tags/v0.0.4 b5325ad11afea129b8b88b2f7d7b9b05f7a27fb5 +refs/tags/v0.0.5 5ed69075c42543401e91929e01bac84329eadfe1 +refs/tags/v0.0.6 3f261b7d21297ff4cfe860b4f7e50a5993a497fd +refs/tags/v0.0.7 36ed6b19b229ab5621237b401b49784d165b05be +refs/tags/v0.0.8 5e54f099142310608ff83301232a7d3e5ca91d31 +refs/tags/v0.1.0 6da6e6dc24d806f02c8042783ee393acf8317942 +refs/tags/v0.2.0 a4537c90b7cd368161e86769dbadfe5d7d1342f1 +refs/tags/workspace-capabilities-v1 67d6e8ac44623d721e13b50a8a9d873eeebb23fc +4bc908991cacf77b04437cbab0a9c1c0d7eaa77c branch: Reset to 4bc908991 +bea5dfa47fd57b49dc29c1aa781d99cde263acac clone: from /mnt/storage/src/mosaic-stack +?? node_modules +worktree /home/jwoltje/darkwing-scratch/r116/replay-4bc908991/target +HEAD 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +branch refs/heads/refactor + +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 +801017277d9e86cbdcf93eff3fff60b384a04ae3cdb029e0fc2d25b539db4d2b diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.err b/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.err new file mode 100644 index 000000000..f166591c5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.err @@ -0,0 +1,24 @@ +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt-4bc9/land-work-logs.adiLIr +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.out b/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.out new file mode 100644 index 000000000..696b08cf2 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/dry.out @@ -0,0 +1,15 @@ +land-work (dry-run): would commit tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f on refactor at 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, patch-id 26100825e412, with this message: + Squash-merge work/vikunja-19-265 into refactor + + Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, + the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + + Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 + Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 + Work-ref: work/vikunja-19-265 + Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 + Base: refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c + Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 + Gate: full, every package suite and every scripts/test-*.sh + Applied-under: scripts/land-work.sh (conductor) +land-work (dry-run): no ref was written. diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/gate.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/gate.log new file mode 100644 index 000000000..6578a1e50 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/gate.log @@ -0,0 +1,23 @@ +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-bus.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-bus.log new file mode 100644 index 000000000..ac3810327 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-bus.log @@ -0,0 +1,156 @@ +✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (251.798703ms) +✔ agents: working counts what the holder received and has not read; routed alone is not working (207.63738ms) +✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (342.533083ms) +✔ agents: working wins over waiting, and Input needed still shows (152.092939ms) +✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (221.126463ms) +✔ agents: state reads only its own business, even for a run name both use (208.364264ms) +✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (206.305885ms) +✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (192.849125ms) +✔ agents: stranded is oldest first and capped at 50 for a role (848.156116ms) +✔ agents: stranded is per role and per business (325.168931ms) +✔ agents: a message routed to a held role and not yet received is not stranded (131.857591ms) +✔ launch identity is stamped, payload identity is refused and stale holder cannot send (253.27586ms) +✔ decision classes route from policy; gated resolution is human-only, choice and target must match (257.444327ms) +✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (281.895808ms) +✔ launch events require a human CLI capability; generic emit cannot forge authority events (169.04911ms) +✔ within-role decisions close atomically and invalid options or blocking omissions refuse (206.234505ms) +✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (280.734537ms) +✔ observer capabilities read human inbox but cannot mutate or forge launch identity (166.481251ms) +✔ task action subjects and linked decision trail are complete and ordered (188.486506ms) +✔ launch binding is durable and reconnecting requires the identical trusted record (129.009753ms) +✔ business isolation includes inherited object names and cross-business message references (211.029793ms) +✔ authority never transfers between action, run, target, unresolved or replaced role holder (258.79056ms) +✔ task projection uses schema current view, skipping earlier and equal-start polls (129.480521ms) +✔ revocation permanently bars the old run from reclaiming first, including after broker restart (218.820877ms) +✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (145.43077ms) +✔ both arbiters require human resolution when their cross-role route is themselves (232.643789ms) +✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (126.015021ms) +✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.575938ms) +✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (192.046588ms) +✔ credentials refuses a role session and any argument (184.737753ms) +✔ credentials reads the status on each request, and a broker without one lists none (219.35056ms) +✔ the broker process answers credentials without a token, path or variable in its output, log or store (188.795112ms) +✔ only validated broker references load; returned data and exceptions cannot expose a known token (4.235ms) +✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (3.014576ms) +✔ expiry refuses use and env references never become client data (0.789873ms) +✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.795642ms) +✔ opaque tokens shorter than 16 characters refuse before use (0.425638ms) +✔ roles lists open decisions routed to a role, and never the human inbox (305.408365ms) +✔ recent lists closed decisions of every route, newest close first, with how each closed (289.69075ms) +✔ recent gives the closing event as closed when the decision was seen first (297.896492ms) +✔ recent stops at RECENT rows (813.889619ms) +✔ every row is what trail already gives the same session for that id (260.603039ms) +✔ a role session can't list decisions, so it can't read another role's open decisions (397.601657ms) +✔ decisions is a read: one business, strict arguments, nothing written (361.565558ms) +✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (242.709865ms) +✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (129.976544ms) +✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (153.844068ms) +✔ endLaunch leaves a claim another run took alone (181.880148ms) +✔ refuse records action.refused against the caller with the code only (139.17165ms) +✔ launches off refuses role.launch with launch-revoked until launches on (200.217011ms) +✔ broker process: launch ops authorize role.launch, record refusals and end runs (263.769625ms) +✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (4.291379ms) +✔ process reader gets own kernel identity without exposing environment values (0.752248ms) +✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (1.102086ms) +✔ real pid 1 remains inspectable when its environment is protected (0.418236ms) +✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (301.79326ms) +✔ missing and foreign-business citations refuse and roll back message and grant (193.456653ms) +✔ cross-role sends still need a matching resolved decision and consume it once (253.762626ms) +✔ messages pages all human messages newest first without writes; read state is history (2661.095598ms) +✔ messages refuses role callers, invalid paging and cursors outside this human feed (242.170127ms) +✔ views messages passes only its paging arguments through (0.287318ms) +✔ messages isolates businesses even with a valid foreign cursor (179.876423ms) +✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (257.96461ms) +✔ startup token refusal returns safe code without value or partial listening broker (43.13888ms) +✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (184.744132ms) +✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (189.418719ms) +✔ trusted host registers later launches; socket clients never have a registration verb (179.803226ms) +✔ runtime excludes declared project roots even when host supplies no repoRoots (40.310092ms) +✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (187.117803ms) +✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (319.828166ms) +✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (209.344475ms) +✔ a message with no reply gives an empty list (162.114007ms) +✔ replies come oldest first and stop at REPLIES (779.75435ms) +✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (298.215275ms) +✔ strict arguments; a role session gets human-required (389.494706ms) +✔ views passes replies through as one call with the id (0.272097ms) +✔ requirements returns the committed list to a holding role session, and no one else (294.252312ms) +✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (158.193108ms) +✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (184.99074ms) +✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (313.789577ms) +✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (264.599193ms) +✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (295.916598ms) +✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (398.494568ms) +✔ reviewFetch answers only the addressed reviewer, for the request it cites (249.472831ms) +✔ review.verdict answers one request once, to the role that asked (300.44433ms) +✔ task.close on a pushed task needs an approve verdict for the latest push (371.451287ms) +✔ a refusal the host decided is filed on the task it names, and only a task ref counts (239.020074ms) +✔ v3b prototype refusals, views and append-only mutations (1170.198333ms) +✔ gated approval authorizes once, survives store reopen, and fresh approval works (317.719242ms) +✔ another run cannot consume an approval; a failed check leaves it usable (230.229198ms) +✔ two scheduled callers have exactly one grant and one consumed refusal (176.731177ms) +✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (336.725488ms) +✔ class drift gated to cross-role refuses before consumption (256.757787ms) +✔ class drift cross-role to gated refuses before consumption (244.111844ms) +✔ class drift gated to within-role refuses before consumption (233.935447ms) +✔ class drift cross-role to within-role refuses before consumption (262.965458ms) +✔ class drift within-role to gated refuses before consumption (203.291818ms) +✔ class drift within-role to cross-role refuses before consumption (175.866354ms) +✔ message.send consumes approval and prevents a later send or authorize (224.487235ms) +✔ role.revoke consumes approval and prevents a later revoke or authorize (251.459523ms) +✔ a business that never switched launches reads allowed with no time and no event (179.638383ms) +✔ launches revoked and then restored read allowed, with the restore time and event id (155.432061ms) +✔ a task closed on the tracker leaves the open list, and total counts the open ones (163.782175ms) +✔ a tombstone is not open (141.117321ms) +✔ the open list stops at the cap and says so; total still counts every open task (145.954222ms) +✔ a role and a reader session read state; arguments, and an unbound cap, refuse (148.135155ms) +✔ a human session reads the same state, with the same cap (142.567012ms) +✔ reading state writes nothing: every table keeps its row count (165.905431ms) +✔ creates private WAL store and excludes a second writer until explicit close (187.850324ms) +✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (164.130494ms) +✔ existing empty database and symlink runtime directory refuse, never initialize over damage (197.080942ms) +✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (181.915443ms) +✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (108.907811ms) +✔ async transactions refuse before invoking their function (108.53927ms) +✔ the session default fits under the reply cap and pages to the end with next (311.936711ms) +✔ the short form: no description, assignees by role, every listed key (240.94946ms) +✔ each filter, alone and together, and total counts every match (319.653944ms) +✔ task_ref reads one task in full, as the whole board has it (271.271001ms) +✔ no arguments is the read the Console and mosaic make, unchanged (253.461371ms) +✔ an unknown argument or a bad value refuses invalid-request (922.019427ms) +✔ tasks rows carry priority and requirement for every session that reads tasks (325.38483ms) +✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (355.41856ms) +✔ an empty business and one with snapshots but no task.created read cleanly (110.127195ms) +✔ recordTask keeps sync reads and a role write apart (191.895136ms) +✔ read_at must be one canonical UTC format, so the projection compares strings safely (98.2776ms) +✔ a bad entry refuses the whole record (128.748825ms) +✔ taskView reads the projection for one business (134.093276ms) +✔ requestTask hands only a holder and a task verb to the handler, and records refusals (235.838435ms) +✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (408.387256ms) +✔ without an adapter the server refuses every task verb (216.779444ms) +✔ the runtime refuses an invalid adapter and closes a valid one (208.322733ms) +✔ the process loads the S3 adapter from plain-data trackers (246.768108ms) +✔ the tester binds only when the business sets bus.tester to exactly true (797.179928ms) +✔ a business may not name a role tester, so the tester address is never a role (253.001314ms) +✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (523.677967ms) +✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (214.274732ms) +✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (250.415913ms) +✔ the tester reads the human views a reader reads (134.250654ms) +✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.285399ms) +✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.37315ms) +✔ testerNonce reads only the tester's variable and gives null on any read error (0.221177ms) +✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (65.813568ms) +✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (716.805485ms) +✔ socket capability stamps launch identity; shared views use wire, no SQL client (157.983949ms) +✔ two wire claims serialize; a lost reply never automatically retries (178.624895ms) +✔ malformed, oversized and identity-forging envelopes refuse without echoing input (111.487611ms) +✔ client preserves UTF-8 when a response divides a multibyte character (12.105862ms) +✔ committed mutation followed by dropped reply reports unknown and is never retried (138.838472ms) +ℹ tests 148 +ℹ suites 0 +ℹ pass 148 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4123.399854 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-business.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-business.log new file mode 100644 index 000000000..7b29c0613 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-business.log @@ -0,0 +1,75 @@ +✔ config directory and file path follow MOSAIC_CONFIG (1.833985ms) +✔ the fixture business validates and comes back frozen (5.624028ms) +✔ two instances may share a definition (1.995292ms) +✔ top-level refusals (5.319829ms) +✔ arbiters and projects (6.040039ms) +✔ role instances (2.657494ms) +✔ Vikunja bots (6.244576ms) +✔ a role without Vikunja takes no tracker block (2.859147ms) +✔ credential references match the definition's services (3.490485ms) +✔ launch (10.81692ms) +✔ loadBusiness: file checks (2.582129ms) +✔ loadBusiness: not a regular file (40.354814ms) +✔ loading writes nothing (1.000398ms) +✔ names that are Object.prototype properties don't count as declared (2.545248ms) +✔ the shipped example refuses as written and validates once filled in (0.509223ms) +✔ the role file loads and resolves through loadBusiness (5.384137ms) +✔ the shipped file is exactly decision 104's list (0.743848ms) +✔ the resolved record matches decision 104, so a widened file fails (1.794818ms) +✔ message.send is within role and every other action is gated (1.179899ms) +✔ a business grant of a gated action through limits does not widen the role (1.341345ms) +✔ a launch block whose by is the chief-of-staff instance is refused (2.158207ms) +✔ the instance takes no credential references and no tracker (2.46052ms) +✔ usage errors exit 4 (288.547114ms) +✔ validate: a good business exits 0 and prints instance digests (80.311291ms) +✔ validate: project files (333.837123ms) +✔ validate: missing files and a broken system config (254.395688ms) +✔ validate: credential reference problems exit 2 and name each one (69.928752ms) +✔ validate: a token file inside the repository is refused (69.276324ms) +✔ validate: role definitions come from MOSAIC_ROLES_DIR (209.717421ms) +✔ resolve: prints one instance's record (200.709265ms) +✔ resolve: refusals (385.472166ms) +✔ parse: exactly one of file or env, plus the service's date (3.22725ms) +✔ check: a good file has no problems (0.951368ms) +✔ check never opens the file: a write-only token passes (0.337748ms) +✔ check: file problems (0.843007ms) +✔ check: token files can't live in the repository or dataRoot, even through a linked directory (0.876059ms) +✔ check: dates and environment references (0.343987ms) +✔ path and load (2.271208ms) +✔ refusals (1.179709ms) +✔ systemVars flattens the validated config (1.915331ms) +✔ precedence: system, business, project, project role, agent (5.992574ms) +✔ limits narrow the definition and never widen it (2.978155ms) +✔ role.launch stays within-role only for the instance the launch block names (6.716689ms) +✔ limits.authority without role.launch leaves the launcher with no launch block (2.528717ms) +✔ limits.authority narrows cross-role actions too (1.465798ms) +✔ classify (1.683125ms) +✔ the record carries what the broker and launcher need (1.329711ms) +✔ digest: key order doesn't matter, any value change does (9.429608ms) +✔ refusals (2.435474ms) +✔ the four shipped version 2 roles load (4.13478ms) +✔ shipped role scopes match addendum B section 2 and the SR runbook (1.357684ms) +✔ shipped authority follows the note's table (0.832146ms) +✔ version 1 files keep loading with no authority (1.191281ms) +✔ the conductor policy isn't a role (0.225801ms) +✔ a missing role file is exit 4, a symbolic link too (0.346123ms) +✔ version 2 refusals (1.12821ms) +✔ authority: closed vocabulary, no gated-only action, no overlap (1.825919ms) +✔ credentials: Gitea scopes (0.876905ms) +✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.000227ms) +✔ credentials: services (0.501414ms) +✔ contract: a non-empty regular Markdown file beside the role file (0.613211ms) +✔ every key names known layers and a merge rule (1.126482ms) +✔ unknown keys and wrong layers refuse (0.770813ms) +✔ types (1.701354ms) +✔ merge: defaults, then the most specific layer wins (0.2473ms) +✔ merge: limits only narrow, and provenance lists each source (0.289684ms) +✔ merge doesn't change its inputs (0.117975ms) +ℹ tests 67 +ℹ suites 0 +ℹ pass 67 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 1968.967643 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-cli.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-cli.log new file mode 100644 index 000000000..4320d05a5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-cli.log @@ -0,0 +1,194 @@ +✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1469.788388ms) +✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (84.323781ms) +✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (194.19185ms) +✔ NO_COLOR: no escape codes, except reverse video on the selected row (283.123824ms) +✔ 1-9 shows the decide flow's own lines and question; only y resolves (182.609148ms) +✔ the app shows the same decide text as mosaic decide (122.317239ms) +✔ any key but y or Y at the question answers No; nothing is sent (3066.60036ms) +✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (403.180144ms) +✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1373.034278ms) +✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (99.537676ms) +✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (141.081757ms) +✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (1043.994441ms) +✔ quitting at the question answers No and sends nothing, armed or not (188.663898ms) +✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (131.884325ms) +✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (130.600859ms) +✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (887.908339ms) +✔ at every size the decide box shows each line y depends on, or says it is hidden (9097.731076ms) +✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (164.034647ms) +✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (105.669423ms) +✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (59.295215ms) +✔ keys: views, moving, trail of a selection, the command line, help and quit (233.026858ms) +✔ one option: the status line says Press 1, not 1-1 (91.535605ms) +✔ no business: the app says so and :business picks one (48.35783ms) +✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.866683ms) +✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (184.857585ms) +✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.524959ms) +✔ decide with --note still asks; a No sends nothing (49.072895ms) +✔ the app's business comes from a live bus host only (1.095186ms) +✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.987501ms) +✔ draw is pure: same state, same frame (0.807599ms) +✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (177.683155ms) +✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (137.12487ms) +✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (130.264898ms) +✔ decide prints a declining choice as declining (182.036498ms) +✔ an unknown outcome is reported once and never resent (140.943941ms) +✔ a decision closed before the answer arrives exits 2 and points at its trail (317.661768ms) +✔ a prefix that matches two open decisions exits 2 and resolves neither (121.28952ms) +✔ without --business a command uses the live host's business, and a stale host.json is not a host (101.406649ms) +✔ every human command refuses inside an agent run before it touches the bus (110.109235ms) +✔ usage errors exit 4; no business and no host is a usage error (156.49468ms) +✔ agents and tasks print through the broker (109.416615ms) +✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (4.152524ms) +✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (79.72093ms) +✔ trackers come from the tracker.* variables of the one project that names a tracker project (101.109807ms) +✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (38.722687ms) +✔ two projects that each name a tracker project refuse, since the boot shape holds one (38.628794ms) +✔ a business without tracker.baseUrl gets no trackers entry (34.467566ms) +✔ an unknown business and a broken system config refuse with exit 3 (75.83012ms) +✔ follow prints an unsolicited message after plain talk returned (223.24397ms) +✔ talk --follow continues after reply and prints a later unsolicited message (224.089268ms) +✔ inbox lists all unread human messages under decisions, does not deliver or read them (3740.709272ms) +✔ follow refuses agent context and bad arguments (87.705309ms) +✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (489.195105ms) +✔ plain talk leaves the process SIGINT handlers unchanged (533.889342ms) +✔ empty views say so (2.004596ms) +✔ the trail keeps the broker's order and names a decision's task without its rows (3.370299ms) +✔ tasks print the tracker fields the snapshot carries (0.288504ms) +✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (966.020473ms) +✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (779.89695ms) +✔ the size cap refuses a push before any byte (367.521434ms) +✔ a fetch over the cap refuses before any byte reaches the reviewer (619.564785ms) +✔ the socket refuses a request with no capability, an unknown one, and a bad request line (1401.081279ms) +✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1278.261732ms) +✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (391.279915ms) +✔ a review of a project the business no longer has refuses unknown-project (432.181265ms) +✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (387.827352ms) +✔ close() answers host-closing to a connection still sending its request line (280.258776ms) +✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (757.118973ms) +✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (921.095415ms) +✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (647.507144ms) +✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.81451ms) +✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (574.635792ms) +✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (4.353273ms) +✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (300.749468ms) +✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (472.257015ms) +✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1033.534074ms) +✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (279.072883ms) +✔ a second host for the same data root refuses with exit 3 while the first runs (202.66522ms) +✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (620.70208ms) +✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (1.638947ms) +✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.849955ms) +✔ a live host's lock stays, however old the file is (0.605573ms) +✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (881.214643ms) +✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (215.887791ms) +✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (29.642339ms) +✔ a broker fork that throws leaves no host.lock and no host.json (33.035544ms) +✔ a broker send that throws leaves no host.lock and no host.json (30.833348ms) +✔ a broker that misses its boot wait leaves no host.lock and no host.json (157.971213ms) +✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (562.135402ms) +✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (180.886323ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (545.783128ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (541.045978ms) +✔ a host.json that can't be written stops both children and leaves no host.lock (265.149137ms) +✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (32.831318ms) +✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (152.631339ms) +✔ an error event on the broker while the notifier starts fails the start once the notifier replies (269.378955ms) +✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (353.309054ms) +✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (289.788488ms) +✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1173.745257ms) +✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (643.864291ms) +✔ a broker reply with no request waiting breaks the channel and the host exits 1 (150.242386ms) +✔ a notifier that refuses stops the broker and the host refuses with exit 3 (191.395613ms) +✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (181.149491ms) +✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (140.825646ms) +✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (164.000414ms) +✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (148.295796ms) +✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (187.544063ms) +✔ watchChildren reports a child that died before it was called, and one that dies later (21.187419ms) +✔ bus stop refuses to signal a live pid that is not a bus host (202.854916ms) +✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (238.427934ms) +✔ bus start refuses with exit 3 without a notifier config (103.180736ms) +✔ bus start runs until bus stop; status reports it while it runs (777.538476ms) +✔ bus-service.sh renders the unit and installs it into a given directory (59.738811ms) +✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (74.982096ms) +✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (15.05149ms) +✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (9.470746ms) +✔ bus start --pm: the PM runs under its own PID namespace, registered, with a manifest (1392.856722ms) +✔ the PM launches a coder through its launch tool; the coder answers; refusals name their code (759.674667ms) +✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or kept and logged (3092.065221ms) +✔ a project clone that can't be made refuses checkout-failed, from --pm and from a session, with no run and no clone left (212.645918ms) +✔ a runner that stops at once ends its launch with the runner's reason (278.764142ms) +✔ a Claude Code launch with no session credential refuses before it starts (161.792798ms) +✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (288.321546ms) +✔ a runner killed from the host ends its launch as killed, not failed (432.82135ms) +✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (197.123146ms) +✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1669.320008ms) +✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (800.015942ms) +✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3713.91866ms) +✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (186.50601ms) +✔ an over-long launch request is refused at once, not at the 10 s idle timeout (179.244714ms) +✔ a launch client that never closes its side doesn't hold the host's close (150.98219ms) +✔ a runner that ignores SIGTERM is killed when the host closes (1293.495684ms) +✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (5.656452ms) +✔ zoned uses the IANA zone across DST (26.559913ms) +✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (182.939948ms) +✔ two blocking decisions get two DMs with different nonces (142.501163ms) +✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.306709ms) +✔ a failed DM is journaled, backs off, and is retried until it lands (132.706811ms) +✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (173.327769ms) +✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (145.149871ms) +✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (319.114173ms) +✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (183.710006ms) +✔ a restart after the second refusal does not send before that refusal's 30 min are up (150.354713ms) +✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (175.559073ms) +✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (107.473533ms) +✔ an inbox read failure is logged and the next poll retries (0.930931ms) +✔ no Discord id reaches the journal or the log (153.47677ms) +✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (34.08543ms) +✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (48.792835ms) +✔ the journal: a whole file that is one torn line truncates to empty (19.645935ms) +✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (1.974968ms) +✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.82203ms) +✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.942383ms) +✔ the journal: a symlinked directory refuses and says it is a link (0.559437ms) +✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.613774ms) +✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.517878ms) +✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.616401ms) +✔ digest content stays within Discord's 2000 characters (2.212101ms) +✔ runLoop never overlaps ticks and stops after the one in flight (110.924214ms) +✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (541.281642ms) +✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (461.983849ms) +✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (498.680569ms) +✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (309.553ms) +✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4659.006241ms) +✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (500.66289ms) +✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (172.838348ms) +✔ install never shows a template name on systemd 261; template drop-ins still refuse (197.116427ms) +✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (177.081658ms) +✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (188.860504ms) +✔ talk --tester refuses text without the [mos test] prefix before any call (129.170401ms) +✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (128.328827ms) +✔ decide, stop and launches take no --tester (157.778901ms) +✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.456151ms) +✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.818698ms) +task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200 +task.close on a missing task answered: task-not-found; it made GET /tasks/999 404 +✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (453.305003ms) +✔ the transport writes {business, verb, args} to the child and reads its JSON (57.972254ms) +✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2189.211602ms) +✔ busExit and refuseInsideAgent (0.669507ms) +✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (249.209704ms) +✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1139.400018ms) +✔ a late reply the Console has listed still reaches the next talk (2297.588768ms) +✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (331.080032ms) +✔ launches off and on go to the broker and change the business's launch state (137.498337ms) +✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (101.20481ms) +ℹ tests 184 +ℹ suites 0 +ℹ pass 184 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 20022.696979 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-control-board.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-control-board.log new file mode 100644 index 000000000..5c2ac550b --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-control-board.log @@ -0,0 +1,132 @@ +✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (4.08742ms) +✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.283512ms) +✔ completed smoke replies and ordinary questions are idle, not human blockers (0.911784ms) +✔ only an explicit first-line input request makes a finished reply waiting (0.20604ms) +✔ tool activity, user text, errors and unfinished turns override attention text (0.158103ms) +✔ STOP access failure is unknown, not absence, under a non-root identity (32.503679ms) +✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (2.951895ms) +✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.344876ms) +✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (5.701562ms) +✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.594693ms) +✔ server rescans connector discovery and refuses HTTP reply without transport (34.427072ms) +✔ connector session links and linked directories are not read (1.167858ms) +✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.982118ms) +✔ CLI print uses the relaunch notice instead of old current preview (61.534681ms) +✔ connector owner and fixed task never inherit a native relaunch notice (2.121408ms) +✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (1.07676ms) +✔ loadConfig: missing file throws ConfigError (1.7537ms) +✔ loadConfig: invalid JSON throws ConfigError (0.355973ms) +✔ loadConfig: missing dataRoot throws ConfigError (0.250908ms) +✔ loadConfig: relative dataRoot throws ConfigError (0.248238ms) +✔ loadConfig: valid config returns dataRoot (0.737708ms) +✔ findNewestSession: picks the newest by mtime among two files (0.535168ms) +✔ findNewestSession: finds files in nested subdirectories (0.321161ms) +✔ findNewestSession: returns null for a missing dir (0.138417ms) +✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.741592ms) +✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.426327ms) +✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.507646ms) +✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (1.358237ms) +✔ deriveState: full state table (0.205964ms) +✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.34151ms) +✔ rule: newest entry is a tool result with no assistant text after it is working (0.297651ms) +✔ rule: a finished ordinary turn is idle, even if it says your move (0.31439ms) +✔ task: the first user message of the session, from text blocks (0.311239ms) +✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.308729ms) +✔ task: no user message in the log means null (shown as unknown), never a guess (0.335755ms) +✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.422536ms) +✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.585899ms) +✔ scan: the written record carries task, workspace and activeProject (0.54574ms) +✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.644149ms) +✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.446009ms) +✔ registration: a record whose pid is gone is stale; derived values win, sources say derived, registered stays with alive false; a pid the probe cannot decide is not stale; pidAlive itself (1.14858ms) +✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.452918ms) +✔ loadRegistrations: a missing seatsDir gives empty lists (0.174963ms) +✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.782893ms) +✔ matchRegistration: matches by sessionsDir, and by realpath through a symlink; sessionsDir null never matches; same seat name with a different sessionsDir does not match (fleet vs repo darkwing) (0.412908ms) +✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (1.203484ms) +✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.334096ms) +✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.511152ms) +✔ scanAgent: ageSeconds is computed from the injected now (0.274653ms) +✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.166571ms) +✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.386295ms) +✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.375914ms) +✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (1.00358ms) +✔ scan: relative boardDir throws ConfigError (0.114621ms) +✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (63.298317ms) +✔ CLI: missing config exits 2 with a refused: message (52.272009ms) +✔ CLI: unknown command exits 2 (54.661823ms) +✔ CLI: unknown --liveness value exits 2 (51.352778ms) +✔ panesRunPi: true when any trimmed line equals 'pi' (0.194434ms) +✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.072828ms) +✔ tmuxIsAlive: a pane running pi is alive (0.17859ms) +✔ tmuxIsAlive: session exists but pi has exited is not alive (0.079665ms) +✔ tmuxIsAlive: no such tmux session is not alive (0.062007ms) +✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.088099ms) +✔ tmuxIsAlive: passes -L only when a socket is given (0.120344ms) +✔ parsePanes: one pane per line, command and optional tab-separated path (0.086524ms) +✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.07509ms) +✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.097496ms) +✔ loadSeen: missing file returns {} (0.141385ms) +✔ loadSeen: invalid JSON throws ConfigError (0.223427ms) +✔ loadSeen: a JSON array throws ConfigError (0.159553ms) +✔ loadSeen: a non-string value throws ConfigError (0.152556ms) +✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.318799ms) +✔ markSeen: seen false deletes the key (0.263181ms) +✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.229887ms) +✔ markSeen: project containing '/' throws ConfigError (0.148858ms) +✔ markSeen: non-boolean seen throws ConfigError (0.116111ms) +✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.310276ms) +✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.255552ms) +✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.267344ms) +✔ scanAgent: an error-state session with a matching mark is seen (0.265411ms) +✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.524882ms) +✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.226395ms) +✔ taskSetBy: a registered task carries the record's setter; a record without the field (pre-#1511) reads unknown; the value is not copied into registered (0.61251ms) +✔ taskSetBy: null whenever the task shown is not the registered one: no registration, an empty registered task, a stale registration; the field is always present (0.617632ms) +✔ taskSetBy: scan() reads the field from disk through the seat package (bounded there), writes it to the per-agent record and index, and an invalid on-disk value is a registrationError, never a row value (1.416931ms) +✔ isLoopbackHost: recognizes loopback hosts (1.311119ms) +✔ isLoopbackHost: rejects non-loopback hosts (4.674035ms) +✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (3.327223ms) +✔ startServer: serves page, healthz, and a rescanning /api/board (35.018146ms) +✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (5.864284ms) +✔ startServer: /api/board returns 500 JSON with an error field when scan throws (2.306264ms) +✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (56.404857ms) +✔ CLI: serve rejects a non-numeric --port with exit 2 (55.020301ms) +✔ CLI: scan still works after the async cli refactor (53.758627ms) +✔ CLI: live serve prints its URL and answers /healthz (66.890185ms) +✔ page.html: esc() escapes every HTML-significant character (0.678943ms) +✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (8.954189ms) +✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (3.486136ms) +✔ POST /api/seen with invalid JSON returns 400 (1.864481ms) +✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (2.507334ms) +✔ POST /api/seen with a missing agent returns 400 (1.555975ms) +✔ POST /api/board returns 405; PUT /api/seen returns 405 (2.06131ms) +✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (54.551041ms) +✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.34278ms) +✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.341815ms) +✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.233437ms) +✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.17303ms) +✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.329579ms) +✔ page.html: task and active project cells show their source via sourceTag(); the detail has a Registered row via registeredText(); SOURCE_LABEL maps registration to registered; every dynamic value in sourceTag/fromSource/registeredText is escaped (0.620363ms) +✔ POST /api/reply: runs agent-send.sh with -s from the registration, -S :control-board, -m text plus the fixed trailer, no -L on the default socket, MOSAIC_TMUX_SOCKET stripped; answers delivered with the exit code and both streams (29.457684ms) +✔ POST /api/reply: a registration with a tmux socket adds -L (29.650035ms) +✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (30.375215ms) +✔ POST /api/reply: refusals before the tool runs: empty or blank or long text 400, unknown row 404, no registration 409, stale registration 409, no tmux session 409, bad JSON 400; the tool is never called (15.158968ms) +✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (5.000553ms) +✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (0.163211ms) +✔ page.html: the reply box appears only where canReply() holds (live registration with a tmux session), the detail has a Reply row, the submit posts JSON to /api/reply, receipts and drafts survive a refresh, and every receipt value is escaped (0.692897ms) +✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (2.666167ms) +✔ page.html: the task cell and detail show who set a registered task via setByTag()/setByText(), both escaped, only from rec.taskSetBy; the reply gate does not read it (0.349867ms) +✔ Host/Origin guard: GET /api/board and POST /api/reply refuse a foreign Host, a wrong port and a cross-origin Origin with 403 JSON, before any scan or send, and never send CORS headers (8.911936ms) +✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (33.146093ms) +✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (5.105033ms) +✔ every refusal code the reader can raise has an HTTP status (0.996263ms) +✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (53.814834ms) +ℹ tests 124 +ℹ suites 0 +ℹ pass 124 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 674.387357 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-conversation.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-conversation.log new file mode 100644 index 000000000..ad9be1eb3 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-conversation.log @@ -0,0 +1,190 @@ +✔ W1: two processes acquire the same pair at once; exactly one claim (210.661658ms) +✔ W1: two writers publish the same revision at once: one wins, the other gets null, the winner's record stays (32.053344ms) +✔ W1: a revision name appears only after its bytes are synced; before that, only a temp file exists (19.298117ms) +✔ W2: acquire while a claim is reserved or active refuses already-active (355.381199ms) +✔ W3: acquire while stopping, uncertain, or stopped without proof refuses unsafe-replacement (374.838628ms) +✔ W4: same session with another seat tuple, and the reverse, both refuse; a loser on the seat key closes it no-unit (231.317825ms) +✔ W4: a hard link of one session under another seat is the same session: the second controller refuses already-active and launches nothing (202.742242ms) +✔ W4: a copy of one session under another seat is the same session: the second controller refuses already-active and launches nothing (195.993216ms) +✔ W4: a session header ID that changes after construction refuses target; nothing is claimed or launched (2.743321ms) +✔ W5: SIGKILL between every publication barrier of acquire and transition; restart never finds two holders or a lost claim (11076.3781ms) +✔ W5: SIGKILL between every publication barrier of release; restart finishes or holds the release (32250.114208ms) +✔ W6: controller killed mid-turn while the engine lives; restart is uncertain, no launch, prompts refuse (263.27765ms) +✔ W12: a live owner paused with SIGSTOP; a second controller refuses already-active and changes nothing (143.003294ms) +✔ W13: crash after the engine spawns, before active; restart finds the live unit: uncertain, no second spawn, force stop only (409.896357ms) +✔ W14: crash after reservation, before the spawn marker: stopped with a no-unit observation; the pair is free (268.93192ms) +✔ W20: crash after the spawn marker, scope collected; uncertain in both runs, the marker is copied, no launch until a boot proof (324.221154ms) +✔ W15: crash between the two keys during release; restart finishes it under the same claim ID (94.930701ms) +✔ W7: recorded boot ID differs on the same machine: stopped with a boot proof; open tool calls become uncertain (166.67525ms) +✔ W8: resume after a proven stop with the same pins: new claim ID, generation +1, same conversation, branch and leaf (267.558212ms) +✔ W9: resume with a changed binary, argv digest, branch or leaf is refused and the claim is unchanged (757.327844ms) +✔ W11: the controller writes no session file; only the fake engine's own appends appear (181.692817ms) +✔ W16: a highest revision that won't parse holds the pair uncertain; the older stopped revision is not reused (85.311781ms) +✔ W17: a claim root copied from another host refuses foreign-host and promotes nothing (66.800357ms) +✔ G1: a session path or claim root under .pi/state, ~/.claude, the data root or a registration refuses at construction (3.68461ms) +✔ G2: a symlink inside the fixture root to a live session file is refused by the real-path check (1.039071ms) +✔ G3: a fixture path swapped for a live path after construction is refused at bind (1.77193ms) +✔ no shim from this file's tests is left running for the after hook (5.038213ms) +✔ K1: force stop kills a tool child that called setsid; stopped with a verified proof (606.643295ms) +✔ K2: K1 on the process-group fallback ends uncertain, never stopped (424.826518ms) +✔ K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM (563.923319ms) +✔ K4: two engines; force stop one; the other survives by independent observation (2798.86151ms) +✔ K5: a stop during a tool call leaves the effect uncertain, and it is shown (520.200006ms) +✔ K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill (608.789333ms) +✔ K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete (612.787675ms) +✔ K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain (5362.763669ms) +✔ K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop (1182.580556ms) +✔ K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop (747.964746ms) +✔ K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain (542.545923ms) +✔ K6: recover without proof, without confirmation, or with changed pins is refused (848.388132ms) +✔ K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed (382.822195ms) +✔ K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop (508.30407ms) +✔ K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced (3286.818607ms) +✔ K16: a claim from another machine ID refuses foreign-host; no boot proof is issued (27.304016ms) +✔ K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine (388.741161ms) +✔ K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof (317.166898ms) +✔ K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names (84.514124ms) +✔ R1: after a proven force stop the controller releases the scope; the shim and the unit are gone (439.317178ms) +✔ R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run (507.569191ms) +✔ R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence (1135.848909ms) +✔ E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released (436.756942ms) +✔ E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it (2518.958298ms) +✔ E3: an engine exit and a force stop take one escalation slot, in either order (966.636819ms) +✔ E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot (925.092247ms) +✔ E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current (2579.445109ms) +✔ E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks (342.199552ms) +✔ R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on #1533) (388.352962ms) +✔ R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope (129.906923ms) +✔ R7: controller killed after the claim is stopped, before the release: the restart releases the scope (2611.736397ms) +✔ R8: controller killed between the two keys' stopped revisions: the restart releases the scope (403.348242ms) +✔ R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one (490.171738ms) +✔ R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on #1536) (397.563894ms) +✔ R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more (2552.378227ms) +✔ R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed (251.178323ms) +✔ no shim from this file's tests is left running for the after hook (4.05387ms) +✔ S1: `/goal x`, with leading spaces or a tab, refuses text-policy at admission; zero engine bytes (206.423089ms) +✔ S2: every prefix pinned Pi interprets is refused, from the list the code uses; the rest reach the engine exactly (204.887622ms) +✔ S3: `/goal` on the second line is pinned from the source: Pi checks only index 0, so it is admitted and sent exactly (196.580113ms) +✔ S4: a `/` left in the composer is cleared when control transfers and returns; the next submit sends only the new text (268.057055ms) +✔ S5: an observer terminal gets a paste then Enter, as send-message.sh does: not admitted: controller, nothing sent (183.997755ms) +✔ S6: a mediated-shaped registration (no tmux) passed to the board's replyToRow: 409 no tmux session; exec never runs (0.492654ms) +✔ S7: ESC, bracketed-paste markers and U+2028/U+2029 travel as one JSON string; the engine receives the exact text in one record (184.574848ms) +✔ P3: a Pi confirm, select, input or editor dialog is shown disabled with a reason and never answered (310.489221ms) +✔ E1: send, ack, user, toolCall, toolResult, final answer: shown once, no refresh, draft and reading position kept (208.914013ms) +✔ E2: U+2028, U+2029 inside JSON strings and CRLF line ends each parse as one record, on the splitter and through the controller (189.542825ms) +✔ E3: a multipart final, two blocks, null request correlation and duplicate delivery (212.681147ms) +✔ E4: a page read after message_end but before its entry is persisted: marker at the seam, re-read after run-settled, each message once (262.963451ms) +✔ E4: a gap or a new epoch also reconciles; nothing is concatenated across a gap (11.040131ms) +✔ E5: an unknown native event gives no client event; evidence records its type and bytes; the terminal count goes up (227.462308ms) +✔ E6: a tool result delayed across a pause and a reconnect is reconciled without a manual refresh (339.986023ms) +✔ E7: the terminal renders the same stream as the library client, as observer and then as controller, and submits only as controller (396.097244ms) +✔ terminal: engine control characters are made visible; a lost connection refuses submit (205.49716ms) +✔ terminal: outcome unknown is shown as such, with no resend offer, and nothing is resent (0.429105ms) +✔ terminal: text after Enter in the same input chunk starts the next message; it never joins the one submitted (0.317733ms) +✔ terminal: a paste-start marker split right after its ESC still opens the paste; the Enter inside it never submits (0.374987ms) +✔ terminal: Ctrl-T then Enter in one chunk is judged after the takeover, as if typed one key at a time (Filbert F2, #1507) (0.548688ms) +✔ terminal: input held behind Ctrl-T waits for that takeover while an earlier action is still pending (Darkwing T1 on #1522) (31.064432ms) +✔ terminal: a hold inside held input holds again, and once it is drained later input and Ctrl-C still reach the terminal (Darkwing note 1 on #1522) (0.476062ms) +✔ terminal: an action that throws still releases the input held behind it, in order, then rethrows (5.753784ms) +✔ terminal: after an action throws, later input still runs; input() puts the error in the status line (Filbert N1 on #1522) (0.405904ms) +✔ terminal: input() reports an error when it happens, so it never overwrites a later status; held input's promise doesn't carry the holder's error (Filbert N4 on #1522) (0.373143ms) +✔ terminal: invisible and bidi characters are made visible; head, status and notice lines stay one line (0.107204ms) +✔ every record these fixtures produced is a valid CHAT-01 record (E5: no record fails the schema) (251.450592ms) +✔ H1: two takeovers with the same expected generation: one wins, +1; the other refuses generation (249.339765ms) +✔ H2: the old controller's prompt after a takeover commits is refused with zero engine bytes (290.049739ms) +✔ H3: a takeover while a prompt holds the dispatch lock: written under the old actor, or refused; never both (765.634912ms) +✔ H4: self-takeover is refused (200.761158ms) +✔ H9: Interrupt racing a prompt's dispatch: before the write, dispatch-refused and no-turn; after, §3 rules (435.083979ms) +✔ H10: Interrupt and force stop together: one stop chain, force stop supersedes (1380.997649ms) +✔ H10: an overlap during the pause before the abort: no abort, the stop ends uncertain (215.183084ms) +✔ H10: a no-turn Interrupt lifts only its own fence; admission stays closed under force stop, overlap or revocation (661.149623ms) +✔ H11: the controller disconnects mid-turn: work continues, the claim is unchanged, control stays put (348.4079ms) +✔ H12: an exact retry after reconnecting to the same incarnation returns the same receipt; one dispatch (210.167467ms) +✔ H13: a retry with the same request ID and different text is refused (196.731656ms) +✔ H14: late stdout from the old engine after a replacement is dropped by incarnation, counted, never rendered (642.301216ms) +✔ H15: a revoked connection's command is refused; the revocation fence holds (408.59963ms) +✔ H16: a second controller for the same session refuses already-active; the first is untouched (196.632065ms) +✔ H10: a second force stop while the first escalation runs refuses fenced; one escalation, and the claim records only the first stop's phases (1060.450201ms) +✔ a force stop whose fence throws leaves no escalation flag behind, so the next force stop runs (Darkwing F2, #1507) (339.39646ms) +✔ H17: a confirmation reused, answered from another connection, or used after the stop changed is refused (734.197749ms) +✔ H18: two prompts before any native output: the second refuses busy; one engine write (213.674669ms) +✔ H19: the pipe fails mid-line under a large prompt: delivery-unknown transport-unknown, poisoned, no later write (340.954123ms) +✔ H19: the link itself never writes again after an unknown outcome, whoever calls it (0.737657ms) +✔ H19: the controller dies mid-write of a large line: after restart the outcome is unknown and nothing is resent (645.814586ms) +✔ H20: the line is written but the ack is lost when the controller dies: orphan, outcome unknown, nothing resent (546.100746ms) +✔ H21: a retry of the exact request with the old token after a crash is stale-incarnation; no second write (722.531598ms) +✔ H22: after H21 and a valid recovery, a new request with the new token is admitted (3082.845354ms) +✔ H23: requests pending at a restart are not resent; each shows outcome unknown (688.633665ms) +✔ no shim from this file's tests is left running for the after hook (5.443098ms) +✔ a plain conversation: catalogue row, one page, CHAT-01 records (6.636439ms) +✔ native entries map to blocks: tools, thinking, bash, notices, ids that do not fit (1.775059ms) +✔ F1: a malformed line is an unavailable part at its position, and reading continues (1.856044ms) +✔ F1: a missing parent stops the history with a notice that names the unreadable lines (2.686041ms) +✔ F1: an unreadable fork is never merged into another branch's history (1.76663ms) +✔ F1: a follow stays on its branch when the next entry's parent is unreadable (2.047238ms) +✔ F1: a file whose entries are all unreadable shows a notice per line (0.828281ms) +✔ F2: a truncated trailing line marks the view incomplete, not an error (1.374413ms) +✔ pagination: 100 parts, then the rest; parts concatenate to the whole branch (3.779842ms) +✔ F3: a replaced file (new inode) refuses old cursors with reconcile (4.880787ms) +✔ F4: a same-inode rewrite of the prefix refuses old cursors with reconcile (5.745549ms) +✔ F5: growth between pages keeps the epoch and the page stops at the pinned length (5.174943ms) +✔ F6: unknown, foreign and expired cursors refuse and leave the cursor usable (7.782937ms) +✔ F7: a symlinked file and a symlinked directory component are refused, never opened (8.590313ms) +✔ F8: a file swapped for a symlink after the catalogue is refused (2.162965ms) +✔ F9: registrations never add or redirect a root (1.594694ms) +✔ F10: a header cwd naming another project is refused (3.488183ms) +✔ F11: parentSession renders with a marker and the parent is never opened (0.835326ms) +✔ F12: two leaves: the default leaf is shown and the other branch reads alone (4.784296ms) +✔ F12: a follow refuses when an appended duplicate id changes the branch's earlier parts (2.364116ms) +✔ F12: a second root (Pi's resetLeaf) starts its own branch (1.288463ms) +✔ F13: compaction is a marker in place, then the retained content (0.752605ms) +✔ F14: long strings split into fragments and parts, reassemble exactly, and pages respect the byte cap (546.19011ms) +✔ fragments never cut a surrogate pair and keep an empty string (5.128442ms) +✔ F15: a Claude seat is an unsupported-harness placeholder whose directory is never read (1.593924ms) +✔ unknown conversations, empty files and non-Pi files refuse (2.453578ms) +✔ an unreadable file or root inside the roots is refused per row, not a failed catalogue (1.134668ms) +✔ a seat directory without search permission refuses that root, not the catalogue (2.018461ms) +✔ every page and cursor is a valid CHAT-01 record (824.165624ms) +✔ the engine pin holds for the installed package (1.988662ms) +✔ pinned Pi, sealed and without credentials, answers the controller's commands with the shapes the fake models (282.616093ms) +✔ sealed, pinned Pi ignores a trusted project's .pi resources; --approve past the seal would load them, and checkSeal refuses it (Filbert F2 on #1522) (547.99121ms) +✔ pinned Pi appends thinking_level_change at start when the branch lacks one, so the leaf moves (K8 then fails closed) (255.363011ms) +✔ N25: ordinary Interrupt reconciles; a non-empty queue_update in the window is O5 (478.981802ms) +✔ N1: an extension's follow-up queued after the fence is cleared before any abort; O5, Unknown (421.069845ms) +✔ N1: a follow-up queued before the fence is O5 at once; the Interrupt refuses fenced (213.890109ms) +✔ N2: with abort first, the fake runs the external item (the ordering guard has teeth) (21.000835ms) +✔ N3: the fence lands in preflight, preflight errors, no run: failed, No run, uncertain (351.565078ms) +✔ N4: the ack arrives after the first abort and a run starts: clear and abort again; Interrupted (202.578501ms) +✔ N5: an input handler takes the prompt: ack, no run, delivery-unknown handled-without-run (294.829393ms) +✔ N6: an extension queues between clear_queue and abort: O5 and O6, Unknown (525.289143ms) +✔ N7: clear_queue times out: no abort, nativeQueue unknown, force stop still ends it (1924.975232ms) +✔ N7: clear_queue answers an error: no abort, nativeQueue unknown, the link not poisoned (177.850383ms) +✔ N8: an extension prompt starts a run during Mosaic preflight; the losing settle is O3 (301.297585ms) +✔ N9: a run that started before the fence and ends aborted: failed interrupted, Interrupted (212.776347ms) +✔ N9: decision 34: a run that ends aborted with no stop in progress: aborted-without-stop, uncertain, outcome unknown (252.393216ms) +✔ N9: an aborted that lands after the fence but before any abort is written: aborted-without-stop, Unknown (557.658379ms) +✔ N10: fake conformance (32.117529ms) +✔ N11: the run fails before any user message_start: delivery-unknown ack-without-start, never failed (407.30226ms) +✔ N12: input that starts a run after the final empty clear is O1 and not part of the stop's proof (520.601392ms) +✔ N13: agent_start with no slot held is O1; a later prompt refuses with zero engine bytes (283.711062ms) +✔ N14: the run completes while clear_queue is in flight: finished, Completed first, uncertain (348.164549ms) +✔ N14: the run completes after the abort is written, before Pi applies it: finished, never relabelled (346.367261ms) +✔ N15: the fence lands in preflight, then an input handler takes it: handled-without-run, No run (342.261476ms) +✔ N16: Interrupt with no slot and no run refuses no-turn: no stop, no bytes, admission open (195.558649ms) +✔ N17: the run fails on its own during the exchange: failed, Failed on its own (379.647685ms) +✔ N18: no final assistant message_end, or a lost line: working stays working; before working, transport-unknown (735.094943ms) +✔ N19: a losing extension prompt settles inside the Mosaic run before its user message: O3, run-overlap (502.788189ms) +✔ N20: an extension triggerTurn during Mosaic preflight starts first; while streaming it queues with no signal (422.148123ms) +✔ N21: a losing settle after the receipt settled finished is O2; the receipt stays finished (197.270995ms) +✔ N22: an agent-level custom message is dropped by the clear with no signal; evidence names the seal (167.681743ms) +✔ N23: a nextTurn message survives clear and abort and attaches to the next prompt, with no signal (187.177493ms) +✔ N24: the seal is an allow-list: --extension, a missing --no-* flag, a second --mode or --session, a session or output flag, or a stray word refuses unsealed-engine; no engine starts (232.310735ms) +✔ N24b: the seal covers the engine command and environment: config can't name either, the env is built from names, and a mutated command is refused at bind (201.261787ms) +ℹ tests 182 +ℹ suites 0 +ℹ pass 182 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 49351.761204 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-discord.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-discord.log new file mode 100644 index 000000000..1728731dc --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-discord.log @@ -0,0 +1,186 @@ +✔ approvals: a request is validated before anything is posted; the rendering shows names and never ids (2.973453ms) +✔ approvals: the ledger is appended and folded into open requests with bind and approval states (1.469816ms) +✔ approvals: a reply approves only when it points at a request, says exactly approve, and comes from a listed approver once (0.548526ms) +✔ approvals: a button approves only on its own request message with the matching custom id (0.47699ms) +✔ approvals flow: a turn that opened a request posts the message with the button, records it, binds it, and both approvers approve (13.998448ms) +✔ approvals flow: a non-approver, a repeat, a wrong custom id and a service refusal each get their fixed line and a drop entry (6.019084ms) +✔ approvals flow: an invalid request from the model, a refused post, and no api client are recorded and post nothing (7.287531ms) +✔ approvals flow: start retries a bind and an approval left as unknown, under their original keys (2.262277ms) +✔ authorize: open channel, listed user (1.842251ms) +✔ authorize: wrong guild (0.197907ms) +✔ authorize: no guild (DM) (0.278536ms) +✔ authorize: unlisted channel (0.175697ms) +✔ authorize: unknown channel, no info (0.249716ms) +✔ authorize: thread of listed parent (0.169832ms) +✔ authorize: thread of unlisted parent (0.150164ms) +✔ authorize: text channel that is not a thread and not listed (0.12767ms) +✔ authorize: unlisted user (0.608739ms) +✔ authorize: no author (0.250561ms) +✔ authorize: bot author (listed id, bot flag) (0.19433ms) +✔ authorize: system author (0.341373ms) +✔ authorize: the bot itself (0.093387ms) +✔ authorize: webhook (0.09291ms) +✔ authorize: mention channel without mention (0.129073ms) +✔ authorize: mention channel with bot mention (0.127683ms) +✔ authorize: mention channel with @everyone only (0.250087ms) +✔ authorize: mention channel mentioning someone else (0.094301ms) +✔ authorize: mention channel, content says @bot but mentions empty (0.074813ms) +✔ authorize: private thread under mention channel, mentioned (0.09293ms) +✔ authorize: private thread under mention channel, not mentioned (0.076969ms) +✔ authorize: thread in another guild per channel info (0.075804ms) +✔ authorize: not an object (0.06359ms) +✔ authorize: no id (0.061907ms) +✔ authorize: oversize content is accepted and flagged (0.067282ms) +✔ authorize: exactly the limit is not oversize (0.064878ms) +✔ authorize: a user's channel allowlist drops them outside it, threads count as the parent, others are unaffected (0.438209ms) +✔ authorize: order puts wrong guild before user, and user before channel (no channel lookup for strangers) (0.13083ms) +✔ binding: a complete binding validates and is frozen (2.057051ms) +✔ binding: unknown key, missing field, wrong type refuse with exit 2 (1.03863ms) +✔ binding: empty allowlists refuse (0.280477ms) +✔ binding: a user's channel allowlist must be non-empty, listed and unique; absent means every listed channel (1.119418ms) +✔ reloadDiff: reloadable keys are summarised by id; every fixed key refuses with exit 2 (1.399883ms) +✔ binding: dmRecipient is optional, a snowflake, one of the listed users, and a fixed key (0.414223ms) +✔ binding: file must be 0600, regular, not a symlink (1.405989ms) +✔ binding: token file mode, symlink, emptiness and shape are checked; token never appears in errors (1.114426ms) +✔ cli: check refuses a non-0600 token file with exit 2 before any network use (79.6592ms) +✔ context files: absolute paths, traversal, symlinks and out-of-repo targets refuse; in-repo files resolve (1.898095ms) +✔ cli: check refuses a missing context file and a missing binding with exit 2; usage is exit 4 (285.357627ms) +✔ cli: reload validates the file first (exit 2), then needs a live owner (exit 1); usage is exit 4 (180.53041ms) +✔ cli: run refuses when STOP is present, before any network use (114.639393ms) +✔ binding: tools is optional, validated strictly, a fixed key for reload, and its roots are resolved against the data root (1.616184ms) +✔ binding: a git key is validated at load and reaches the extension whole, and only on a writable root (1.166471ms) +✔ delivery: an accepted message is in the inbox before the turn, the reply is chunked with one nonce per chunk, and the turn record is write-once (16.892546ms) +✔ delivery: refused and unknown outcomes are journaled; a later chunk is not sent after a failure (17.037845ms) +✔ delivery: restart with an unknown entry re-sends the same nonce once and reconciles before accepting traffic (1.471104ms) +✔ delivery: an unknown entry older than the dedupe window is marked refused, not re-sent; a still-unknown one refuses start (1.051357ms) +✔ delivery: repeated unknown reconciliations never refresh the dedupe window; the original intent time decides (1.184427ms) +✔ turn: a failed engine turn posts the fixed line, never model output, and writes a failed record (2.602432ms) +✔ turn: a second message during a turn is held by the engine, both get their own reply and record (32.209275ms) +✔ turn: a thread under a listed channel is answered in the thread; an unknown thread is looked up once (2.760489ms) +✔ drop: an unlisted user gets silence and one drop line; no inbox entry, no REST call, no engine call (0.668909ms) +✔ drop: an oversize message is accepted into the inbox, answered with the fixed line and journaled as a drop (0.625419ms) +✔ restart: an inbox with three ids and a replay of the same three produces zero turns (42.430316ms) +✔ stop: STOP present refuses start; STOP written while running refuses new turns and the current one finishes (31.691846ms) +✔ ceiling: the ceiling plus one is refused and journaled; one fixed line per UTC day; a new day accepts again (5.198495ms) +✔ ceiling: a burst arriving while turns are still running cannot queue past the ceiling (3.546429ms) +✔ ceiling: a turn interrupted by a crash still counts after restart; admissions are durable (2.186093ms) +✔ ceiling: the daily notice survives a same-day restart; one delivery attempt in total, even when the first attempt crashed mid-flight (3.734826ms) +✔ duplicate: the same event delivered twice while the thread lookup is held yields one prompt, one admission and one reply (1.927471ms) +✔ journal: no token-shaped string and no model output on the drop path reaches disk (0.369456ms) +✔ receipt: an admitted message gets one eyes reaction on the inbound message; drops and refusals get none; a failed reaction is recorded and does not fail the turn (1.852781ms) +✔ receipt: Discord refusing the reaction leaves the turn intact and records ok false (1.74422ms) +✔ reload: a new user is silent before and answered after; a removed channel goes silent; a lower ceiling applies at once (3.476353ms) +✔ reload: a fixed key refuses with exit 2 and the old binding stays in force (0.744948ms) +✔ tools: with a tools binding the turn record lists every read and its outcome; without one the field is null (3.438857ms) +✔ context: the Discord block names the server, channels and modes, and states the rules from Q15 and Q16 (2.631661ms) +✔ context: with tools the block names the roots, keeps file content as data, and says to state refusals plainly (0.771247ms) +✔ context: a writable root adds the write rules and says a write is real only once Jason commits (1.692456ms) +✔ context: the envelope is one bracketed line then the text; names cannot break the line (0.995808ms) +✔ context: a git root swaps the terminal-commit line for the git verbs, and a vault root adds the id protocol (1.280226ms) +✔ context: assembleContext concatenates files in launcher format and appends the block; sha256 is stable (1.237526ms) +✔ context: splitReply keeps paragraphs together under the limit and splits long ones at lines, spaces, then hard (0.658129ms) +✔ engine: buildPiArgs carries the fixed flags, engine settings, session dir and prompt file (2.52921ms) +✔ engine: with tools, buildPiArgs turns pi's own tools off, loads the extension explicitly and allowlists exactly our three (0.419859ms) +✔ engine: a run with tool turns settles once, on the answer, with every tool call in the result (42.876607ms) +✔ engine: a run that ends on a tool-only turn fails the prompt as empty; a retried run settles on the real end (29.56768ms) +✔ engine: one prompt, one turn, text and usage come back (26.813213ms) +✔ engine: a prompt while streaming is held until pi settles, then sent as its own run, and answered in order (341.138888ms) +✔ engine: a held prompt that times out before pi settles fails on its own and is never sent (239.690634ms) +✔ engine: timeout sends abort and fails only that turn; the process stays (103.943067ms) +✔ engine: tool events from a run that outlived its timeout never land in the next prompt's record (226.135663ms) +✔ engine: a prompt after a turn that timed out before its agent_start waits for pi to settle instead of being refused (126.838209ms) +✔ engine: when pi has not started a timed-out turn by the end of the abort grace, the engine stops pi and fails held prompts (213.184078ms) +✔ engine: a timed-out turn pi starts only after the grace never answers a later prompt (615.250229ms) +✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (early prompt response) (1.21791ms) +✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (late prompt response) (0.492683ms) +✔ engine: a timed-out run pi did start outlives the grace; the next prompt goes out when it ends (424.927098ms) +✔ engine: a malformed JSONL line fails the turn, not the process (24.118859ms) +✔ engine: a turn that ends in error rejects with the error code; process exit fails pending turns (46.867375ms) +✔ gateway: hello -> identify with intents, ready, heartbeat with jitter, ack (2.197697ms) +✔ gateway: missed ack closes the socket and resumes with the last sequence (1.547531ms) +✔ gateway: op 7 reconnect resumes; op 9 non-resumable re-identifies (0.472599ms) +✔ gateway: op 9 resumable resumes (0.365463ms) +✔ gateway: close 4014 is fatal, reports the missing intent, never reconnects (0.853105ms) +✔ gateway: 4004 and 4013 are fatal too; 1006 reconnects with identify when no session (0.489342ms) +✔ gateway: close() is final and unparseable frames are ignored (0.359454ms) +✔ git: config validation is strict, needs write: true, a work tree and a private token file (50.681649ms) +✔ git: the child environment drops every host git config, names one helper, and carries the token path only for origin (35.803673ms) +✔ git: status reports the branch, ahead/behind and changed paths, and refuses off the named branch or mid-merge (59.136437ms) +✔ git: parseStatus reads porcelain v2 including renames and conflicts (0.237118ms) +✔ git: a commit stages exactly the named files, carries the seat author and the requester trailer, and pushes at once (69.348629ms) +✔ git: commit refusals: message, paths, requester, nothing to commit, and an index that already holds other work (76.349659ms) +✔ git: a commit whose push fails is still a commit, says so, and the next commit's push carries both (D6) (79.648314ms) +✔ git: pull is fast-forward only; a diverged origin or dirty local files refuse with nothing merged (175.146332ms) +✔ git: push pushes the named branch only and reports up to date (65.926001ms) +✔ git: no token value or token path ever reaches a git argument list; outputs are masked and capped (76.334553ms) +✔ git: the credential helper answers get over https from a private file and nothing else (182.21881ms) +✔ git: the vault protocol validates before a commit, honours another owner's lock, reserves ids, and locks around writes (700.963543ms) +✔ lock: the claim is exclusive; a second start against a live owner refuses (5.409108ms) +✔ lock: a stale lock (dead owner, reused pid, or record without start) refuses run and is never signaled; only unlock clears it (56.450963ms) +✔ lock: an incomplete claim (directory without owner record) is busy and refuses run; unlock clears it (0.801843ms) +✔ lock: an owner record that exists but cannot be read is invalid: never signaled, never removed, never claimed over (2.546895ms) +✔ lock: legacy upgrade; a live connector holding a {pid, start} record is unknown, unlock refuses and nothing changes; after it exits, unlock clears it (37.628838ms) +✔ lock: a live pid whose record carries a malformed or noncanonical start or boot string is unknown, not a mismatch; nothing signals, removes, or claims over it (271.358668ms) +✔ lock: identity syntax; only canonical unsigned decimal start ticks and lowercase boot uuids are identities (0.442293ms) +✔ lock: a process whose start marker or boot id cannot be read refuses to claim (20.027596ms) +✔ lock: a live pid whose identity cannot be read right now is unknown: never signaled, never removed, never claimed over (0.905546ms) +✔ lock: four processes racing for the same binding; exactly one claims it and the others refuse (31.82796ms) +✔ lock: stale handoff; concurrent starts over a stale lock all refuse, nothing reclaims, one unlock then exactly one live owner (137.219588ms) +✔ lock: four-party schedule; claims landing inside an unlock's gap never survive, one unlock leaves no owner and no residue (78.457252ms) +✔ notices: a kind is recorded per UTC day and found again (0.451501ms) +✔ notify: the DM channel opens once, every send carries the nonce, and only the message id comes back (4.755448ms) +✔ notify: refusals and unknowns surface as RestOutcome without ids; a refused send reopens the channel next time (2.106295ms) +✔ notify: no dmRecipient, a non-0600 binding or token, or a missing binding refuse before any network use (1.680945ms) +✔ recover: nothing to do is clean; a lock whose owner is gone or that has no record is cleared and STOP ends up absent (45.049686ms) +✔ recover: an operator STOP refuses with exit 3 and is never removed, whatever the lock says (28.368682ms) +✔ recover: a brake written during the unlock wins; STOP stays with both lines and the start is refused (24.003883ms) +✔ recover: a held binding refuses with exit 3 and writes no STOP: live owner, alive pid without verifiable identity, unreadable record (60.545081ms) +✔ cli: recover exits 0 when ready, 3 behind a brake or a held binding, and run's own STOP refusal is 3 (603.051875ms) +✔ rest: createMessage sends nonce, enforce_nonce, empty allowed_mentions and a soft reply reference (2.744565ms) +✔ rest: 429 waits retry_after and retries; 4xx is refused; 5xx and socket errors are unknown (5.847715ms) +✔ rest: content and nonce limits are enforced locally; typing never throws (0.626475ms) +✔ rest: react PUTs the encoded emoji on the inbound message for @me; 2xx is true, anything else is false and never throws (0.807326ms) +✔ rest: createDm posts the recipient and resolves the channel id; 4xx refused, 5xx unknown, bad id never sent (0.940492ms) +✔ setspark config: a bare https or loopback origin, a private key file, a principal (4.544887ms) +✔ setspark config: reaches the tools config and the binding as a fixed key (2.305689ms) +✔ setspark config: the binding's key survives resolveToolRoots and the engine's JSON hand-off to the extension (1.054481ms) +✔ setspark config: approvers come from the binding's users, never from the binding's setspark key (1.455018ms) +✔ setspark verbs: required_approvers go out as discord ids from names and come back as names (19.238325ms) +✔ setspark verbs: no Discord user id reaches tool text, whatever shape the service returns it in (7.166854ms) +✔ setspark contract: a decision made with names opens a request the connector accepts; names stored by an old record still refuse (4.362434ms) +✔ setspark keys: read per call, one printable token per file, rotation without a restart (2.353352ms) +✔ setspark idempotency keys: principal, turn id, call index; connector keys name a step (0.421416ms) +✔ setspark http core: json in and out, bearer header, idempotency header, fixed user agent, no key anywhere else (1.769386ms) +✔ setspark http core: error bodies become fixed refusals with code and the 409 fields; server text is data, cut (1009.237367ms) +✔ setspark verbs: a setspark key enables the eight verbs and no counters (0.432863ms) +✔ setspark verbs: writes carry the turn's key and the asserted requester, reads carry no key, and the api key never appears in text or details (5.8588ms) +✔ setspark verbs: no turn refuses every write before any request; bad arguments refuse before any request; reads still work (1.187762ms) +✔ setspark verbs: renderRecord caps long output and hides the accepted snapshot (0.206072ms) +✔ setspark api: bind, add_approval (button and reply) and get use integer request ids and the connector's keys (2.460851ms) +✔ tools: config refuses a missing, symlinked, dotted, non-directory or duplicate root and bad limits (3.528232ms) +✔ tools: every escape is refused with a fixed reason and nothing outside the root is read (3.822276ms) +✔ tools: happy paths list, read a window, and search case-insensitively; dotfiles and symlinks never appear (4.83166ms) +✔ tools: the tool set renders text for the model, records details for the journal, and enforces the per-run budget (2.787516ms) +✔ tools: listing and search caps hold (7.306915ms) +✔ tools: credential shapes are caught; ordinary prose and ids are not (0.562959ms) +✔ tools: the read uses the checked file itself; a symlink, a swapped file, a FIFO, a grown file or a hard link at read time is refused (4.120655ms) +✔ tools: an unreadable file under the root is skipped by search and refused by read (1.017947ms) +✔ tools: config accepts write: true only as a boolean, and enables the write tools only then (0.845506ms) +✔ tools: every write outside the fence is refused before any byte lands, and no temp file remains (3.784296ms) +✔ tools: write_file leaves the exact bytes, edit_file replaces one exact match, and the set renders the change as uncommitted (1.906655ms) +✔ tools: a target that changed between the check and the rename is refused and the temp file is removed (1.149752ms) +✔ web: config takes an https or loopback-http SearXNG base url and a bounded fetch cap (3.139038ms) +✔ web: address rules refuse every private, loopback, link-local, mapped and multicast form (2.039859ms) +✔ web: web_fetch refuses bad urls, private hosts, rebinding names, non-https redirects, too many hops, error status, non-text bodies, and times out (1022.280799ms) +✔ web: web_fetch returns html as text with the title, follows an https redirect, keeps plain text and json, and cuts at the cap (4.266578ms) +✔ web: html to text drops scripts, styles and comments, decodes entities and keeps block breaks (0.245661ms) +✔ web: web_search asks the instance for json, returns at most ten clean results, and refuses a bad query, a down instance or an unusable answer (2.591438ms) +✔ web: the tool set enables the web tools only with a web key, counts them in the budget, and records url, status and hits (2.283129ms) +ℹ tests 178 +ℹ suites 0 +ℹ pass 178 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 2587.14053 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-harness.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-harness.log new file mode 100644 index 000000000..ed3773cd5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-harness.log @@ -0,0 +1,88 @@ +✔ sessionModel: agent vars win, then the system's execution settings (11.417251ms) +✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (5.304735ms) +✔ a claude-code bundle adds the wrapped gate hook and the MCP config (3.642441ms) +✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (12.503437ms) +✔ the prompt names the project clones in the workspace, and none when there are none (6.414451ms) +✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.99343ms) +✔ a bundle is written once: an existing file refuses (1.363733ms) +✔ a path with a single quote can't go into the hook command (2.059428ms) +✔ allow exits 0, a deny exits 2 with the reason on stderr (123.122737ms) +✔ a missing or wrong policy, or a bad event, exits 2 (89.459995ms) +✔ the bundle's wrapped command: a missing gate or node still blocks (1104.522536ms) +✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (830.929292ms) +✔ claude: the hook alone blocks a path outside the workspace (473.056852ms) +✔ claude: a second turn resumes the first turn's session (741.296019ms) +✔ claude adapter: --restricted is always passed (4.990189ms) +✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (21.191704ms) +✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (6.61878ms) +✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (755.774626ms) +✔ claude: a missing hook or MCP file refuses before claude starts (7.19534ms) +✔ pi: policy tools and typed tools pass, anything else is blocked (3.041189ms) +✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.64685ms) +✔ file tool paths must resolve inside the workspace (1.056781ms) +✔ pi's own path normalisation can't be used to step out (0.826881ms) +✔ a symlink inside the workspace that points out is outside (0.761328ms) +✔ a dangling symlink is refused at any depth, in both harnesses (2.533389ms) +✔ read is checked under every spelling pi's read would open, in both harnesses (20.438023ms) +✔ other spellings cover directories, dangling links and pi's cwd (1.515228ms) +✔ a relative path climbs from the workspace's real path, in both harnesses (4.153201ms) +✔ claude path fields per tool (0.610032ms) +✔ glob patterns stay inside the workspace (0.543676ms) +✔ a path that can't be checked is blocked (0.359141ms) +✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (222.531295ms) +✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (181.708367ms) +✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1810.757253ms) +✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (304.034885ms) +✔ initialize, ping and tools/list (49.490803ms) +✔ tools/call goes through the tool socket; a refusal is an isError result (34.679814ms) +✔ replies are compact JSON; over the cap a tool error names the size and the cap (37.092043ms) +✔ unknown tools and methods are JSON-RPC errors and never reach the socket (30.521693ms) +✔ a missing argument is a usage error (31.416875ms) +✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (419.689527ms) +✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (332.619082ms) +✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (317.616788ms) +✔ pi: a read is refused when pi would open another spelling outside (320.724142ms) +✔ pi: a relative path climbs from the real path of a workspace behind a symlink (313.694889ms) +✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (315.786976ms) +✔ pi: a missing extension refuses before any model call (6.009854ms) +✔ pi: an extension without its configuration fails pi's start (261.500827ms) +✔ founderCheck: founder variables, then a needed service without a usable token (1.121833ms) +✔ turnRequest names the sender, class, reply and decision (0.183495ms) +✔ turnRequest says a tester's message is a test and never Jason's instruction (0.209542ms) +✔ turnRequest shows the message's own sent time, a day old as well as new (0.136002ms) +✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.223525ms) +✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (257.898025ms) +✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (256.20573ms) +✔ a task closed on the tracker is missing from the next turn's open list (219.349847ms) +✔ a message read a day after it was sent shows the time it was sent (180.281572ms) +✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (141.080288ms) +✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (106.962563ms) +✔ typed tools carry the runner's capability; launch goes to the host's launch socket (413.230359ms) +✔ a RESULT gets no automatic reply; failed turns reply with the reason (1290.657478ms) +✔ SIGTERM during a turn kills the turn's process group and still exits 0 (182.08729ms) +✔ founder credentials stop before the claim (20) (188.636868ms) +✔ a refused claim exits 21; an ended run's capability exits 22 (225.623191ms) +✔ the launch ending under a running session exits 22 (156.82854ms) +✔ a broker that stays unreachable exits 23 after brokerRetries polls (273.241507ms) +✔ a broker that is down at the claim exits 23, not 21 (92.422156ms) +✔ no capability, or a malformed one, on stdin exits 2 (216.444618ms) +✔ a missing or malformed policy exits 2 before the claim (124.55692ms) +✔ the PM gets launch, its task verbs and the reads (7.018235ms) +✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (5.331953ms) +✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.508073ms) +✔ a coder with a tracker gets its own task tools and no task_reassign (1.981148ms) +✔ launch only when the business's launch block names the instance as launcher (1.735115ms) +✔ an action outside the instance's authority has no tool (1.242679ms) +✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (5.642711ms) +✔ callTool: one JSON line out, the result back, a refusal rejects (8.152472ms) +✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.195186ms) +✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.792668ms) +✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.686905ms) +ℹ tests 80 +ℹ suites 0 +ℹ pass 80 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 11168.564005 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-ledger.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-ledger.log new file mode 100644 index 000000000..0c410f120 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-ledger.log @@ -0,0 +1,94 @@ +✔ a raw token file, with or without one trailing newline, reaches curl only through the config stream (114.526138ms) +✔ the raw path accepts nothing else, and refuses before curl runs (337.145253ms) +✔ the file checks still apply on the raw path: mode, symlink, missing, directory (266.074794ms) +✔ the raw path base URL has no override (49.90214ms) +✔ the JSON path is unchanged, and JSON never falls through to the raw path (230.390925ms) +✔ a file that changes between the two reads refuses before curl runs, with or without a body (680.987432ms) +✔ the token reaches no child environment, even with an inherited CFG or SHELLOPTS=allexport (651.027783ms) +✔ real helper GET HTTP 200 preserves exit 0 without credentials (13.505541ms) +✔ real helper POST HTTP 201 preserves exit 0 without credentials (11.262824ms) +✔ real helper GET HTTP 403 preserves exit 1 without credentials (8.533156ms) +✔ fixture git subjects only, follow-ups and three session kinds (157.425683ms) +✔ text and JSON carry same numbers, open and truncated title (216.251277ms) +✔ missing credentials exit 2, no-issues never calls API and shows unknown (180.555063ms) +✔ empty range gives no rows and zero totals (138.546379ms) +✔ inclusive UTC dates, first-line preamble only, role and seat boundaries (154.480319ms) +✔ close-only issue included, even median, missing metadata stays unknown (139.891174ms) +✔ unique commits but per-issue links count multiple tags once each (137.450468ms) +✔ issue pages of 50, 50 and 7 read 107 issues in 3 pages (287.118203ms) +✔ one short page reads 1 page; --no-issues reads none and says so (232.074078ms) +✔ a short page 10 is read; a full page 10 refuses at the ceiling (693.296245ms) +✔ an issue number on two pages refuses (150.425197ms) +✔ a failing page 2 refuses the whole read without its stderr (144.614736ms) +✔ page 2 with a malformed record refuses (152.221557ms) +✔ page 2 with more than 50 rows refuses (147.413299ms) +✔ bad API payload not JSON refuses (131.11736ms) +✔ bad API payload {} refuses (153.846731ms) +✔ bad API payload [{"number":1}] refuses (128.760381ms) +✔ partial or malformed session log refuses with location, not content (166.420435ms) +✔ a U+2028 or U+2029 inside a session string is one line, not a malformed record (139.279086ms) +✔ no sessions is an empty table; symlink source refuses (200.302901ms) +✔ reads only refactor even when another branch is checked out (168.685259ms) +✔ invalid dates, reverse dates and duplicate options refuse (102.201871ms) +✔ T3 agent assignments do not count as human in Table 2 (175.633807ms) +✔ preamble parsing and issue number boundaries (0.424696ms) +✔ T3 header: agent, or board from control-board; anything short of the full header is human (0.129455ms) +✔ no closed issues with human messages means undefined ratio, not invented zero (0.188691ms) +✔ T3: seat, archived, unmapped and Researcher threads count; imported, deleted and other-project threads do not (464.599037ms) +✔ T3: the default path is read from HOME and prints no path line; --no-t3 says so (647.26833ms) +✔ T3: a HOME with no database exits 1 and names --no-t3 (152.624647ms) +✔ T3: a file that is not a database exits 1 and names --no-t3 (164.823997ms) +✔ T3: a seat thread renamed to another seat exits 1 naming thread, title and roles (476.824998ms) +✔ T3: an unmapped thread addressed as a seat exits 1 (379.539687ms) +✔ T3: a header to another thread id is not cross-checked (384.123799ms) +✔ T3: no project, or two, for this root exits 1 (974.360985ms) +✔ T3: a removed column exits 1 and names it (235.687527ms) +✔ T3: a missing table exits 1 and names it (243.265655ms) +✔ T3: a counted row with an unknown role exits 1 without its text (392.343269ms) +✔ T3: a counted row with role reasoning without the reasoning: id prefix exits 1 without its text (390.951087ms) +✔ T3: a counted row with non-text content exits 1 without its text (372.820868ms) +✔ T3: a counted row with an unparseable created_at exits 1 without its text (382.639134ms) +✔ T3: a reasoning summary is skipped before any check and counted as excluded (1096.494368ms) +✔ T3: a missing orchestration_events makes the diagnostic unknown and keeps the counts (714.582716ms) +✔ T3: a human message with no event counts in humanWithoutEvent (399.984309ms) +✔ T3: an unparseable event makes the diagnostic unknown and keeps the counts (738.244947ms) +✔ T3: an event with no string messageId makes the diagnostic unknown and keeps the counts (733.684212ms) +✔ T3: an error that is not from SQLite is rethrown, not reported as a database failure (337.959655ms) +✔ T3: a symlink at ~/.t3 exits 1 (147.409156ms) +✔ T3: a symlink at ~/.t3/userdata exits 1 (137.724668ms) +✔ T3: a symlink at ~/.t3/userdata/state.sqlite exits 1 (139.212223ms) +✔ T3: with --t3-db, a symlinked file or directory exits 1 (450.122329ms) +✔ T3 WAL: the newest message only in -wal, writer attached, is counted (423.419424ms) +✔ T3 WAL: stopped cleanly, counts are correct and the main file is unchanged (398.691888ms) +✔ T3 WAL: -wal without -shm in a writable directory is read (400.301636ms) +✔ T3 WAL: -wal without -shm in a read-only directory exits 1 (416.80235ms) +✔ T3 WAL: stopped cleanly in a read-only directory exits 1 (393.985742ms) +✔ T3: a lock held past the 5 s busy timeout exits 1 and names --no-t3 (5418.216034ms) +✔ a done row whose closing issue is open is a violation; a row that is not done is not (1.748961ms) +✔ an issue several rows close is expected closed only once all of them are done (0.485736ms) +✔ closure needs positive evidence: unknown is undecided, and so is a skipped or short issue check (0.356118ms) +✔ each owner of an in-progress or in-review row gets one liveness class (7.367483ms) +✔ a required row not done after 14 days is a violation; a legacy row uses genesis as its lower bound (0.394208ms) +✔ an ISO requiredSince, as `set required` writes it, ages from its UTC day; one that does not parse is a violation (0.217947ms) +✔ the text section always ends in a count and a result, and never prints a full pass (0.320385ms) +✔ pidAlive: a running pid is present, an exited one is gone, and EPERM still means present (23.141623ms) +✔ issue states: open list first, then the metric page, then at most 10 lookups (253.662622ms) +✔ a full open list: lookups settle what it leaves out, and only an unsettled issue keeps it undecided (349.836286ms) +✔ the open list refuses on a failed call or a bad record, and never echoes the helper (158.147064ms) +✔ a helper call past the deadline is killed with its child, and the call reports it (2007.79949ms) +✔ readQueue loads queue.json through the queue validator and refuses anything else (115.702567ms) +✔ protected changes list every in-range entry that changes a required or parked row (386.614415ms) +✔ the CLI prints the queue section above the weekly table and under a queue key in --json (520.068651ms) +✔ a queue with nothing wrong prints 0 violations and a reduced pass, never a full pass (244.237551ms) +✔ --no-issues makes no call and leaves the issue checks undecided; --no-queue skips the section (306.612126ms) +✔ the CLI refuses a bad queue before any call, and a failed open list with exit 2 (291.966812ms) +✔ --unsupported-runtime repeats once per seat and takes a seat name (345.360334ms) +✔ an unreadable config makes every owner invalid instead of passing them (154.037511ms) +ℹ tests 86 +ℹ suites 0 +ℹ pass 86 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 22363.078395 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-mosaic.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-mosaic.log new file mode 100644 index 000000000..4d38fa05e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-mosaic.log @@ -0,0 +1,77 @@ +✔ pure resolution selects current default or explicit enrolled account (2.64574ms) +✔ scope is explicit, bounded and never inferred (1.938684ms) +✔ fork pin is preserved against default change, override, missing account and revocation (0.894055ms) +✔ unenrolled account/provider, missing harness, model expansion and native model ceiling refuse (1.210178ms) +✔ only explicit synthetic credential forms and internal fixture stores admitted (7.34055ms) +✔ two concurrent workspaces of the same agent publish distinct complete private generations (48.764519ms) +✔ same execution ID is exclusively claimed and cannot overwrite a published generation (47.923477ms) +✔ failed generation after-auth preserves prior files, records failure and refuses blind same-ID retry (47.922869ms) +✔ failed generation before-publish preserves prior files, records failure and refuses blind same-ID retry (54.463287ms) +✔ credential lock contention refuses without duplicate side effects (11.233397ms) +✔ symlinked pre-existing final target is refused and never followed (19.860922ms) +✔ invalid registry cannot resolve; no fallback to supplied partial entries (0.295282ms) +✔ post-publication failure records uncertainty, preserves complete generation and prevents replay (26.443649ms) +✔ expired credentials refresh under transaction and subsequent generation reuses rotation (94.291775ms) +✔ refresh failure retains prior generation and store state (95.703697ms) +✔ refresh timeout retains prior generation and store state (153.700393ms) +✔ refresh malformed retains prior generation and store state (62.197036ms) +✔ concurrent refresh on same account refuses contention while unrelated account proceeds (224.544143ms) +✔ invalid refresh options refuse before burning claim (30.852344ms) +✔ fixed fake process rotates both OAuth fields without mutating caller input (39.950248ms) +✔ concurrent isolated processes preserve separate provider credentials (30.029674ms) +✔ fake failure is refused with fixed diagnostics (25.503265ms) +✔ fake malformed is refused with fixed diagnostics (23.957098ms) +✔ fake timeout is refused with fixed diagnostics (103.091112ms) +✔ fake unchanged is refused with fixed diagnostics (26.138169ms) +✔ caller executable/environment injection is rejected before spawning (0.29106ms) +✔ valid fixture tree validates and lists without secrets (87.721774ms) +✔ unknown-field refuses (0.476552ms) +✔ invalid-id refuses uppercase and traversal shapes (0.311203ms) +✔ plain-http baseUrl requires allowInsecureTransport (0.362654ms) +✔ native provider rejects allowInsecureTransport (0.17193ms) +✔ unsupported credential type and kind refuse (0.168251ms) +✔ account provider-path mismatch refuses (3.546866ms) +✔ profile account refs must be provider/account shaped (0.325813ms) +✔ seat selection accepts fork pin field, validates account refs (0.258007ms) +✔ harness manifest id must equal executable (gate 1) (0.21404ms) +✔ CLI validate: duplicate provider id across files refuses (33.868394ms) +✔ CLI validate: missing referenced provider/account refuse (39.476162ms) +✔ CLI validate: broken JSON refuses without secret echo (32.084333ms) +✔ CLI usage errors exit 2 (50.798121ms) +✔ credential.json sibling presence does not break validation and is never read (64.83419ms) +✔ D1 missing, empty and structurally empty roots refuse, no list projection (191.694805ms) +✔ D1 required directory auth cannot be absent (52.737153ms) +✔ D1 required directory auth/providers cannot be absent (54.555804ms) +✔ D1 required directory auth/accounts cannot be absent (63.570503ms) +✔ D1 required directory auth/settings cannot be absent (62.559803ms) +✔ D1 required directory harnesses cannot be absent (61.041321ms) +✔ D1 root file and unreadable metadata refuse (111.394096ms) +✔ D2 no symlink traversal at auth/providers/openai-codex.json (54.46626ms) +✔ D2 no symlink traversal at auth/accounts/openai-codex/homelab-openai (64.897549ms) +✔ D2 no symlink traversal at auth/providers (59.546092ms) +✔ D2 no symlink traversal at auth (55.925317ms) +✔ D2 root and ancestor symlinks and lexical traversal refuse (156.683775ms) +✔ private filesystem modes enforced for root (51.729741ms) +✔ private filesystem modes enforced for auth (56.656833ms) +✔ private filesystem modes enforced for auth/providers/openai-codex.json (53.869333ms) +✔ private filesystem modes enforced for auth/accounts/openai-codex/homelab-openai/account.json (58.080268ms) +✔ D3 numeric version 1 only across all record kinds (1.206462ms) +✔ D4 nested unknown keys and missing per-kind required fields refuse (59.552258ms) +✔ D5 unenrolled default refuses even when account exists (63.250436ms) +✔ D6 provider/account credential type must match (61.130258ms) +✔ D7 every harness endpoint enforces HTTP opt-in and shape (0.485976ms) +✔ D8 URLs reject embedded credentials and unsupported protocols without echo (166.26481ms) +✔ D9 malformed JSON diagnostics contain no content excerpt (62.167962ms) +✔ D10 missing metadata is missing-path, not invalid-json (60.625394ms) +✔ D10 library returns no partial entries on any invalid record (72.511534ms) +✔ null/scalar/array metadata refuses without stack or echo (235.295603ms) +✔ credential sibling is never opened, even when an unreadable symlink (30.023545ms) +✔ oversized metadata refuses before parsing (54.61011ms) +ℹ tests 69 +ℹ suites 0 +ℹ pass 69 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 2142.781817 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-runs.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-runs.log new file mode 100644 index 000000000..b3133649d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-runs.log @@ -0,0 +1,51 @@ +✔ isRunId accepts the run id shape and nothing else (0.849932ms) +✔ a missing data root or runs directory lists nothing (1.291012ms) +✔ runs as a regular file lists nothing, as before (0.492943ms) +✔ listRunIds keeps r- names only, sorted oldest first (1.095144ms) +✔ listRunRecords returns each result, or null for an incomplete or unreadable one (1.198963ms) +✔ readRunRecord returns documents and artifacts in directory order (0.821147ms) +✔ readRunRecord is null for a missing run, a dangling link or a file (0.549285ms) +✔ readRunRecord and readRunDocument refuse an invalid run id before touching the disk (0.558375ms) +✔ readRunDocument reads only the three run documents (0.474975ms) +✔ a link inside the data root is followed (0.777762ms) +✔ a data root that is itself a link is trusted as configured (0.56091ms) +✔ a run directory linked out of the data root is never read (0.548427ms) +✔ a document linked out of the data root reads as null (0.714853ms) +✔ a runs directory linked out of the data root refuses (0.480394ms) +✔ a relative link that climbs out of the data root refuses (0.378929ms) +✔ a sibling whose name starts with the data root's name is outside it (0.403268ms) +✔ a link loop refuses instead of reading as missing (0.498559ms) +✔ an unreadable runs directory refuses instead of listing nothing (0.373343ms) +✔ an unreadable run directory refuses instead of reading as missing (0.407959ms) +✔ a link to the data root's parent is outside it (0.333203ms) +✔ listRunIds sorts whatever order the directory returns (0.624954ms) +✔ listRunRecords lists an r- name that isn't a valid run id, as before (0.436021ms) +✔ the readers write nothing (4.744034ms) +✔ no pointer is null (1.408255ms) +✔ the pointer release.sh writes reads back (0.915792ms) +✔ a pointer that isn't the version 1 shape refuses with exit 2 (2.40511ms) +✔ a pointer that is a directory refuses with exit 4 (0.491361ms) +✔ a state file linked out of the data root refuses (0.834085ms) +✔ a state directory linked out of the data root refuses (0.474449ms) +✔ a state directory linked out to nothing reads as no release and an empty log (0.395776ms) +✔ a missing log is empty (0.30571ms) +✔ the log reads oldest first and counts malformed lines (0.796743ms) +✔ last must be a positive integer (0.388197ms) +✔ the state readers write nothing (0.694366ms) +✔ list prints each run in the established format (63.238514ms) +✔ list prints a damaged result.json as unknown and keeps listing the runs after it (58.056535ms) +✔ list prints each result field that isn't a string as unknown or - (57.141485ms) +✔ show prints the run in the established format (61.12897ms) +✔ show of a missing run and an invalid id exit 4 as before (93.088519ms) +✔ list and show refuse a runs directory linked out of the data root (121.350903ms) +✔ show refuses a run linked out of the data root; list reports it unknown (119.869643ms) +✔ list shows an r- name that isn't a valid run id, as before (58.893158ms) +✔ show refuses an invalid id before reading the config (33.871328ms) +ℹ tests 43 +ℹ suites 0 +ℹ pass 43 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 717.11402 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-seat.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-seat.log new file mode 100644 index 000000000..bf8139aeb --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-seat.log @@ -0,0 +1,132 @@ +✔ a first launch clones the root at its branch, with the root's path as origin (41.758331ms) +✔ the clone is not at its place until git clone has finished (23.10194ms) +✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (64.613898ms) +✔ a clone ahead of the root keeps its commits and counts as current (42.548924ms) +▶ a dirty clone, one on another branch and one diverged are kept as they are + ✔ a modified file (35.039504ms) + ✔ an untracked file (30.90199ms) + ✔ a staged file (35.851488ms) + ✔ another branch (31.089246ms) + ✔ a detached HEAD (35.573034ms) + ✔ a diverged branch (46.540732ms) +✔ a dirty clone, one on another branch and one diverged are kept as they are (216.190899ms) +▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it + ✔ user.name (27.958827ms) + ✔ user.email (26.954602ms) +✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (55.368451ms) +✔ a commit git can't read after the fast-forward is null (48.067919ms) +✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (27.504027ms) +▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it + ✔ core.fsmonitor (41.609165ms) + ✔ core.hooksPath (48.448569ms) + ✔ a hook file (37.399112ms) + ✔ include.path (40.584299ms) + ✔ includeIf (35.699486ms) + ✔ a filter driver (40.169362ms) + ✔ origin moved (53.798253ms) + ✔ a second origin url (44.374098ms) + ✔ the origin url twice, both the root (34.377169ms) + ✔ an ext:: origin (33.506323ms) + ✔ a branch tracking another remote (36.407558ms) + ✔ a branch merging a tag (32.486746ms) + ✔ a fetch line onto local branches (32.180294ms) + ✔ no origin (38.439182ms) + ✔ a config file over the size cap (41.561437ms) + ✔ config a symlink to /dev/zero (65.47388ms) + ✔ the clone a symlink to the bait (51.717785ms) + ✔ the clone a file (33.165151ms) + ✔ the clone a plain directory (39.842924ms) + ✔ .git a gitdir: file (36.961436ms) + ✔ .git a symlink (30.339849ms) + ✔ .git/logs a symlink (32.920073ms) + ✔ .git/refs/heads a symlink (29.871396ms) + ✔ .git/objects a symlink (31.200471ms) + ✔ a reflog hard-linked to a file outside (33.236857ms) + ✔ HEAD a fifo (36.993102ms) + ✔ a commondir file (33.103306ms) + ✔ an alternates file (31.266767ms) + ✔ a gitlink staged, no .gitmodules (45.830112ms) + ✔ a gitlink and .gitmodules staged (44.746593ms) + ✔ a gitlink to a repository with its own gitlink (51.889803ms) + ✔ a gitlink and .gitmodules committed (47.156202ms) + ✔ a gitlink and submodule.active in config (46.71692ms) + ✔ a .git/modules with no gitlink (35.363458ms) +✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1353.88651ms) +▶ a root that can't be cloned refuses with the project id and leaves nothing behind + ✔ missing (9.913012ms) + ✔ not a repository (11.77764ms) + ✔ a plain directory inside another repository (15.501947ms) + ✔ unreadable (10.089836ms) + ✔ on no branch (11.61772ms) + ✔ missing an object (18.333356ms) +✔ a root that can't be cloned refuses with the project id and leaves nothing behind (78.175953ms) +✔ a clone whose root is on no branch, or gone, is kept and named (33.514577ms) +✔ no credential or forge remote of the root reaches a clone (48.901828ms) +✔ every project in the business file gets its own clone at its own branch (35.487168ms) +✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (512.973849ms) +✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1015.975208ms) +✔ a timeout signals git's process group, so a process git started dies with it (516.018319ms) +✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (521.416391ms) +✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.603562ms) +✔ sandboxProblem names a missing bwrap and a bwrap that fails (7.844335ms) +✔ every bind says why; the bundle and session file stay read-only over the run directory (2.609183ms) +✔ the host's git socket is bound only when given, read-only and before the writable binds (0.761257ms) +✔ the git identity is the instance's, at @.mosaic.invalid, and sandboxArgv refuses without it (1.492248ms) +✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1785.906151ms) +✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2429.804318ms) +✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (255.817754ms) +✔ resolveSeat: by name under --repo resolves the repo layout (1.289644ms) +✔ resolveSeat: by path resolves the fleet layout (0.334979ms) +✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.745251ms) +✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.659451ms) +✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.801181ms) +✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.260482ms) +✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.129825ms) +✔ CLI launch: registers, execs the fake launch script, and passes args through (27.325669ms) +✔ CLI launch: --harness lands in the record (27.302393ms) +✔ CLI launch: the launch script's own exit code passes through (29.232185ms) +✔ CLI launch: relaunching a seat rewrites the one registration record (54.538189ms) +✔ CLI launch: omitting --task records an empty string, not null (27.289592ms) +✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (87.358463ms) +✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (130.711141ms) +✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.410979ms) +✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.566223ms) +✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.73719ms) +✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (2.495083ms) +✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (266.143021ms) +✔ family: exactly one launch.max key in the model name, else null (0.648267ms) +✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.654693ms) +✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.249283ms) +✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.418027ms) +✔ session file and launch log: 0600, the session file written once (0.997337ms) +✔ endReason maps the runner's exit codes; a signal is killed (0.109657ms) +✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.188469ms) +✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.974493ms) +✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (299.699215ms) +✔ workRef and validBranch take only what a ref name can hold (1.106767ms) +✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (150.649177ms) +✔ a rewritten branch refuses non-fast-forward and the work ref stays (126.231292ms) +✔ a branch with no history in common with main refuses unrelated-history (67.991645ms) +✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (39.863497ms) +✔ main is fetched from the root again before each push, so a clone of a newer root pushes (142.723816ms) +✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (107.898924ms) +✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (93.0251ms) +✔ only a v2 bundle with the named branch is read (56.17447ms) +✔ a branch named main, or named for another task, moves only this task's work ref (113.586045ms) +✔ a record that throws moves the work ref back, or removes a new one (126.587935ms) +✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (397.611832ms) +✔ a root that can't be read refuses root-unreadable (29.025189ms) +✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2160.660581ms) +✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.569329ms) +✔ a working repository path that isn't a directory refuses (30.827875ms) +✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (110.037703ms) +✔ review of a project with no working repository refuses unknown-commit (12.83585ms) +✔ the runner's git tools hold the host's limits and branch rule (1.162495ms) +ℹ tests 120 +ℹ suites 0 +ℹ pass 120 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4849.085042 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-tasks.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-tasks.log new file mode 100644 index 000000000..045c78a05 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-tasks.log @@ -0,0 +1,100 @@ +✔ the boot config is checked before anything starts (98.80724ms) +✔ a business with no tracker entry refuses task verbs (125.230902ms) +✔ credential.expiring and .expired are recorded once per instance (208.188163ms) +✔ a token file that changes on disk records credential.changed (121.905276ms) +✔ autostart polls, reconciles and retries a startup the tracker was down for (148.663147ms) +✔ a refusal a restart must clear is not retried by the poll (102.818629ms) +✔ a poll that fires while two are queued is dropped (101.87759ms) +✔ close waits for a running verb and refuses one that has not started (211.825335ms) +✔ the bundled Vikunja is the pinned upstream image the runbook names (0.727101ms) +✔ every published port is on 127.0.0.1, and no secret is in the file (0.259194ms) +✔ the committed table loads frozen; its verbs are the broker task verbs (1.350825ms) +✔ a write names a verb the table has as its own key, not one it inherits (0.450993ms) +✔ the schema refuses any other shape (2.460735ms) +✔ the Field table in the slice 1 plan names the verbs each field is written by (0.565773ms) +✔ each verb refuses, asks for a decision and writes as the table and the role files say (1191.758641ms) +✔ the list holds the PRD's requirement ids, in its order, at its version (1.232627ms) +✔ the committed list loads frozen (0.534381ms) +✔ the schema refuses any other shape (2.25841ms) +✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (359.329248ms) +✔ the project list holds recorded project objects in the recorded list envelope (94.777073ms) +✔ the recorded task bodies pass the checks S3 applies to every read (0.42365ms) +✔ the client works against the fake over real HTTP with the platform fetch (244.646265ms) +✔ a correct install starts, and the first reconcile records tasks that already exist (126.022516ms) +✔ verbs refuse while a business is starting and after startup refused it (138.649202ms) +✔ startup refuses a token that can do more than its role needs (374.50055ms) +✔ startup refuses an unsupported version and flags an untested one (288.121005ms) +✔ startup refuses a board that the runbook did not install (382.967863ms) +✔ startup refuses a project the sync bot cannot read (86.933866ms) +✔ startup refuses a configured label the pm bot cannot see (95.554985ms) +✔ startup refuses an expired credential and a missing sync credential (195.856642ms) +✔ an unreachable tracker refuses with tracker-unavailable (86.631686ms) +✔ an edit in the UI is recorded once, with the fields that changed (216.545224ms) +✔ a move between open buckets is seen on the board, though updated does not change (164.230165ms) +✔ a person's comment is counted and a bot's is not (277.396349ms) +✔ the hourly reconcile catches a comment through comment_count (236.809884ms) +✔ a task closed in the UI leaves the open view with its done bucket (394.544945ms) +✔ a task that leaves the board is recorded as deleted, moved or out of reach (268.219526ms) +✔ a poll that read before a verb wrote does not overwrite the verb (170.580581ms) +✔ a tracker fault during a tick is reported and the next tick catches up (150.010241ms) +✔ a malformed answer refuses the tick with tracker-shape (133.338185ms) +✔ no token value reaches the database, the log or a refusal (255.013005ms) +✔ the first look at a task counts only comments inside the window (144.125871ms) +✔ with descendants off the adapter reads no project list and no child, as in v0 (131.061019ms) +✔ a three-level tree is read per project, and a project outside it is not (112.209451ms) +✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (202.875988ms) +✔ a root without the installed buckets refuses with descendants on (101.012421ms) +✔ the project list refuses without read_all, and skips archived projects and saved filters (211.670399ms) +✔ descendants must be true or false (81.413343ms) +✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (167.501291ms) +✔ a child made after startup joins the tree at the next reconcile (154.017319ms) +✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (168.222773ms) +✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (193.449979ms) +✔ a reconcile that fails keeps the previous tree (130.929174ms) +✔ a closed task the cursor missed takes its own project's done bucket (129.16481ms) +✔ closed tasks read at startup take their own project's done bucket (75.58501ms) +✔ a closed task the cursor returns takes its own project's done bucket (123.725042ms) +✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (119.855943ms) +✔ a task in a bucket outside the five keeps its raw bucket id (116.475205ms) +✔ bucket 0 on a watch-only task never becomes a bucket or a state (192.769554ms) +✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (136.847607ms) +✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (131.035881ms) +✔ task.create needs a recorded human request and a requirement id (204.553923ms) +✔ task.create takes only an approved requirement id (198.828209ms) +✔ task.create cites the request a received message carries, not the message's id (174.207127ms) +✔ only labels named in the business file can be written (232.689281ms) +✔ task.schedule sets and clears a due date and relations (278.706232ms) +✔ assign and reassign move the role bots and record task.assigned (310.140321ms) +✔ task.update.assigned is for the assignee and records task.state (316.424293ms) +✔ a wrong expected digest records task.conflict and writes nothing (182.957407ms) +✔ a cross-role verb needs a resolved decision, used once (215.472438ms) +✔ task.close needs a verdict; after it every verb refuses with task-done (207.988048ms) +✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (263.301086ms) +✔ a lost answer is settled by a re-read and never retried (177.900917ms) +✔ a create whose answer is lost is reported uncertain, and the poll finds the task (110.070479ms) +✔ a task the sync bot cannot read refuses and records nothing (88.505007ms) +✔ verbs and polls for one business run one at a time (157.951072ms) +✔ a due date with milliseconds is written to the second (153.217701ms) +✔ every write landed and the final read failed: the verb succeeds and records what it wrote (104.463181ms) +✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (76.887254ms) +✔ a create whose final read fails succeeds and records task.created (84.996061ms) +✔ an edit between the last write and the final read shows as external on the next poll (98.633631ms) +✔ task.created is recorded when a later label write fails (61.46705ms) +✔ every verb acts in an installed child, on the child's own board (226.790073ms) +✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (146.428786ms) +✔ with descendants off, task.create takes only the root project (71.874162ms) +✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (100.00347ms) +✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (131.495173ms) +✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (93.110166ms) +✔ a verb and a create in the child record the final read of the child's board (81.000463ms) +✔ a create in the child whose final read fails records the child's todo bucket (95.81865ms) +✔ a lost answer in the child is settled by a re-read of the child's board (120.780458ms) +✔ every related task is read before authority, not only the first (91.870465ms) +ℹ tests 92 +ℹ suites 0 +ℹ pass 92 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4948.995448 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-webui.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-webui.log new file mode 100644 index 000000000..691831c26 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/pkg-webui.log @@ -0,0 +1,117 @@ +✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (6297.038269ms) +✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (7645.070123ms) +✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (4540.681377ms) +Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286} +✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (6410.95818ms) +✔ the README says a refused field table names the file or the key at fault, never a path (1.289205ms) +✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (7921.107178ms) +✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (302.207495ms) +✔ decisions route serves the roles and recent lists from the reader view (494.701475ms) +✔ credentials route serves the broker credential status from the reader view (340.641924ms) +✔ replies route serves the replies to one message from the reader view (1053.736556ms) +✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (165.862797ms) +✔ bus refusals map to statuses and never carry a path or a stack (81.407964ms) +✔ humanCall speaks the human transport protocol without blocking the server (1786.14702ms) +✔ busReader takes --business, else the live bus host, else refuses (232.644118ms) +✔ humanCall kills a transport that runs past its timeout (528.334602ms) +✔ serve refuses a --business value that is not a business id (266.101415ms) +✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (5937.30926ms) +✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3453.851991ms) +✔ conversation view: a newer session with no readable history keeps the marker (1892.766911ms) +✔ conversation view: seats without history say so and offer no reply (2091.329146ms) +✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (4482.949071ms) +✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54705.885652ms) +✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (324.18192ms) +✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (10875.565483ms) +✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (2966.53842ms) +✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2915.913668ms) +✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (4070.69347ms) +✔ copy writes nothing when an archived path is missing at the commit (573.727912ms) +✔ a copy that loses the rename race leaves no read-only temp directory behind (859.773313ms) +✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (627.986804ms) +✔ a copy that meets a target holding files says exists: and moves nothing into it (682.372333ms) +✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (486.187275ms) +✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (1596.82891ms) +✔ serve refuses a --checkout that is not an absolute directory path (329.027849ms) +✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (54.603938ms) +✔ preview options are all three or none, and each is checked (7.936316ms) +✔ the CLI refuses a partial or invalid preview flag set at start (2160.122185ms) +✔ the CLI with all three flags serves the preview mode (391.612626ms) +✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (26.694823ms) +✔ the header name matches without regard to case, and the value compare is exact (4.458153ms) +✔ the public name with the header reads the bus views, and the Host and Origin are checked first (39.596193ms) +✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (15.109886ms) +✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (7.678104ms) +✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (21.876593ms) +✔ a repeated Host is 400 before any other check, in preview mode and without it (9.253233ms) +✔ without the preview flags the public name is refused and writes still reach the board (6.831709ms) +✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (2.117622ms) +✔ credential state from the date alone, as the bus states it (0.257576ms) +✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1923.592986ms) +✔ queue: a refused read fails closed with the store's text, redacted (1883.235979ms) +✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (4552.075433ms) +✔ business: names, vars on the allowlist, authority, credential metadata only (12.564062ms) +✔ business: missing or invalid file refuses with the module's text, redacted (30.328279ms) +✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (11.271847ms) +✔ settings: release, board, loopback address, notifier binding name only (701.989547ms) +✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (20.924446ms) +✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (5767.310165ms) +✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (22554.24854ms) +✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (6594.874038ms) +✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13667.159128ms) +✔ startServer takes send only as a function and only with the preview mode (5.812234ms) +✔ the CLI refuses --send without the preview flags, and without a configured bus (503.978165ms) +✔ the CLI with --send and a configured bus sends through the human transport and logs one line (132.435438ms) +✔ without --send the route is read-only like every other write, and config says no send (9.231271ms) +✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (5.836844ms) +✔ config says send only on the public name with --send on (1.82475ms) +✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.700288ms) +✔ each request check refuses before anything is sent, and logs the refusal without the body (12.103085ms) +✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (3.69418ms) +✔ a crafted role name cannot forge a log line (1.95722ms) +✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (5.543821ms) +✔ through the human transport the request is exactly the business, message.send and the keys (104.535593ms) +✔ against a real broker: the message is written once as a human send, and its refusals map (2217.124391ms) +✔ loopback host and board origin fail closed (5.28171ms) +✔ real board fixture passes through WebUI; assets and isolated seen/reply work (512.143144ms) +✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (50.3962ms) +✔ unreachable board reports URL; CLI rejects unsupported options (380.729217ms) +✔ render prints the unit without the preview flags (8.760772ms) +✔ render carries every serve flag, the preview set included (5.780891ms) +✔ a partial preview set is refused (12.883021ms) +✔ a value the unit cannot carry is refused, for every flag (222.448903ms) +✔ the rendered unit names none of the human proof agent markers and sets no agent variable (15.992476ms) +✔ install into --dir with --no-reload writes the file whole, then reports unchanged (163.727815ms) +✔ install without --no-reload runs daemon-reload and nothing that starts the unit (71.354649ms) +✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (324.914474ms) +✔ status prints the unit state and GET /healthz on the installed port (216.539714ms) +✔ usage: an unknown verb or flag, and start or enable, exit 4 (101.045447ms) +✔ without --send, render is the template with its placeholders filled, byte for byte (56.735269ms) +✔ render --send with the preview set ends ExecStart with --send and changes nothing else (101.704138ms) +✔ --send without the whole preview set is refused and writes nothing (215.479106ms) +✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (530.302542ms) +✔ uninstall and status take no --send (306.369956ms) +✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (693.453782ms) +✔ when the state read fails, install and uninstall refuse with one line and change nothing (143.518719ms) +✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (149.108431ms) +✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (641.181354ms) +✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (19.360599ms) +✔ the uid header takes only an Authentik uid; the username header still takes a username (348.609515ms) +✔ a preview value cannot start with - or . (36.202622ms) +✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (452.176142ms) +✔ tokens.css and icons.svg are byte copies of docs/design (0.822042ms) +✔ JetBrains Mono files match the digests in their sources file, with the OFL text (1.539103ms) +✔ shipped strings are unchanged, and the web keeps its write boundary (1.893239ms) +✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (7084.310216ms) +✔ five states on Board, Inbox, Tasks, Agents and Trail (2712.774663ms) +✔ Queue, Business and Settings in their five states, with no move button (5199.542903ms) +✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (2347.084531ms) +✔ the server log names no config path when the system config refuses (316.346059ms) +ℹ tests 108 +ℹ suites 0 +ℹ pass 108 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 55151.994719 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-auth.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-auth.log new file mode 100644 index 000000000..ac2287606 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-auth.log @@ -0,0 +1,17 @@ +OK status with missing harness credential exits 3 and still lists accounts +OK status reports harness credential (read-only) + mosaic accounts +OK api key material never reaches output +OK oauth token material never reaches output +OK unparseable credential file exits 2 +OK symlinked credential file exits 4 +OK env-side credential names reported +OK env var values never reach output +OK accounts without an accounts dir reports none and creates nothing +OK accounts lists files and marks the active one +OK loose account perms flagged in listing +OK agent --auth with missing account file refuses (exit 4) +OK agent --auth with non-0600 account file refuses +OK agent --auth with invalid account name refuses +OK auth.sh without valid config refuses + +selftest: 15 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-conductor.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-conductor.log new file mode 100644 index 000000000..62afc513c --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-conductor.log @@ -0,0 +1,23 @@ +On branch refactor +Your branch is up to date with 'origin/refactor'. + +nothing to commit, working tree clean +OK dry-run: allowed change, exit 0, nothing committed (exit 0) +OK dry-run committed nothing +OK apply: allowed change exits 0 (exit 0) +OK apply: attribution in commit subject +OK apply: target tree clean after commit +OK disallowed path refused (exit 1) +OK disallowed path: target untouched +OK syntax gate refused broken .mjs (exit 1) +OK syntax gate: target untouched +OK suite failure refused (exit 1) +OK suite failure: target reverted to clean +OK disabled policy refused (exit 2) +OK disabled policy: target untouched +OK failed run refused (exit 1) +OK failed run: target untouched +OK missing run exits 4 (exit 4) +OK invalid policy exits 2 (exit 2) + +selftest: 17 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-config.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-config.log new file mode 100644 index 000000000..76c05ef74 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-config.log @@ -0,0 +1,26 @@ +OK absent adapter defaults to pi +OK adapter mock validates (exit 0) +OK unsupported adapter exits 2 (exit 2) +OK env exports adapter +OK bootstrap creates default when absent (exit 0) +OK bootstrap wrote config file +OK bootstrap is idempotent on existing config (exit 0) +OK bootstrap did not rewrite existing config +OK validate missing config exits 3 (exit 3) +OK malformed JSON exits 2 (exit 2) +OK unsupported configVersion exits 2 (exit 2) +OK unknown top-level key exits 2 (exit 2) +OK unknown execution key exits 2 (exit 2) +OK unsupported backend exits 2 (exit 2) +OK unsupported environment exits 2 (exit 2) +OK relative dataRoot exits 2 (exit 2) +OK non-canonical dataRoot exits 2 (exit 2) +OK filesystem root dataRoot exits 2 (exit 2) +OK home directory dataRoot exits 2 (exit 2) +OK dataRoot containing config dir exits 2 (exit 2) +OK control character in provider exits 2 (exit 2) +OK symlinked config file exits 2 (exit 2) +OK env exports resolve correctly +OK failed validation modified nothing + +selftest: 24 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-discord.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-discord.log new file mode 100644 index 000000000..b013f9ffa --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-discord.log @@ -0,0 +1,70 @@ +toolchain: node v26.8.1 + +OK syntax: packages/discord/src/approvals.mjs +OK syntax: packages/discord/src/authorize.mjs +OK syntax: packages/discord/src/binding.mjs +OK syntax: packages/discord/src/cli.mjs +OK syntax: packages/discord/src/connector.mjs +OK syntax: packages/discord/src/context.mjs +OK syntax: packages/discord/src/engine-pi.mjs +OK syntax: packages/discord/src/errors.mjs +OK syntax: packages/discord/src/gateway.mjs +OK syntax: packages/discord/src/git.mjs +OK syntax: packages/discord/src/journal.mjs +OK syntax: packages/discord/src/notify.mjs +OK syntax: packages/discord/src/rest.mjs +OK syntax: packages/discord/src/setspark.mjs +OK syntax: packages/discord/src/tools.mjs +OK syntax: packages/discord/src/web.mjs +OK syntax: packages/discord/bin/git-credential.mjs +OK syntax: packages/discord/extension/tools.mjs +OK syntax: packages/discord/tests/approvals.test.mjs +OK syntax: packages/discord/tests/authorize.test.mjs +OK syntax: packages/discord/tests/binding.test.mjs +OK syntax: packages/discord/tests/connector.test.mjs +OK syntax: packages/discord/tests/context.test.mjs +OK syntax: packages/discord/tests/engine.test.mjs +OK syntax: packages/discord/tests/fake-pi.mjs +OK syntax: packages/discord/tests/gateway.test.mjs +OK syntax: packages/discord/tests/git.test.mjs +OK syntax: packages/discord/tests/helpers.mjs +OK syntax: packages/discord/tests/journal.test.mjs +OK syntax: packages/discord/tests/notify.test.mjs +OK syntax: packages/discord/tests/recover.test.mjs +OK syntax: packages/discord/tests/rest.test.mjs +OK syntax: packages/discord/tests/setspark.test.mjs +OK syntax: packages/discord/tests/tools.test.mjs +OK syntax: packages/discord/tests/web.test.mjs +OK syntax: packages/discord/fixtures/claim-worker.mjs +OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs +OK syntax: scripts/discord.sh +OK syntax: scripts/discord-service.sh +OK packages/discord declares no dependencies +OK no bot-token-shaped string in packages/discord +OK fixture binding uses placeholder ids only +OK fixture binding validates +OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool +OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start +OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root +OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token +OK real pi with protocol vault adds reserve_id to the git verbs +OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key +OK real pi refuses a git key on a read-only root (fail closed) +OK real pi with the pilot flags (--no-tools) exposes no tool at all +OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed) +OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT +OK node --test packages/discord/tests/ (ℹ pass 178) +OK scripts/discord.sh --help exits 0 +OK scripts/discord.sh check without a binding exits 4 +OK scripts/discord.sh recover without a binding exits 4 +OK scripts/discord.sh reload without a binding exits 4 +OK scripts/discord-service.sh without a command exits 4 +OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP +OK service install writes the rendered unit (0644) and leaves no temp file +OK service install a second time reports unchanged +OK systemd-analyze verify accepts the rendered unit +OK service uninstall removes the unit file +OK service install with an unknown flag exits 4 +OK service install with USER unset finishes and names the account for lingering + +discord suite: 66 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-extension-package.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-extension-package.log new file mode 100644 index 000000000..7d5959b9f --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-extension-package.log @@ -0,0 +1,21 @@ +OK initial ordinary-file install +OK installed tree matches canonical source +OK installed tree has no symlinks +OK check detects installation drift +OK sync refuses to overwrite installation drift +OK check detects an extra destination file +OK check detects an extra destination directory +OK check rejects a destination symlink +OK sync accepts a canonical source update +OK updated installation matches canonical source +scripts/test-extension-package.sh: line 14: 4173242 Killed "$@" > /dev/null 2>&1 +OK forced interruption kills the replacing process +OK next invocation recovers old consistent installation +OK interrupted replacement rolled back +OK sync succeeds after interruption recovery +OK unlocked stale lock file does not block +OK active lock refuses a concurrent sync +OK source symlink fails closed +OK nested second entrypoint fails closed + +extension package selftest: 18 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-foundation.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-foundation.log new file mode 100644 index 000000000..6338e1e6d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-foundation.log @@ -0,0 +1,53 @@ +toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0 + +OK syntax: scripts/foundation-inspect.mjs +OK syntax: scripts/foundation/strict-json.mjs +OK syntax: scripts/foundation/canonical.mjs +OK syntax: scripts/foundation/resolve.mjs +OK syntax: scripts/foundation/validate-record.mjs +OK syntax: scripts/foundation/fixtures/build-fixtures.mjs +OK syntax: scripts/foundation/canonical.test.mjs +OK syntax: scripts/foundation/cli.test.mjs +OK syntax: scripts/foundation/fixtures.test.mjs +OK syntax: scripts/foundation/resolve.test.mjs +OK syntax: scripts/foundation/strict-json.test.mjs +OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written) +OK fixture generator runs +OK checked-in fixtures/bundles equal a fresh generation +OK checked-in fixtures/raw equal a fresh generation +OK checked-in fixtures/index.json equal a fresh generation +OK checked-in demo bundles equal a fresh generation +OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT +OK node --test scripts/foundation/ (ℹ pass 80) +OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof) + platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999) + node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases) + schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10 + profile column (schema-valid records only): profile-valid 510, profile-invalid 30 + profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns +OK oracle: zero schema-column disagreements with the pinned checker +OK oracle: strict-only profile refusals are counted and asserted +OK demo: permitted read preview exits 0 (exit 0) +OK demo: permitted file.change preview exits 0 (exit 0) +OK demo: assignment.change proposal is unresolved (exit 3) (exit 3) +OK demo: revoked registration is refused (exit 3) (exit 3) +OK demo: message is not authority (exit 3) (exit 3) +OK usage: no arguments exits 2 (exit 2) +OK io: missing file exits 4 (exit 4) +OK io: directory exits 4 (exit 4) +OK io: symlink exits 4 (O_NOFOLLOW) (exit 4) +OK bound: oversize fixture exits 2 (exit 2) +OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2) +OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2) +OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0) +OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed +OK text output starts with the disclaimer +OK json output is valid JSON with result allowed and exactly the charter §7 fields +OK json golden matches byte-for-byte +OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal +OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs +OK canary never printed (bundle run and credential-file run) +OK a non-bundle JSON file is refused at the shape gate, not read into output +OK no field of the non-bundle file is echoed + +selftest: 44 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-queue.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-queue.log new file mode 100644 index 000000000..c50ded54f --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-queue.log @@ -0,0 +1,36 @@ +toolchain: node v26.8.1, git version 2.55.0 + +OK syntax: packages/queue/src/cli.mjs +OK syntax: packages/queue/src/errors.mjs +OK syntax: packages/queue/src/io.mjs +OK syntax: packages/queue/src/lock.mjs +OK syntax: packages/queue/src/queue.mjs +OK syntax: packages/queue/src/review.mjs +OK syntax: packages/queue/src/store.mjs +OK syntax: packages/queue/tests/commit.test.mjs +OK syntax: packages/queue/tests/data.test.mjs +OK syntax: packages/queue/tests/dispatch.test.mjs +OK syntax: packages/queue/tests/gate-owner.test.mjs +OK syntax: packages/queue/tests/helpers.mjs +OK syntax: packages/queue/tests/lock.test.mjs +OK syntax: packages/queue/tests/migration.test.mjs +OK syntax: packages/queue/tests/review.test.mjs +OK syntax: packages/queue/tests/store.test.mjs +OK syntax: packages/queue/tests/write.test.mjs +OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs +OK syntax: packages/queue/tests/fixtures/kill-at.mjs +OK syntax: packages/queue/tests/fixtures/lock-child.mjs +OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh +OK syntax: scripts/queue-commit.sh +OK syntax: scripts/git-hooks/pre-commit +OK syntax: scripts/mosaic +OK queue-commit.sh, the guard and scripts/mosaic are executable +OK packages/queue declares no dependencies +ℹ tests 156 +ℹ pass 156 +ℹ fail 0 +OK node --test packages/queue/tests/ +OK scripts/mosaic queue help +skip queue verify and render --check: this checkout (/home/jwoltje/darkwing-scratch/rt-4bc9/land-work.4hHHey/lw-4075603-1792003071) is not the queue's canonical root (/mnt/storage/src/mosaic-stack) + +queue suite: 28 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-release.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-release.log new file mode 100644 index 000000000..7202b85d4 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-release.log @@ -0,0 +1,16 @@ +OK valid RELEASE resolves (exit 0) +OK invalid RELEASE exits 1 (exit 1) +OK missing RELEASE exits 1 (exit 1) +OK valid RELEASE leaves image tag consistent with version +OK status safe on empty state (exit 0) +OK status created no pointer +OK fault-injected activation refuses (exit 1) +OK refused activation wrote no pointer +OK refusal logged exactly once with valid fields +OK healthy activation succeeds (exit 0) +OK pointer written with valid fields +OK repeat activation succeeds (log grows) (exit 0) +OK log is append-only across activations +OK rollback without previous refuses (exit 1) + +selftest: 14 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-task.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-task.log new file mode 100644 index 000000000..df6724a77 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.ASEJp9/script-task.log @@ -0,0 +1,101 @@ +OK valid task validates (exit 0) +OK unknown task key exits 2 (exit 2) +OK unsupported taskVersion exits 2 (exit 2) +OK invalid task id exits 2 (exit 2) +OK empty prompt exits 2 (exit 2) +OK NUL in expectExact exits 2 (exit 2) +OK out-of-range timeout exits 2 (exit 2) +OK missing mission file exits 4 (exit 4) +OK task with valid mission validates (exit 0) +OK invalid mission exits 2 (exit 2) +OK validate missing task exits 4 (exit 4) +OK validation does not modify the task file +OK prune dry-run exits 0 (exit 0) +OK dry-run deleted nothing +OK prune --keep=2 --yes removes oldest (exit 0) +OK kept exactly 2 newest runs +OK newest run kept, oldest pruned +OK append-only receipt written (3 entries) +OK sessions/workspaces untouched by prune +OK prune with invalid keep exits 4 (exit 4) +OK mock adapter: gate passes on matching mock response (exit 0) +OK mock adapter: expect-mismatch recorded (exit 1) +OK mismatch reason recorded +OK unknown adapter fails closed (exit 1) +OK mission task runs via mock adapter (exit 0) +OK mission section injected into generated prompt +OK retry of mission run succeeds (exit 0) +OK retriedFrom lineage recorded +OK mission section present after retry (relative path resolved) +OK retry of missing run exits 4 (exit 4) +OK skill install bundled ms-tools (exit 0) +OK installed to skills-available +OK double install refuses (exit 1) +OK activate enables skill (exit 0) +OK enabled dir populated +OK uninstall while enabled refuses (exit 1) +OK deactivate moves back to available (exit 0) +OK uninstall removes from available (exit 0) +OK seat with enabled skill launches +OK skill path delivered to adapter +OK shipped researcher contract resolves (ceiling + network) +OK resolve-role refuses a non-role document (conductor policy) (exit 2) +OK resolve-role refuses name/filename mismatch (exit 2) +OK resolve-role refuses unknown network declaration (exit 2) +OK resolve-role refuses duplicate role tool (exit 2) +OK resolve-role refuses unsupported tool (exit 2) +OK resolve-role refuses missing contract file (exit 4) +OK version 1 role prints no contract line +OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer) +OK resolve-role accepts a minimal version 2 role (exit 0) +OK resolve-role refuses an action outside the vocabulary (exit 2) +OK resolve-role refuses a gated-only action in a role file (exit 2) +OK resolve-role refuses a Vikunja verb no role may hold (exit 2) +OK resolve-role refuses a version 2 role whose contract is missing (exit 2) +OK resolve-role refuses a contract that is a symbolic link (exit 2) +OK seat launches under role ceiling +OK role ceiling narrows seat tools (read,write,bash -> read,bash) +OK narrowing recorded loudly +OK missing role contract refuses launch (exit 2) +OK missing-contract refusal names the role +OK empty ceiling intersection -> tool-free seat +OK tool-free outcome recorded loudly +OK overridden agents dir without seat definition refuses (exit 4) +OK seat-resolution refusal names the seat +OK policy: mission only -> mission tools +OK policy: task only -> task tools +OK policy: both -> intersection (task narrowed) +OK policy: empty intersection -> tool-free +OK invalid mission capabilities rejected (exit 2) +mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls) +OK task run with user layer present (exit 0) +OK user context dispatched into generated prompt +OK workspace+tools task runs via mock (exit 0) +OK workspace path + tools delivered to adapter +OK persistent workspace created on host +OK plain task still runs (no workspace/tools) (exit 0) +OK workspace var present but empty when absent +OK tools empty when absent +OK unknown tool exits 2 (exit 2) +OK workspace traversal exits 2 (exit 2) +OK live hello task succeeds with exact marker +OK result.json written in run dir +OK result.json contents are correct +OK wrong expectExact fails with exit 1 (reason: expect-mismatch) +OK each run gets a distinct run dir (no clobber) +OK list shows both runs +OK fork base: teach succeeds (exit 0) +OK fork child recalls ancestor context (exit 0) +OK forked child recalled ancestor code word +OK ancestor session untouched by fork +OK child session dir has its own branch file +OK onboard without name exits 4 (non-interactive) (exit 4) +OK onboard --name renders profile (exit 0) +OK profile written +OK canon structure: required filled, optional placeholdered +OK canon sections present +OK user recall run succeeds +OK recalled user name (response: Jason) +OK no agent identity on headless run + +selftest: 98 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/gate.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/gate.log new file mode 100644 index 000000000..6578a1e50 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/gate.log @@ -0,0 +1,23 @@ +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-bus.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-bus.log new file mode 100644 index 000000000..f3d7108ad --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-bus.log @@ -0,0 +1,156 @@ +✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (210.283609ms) +✔ agents: working counts what the holder received and has not read; routed alone is not working (220.715038ms) +✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (374.208008ms) +✔ agents: working wins over waiting, and Input needed still shows (197.448083ms) +✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (296.632672ms) +✔ agents: state reads only its own business, even for a run name both use (266.063519ms) +✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (313.878016ms) +✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (322.089661ms) +✔ agents: stranded is oldest first and capped at 50 for a role (1164.14028ms) +✔ agents: stranded is per role and per business (367.879268ms) +✔ agents: a message routed to a held role and not yet received is not stranded (147.450589ms) +✔ launch identity is stamped, payload identity is refused and stale holder cannot send (223.99197ms) +✔ decision classes route from policy; gated resolution is human-only, choice and target must match (293.572424ms) +✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (317.924562ms) +✔ launch events require a human CLI capability; generic emit cannot forge authority events (212.323144ms) +✔ within-role decisions close atomically and invalid options or blocking omissions refuse (256.439738ms) +✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (425.231924ms) +✔ observer capabilities read human inbox but cannot mutate or forge launch identity (196.851204ms) +✔ task action subjects and linked decision trail are complete and ordered (311.420518ms) +✔ launch binding is durable and reconnecting requires the identical trusted record (137.057477ms) +✔ business isolation includes inherited object names and cross-business message references (213.178018ms) +✔ authority never transfers between action, run, target, unresolved or replaced role holder (547.461947ms) +✔ task projection uses schema current view, skipping earlier and equal-start polls (144.073123ms) +✔ revocation permanently bars the old run from reclaiming first, including after broker restart (250.771763ms) +✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (159.640618ms) +✔ both arbiters require human resolution when their cross-role route is themselves (250.295607ms) +✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (134.161978ms) +✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.270933ms) +✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (156.361559ms) +✔ credentials refuses a role session and any argument (196.613969ms) +✔ credentials reads the status on each request, and a broker without one lists none (255.142986ms) +✔ the broker process answers credentials without a token, path or variable in its output, log or store (207.843028ms) +✔ only validated broker references load; returned data and exceptions cannot expose a known token (41.743945ms) +✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (2.528624ms) +✔ expiry refuses use and env references never become client data (0.479662ms) +✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.031959ms) +✔ opaque tokens shorter than 16 characters refuse before use (0.22769ms) +✔ roles lists open decisions routed to a role, and never the human inbox (274.041011ms) +✔ recent lists closed decisions of every route, newest close first, with how each closed (339.964297ms) +✔ recent gives the closing event as closed when the decision was seen first (340.348519ms) +✔ recent stops at RECENT rows (1186.313475ms) +✔ every row is what trail already gives the same session for that id (287.625984ms) +✔ a role session can't list decisions, so it can't read another role's open decisions (688.017524ms) +✔ decisions is a read: one business, strict arguments, nothing written (391.041021ms) +✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (197.169384ms) +✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (150.686961ms) +✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (177.620135ms) +✔ endLaunch leaves a claim another run took alone (202.655656ms) +✔ refuse records action.refused against the caller with the code only (175.243136ms) +✔ launches off refuses role.launch with launch-revoked until launches on (199.360809ms) +✔ broker process: launch ops authorize role.launch, record refusals and end runs (380.322901ms) +✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.748776ms) +✔ process reader gets own kernel identity without exposing environment values (0.533122ms) +✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.680285ms) +✔ real pid 1 remains inspectable when its environment is protected (0.254001ms) +✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (237.322605ms) +✔ missing and foreign-business citations refuse and roll back message and grant (228.967153ms) +✔ cross-role sends still need a matching resolved decision and consume it once (273.424286ms) +✔ messages pages all human messages newest first without writes; read state is history (3392.275868ms) +✔ messages refuses role callers, invalid paging and cursors outside this human feed (259.361285ms) +✔ views messages passes only its paging arguments through (0.228098ms) +✔ messages isolates businesses even with a valid foreign cursor (191.667552ms) +✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (202.535724ms) +✔ startup token refusal returns safe code without value or partial listening broker (38.314704ms) +✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (212.757762ms) +✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (192.974934ms) +✔ trusted host registers later launches; socket clients never have a registration verb (205.818065ms) +✔ runtime excludes declared project roots even when host supplies no repoRoots (33.663161ms) +✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (199.485823ms) +✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (295.78423ms) +✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (234.438193ms) +✔ a message with no reply gives an empty list (188.858408ms) +✔ replies come oldest first and stop at REPLIES (1051.468477ms) +✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (452.863295ms) +✔ strict arguments; a role session gets human-required (396.620097ms) +✔ views passes replies through as one call with the id (0.205571ms) +✔ requirements returns the committed list to a holding role session, and no one else (255.019352ms) +✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (174.57837ms) +✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (209.407368ms) +✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (296.037973ms) +✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (303.637348ms) +✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (340.11945ms) +✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (508.069866ms) +✔ reviewFetch answers only the addressed reviewer, for the request it cites (389.769794ms) +✔ review.verdict answers one request once, to the role that asked (426.2812ms) +✔ task.close on a pushed task needs an approve verdict for the latest push (640.724306ms) +✔ a refusal the host decided is filed on the task it names, and only a task ref counts (269.78516ms) +✔ v3b prototype refusals, views and append-only mutations (1285.163637ms) +✔ gated approval authorizes once, survives store reopen, and fresh approval works (298.919178ms) +✔ another run cannot consume an approval; a failed check leaves it usable (265.883327ms) +✔ two scheduled callers have exactly one grant and one consumed refusal (191.662097ms) +✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (435.937638ms) +✔ class drift gated to cross-role refuses before consumption (362.697159ms) +✔ class drift cross-role to gated refuses before consumption (318.449296ms) +✔ class drift gated to within-role refuses before consumption (363.629065ms) +✔ class drift cross-role to within-role refuses before consumption (271.197089ms) +✔ class drift within-role to gated refuses before consumption (471.342272ms) +✔ class drift within-role to cross-role refuses before consumption (210.180197ms) +✔ message.send consumes approval and prevents a later send or authorize (230.851645ms) +✔ role.revoke consumes approval and prevents a later revoke or authorize (271.508247ms) +✔ a business that never switched launches reads allowed with no time and no event (150.176307ms) +✔ launches revoked and then restored read allowed, with the restore time and event id (169.316532ms) +✔ a task closed on the tracker leaves the open list, and total counts the open ones (172.762257ms) +✔ a tombstone is not open (152.550737ms) +✔ the open list stops at the cap and says so; total still counts every open task (189.606572ms) +✔ a role and a reader session read state; arguments, and an unbound cap, refuse (165.485094ms) +✔ a human session reads the same state, with the same cap (215.819377ms) +✔ reading state writes nothing: every table keeps its row count (211.339038ms) +✔ creates private WAL store and excludes a second writer until explicit close (142.344371ms) +✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (193.550834ms) +✔ existing empty database and symlink runtime directory refuse, never initialize over damage (210.944569ms) +✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (206.009517ms) +✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (125.280523ms) +✔ async transactions refuse before invoking their function (115.223221ms) +✔ the session default fits under the reply cap and pages to the end with next (335.067361ms) +✔ the short form: no description, assignees by role, every listed key (342.32896ms) +✔ each filter, alone and together, and total counts every match (458.396406ms) +✔ task_ref reads one task in full, as the whole board has it (405.849585ms) +✔ no arguments is the read the Console and mosaic make, unchanged (280.090765ms) +✔ an unknown argument or a bad value refuses invalid-request (1172.482306ms) +✔ tasks rows carry priority and requirement for every session that reads tasks (348.6625ms) +✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (545.646762ms) +✔ an empty business and one with snapshots but no task.created read cleanly (153.958091ms) +✔ recordTask keeps sync reads and a role write apart (215.623789ms) +✔ read_at must be one canonical UTC format, so the projection compares strings safely (177.469269ms) +✔ a bad entry refuses the whole record (154.293083ms) +✔ taskView reads the projection for one business (220.663018ms) +✔ requestTask hands only a holder and a task verb to the handler, and records refusals (308.761739ms) +✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (519.5176ms) +✔ without an adapter the server refuses every task verb (490.241227ms) +✔ the runtime refuses an invalid adapter and closes a valid one (226.873176ms) +✔ the process loads the S3 adapter from plain-data trackers (263.745833ms) +✔ the tester binds only when the business sets bus.tester to exactly true (1178.331339ms) +✔ a business may not name a role tester, so the tester address is never a role (274.932205ms) +✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (834.834469ms) +✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (243.66276ms) +✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (280.997386ms) +✔ the tester reads the human views a reader reads (148.168048ms) +✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.134362ms) +✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.337236ms) +✔ testerNonce reads only the tester's variable and gives null on any read error (0.198241ms) +✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (60.677937ms) +✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (765.425981ms) +✔ socket capability stamps launch identity; shared views use wire, no SQL client (235.455556ms) +✔ two wire claims serialize; a lost reply never automatically retries (310.705906ms) +✔ malformed, oversized and identity-forging envelopes refuse without echoing input (119.820631ms) +✔ client preserves UTF-8 when a response divides a multibyte character (11.249303ms) +✔ committed mutation followed by dropped reply reports unknown and is never retried (150.903347ms) +ℹ tests 148 +ℹ suites 0 +ℹ pass 148 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4990.290312 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-business.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-business.log new file mode 100644 index 000000000..ea33bcf0f --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-business.log @@ -0,0 +1,75 @@ +✔ config directory and file path follow MOSAIC_CONFIG (1.122227ms) +✔ the fixture business validates and comes back frozen (3.264409ms) +✔ two instances may share a definition (1.002532ms) +✔ top-level refusals (4.018405ms) +✔ arbiters and projects (6.14247ms) +✔ role instances (3.261108ms) +✔ Vikunja bots (7.697235ms) +✔ a role without Vikunja takes no tracker block (1.870509ms) +✔ credential references match the definition's services (2.178675ms) +✔ launch (6.82394ms) +✔ loadBusiness: file checks (1.713758ms) +✔ loadBusiness: not a regular file (32.593465ms) +✔ loading writes nothing (0.966379ms) +✔ names that are Object.prototype properties don't count as declared (2.497501ms) +✔ the shipped example refuses as written and validates once filled in (0.49399ms) +✔ the role file loads and resolves through loadBusiness (4.39236ms) +✔ the shipped file is exactly decision 104's list (0.554831ms) +✔ the resolved record matches decision 104, so a widened file fails (1.235584ms) +✔ message.send is within role and every other action is gated (1.047833ms) +✔ a business grant of a gated action through limits does not widen the role (1.08181ms) +✔ a launch block whose by is the chief-of-staff instance is refused (1.395251ms) +✔ the instance takes no credential references and no tracker (1.824526ms) +✔ usage errors exit 4 (261.815124ms) +✔ validate: a good business exits 0 and prints instance digests (65.972993ms) +✔ validate: project files (313.287975ms) +✔ validate: missing files and a broken system config (256.264315ms) +✔ validate: credential reference problems exit 2 and name each one (61.012973ms) +✔ validate: a token file inside the repository is refused (64.14672ms) +✔ validate: role definitions come from MOSAIC_ROLES_DIR (198.29397ms) +✔ resolve: prints one instance's record (206.124956ms) +✔ resolve: refusals (366.906455ms) +✔ parse: exactly one of file or env, plus the service's date (1.973022ms) +✔ check: a good file has no problems (0.609931ms) +✔ check never opens the file: a write-only token passes (0.263741ms) +✔ check: file problems (0.643397ms) +✔ check: token files can't live in the repository or dataRoot, even through a linked directory (0.651697ms) +✔ check: dates and environment references (0.305859ms) +✔ path and load (1.691674ms) +✔ refusals (0.844636ms) +✔ systemVars flattens the validated config (1.60679ms) +✔ precedence: system, business, project, project role, agent (4.422055ms) +✔ limits narrow the definition and never widen it (2.134432ms) +✔ role.launch stays within-role only for the instance the launch block names (3.952854ms) +✔ limits.authority without role.launch leaves the launcher with no launch block (1.381382ms) +✔ limits.authority narrows cross-role actions too (0.822291ms) +✔ classify (0.896522ms) +✔ the record carries what the broker and launcher need (0.79598ms) +✔ digest: key order doesn't matter, any value change does (4.863815ms) +✔ refusals (1.925669ms) +✔ the four shipped version 2 roles load (3.021042ms) +✔ shipped role scopes match addendum B section 2 and the SR runbook (0.72038ms) +✔ shipped authority follows the note's table (0.730932ms) +✔ version 1 files keep loading with no authority (1.045976ms) +✔ the conductor policy isn't a role (0.263322ms) +✔ a missing role file is exit 4, a symbolic link too (0.421466ms) +✔ version 2 refusals (1.452967ms) +✔ authority: closed vocabulary, no gated-only action, no overlap (2.599483ms) +✔ credentials: Gitea scopes (1.103018ms) +✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.373824ms) +✔ credentials: services (0.677917ms) +✔ contract: a non-empty regular Markdown file beside the role file (0.821398ms) +✔ every key names known layers and a merge rule (0.734683ms) +✔ unknown keys and wrong layers refuse (0.620551ms) +✔ types (1.684553ms) +✔ merge: defaults, then the most specific layer wins (0.281531ms) +✔ merge: limits only narrow, and provenance lists each source (0.43294ms) +✔ merge doesn't change its inputs (0.116998ms) +ℹ tests 67 +ℹ suites 0 +ℹ pass 67 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 1852.431769 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-cli.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-cli.log new file mode 100644 index 000000000..2463bb4c2 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-cli.log @@ -0,0 +1,194 @@ +✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1252.151838ms) +✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (71.502997ms) +✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (159.405894ms) +✔ NO_COLOR: no escape codes, except reverse video on the selected row (218.729407ms) +✔ 1-9 shows the decide flow's own lines and question; only y resolves (184.207569ms) +✔ the app shows the same decide text as mosaic decide (344.810656ms) +✔ any key but y or Y at the question answers No; nothing is sent (2614.751829ms) +✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (454.62681ms) +✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1896.125653ms) +✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (102.511268ms) +✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (98.904654ms) +✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (784.203394ms) +✔ quitting at the question answers No and sends nothing, armed or not (225.58349ms) +✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (145.192423ms) +✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (136.443004ms) +✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (913.378508ms) +✔ at every size the decide box shows each line y depends on, or says it is hidden (7886.698582ms) +✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (152.108433ms) +✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (114.340782ms) +✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (57.611274ms) +✔ keys: views, moving, trail of a selection, the command line, help and quit (232.952562ms) +✔ one option: the status line says Press 1, not 1-1 (92.996305ms) +✔ no business: the app says so and :business picks one (50.504189ms) +✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.853504ms) +✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (172.655178ms) +✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.417633ms) +✔ decide with --note still asks; a No sends nothing (72.231465ms) +✔ the app's business comes from a live bus host only (0.997305ms) +✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.966855ms) +✔ draw is pure: same state, same frame (0.746162ms) +✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (228.741477ms) +✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (114.531423ms) +✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (113.219755ms) +✔ decide prints a declining choice as declining (159.51892ms) +✔ an unknown outcome is reported once and never resent (99.382164ms) +✔ a decision closed before the answer arrives exits 2 and points at its trail (99.491644ms) +✔ a prefix that matches two open decisions exits 2 and resolves neither (176.764955ms) +✔ without --business a command uses the live host's business, and a stale host.json is not a host (109.443131ms) +✔ every human command refuses inside an agent run before it touches the bus (104.695332ms) +✔ usage errors exit 4; no business and no host is a usage error (94.715037ms) +✔ agents and tasks print through the broker (135.793383ms) +✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.217496ms) +✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (55.647295ms) +✔ trackers come from the tracker.* variables of the one project that names a tracker project (70.660565ms) +✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (37.929435ms) +✔ two projects that each name a tracker project refuse, since the boot shape holds one (33.228483ms) +✔ a business without tracker.baseUrl gets no trackers entry (32.546187ms) +✔ an unknown business and a broken system config refuse with exit 3 (61.134488ms) +✔ follow prints an unsolicited message after plain talk returned (280.106027ms) +✔ talk --follow continues after reply and prints a later unsolicited message (182.351164ms) +✔ inbox lists all unread human messages under decisions, does not deliver or read them (4110.261892ms) +✔ follow refuses agent context and bad arguments (117.383779ms) +✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (122.764117ms) +✔ plain talk leaves the process SIGINT handlers unchanged (122.612126ms) +✔ empty views say so (1.485922ms) +✔ the trail keeps the broker's order and names a decision's task without its rows (1.299857ms) +✔ tasks print the tracker fields the snapshot carries (0.214922ms) +✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (761.242274ms) +✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (713.789534ms) +✔ the size cap refuses a push before any byte (370.193686ms) +✔ a fetch over the cap refuses before any byte reaches the reviewer (1174.254179ms) +✔ the socket refuses a request with no capability, an unknown one, and a bad request line (843.526317ms) +✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (977.754123ms) +✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (376.111533ms) +✔ a review of a project the business no longer has refuses unknown-project (718.828359ms) +✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (276.958313ms) +✔ close() answers host-closing to a connection still sending its request line (548.512417ms) +✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (728.831578ms) +✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (624.796131ms) +✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (616.636471ms) +✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.461958ms) +✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (649.079171ms) +✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.691615ms) +✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.511819ms) +✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (413.44257ms) +✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (970.636838ms) +✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (232.696577ms) +✔ a second host for the same data root refuses with exit 3 while the first runs (200.052137ms) +✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (564.131178ms) +✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (1.736326ms) +✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.732047ms) +✔ a live host's lock stays, however old the file is (0.539871ms) +✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (1113.053769ms) +✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (201.995729ms) +✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (26.37962ms) +✔ a broker fork that throws leaves no host.lock and no host.json (27.455985ms) +✔ a broker send that throws leaves no host.lock and no host.json (29.787043ms) +✔ a broker that misses its boot wait leaves no host.lock and no host.json (47.67356ms) +✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (234.576223ms) +✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (266.148221ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (535.483253ms) +✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (168.968079ms) +✔ a host.json that can't be written stops both children and leaves no host.lock (285.463758ms) +✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (28.114494ms) +✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (137.853663ms) +✔ an error event on the broker while the notifier starts fails the start once the notifier replies (249.431153ms) +✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (467.572873ms) +✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (309.258903ms) +✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1164.103359ms) +✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (292.943233ms) +✔ a broker reply with no request waiting breaks the channel and the host exits 1 (163.231265ms) +✔ a notifier that refuses stops the broker and the host refuses with exit 3 (199.670995ms) +✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (168.442493ms) +✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (145.705375ms) +✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (196.254617ms) +✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (132.531232ms) +✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (197.973549ms) +✔ watchChildren reports a child that died before it was called, and one that dies later (21.634132ms) +✔ bus stop refuses to signal a live pid that is not a bus host (202.980763ms) +✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (227.590758ms) +✔ bus start refuses with exit 3 without a notifier config (100.448225ms) +✔ bus start runs until bus stop; status reports it while it runs (691.335413ms) +✔ bus-service.sh renders the unit and installs it into a given directory (51.84839ms) +✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (63.52385ms) +✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (12.609864ms) +✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.254113ms) +✔ bus start --pm: the PM runs under its own PID namespace, registered, with a manifest (1382.670551ms) +✔ the PM launches a coder through its launch tool; the coder answers; refusals name their code (1000.08479ms) +✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or kept and logged (2665.361234ms) +✔ a project clone that can't be made refuses checkout-failed, from --pm and from a session, with no run and no clone left (236.774469ms) +✔ a runner that stops at once ends its launch with the runner's reason (573.330495ms) +✔ a Claude Code launch with no session credential refuses before it starts (157.42282ms) +✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (246.839356ms) +✔ a runner killed from the host ends its launch as killed, not failed (579.451249ms) +✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (191.865807ms) +✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1393.891839ms) +✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (843.461835ms) +✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3666.43525ms) +✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (121.401763ms) +✔ an over-long launch request is refused at once, not at the 10 s idle timeout (125.144021ms) +✔ a launch client that never closes its side doesn't hold the host's close (136.396625ms) +✔ a runner that ignores SIGTERM is killed when the host closes (1255.524411ms) +✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.324031ms) +✔ zoned uses the IANA zone across DST (24.920705ms) +✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (250.680781ms) +✔ two blocking decisions get two DMs with different nonces (112.983736ms) +✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.171459ms) +✔ a failed DM is journaled, backs off, and is retried until it lands (115.503731ms) +✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (157.976454ms) +✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (100.861725ms) +✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (105.795801ms) +✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (229.275963ms) +✔ a restart after the second refusal does not send before that refusal's 30 min are up (140.335031ms) +✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (110.106785ms) +✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (140.740126ms) +✔ an inbox read failure is logged and the next poll retries (0.752613ms) +✔ no Discord id reaches the journal or the log (111.564567ms) +✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (34.91173ms) +✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (95.845427ms) +✔ the journal: a whole file that is one torn line truncates to empty (24.948894ms) +✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (4.022348ms) +✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.657369ms) +✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.563127ms) +✔ the journal: a symlinked directory refuses and says it is a link (0.346014ms) +✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.472688ms) +✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.376841ms) +✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.623737ms) +✔ digest content stays within Discord's 2000 characters (0.27045ms) +✔ runLoop never overlaps ticks and stops after the one in flight (111.148431ms) +✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (519.104253ms) +✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (417.057666ms) +✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (445.999723ms) +✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (282.72807ms) +✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4177.638749ms) +✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (493.992494ms) +✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (184.909868ms) +✔ install never shows a template name on systemd 261; template drop-ins still refuse (351.487608ms) +✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (158.766309ms) +✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (247.885794ms) +✔ talk --tester refuses text without the [mos test] prefix before any call (99.37442ms) +✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (125.340867ms) +✔ decide, stop and launches take no --tester (151.929285ms) +✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.330241ms) +✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.54619ms) +task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200 +task.close on a missing task answered: task-not-found; it made GET /tasks/999 404 +✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (447.431179ms) +✔ the transport writes {business, verb, args} to the child and reads its JSON (43.896359ms) +✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2173.267399ms) +✔ busExit and refuseInsideAgent (3.655282ms) +✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (306.437441ms) +✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1123.178963ms) +✔ a late reply the Console has listed still reaches the next talk (2658.731429ms) +✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (424.833843ms) +✔ launches off and on go to the broker and change the business's launch state (123.213814ms) +✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (121.340104ms) +ℹ tests 184 +ℹ suites 0 +ℹ pass 184 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 18602.36111 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-control-board.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-control-board.log new file mode 100644 index 000000000..08284149d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-control-board.log @@ -0,0 +1,132 @@ +✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (3.458503ms) +✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.210405ms) +✔ completed smoke replies and ordinary questions are idle, not human blockers (0.720153ms) +✔ only an explicit first-line input request makes a finished reply waiting (0.140414ms) +✔ tool activity, user text, errors and unfinished turns override attention text (0.131883ms) +✔ STOP access failure is unknown, not absence, under a non-root identity (27.386948ms) +✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (2.454779ms) +✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.173716ms) +✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (4.725596ms) +✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.528652ms) +✔ server rescans connector discovery and refuses HTTP reply without transport (28.845929ms) +✔ connector session links and linked directories are not read (0.900456ms) +✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.202663ms) +✔ CLI print uses the relaunch notice instead of old current preview (51.756787ms) +✔ connector owner and fixed task never inherit a native relaunch notice (1.79764ms) +✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (0.958184ms) +✔ loadConfig: missing file throws ConfigError (1.359961ms) +✔ loadConfig: invalid JSON throws ConfigError (0.272053ms) +✔ loadConfig: missing dataRoot throws ConfigError (0.191869ms) +✔ loadConfig: relative dataRoot throws ConfigError (0.188668ms) +✔ loadConfig: valid config returns dataRoot (0.58421ms) +✔ findNewestSession: picks the newest by mtime among two files (0.40797ms) +✔ findNewestSession: finds files in nested subdirectories (0.276777ms) +✔ findNewestSession: returns null for a missing dir (0.11094ms) +✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.588132ms) +✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.127347ms) +✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.422491ms) +✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (1.000324ms) +✔ deriveState: full state table (0.161356ms) +✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.285616ms) +✔ rule: newest entry is a tool result with no assistant text after it is working (0.24788ms) +✔ rule: a finished ordinary turn is idle, even if it says your move (0.238687ms) +✔ task: the first user message of the session, from text blocks (0.225166ms) +✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.25732ms) +✔ task: no user message in the log means null (shown as unknown), never a guess (0.248047ms) +✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.33295ms) +✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.466579ms) +✔ scan: the written record carries task, workspace and activeProject (0.424453ms) +✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.528756ms) +✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.336215ms) +✔ registration: a record whose pid is gone is stale; derived values win, sources say derived, registered stays with alive false; a pid the probe cannot decide is not stale; pidAlive itself (0.859754ms) +✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.379465ms) +✔ loadRegistrations: a missing seatsDir gives empty lists (0.134277ms) +✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.62942ms) +✔ matchRegistration: matches by sessionsDir, and by realpath through a symlink; sessionsDir null never matches; same seat name with a different sessionsDir does not match (fleet vs repo darkwing) (0.309301ms) +✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (1.10651ms) +✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.298172ms) +✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.425674ms) +✔ scanAgent: ageSeconds is computed from the injected now (0.229042ms) +✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.137973ms) +✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.288981ms) +✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.319601ms) +✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (0.789635ms) +✔ scan: relative boardDir throws ConfigError (0.079402ms) +✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (51.139933ms) +✔ CLI: missing config exits 2 with a refused: message (47.054104ms) +✔ CLI: unknown command exits 2 (45.48877ms) +✔ CLI: unknown --liveness value exits 2 (47.931259ms) +✔ panesRunPi: true when any trimmed line equals 'pi' (0.195973ms) +✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.067219ms) +✔ tmuxIsAlive: a pane running pi is alive (0.187642ms) +✔ tmuxIsAlive: session exists but pi has exited is not alive (0.069756ms) +✔ tmuxIsAlive: no such tmux session is not alive (0.048756ms) +✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.058498ms) +✔ tmuxIsAlive: passes -L only when a socket is given (0.110833ms) +✔ parsePanes: one pane per line, command and optional tab-separated path (0.077665ms) +✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.071151ms) +✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.090367ms) +✔ loadSeen: missing file returns {} (0.133067ms) +✔ loadSeen: invalid JSON throws ConfigError (0.184738ms) +✔ loadSeen: a JSON array throws ConfigError (0.158399ms) +✔ loadSeen: a non-string value throws ConfigError (0.17043ms) +✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.307671ms) +✔ markSeen: seen false deletes the key (0.253804ms) +✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.197669ms) +✔ markSeen: project containing '/' throws ConfigError (0.141843ms) +✔ markSeen: non-boolean seen throws ConfigError (0.112069ms) +✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.280557ms) +✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.230059ms) +✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.216396ms) +✔ scanAgent: an error-state session with a matching mark is seen (0.22501ms) +✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.510785ms) +✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.204941ms) +✔ taskSetBy: a registered task carries the record's setter; a record without the field (pre-#1511) reads unknown; the value is not copied into registered (0.677322ms) +✔ taskSetBy: null whenever the task shown is not the registered one: no registration, an empty registered task, a stale registration; the field is always present (0.628605ms) +✔ taskSetBy: scan() reads the field from disk through the seat package (bounded there), writes it to the per-agent record and index, and an invalid on-disk value is a registrationError, never a row value (1.38689ms) +✔ isLoopbackHost: recognizes loopback hosts (1.116005ms) +✔ isLoopbackHost: rejects non-loopback hosts (3.96107ms) +✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (2.883253ms) +✔ startServer: serves page, healthz, and a rescanning /api/board (29.935354ms) +✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (5.136985ms) +✔ startServer: /api/board returns 500 JSON with an error field when scan throws (1.982505ms) +✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (48.816699ms) +✔ CLI: serve rejects a non-numeric --port with exit 2 (45.649046ms) +✔ CLI: scan still works after the async cli refactor (50.114837ms) +✔ CLI: live serve prints its URL and answers /healthz (58.650939ms) +✔ page.html: esc() escapes every HTML-significant character (0.574266ms) +✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (7.711964ms) +✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (2.808558ms) +✔ POST /api/seen with invalid JSON returns 400 (1.476006ms) +✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (1.895113ms) +✔ POST /api/seen with a missing agent returns 400 (1.25086ms) +✔ POST /api/board returns 405; PUT /api/seen returns 405 (1.58423ms) +✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (51.374544ms) +✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.298655ms) +✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.248608ms) +✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.164538ms) +✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.15516ms) +✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.294645ms) +✔ page.html: task and active project cells show their source via sourceTag(); the detail has a Registered row via registeredText(); SOURCE_LABEL maps registration to registered; every dynamic value in sourceTag/fromSource/registeredText is escaped (0.551606ms) +✔ POST /api/reply: runs agent-send.sh with -s from the registration, -S :control-board, -m text plus the fixed trailer, no -L on the default socket, MOSAIC_TMUX_SOCKET stripped; answers delivered with the exit code and both streams (28.732846ms) +✔ POST /api/reply: a registration with a tmux socket adds -L (25.006267ms) +✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (26.28869ms) +✔ POST /api/reply: refusals before the tool runs: empty or blank or long text 400, unknown row 404, no registration 409, stale registration 409, no tmux session 409, bad JSON 400; the tool is never called (14.726367ms) +✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (4.381219ms) +✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (0.136368ms) +✔ page.html: the reply box appears only where canReply() holds (live registration with a tmux session), the detail has a Reply row, the submit posts JSON to /api/reply, receipts and drafts survive a refresh, and every receipt value is escaped (0.558742ms) +✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (2.121162ms) +✔ page.html: the task cell and detail show who set a registered task via setByTag()/setByText(), both escaped, only from rec.taskSetBy; the reply gate does not read it (0.259763ms) +✔ Host/Origin guard: GET /api/board and POST /api/reply refuse a foreign Host, a wrong port and a cross-origin Origin with 403 JSON, before any scan or send, and never send CORS headers (7.169152ms) +✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (36.066799ms) +✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (5.477558ms) +✔ every refusal code the reader can raise has an HTTP status (0.978947ms) +✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (45.623891ms) +ℹ tests 124 +ℹ suites 0 +ℹ pass 124 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 596.855511 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-conversation.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-conversation.log new file mode 100644 index 000000000..cb42ce54d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-conversation.log @@ -0,0 +1,190 @@ +✔ W1: two processes acquire the same pair at once; exactly one claim (209.562965ms) +✔ W1: two writers publish the same revision at once: one wins, the other gets null, the winner's record stays (33.9245ms) +✔ W1: a revision name appears only after its bytes are synced; before that, only a temp file exists (18.380819ms) +✔ W2: acquire while a claim is reserved or active refuses already-active (351.673401ms) +✔ W3: acquire while stopping, uncertain, or stopped without proof refuses unsafe-replacement (367.366892ms) +✔ W4: same session with another seat tuple, and the reverse, both refuse; a loser on the seat key closes it no-unit (236.112054ms) +✔ W4: a hard link of one session under another seat is the same session: the second controller refuses already-active and launches nothing (186.436273ms) +✔ W4: a copy of one session under another seat is the same session: the second controller refuses already-active and launches nothing (174.379777ms) +✔ W4: a session header ID that changes after construction refuses target; nothing is claimed or launched (2.517697ms) +✔ W5: SIGKILL between every publication barrier of acquire and transition; restart never finds two holders or a lost claim (9546.205809ms) +✔ W5: SIGKILL between every publication barrier of release; restart finishes or holds the release (31897.26179ms) +✔ W6: controller killed mid-turn while the engine lives; restart is uncertain, no launch, prompts refuse (252.694463ms) +✔ W12: a live owner paused with SIGSTOP; a second controller refuses already-active and changes nothing (147.216472ms) +✔ W13: crash after the engine spawns, before active; restart finds the live unit: uncertain, no second spawn, force stop only (414.16951ms) +✔ W14: crash after reservation, before the spawn marker: stopped with a no-unit observation; the pair is free (275.077806ms) +✔ W20: crash after the spawn marker, scope collected; uncertain in both runs, the marker is copied, no launch until a boot proof (343.00535ms) +✔ W15: crash between the two keys during release; restart finishes it under the same claim ID (107.008941ms) +✔ W7: recorded boot ID differs on the same machine: stopped with a boot proof; open tool calls become uncertain (179.078787ms) +✔ W8: resume after a proven stop with the same pins: new claim ID, generation +1, same conversation, branch and leaf (276.741473ms) +✔ W9: resume with a changed binary, argv digest, branch or leaf is refused and the claim is unchanged (769.752197ms) +✔ W11: the controller writes no session file; only the fake engine's own appends appear (196.800977ms) +✔ W16: a highest revision that won't parse holds the pair uncertain; the older stopped revision is not reused (88.16502ms) +✔ W17: a claim root copied from another host refuses foreign-host and promotes nothing (67.253353ms) +✔ G1: a session path or claim root under .pi/state, ~/.claude, the data root or a registration refuses at construction (3.624798ms) +✔ G2: a symlink inside the fixture root to a live session file is refused by the real-path check (1.033253ms) +✔ G3: a fixture path swapped for a live path after construction is refused at bind (2.186914ms) +✔ no shim from this file's tests is left running for the after hook (4.441793ms) +✔ K1: force stop kills a tool child that called setsid; stopped with a verified proof (577.455008ms) +✔ K2: K1 on the process-group fallback ends uncertain, never stopped (432.616632ms) +✔ K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM (548.896102ms) +✔ K4: two engines; force stop one; the other survives by independent observation (2727.592734ms) +✔ K5: a stop during a tool call leaves the effect uncertain, and it is shown (462.486986ms) +✔ K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill (580.004375ms) +✔ K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete (486.422301ms) +✔ K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain (5170.458601ms) +✔ K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop (760.301526ms) +✔ K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop (616.826207ms) +✔ K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain (490.485312ms) +✔ K6: recover without proof, without confirmation, or with changed pins is refused (743.181578ms) +✔ K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed (408.474226ms) +✔ K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop (552.529826ms) +✔ K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced (3257.154588ms) +✔ K16: a claim from another machine ID refuses foreign-host; no boot proof is issued (41.217854ms) +✔ K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine (312.158741ms) +✔ K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof (326.750139ms) +✔ K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names (82.977604ms) +✔ R1: after a proven force stop the controller releases the scope; the shim and the unit are gone (406.560444ms) +✔ R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run (515.323654ms) +✔ R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence (1203.333461ms) +✔ E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released (392.744536ms) +✔ E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it (2472.428318ms) +✔ E3: an engine exit and a force stop take one escalation slot, in either order (1232.47721ms) +✔ E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot (925.67917ms) +✔ E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current (2585.646199ms) +✔ E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks (355.465346ms) +✔ R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on #1533) (366.978786ms) +✔ R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope (125.413605ms) +✔ R7: controller killed after the claim is stopped, before the release: the restart releases the scope (2618.770262ms) +✔ R8: controller killed between the two keys' stopped revisions: the restart releases the scope (409.155088ms) +✔ R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one (416.783726ms) +✔ R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on #1536) (372.574366ms) +✔ R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more (2578.881061ms) +✔ R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed (255.801719ms) +✔ no shim from this file's tests is left running for the after hook (4.60014ms) +✔ S1: `/goal x`, with leading spaces or a tab, refuses text-policy at admission; zero engine bytes (208.652928ms) +✔ S2: every prefix pinned Pi interprets is refused, from the list the code uses; the rest reach the engine exactly (204.709293ms) +✔ S3: `/goal` on the second line is pinned from the source: Pi checks only index 0, so it is admitted and sent exactly (201.583792ms) +✔ S4: a `/` left in the composer is cleared when control transfers and returns; the next submit sends only the new text (280.98723ms) +✔ S5: an observer terminal gets a paste then Enter, as send-message.sh does: not admitted: controller, nothing sent (197.497474ms) +✔ S6: a mediated-shaped registration (no tmux) passed to the board's replyToRow: 409 no tmux session; exec never runs (0.490409ms) +✔ S7: ESC, bracketed-paste markers and U+2028/U+2029 travel as one JSON string; the engine receives the exact text in one record (187.490837ms) +✔ P3: a Pi confirm, select, input or editor dialog is shown disabled with a reason and never answered (292.74485ms) +✔ E1: send, ack, user, toolCall, toolResult, final answer: shown once, no refresh, draft and reading position kept (198.722205ms) +✔ E2: U+2028, U+2029 inside JSON strings and CRLF line ends each parse as one record, on the splitter and through the controller (182.826818ms) +✔ E3: a multipart final, two blocks, null request correlation and duplicate delivery (207.801645ms) +✔ E4: a page read after message_end but before its entry is persisted: marker at the seam, re-read after run-settled, each message once (202.308495ms) +✔ E4: a gap or a new epoch also reconciles; nothing is concatenated across a gap (10.632407ms) +✔ E5: an unknown native event gives no client event; evidence records its type and bytes; the terminal count goes up (193.141956ms) +✔ E6: a tool result delayed across a pause and a reconnect is reconciled without a manual refresh (205.170538ms) +✔ E7: the terminal renders the same stream as the library client, as observer and then as controller, and submits only as controller (217.42953ms) +✔ terminal: engine control characters are made visible; a lost connection refuses submit (187.828527ms) +✔ terminal: outcome unknown is shown as such, with no resend offer, and nothing is resent (0.416312ms) +✔ terminal: text after Enter in the same input chunk starts the next message; it never joins the one submitted (0.254912ms) +✔ terminal: a paste-start marker split right after its ESC still opens the paste; the Enter inside it never submits (0.312882ms) +✔ terminal: Ctrl-T then Enter in one chunk is judged after the takeover, as if typed one key at a time (Filbert F2, #1507) (0.470671ms) +✔ terminal: input held behind Ctrl-T waits for that takeover while an earlier action is still pending (Darkwing T1 on #1522) (30.987867ms) +✔ terminal: a hold inside held input holds again, and once it is drained later input and Ctrl-C still reach the terminal (Darkwing note 1 on #1522) (0.463338ms) +✔ terminal: an action that throws still releases the input held behind it, in order, then rethrows (5.743116ms) +✔ terminal: after an action throws, later input still runs; input() puts the error in the status line (Filbert N1 on #1522) (0.396498ms) +✔ terminal: input() reports an error when it happens, so it never overwrites a later status; held input's promise doesn't carry the holder's error (Filbert N4 on #1522) (0.303662ms) +✔ terminal: invisible and bidi characters are made visible; head, status and notice lines stay one line (0.113107ms) +✔ every record these fixtures produced is a valid CHAT-01 record (E5: no record fails the schema) (217.801996ms) +✔ H1: two takeovers with the same expected generation: one wins, +1; the other refuses generation (247.958547ms) +✔ H2: the old controller's prompt after a takeover commits is refused with zero engine bytes (287.798729ms) +✔ H3: a takeover while a prompt holds the dispatch lock: written under the old actor, or refused; never both (791.650803ms) +✔ H4: self-takeover is refused (184.03877ms) +✔ H9: Interrupt racing a prompt's dispatch: before the write, dispatch-refused and no-turn; after, §3 rules (409.30949ms) +✔ H10: Interrupt and force stop together: one stop chain, force stop supersedes (947.322682ms) +✔ H10: an overlap during the pause before the abort: no abort, the stop ends uncertain (195.153738ms) +✔ H10: a no-turn Interrupt lifts only its own fence; admission stays closed under force stop, overlap or revocation (572.285995ms) +✔ H11: the controller disconnects mid-turn: work continues, the claim is unchanged, control stays put (254.263306ms) +✔ H12: an exact retry after reconnecting to the same incarnation returns the same receipt; one dispatch (126.447112ms) +✔ H13: a retry with the same request ID and different text is refused (156.199184ms) +✔ H14: late stdout from the old engine after a replacement is dropped by incarnation, counted, never rendered (571.563613ms) +✔ H15: a revoked connection's command is refused; the revocation fence holds (280.462384ms) +✔ H16: a second controller for the same session refuses already-active; the first is untouched (193.933017ms) +✔ H10: a second force stop while the first escalation runs refuses fenced; one escalation, and the claim records only the first stop's phases (845.681512ms) +✔ a force stop whose fence throws leaves no escalation flag behind, so the next force stop runs (Darkwing F2, #1507) (357.660655ms) +✔ H17: a confirmation reused, answered from another connection, or used after the stop changed is refused (761.937317ms) +✔ H18: two prompts before any native output: the second refuses busy; one engine write (186.654773ms) +✔ H19: the pipe fails mid-line under a large prompt: delivery-unknown transport-unknown, poisoned, no later write (347.680133ms) +✔ H19: the link itself never writes again after an unknown outcome, whoever calls it (0.680918ms) +✔ H19: the controller dies mid-write of a large line: after restart the outcome is unknown and nothing is resent (660.116427ms) +✔ H20: the line is written but the ack is lost when the controller dies: orphan, outcome unknown, nothing resent (557.137338ms) +✔ H21: a retry of the exact request with the old token after a crash is stale-incarnation; no second write (720.825013ms) +✔ H22: after H21 and a valid recovery, a new request with the new token is admitted (2923.957741ms) +✔ H23: requests pending at a restart are not resent; each shows outcome unknown (604.942292ms) +✔ no shim from this file's tests is left running for the after hook (4.377353ms) +✔ a plain conversation: catalogue row, one page, CHAT-01 records (5.435039ms) +✔ native entries map to blocks: tools, thinking, bash, notices, ids that do not fit (1.462725ms) +✔ F1: a malformed line is an unavailable part at its position, and reading continues (1.415022ms) +✔ F1: a missing parent stops the history with a notice that names the unreadable lines (2.16781ms) +✔ F1: an unreadable fork is never merged into another branch's history (1.310127ms) +✔ F1: a follow stays on its branch when the next entry's parent is unreadable (1.733325ms) +✔ F1: a file whose entries are all unreadable shows a notice per line (0.701242ms) +✔ F2: a truncated trailing line marks the view incomplete, not an error (1.086562ms) +✔ pagination: 100 parts, then the rest; parts concatenate to the whole branch (3.427334ms) +✔ F3: a replaced file (new inode) refuses old cursors with reconcile (4.235146ms) +✔ F4: a same-inode rewrite of the prefix refuses old cursors with reconcile (5.243861ms) +✔ F5: growth between pages keeps the epoch and the page stops at the pinned length (4.73021ms) +✔ F6: unknown, foreign and expired cursors refuse and leave the cursor usable (6.588739ms) +✔ F7: a symlinked file and a symlinked directory component are refused, never opened (7.173923ms) +✔ F8: a file swapped for a symlink after the catalogue is refused (1.927004ms) +✔ F9: registrations never add or redirect a root (1.603264ms) +✔ F10: a header cwd naming another project is refused (3.034045ms) +✔ F11: parentSession renders with a marker and the parent is never opened (0.718258ms) +✔ F12: two leaves: the default leaf is shown and the other branch reads alone (4.002369ms) +✔ F12: a follow refuses when an appended duplicate id changes the branch's earlier parts (1.919777ms) +✔ F12: a second root (Pi's resetLeaf) starts its own branch (1.058808ms) +✔ F13: compaction is a marker in place, then the retained content (0.602818ms) +✔ F14: long strings split into fragments and parts, reassemble exactly, and pages respect the byte cap (501.846101ms) +✔ fragments never cut a surrogate pair and keep an empty string (5.107086ms) +✔ F15: a Claude seat is an unsupported-harness placeholder whose directory is never read (1.595685ms) +✔ unknown conversations, empty files and non-Pi files refuse (2.552625ms) +✔ an unreadable file or root inside the roots is refused per row, not a failed catalogue (1.208606ms) +✔ a seat directory without search permission refuses that root, not the catalogue (2.119698ms) +✔ every page and cursor is a valid CHAT-01 record (772.873149ms) +✔ the engine pin holds for the installed package (1.653653ms) +✔ pinned Pi, sealed and without credentials, answers the controller's commands with the shapes the fake models (252.68004ms) +✔ sealed, pinned Pi ignores a trusted project's .pi resources; --approve past the seal would load them, and checkSeal refuses it (Filbert F2 on #1522) (495.140271ms) +✔ pinned Pi appends thinking_level_change at start when the branch lacks one, so the leaf moves (K8 then fails closed) (255.902314ms) +✔ N25: ordinary Interrupt reconciles; a non-empty queue_update in the window is O5 (492.178098ms) +✔ N1: an extension's follow-up queued after the fence is cleared before any abort; O5, Unknown (429.219944ms) +✔ N1: a follow-up queued before the fence is O5 at once; the Interrupt refuses fenced (227.317829ms) +✔ N2: with abort first, the fake runs the external item (the ordering guard has teeth) (22.150776ms) +✔ N3: the fence lands in preflight, preflight errors, no run: failed, No run, uncertain (336.42121ms) +✔ N4: the ack arrives after the first abort and a run starts: clear and abort again; Interrupted (174.60128ms) +✔ N5: an input handler takes the prompt: ack, no run, delivery-unknown handled-without-run (288.551883ms) +✔ N6: an extension queues between clear_queue and abort: O5 and O6, Unknown (450.268213ms) +✔ N7: clear_queue times out: no abort, nativeQueue unknown, force stop still ends it (1867.293044ms) +✔ N7: clear_queue answers an error: no abort, nativeQueue unknown, the link not poisoned (181.430304ms) +✔ N8: an extension prompt starts a run during Mosaic preflight; the losing settle is O3 (273.931929ms) +✔ N9: a run that started before the fence and ends aborted: failed interrupted, Interrupted (178.199187ms) +✔ N9: decision 34: a run that ends aborted with no stop in progress: aborted-without-stop, uncertain, outcome unknown (230.255348ms) +✔ N9: an aborted that lands after the fence but before any abort is written: aborted-without-stop, Unknown (385.210139ms) +✔ N10: fake conformance (31.672278ms) +✔ N11: the run fails before any user message_start: delivery-unknown ack-without-start, never failed (427.519328ms) +✔ N12: input that starts a run after the final empty clear is O1 and not part of the stop's proof (274.469572ms) +✔ N13: agent_start with no slot held is O1; a later prompt refuses with zero engine bytes (293.958789ms) +✔ N14: the run completes while clear_queue is in flight: finished, Completed first, uncertain (369.27492ms) +✔ N14: the run completes after the abort is written, before Pi applies it: finished, never relabelled (360.838058ms) +✔ N15: the fence lands in preflight, then an input handler takes it: handled-without-run, No run (349.640367ms) +✔ N16: Interrupt with no slot and no run refuses no-turn: no stop, no bytes, admission open (199.575152ms) +✔ N17: the run fails on its own during the exchange: failed, Failed on its own (343.711978ms) +✔ N18: no final assistant message_end, or a lost line: working stays working; before working, transport-unknown (732.05506ms) +✔ N19: a losing extension prompt settles inside the Mosaic run before its user message: O3, run-overlap (542.210319ms) +✔ N20: an extension triggerTurn during Mosaic preflight starts first; while streaming it queues with no signal (477.907467ms) +✔ N21: a losing settle after the receipt settled finished is O2; the receipt stays finished (228.439589ms) +✔ N22: an agent-level custom message is dropped by the clear with no signal; evidence names the seal (202.147919ms) +✔ N23: a nextTurn message survives clear and abort and attaches to the next prompt, with no signal (156.731642ms) +✔ N24: the seal is an allow-list: --extension, a missing --no-* flag, a second --mode or --session, a session or output flag, or a stray word refuses unsealed-engine; no engine starts (219.697683ms) +✔ N24b: the seal covers the engine command and environment: config can't name either, the env is built from names, and a mutated command is refused at bind (140.969574ms) +ℹ tests 182 +ℹ suites 0 +ℹ pass 182 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 47481.06347 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-discord.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-discord.log new file mode 100644 index 000000000..27acdabc9 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-discord.log @@ -0,0 +1,186 @@ +✔ approvals: a request is validated before anything is posted; the rendering shows names and never ids (3.582421ms) +✔ approvals: the ledger is appended and folded into open requests with bind and approval states (1.434887ms) +✔ approvals: a reply approves only when it points at a request, says exactly approve, and comes from a listed approver once (0.509173ms) +✔ approvals: a button approves only on its own request message with the matching custom id (0.405433ms) +✔ approvals flow: a turn that opened a request posts the message with the button, records it, binds it, and both approvers approve (13.229844ms) +✔ approvals flow: a non-approver, a repeat, a wrong custom id and a service refusal each get their fixed line and a drop entry (7.274383ms) +✔ approvals flow: an invalid request from the model, a refused post, and no api client are recorded and post nothing (7.806479ms) +✔ approvals flow: start retries a bind and an approval left as unknown, under their original keys (2.34839ms) +✔ authorize: open channel, listed user (1.888929ms) +✔ authorize: wrong guild (0.193036ms) +✔ authorize: no guild (DM) (0.166076ms) +✔ authorize: unlisted channel (0.180894ms) +✔ authorize: unknown channel, no info (0.371111ms) +✔ authorize: thread of listed parent (0.186146ms) +✔ authorize: thread of unlisted parent (0.184273ms) +✔ authorize: text channel that is not a thread and not listed (0.136053ms) +✔ authorize: unlisted user (0.186043ms) +✔ authorize: no author (1.087594ms) +✔ authorize: bot author (listed id, bot flag) (0.186667ms) +✔ authorize: system author (0.1273ms) +✔ authorize: the bot itself (0.090522ms) +✔ authorize: webhook (0.079205ms) +✔ authorize: mention channel without mention (0.125734ms) +✔ authorize: mention channel with bot mention (0.124958ms) +✔ authorize: mention channel with @everyone only (0.091808ms) +✔ authorize: mention channel mentioning someone else (0.073877ms) +✔ authorize: mention channel, content says @bot but mentions empty (0.100249ms) +✔ authorize: private thread under mention channel, mentioned (0.096905ms) +✔ authorize: private thread under mention channel, not mentioned (0.077127ms) +✔ authorize: thread in another guild per channel info (0.122538ms) +✔ authorize: not an object (0.071779ms) +✔ authorize: no id (0.065021ms) +✔ authorize: oversize content is accepted and flagged (0.07259ms) +✔ authorize: exactly the limit is not oversize (0.070857ms) +✔ authorize: a user's channel allowlist drops them outside it, threads count as the parent, others are unaffected (0.431288ms) +✔ authorize: order puts wrong guild before user, and user before channel (no channel lookup for strangers) (0.139322ms) +✔ binding: a complete binding validates and is frozen (2.371584ms) +✔ binding: unknown key, missing field, wrong type refuse with exit 2 (1.093903ms) +✔ binding: empty allowlists refuse (0.518765ms) +✔ binding: a user's channel allowlist must be non-empty, listed and unique; absent means every listed channel (1.127831ms) +✔ reloadDiff: reloadable keys are summarised by id; every fixed key refuses with exit 2 (1.453894ms) +✔ binding: dmRecipient is optional, a snowflake, one of the listed users, and a fixed key (0.379583ms) +✔ binding: file must be 0600, regular, not a symlink (2.85643ms) +✔ binding: token file mode, symlink, emptiness and shape are checked; token never appears in errors (1.325751ms) +✔ cli: check refuses a non-0600 token file with exit 2 before any network use (117.739995ms) +✔ context files: absolute paths, traversal, symlinks and out-of-repo targets refuse; in-repo files resolve (1.955336ms) +✔ cli: check refuses a missing context file and a missing binding with exit 2; usage is exit 4 (270.411896ms) +✔ cli: reload validates the file first (exit 2), then needs a live owner (exit 1); usage is exit 4 (171.023465ms) +✔ cli: run refuses when STOP is present, before any network use (122.548934ms) +✔ binding: tools is optional, validated strictly, a fixed key for reload, and its roots are resolved against the data root (1.941472ms) +✔ binding: a git key is validated at load and reaches the extension whole, and only on a writable root (1.17062ms) +✔ delivery: an accepted message is in the inbox before the turn, the reply is chunked with one nonce per chunk, and the turn record is write-once (16.604614ms) +✔ delivery: refused and unknown outcomes are journaled; a later chunk is not sent after a failure (18.512718ms) +✔ delivery: restart with an unknown entry re-sends the same nonce once and reconciles before accepting traffic (1.440096ms) +✔ delivery: an unknown entry older than the dedupe window is marked refused, not re-sent; a still-unknown one refuses start (1.155775ms) +✔ delivery: repeated unknown reconciliations never refresh the dedupe window; the original intent time decides (1.30338ms) +✔ turn: a failed engine turn posts the fixed line, never model output, and writes a failed record (2.397641ms) +✔ turn: a second message during a turn is held by the engine, both get their own reply and record (33.104412ms) +✔ turn: a thread under a listed channel is answered in the thread; an unknown thread is looked up once (1.947664ms) +✔ drop: an unlisted user gets silence and one drop line; no inbox entry, no REST call, no engine call (0.639936ms) +✔ drop: an oversize message is accepted into the inbox, answered with the fixed line and journaled as a drop (0.735057ms) +✔ restart: an inbox with three ids and a replay of the same three produces zero turns (40.316033ms) +✔ stop: STOP present refuses start; STOP written while running refuses new turns and the current one finishes (31.324175ms) +✔ ceiling: the ceiling plus one is refused and journaled; one fixed line per UTC day; a new day accepts again (5.063872ms) +✔ ceiling: a burst arriving while turns are still running cannot queue past the ceiling (2.464274ms) +✔ ceiling: a turn interrupted by a crash still counts after restart; admissions are durable (2.167862ms) +✔ ceiling: the daily notice survives a same-day restart; one delivery attempt in total, even when the first attempt crashed mid-flight (3.947284ms) +✔ duplicate: the same event delivered twice while the thread lookup is held yields one prompt, one admission and one reply (2.142946ms) +✔ journal: no token-shaped string and no model output on the drop path reaches disk (0.408784ms) +✔ receipt: an admitted message gets one eyes reaction on the inbound message; drops and refusals get none; a failed reaction is recorded and does not fail the turn (1.927204ms) +✔ receipt: Discord refusing the reaction leaves the turn intact and records ok false (1.705848ms) +✔ reload: a new user is silent before and answered after; a removed channel goes silent; a lower ceiling applies at once (2.325204ms) +✔ reload: a fixed key refuses with exit 2 and the old binding stays in force (1.771824ms) +✔ tools: with a tools binding the turn record lists every read and its outcome; without one the field is null (2.489708ms) +✔ context: the Discord block names the server, channels and modes, and states the rules from Q15 and Q16 (3.013695ms) +✔ context: with tools the block names the roots, keeps file content as data, and says to state refusals plainly (0.774354ms) +✔ context: a writable root adds the write rules and says a write is real only once Jason commits (1.829754ms) +✔ context: the envelope is one bracketed line then the text; names cannot break the line (1.172546ms) +✔ context: a git root swaps the terminal-commit line for the git verbs, and a vault root adds the id protocol (1.286957ms) +✔ context: assembleContext concatenates files in launcher format and appends the block; sha256 is stable (1.029568ms) +✔ context: splitReply keeps paragraphs together under the limit and splits long ones at lines, spaces, then hard (0.612516ms) +✔ engine: buildPiArgs carries the fixed flags, engine settings, session dir and prompt file (2.317858ms) +✔ engine: with tools, buildPiArgs turns pi's own tools off, loads the extension explicitly and allowlists exactly our three (0.391699ms) +✔ engine: a run with tool turns settles once, on the answer, with every tool call in the result (46.799002ms) +✔ engine: a run that ends on a tool-only turn fails the prompt as empty; a retried run settles on the real end (25.43123ms) +✔ engine: one prompt, one turn, text and usage come back (25.055139ms) +✔ engine: a prompt while streaming is held until pi settles, then sent as its own run, and answered in order (341.038496ms) +✔ engine: a held prompt that times out before pi settles fails on its own and is never sent (238.926527ms) +✔ engine: timeout sends abort and fails only that turn; the process stays (113.497686ms) +✔ engine: tool events from a run that outlived its timeout never land in the next prompt's record (225.40858ms) +✔ engine: a prompt after a turn that timed out before its agent_start waits for pi to settle instead of being refused (124.690953ms) +✔ engine: when pi has not started a timed-out turn by the end of the abort grace, the engine stops pi and fails held prompts (212.538955ms) +✔ engine: a timed-out turn pi starts only after the grace never answers a later prompt (614.554219ms) +✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (early prompt response) (1.327533ms) +✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (late prompt response) (0.554896ms) +✔ engine: a timed-out run pi did start outlives the grace; the next prompt goes out when it ends (426.741485ms) +✔ engine: a malformed JSONL line fails the turn, not the process (24.369463ms) +✔ engine: a turn that ends in error rejects with the error code; process exit fails pending turns (42.75321ms) +✔ gateway: hello -> identify with intents, ready, heartbeat with jitter, ack (2.222809ms) +✔ gateway: missed ack closes the socket and resumes with the last sequence (3.555025ms) +✔ gateway: op 7 reconnect resumes; op 9 non-resumable re-identifies (0.485963ms) +✔ gateway: op 9 resumable resumes (0.317445ms) +✔ gateway: close 4014 is fatal, reports the missing intent, never reconnects (1.388402ms) +✔ gateway: 4004 and 4013 are fatal too; 1006 reconnects with identify when no session (1.777094ms) +✔ gateway: close() is final and unparseable frames are ignored (0.370857ms) +✔ git: config validation is strict, needs write: true, a work tree and a private token file (85.391109ms) +✔ git: the child environment drops every host git config, names one helper, and carries the token path only for origin (37.76738ms) +✔ git: status reports the branch, ahead/behind and changed paths, and refuses off the named branch or mid-merge (56.239725ms) +✔ git: parseStatus reads porcelain v2 including renames and conflicts (0.332082ms) +✔ git: a commit stages exactly the named files, carries the seat author and the requester trailer, and pushes at once (67.490445ms) +✔ git: commit refusals: message, paths, requester, nothing to commit, and an index that already holds other work (76.177733ms) +✔ git: a commit whose push fails is still a commit, says so, and the next commit's push carries both (D6) (71.754678ms) +✔ git: pull is fast-forward only; a diverged origin or dirty local files refuse with nothing merged (169.231706ms) +✔ git: push pushes the named branch only and reports up to date (62.918722ms) +✔ git: no token value or token path ever reaches a git argument list; outputs are masked and capped (77.98125ms) +✔ git: the credential helper answers get over https from a private file and nothing else (179.30773ms) +✔ git: the vault protocol validates before a commit, honours another owner's lock, reserves ids, and locks around writes (696.49928ms) +✔ lock: the claim is exclusive; a second start against a live owner refuses (3.933059ms) +✔ lock: a stale lock (dead owner, reused pid, or record without start) refuses run and is never signaled; only unlock clears it (69.88915ms) +✔ lock: an incomplete claim (directory without owner record) is busy and refuses run; unlock clears it (1.062523ms) +✔ lock: an owner record that exists but cannot be read is invalid: never signaled, never removed, never claimed over (2.542227ms) +✔ lock: legacy upgrade; a live connector holding a {pid, start} record is unknown, unlock refuses and nothing changes; after it exits, unlock clears it (29.382594ms) +✔ lock: a live pid whose record carries a malformed or noncanonical start or boot string is unknown, not a mismatch; nothing signals, removes, or claims over it (262.369805ms) +✔ lock: identity syntax; only canonical unsigned decimal start ticks and lowercase boot uuids are identities (0.417604ms) +✔ lock: a process whose start marker or boot id cannot be read refuses to claim (19.916065ms) +✔ lock: a live pid whose identity cannot be read right now is unknown: never signaled, never removed, never claimed over (0.957097ms) +✔ lock: four processes racing for the same binding; exactly one claims it and the others refuse (31.457309ms) +✔ lock: stale handoff; concurrent starts over a stale lock all refuse, nothing reclaims, one unlock then exactly one live owner (127.890193ms) +✔ lock: four-party schedule; claims landing inside an unlock's gap never survive, one unlock leaves no owner and no residue (80.436968ms) +✔ notices: a kind is recorded per UTC day and found again (0.45041ms) +✔ notify: the DM channel opens once, every send carries the nonce, and only the message id comes back (13.751312ms) +✔ notify: refusals and unknowns surface as RestOutcome without ids; a refused send reopens the channel next time (2.21561ms) +✔ notify: no dmRecipient, a non-0600 binding or token, or a missing binding refuse before any network use (1.54854ms) +✔ recover: nothing to do is clean; a lock whose owner is gone or that has no record is cleared and STOP ends up absent (31.638668ms) +✔ recover: an operator STOP refuses with exit 3 and is never removed, whatever the lock says (25.189417ms) +✔ recover: a brake written during the unlock wins; STOP stays with both lines and the start is refused (24.398159ms) +✔ recover: a held binding refuses with exit 3 and writes no STOP: live owner, alive pid without verifiable identity, unreadable record (62.609534ms) +✔ cli: recover exits 0 when ready, 3 behind a brake or a held binding, and run's own STOP refusal is 3 (586.648175ms) +✔ rest: createMessage sends nonce, enforce_nonce, empty allowed_mentions and a soft reply reference (2.30885ms) +✔ rest: 429 waits retry_after and retries; 4xx is refused; 5xx and socket errors are unknown (7.850794ms) +✔ rest: content and nonce limits are enforced locally; typing never throws (0.696499ms) +✔ rest: react PUTs the encoded emoji on the inbound message for @me; 2xx is true, anything else is false and never throws (0.653921ms) +✔ rest: createDm posts the recipient and resolves the channel id; 4xx refused, 5xx unknown, bad id never sent (1.060178ms) +✔ setspark config: a bare https or loopback origin, a private key file, a principal (5.143414ms) +✔ setspark config: reaches the tools config and the binding as a fixed key (3.08277ms) +✔ setspark config: the binding's key survives resolveToolRoots and the engine's JSON hand-off to the extension (1.479795ms) +✔ setspark config: approvers come from the binding's users, never from the binding's setspark key (3.015247ms) +✔ setspark verbs: required_approvers go out as discord ids from names and come back as names (23.66728ms) +✔ setspark verbs: no Discord user id reaches tool text, whatever shape the service returns it in (12.389908ms) +✔ setspark contract: a decision made with names opens a request the connector accepts; names stored by an old record still refuse (7.280497ms) +✔ setspark keys: read per call, one printable token per file, rotation without a restart (3.44477ms) +✔ setspark idempotency keys: principal, turn id, call index; connector keys name a step (0.624557ms) +✔ setspark http core: json in and out, bearer header, idempotency header, fixed user agent, no key anywhere else (2.74946ms) +✔ setspark http core: error bodies become fixed refusals with code and the 409 fields; server text is data, cut (1013.461509ms) +✔ setspark verbs: a setspark key enables the eight verbs and no counters (0.488869ms) +✔ setspark verbs: writes carry the turn's key and the asserted requester, reads carry no key, and the api key never appears in text or details (6.229454ms) +✔ setspark verbs: no turn refuses every write before any request; bad arguments refuse before any request; reads still work (1.263598ms) +✔ setspark verbs: renderRecord caps long output and hides the accepted snapshot (0.196761ms) +✔ setspark api: bind, add_approval (button and reply) and get use integer request ids and the connector's keys (2.315625ms) +✔ tools: config refuses a missing, symlinked, dotted, non-directory or duplicate root and bad limits (4.041227ms) +✔ tools: every escape is refused with a fixed reason and nothing outside the root is read (4.012319ms) +✔ tools: happy paths list, read a window, and search case-insensitively; dotfiles and symlinks never appear (3.739047ms) +✔ tools: the tool set renders text for the model, records details for the journal, and enforces the per-run budget (2.519851ms) +✔ tools: listing and search caps hold (6.772735ms) +✔ tools: credential shapes are caught; ordinary prose and ids are not (0.55509ms) +✔ tools: the read uses the checked file itself; a symlink, a swapped file, a FIFO, a grown file or a hard link at read time is refused (3.753541ms) +✔ tools: an unreadable file under the root is skipped by search and refused by read (0.851342ms) +✔ tools: config accepts write: true only as a boolean, and enables the write tools only then (0.861532ms) +✔ tools: every write outside the fence is refused before any byte lands, and no temp file remains (3.796729ms) +✔ tools: write_file leaves the exact bytes, edit_file replaces one exact match, and the set renders the change as uncommitted (1.894622ms) +✔ tools: a target that changed between the check and the rename is refused and the temp file is removed (1.159926ms) +✔ web: config takes an https or loopback-http SearXNG base url and a bounded fetch cap (3.660608ms) +✔ web: address rules refuse every private, loopback, link-local, mapped and multicast form (2.290403ms) +✔ web: web_fetch refuses bad urls, private hosts, rebinding names, non-https redirects, too many hops, error status, non-text bodies, and times out (1028.262246ms) +✔ web: web_fetch returns html as text with the title, follows an https redirect, keeps plain text and json, and cuts at the cap (4.285616ms) +✔ web: html to text drops scripts, styles and comments, decodes entities and keeps block breaks (0.271985ms) +✔ web: web_search asks the instance for json, returns at most ten clean results, and refuses a bad query, a down instance or an unusable answer (3.537786ms) +✔ web: the tool set enables the web tools only with a web key, counts them in the budget, and records url, status and hits (2.25611ms) +ℹ tests 178 +ℹ suites 0 +ℹ pass 178 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 2677.163985 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-harness.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-harness.log new file mode 100644 index 000000000..1dab22bf5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-harness.log @@ -0,0 +1,88 @@ +✔ sessionModel: agent vars win, then the system's execution settings (13.011722ms) +✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (4.593419ms) +✔ a claude-code bundle adds the wrapped gate hook and the MCP config (2.72138ms) +✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (8.254403ms) +✔ the prompt names the project clones in the workspace, and none when there are none (8.819998ms) +✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.172442ms) +✔ a bundle is written once: an existing file refuses (1.492395ms) +✔ a path with a single quote can't go into the hook command (1.458681ms) +✔ allow exits 0, a deny exits 2 with the reason on stderr (122.140627ms) +✔ a missing or wrong policy, or a bad event, exits 2 (80.520467ms) +✔ the bundle's wrapped command: a missing gate or node still blocks (1088.922463ms) +✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (727.875952ms) +✔ claude: the hook alone blocks a path outside the workspace (429.598852ms) +✔ claude: a second turn resumes the first turn's session (751.821725ms) +✔ claude adapter: --restricted is always passed (4.757148ms) +✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (15.187694ms) +✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (5.482067ms) +✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (687.32069ms) +✔ claude: a missing hook or MCP file refuses before claude starts (7.313451ms) +✔ pi: policy tools and typed tools pass, anything else is blocked (4.164404ms) +✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.965647ms) +✔ file tool paths must resolve inside the workspace (1.677176ms) +✔ pi's own path normalisation can't be used to step out (1.289292ms) +✔ a symlink inside the workspace that points out is outside (1.142457ms) +✔ a dangling symlink is refused at any depth, in both harnesses (4.10726ms) +✔ read is checked under every spelling pi's read would open, in both harnesses (19.779652ms) +✔ other spellings cover directories, dangling links and pi's cwd (4.871073ms) +✔ a relative path climbs from the workspace's real path, in both harnesses (3.880639ms) +✔ claude path fields per tool (0.538287ms) +✔ glob patterns stay inside the workspace (0.544788ms) +✔ a path that can't be checked is blocked (0.369772ms) +✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (203.287415ms) +✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (125.798472ms) +✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1808.838211ms) +✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (304.015051ms) +✔ initialize, ping and tools/list (46.36578ms) +✔ tools/call goes through the tool socket; a refusal is an isError result (34.21624ms) +✔ replies are compact JSON; over the cap a tool error names the size and the cap (39.438432ms) +✔ unknown tools and methods are JSON-RPC errors and never reach the socket (28.077769ms) +✔ a missing argument is a usage error (29.851857ms) +✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (346.928325ms) +✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (314.523842ms) +✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (302.545707ms) +✔ pi: a read is refused when pi would open another spelling outside (324.713984ms) +✔ pi: a relative path climbs from the real path of a workspace behind a symlink (311.907881ms) +✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (304.946926ms) +✔ pi: a missing extension refuses before any model call (5.503924ms) +✔ pi: an extension without its configuration fails pi's start (243.446003ms) +✔ founderCheck: founder variables, then a needed service without a usable token (1.209278ms) +✔ turnRequest names the sender, class, reply and decision (0.20789ms) +✔ turnRequest says a tester's message is a test and never Jason's instruction (0.20564ms) +✔ turnRequest shows the message's own sent time, a day old as well as new (0.128458ms) +✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.233581ms) +✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (269.801189ms) +✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (263.01837ms) +✔ a task closed on the tracker is missing from the next turn's open list (216.626737ms) +✔ a message read a day after it was sent shows the time it was sent (145.274384ms) +✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (129.188174ms) +✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (91.317394ms) +✔ typed tools carry the runner's capability; launch goes to the host's launch socket (403.77389ms) +✔ a RESULT gets no automatic reply; failed turns reply with the reason (1282.964834ms) +✔ SIGTERM during a turn kills the turn's process group and still exits 0 (146.783485ms) +✔ founder credentials stop before the claim (20) (169.167675ms) +✔ a refused claim exits 21; an ended run's capability exits 22 (181.824137ms) +✔ the launch ending under a running session exits 22 (143.685907ms) +✔ a broker that stays unreachable exits 23 after brokerRetries polls (242.698356ms) +✔ a broker that is down at the claim exits 23, not 21 (85.753189ms) +✔ no capability, or a malformed one, on stdin exits 2 (202.135234ms) +✔ a missing or malformed policy exits 2 before the claim (128.608219ms) +✔ the PM gets launch, its task verbs and the reads (6.742877ms) +✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (4.427516ms) +✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.405944ms) +✔ a coder with a tracker gets its own task tools and no task_reassign (1.41594ms) +✔ launch only when the business's launch block names the instance as launcher (1.148263ms) +✔ an action outside the instance's authority has no tool (1.048667ms) +✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (5.907689ms) +✔ callTool: one JSON line out, the result back, a refusal rejects (10.196327ms) +✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.074913ms) +✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.502612ms) +✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.80539ms) +ℹ tests 80 +ℹ suites 0 +ℹ pass 80 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 11072.889017 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-ledger.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-ledger.log new file mode 100644 index 000000000..55c1327f0 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-ledger.log @@ -0,0 +1,94 @@ +✔ a raw token file, with or without one trailing newline, reaches curl only through the config stream (123.178592ms) +✔ the raw path accepts nothing else, and refuses before curl runs (339.844416ms) +✔ the file checks still apply on the raw path: mode, symlink, missing, directory (272.571439ms) +✔ the raw path base URL has no override (53.719691ms) +✔ the JSON path is unchanged, and JSON never falls through to the raw path (243.296793ms) +✔ a file that changes between the two reads refuses before curl runs, with or without a body (676.6351ms) +✔ the token reaches no child environment, even with an inherited CFG or SHELLOPTS=allexport (662.481742ms) +✔ real helper GET HTTP 200 preserves exit 0 without credentials (14.473021ms) +✔ real helper POST HTTP 201 preserves exit 0 without credentials (10.606697ms) +✔ real helper GET HTTP 403 preserves exit 1 without credentials (8.739791ms) +✔ fixture git subjects only, follow-ups and three session kinds (157.211183ms) +✔ text and JSON carry same numbers, open and truncated title (215.989209ms) +✔ missing credentials exit 2, no-issues never calls API and shows unknown (172.73868ms) +✔ empty range gives no rows and zero totals (190.709353ms) +✔ inclusive UTC dates, first-line preamble only, role and seat boundaries (158.455224ms) +✔ close-only issue included, even median, missing metadata stays unknown (146.081479ms) +✔ unique commits but per-issue links count multiple tags once each (143.414121ms) +✔ issue pages of 50, 50 and 7 read 107 issues in 3 pages (293.715921ms) +✔ one short page reads 1 page; --no-issues reads none and says so (245.873464ms) +✔ a short page 10 is read; a full page 10 refuses at the ceiling (680.895398ms) +✔ an issue number on two pages refuses (157.994833ms) +✔ a failing page 2 refuses the whole read without its stderr (150.656653ms) +✔ page 2 with a malformed record refuses (152.99674ms) +✔ page 2 with more than 50 rows refuses (179.629523ms) +✔ bad API payload not JSON refuses (132.853817ms) +✔ bad API payload {} refuses (160.682191ms) +✔ bad API payload [{"number":1}] refuses (134.065221ms) +✔ partial or malformed session log refuses with location, not content (137.673909ms) +✔ a U+2028 or U+2029 inside a session string is one line, not a malformed record (142.658998ms) +✔ no sessions is an empty table; symlink source refuses (230.084567ms) +✔ reads only refactor even when another branch is checked out (156.222384ms) +✔ invalid dates, reverse dates and duplicate options refuse (142.849962ms) +✔ T3 agent assignments do not count as human in Table 2 (140.969659ms) +✔ preamble parsing and issue number boundaries (0.437033ms) +✔ T3 header: agent, or board from control-board; anything short of the full header is human (0.13755ms) +✔ no closed issues with human messages means undefined ratio, not invented zero (0.192016ms) +✔ T3: seat, archived, unmapped and Researcher threads count; imported, deleted and other-project threads do not (469.074324ms) +✔ T3: the default path is read from HOME and prints no path line; --no-t3 says so (676.743837ms) +✔ T3: a HOME with no database exits 1 and names --no-t3 (129.183069ms) +✔ T3: a file that is not a database exits 1 and names --no-t3 (139.684739ms) +✔ T3: a seat thread renamed to another seat exits 1 naming thread, title and roles (426.081302ms) +✔ T3: an unmapped thread addressed as a seat exits 1 (367.356601ms) +✔ T3: a header to another thread id is not cross-checked (373.558727ms) +✔ T3: no project, or two, for this root exits 1 (945.232638ms) +✔ T3: a removed column exits 1 and names it (238.90353ms) +✔ T3: a missing table exits 1 and names it (232.317364ms) +✔ T3: a counted row with an unknown role exits 1 without its text (383.393636ms) +✔ T3: a counted row with role reasoning without the reasoning: id prefix exits 1 without its text (361.258599ms) +✔ T3: a counted row with non-text content exits 1 without its text (365.031452ms) +✔ T3: a counted row with an unparseable created_at exits 1 without its text (383.969779ms) +✔ T3: a reasoning summary is skipped before any check and counted as excluded (988.55625ms) +✔ T3: a missing orchestration_events makes the diagnostic unknown and keeps the counts (690.27355ms) +✔ T3: a human message with no event counts in humanWithoutEvent (383.385881ms) +✔ T3: an unparseable event makes the diagnostic unknown and keeps the counts (753.74895ms) +✔ T3: an event with no string messageId makes the diagnostic unknown and keeps the counts (698.053835ms) +✔ T3: an error that is not from SQLite is rethrown, not reported as a database failure (337.475207ms) +✔ T3: a symlink at ~/.t3 exits 1 (134.253261ms) +✔ T3: a symlink at ~/.t3/userdata exits 1 (141.948039ms) +✔ T3: a symlink at ~/.t3/userdata/state.sqlite exits 1 (130.926851ms) +✔ T3: with --t3-db, a symlinked file or directory exits 1 (442.574169ms) +✔ T3 WAL: the newest message only in -wal, writer attached, is counted (406.679156ms) +✔ T3 WAL: stopped cleanly, counts are correct and the main file is unchanged (387.976844ms) +✔ T3 WAL: -wal without -shm in a writable directory is read (438.616039ms) +✔ T3 WAL: -wal without -shm in a read-only directory exits 1 (419.212883ms) +✔ T3 WAL: stopped cleanly in a read-only directory exits 1 (407.996801ms) +✔ T3: a lock held past the 5 s busy timeout exits 1 and names --no-t3 (5422.333221ms) +✔ a done row whose closing issue is open is a violation; a row that is not done is not (1.883172ms) +✔ an issue several rows close is expected closed only once all of them are done (0.509081ms) +✔ closure needs positive evidence: unknown is undecided, and so is a skipped or short issue check (0.369008ms) +✔ each owner of an in-progress or in-review row gets one liveness class (7.651863ms) +✔ a required row not done after 14 days is a violation; a legacy row uses genesis as its lower bound (0.380774ms) +✔ an ISO requiredSince, as `set required` writes it, ages from its UTC day; one that does not parse is a violation (0.201336ms) +✔ the text section always ends in a count and a result, and never prints a full pass (0.320636ms) +✔ pidAlive: a running pid is present, an exited one is gone, and EPERM still means present (23.714122ms) +✔ issue states: open list first, then the metric page, then at most 10 lookups (261.453181ms) +✔ a full open list: lookups settle what it leaves out, and only an unsettled issue keeps it undecided (338.67107ms) +✔ the open list refuses on a failed call or a bad record, and never echoes the helper (160.489824ms) +✔ a helper call past the deadline is killed with its child, and the call reports it (2007.181334ms) +✔ readQueue loads queue.json through the queue validator and refuses anything else (142.991544ms) +✔ protected changes list every in-range entry that changes a required or parked row (391.165289ms) +✔ the CLI prints the queue section above the weekly table and under a queue key in --json (503.43492ms) +✔ a queue with nothing wrong prints 0 violations and a reduced pass, never a full pass (249.500734ms) +✔ --no-issues makes no call and leaves the issue checks undecided; --no-queue skips the section (321.955155ms) +✔ the CLI refuses a bad queue before any call, and a failed open list with exit 2 (267.356794ms) +✔ --unsupported-runtime repeats once per seat and takes a seat name (333.289325ms) +✔ an unreadable config makes every owner invalid instead of passing them (180.522245ms) +ℹ tests 86 +ℹ suites 0 +ℹ pass 86 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 22159.685953 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-mosaic.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-mosaic.log new file mode 100644 index 000000000..0b87d5091 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-mosaic.log @@ -0,0 +1,77 @@ +✔ pure resolution selects current default or explicit enrolled account (1.964812ms) +✔ scope is explicit, bounded and never inferred (1.602758ms) +✔ fork pin is preserved against default change, override, missing account and revocation (0.754462ms) +✔ unenrolled account/provider, missing harness, model expansion and native model ceiling refuse (0.759038ms) +✔ only explicit synthetic credential forms and internal fixture stores admitted (5.506298ms) +✔ two concurrent workspaces of the same agent publish distinct complete private generations (39.397476ms) +✔ same execution ID is exclusively claimed and cannot overwrite a published generation (32.131856ms) +✔ failed generation after-auth preserves prior files, records failure and refuses blind same-ID retry (49.642355ms) +✔ failed generation before-publish preserves prior files, records failure and refuses blind same-ID retry (55.274551ms) +✔ credential lock contention refuses without duplicate side effects (11.197207ms) +✔ symlinked pre-existing final target is refused and never followed (25.418672ms) +✔ invalid registry cannot resolve; no fallback to supplied partial entries (0.263893ms) +✔ post-publication failure records uncertainty, preserves complete generation and prevents replay (26.347253ms) +✔ expired credentials refresh under transaction and subsequent generation reuses rotation (80.102007ms) +✔ refresh failure retains prior generation and store state (59.617906ms) +✔ refresh timeout retains prior generation and store state (140.216954ms) +✔ refresh malformed retains prior generation and store state (58.706528ms) +✔ concurrent refresh on same account refuses contention while unrelated account proceeds (221.722696ms) +✔ invalid refresh options refuse before burning claim (30.765375ms) +✔ fixed fake process rotates both OAuth fields without mutating caller input (32.89121ms) +✔ concurrent isolated processes preserve separate provider credentials (27.88092ms) +✔ fake failure is refused with fixed diagnostics (21.184181ms) +✔ fake malformed is refused with fixed diagnostics (21.935709ms) +✔ fake timeout is refused with fixed diagnostics (102.366305ms) +✔ fake unchanged is refused with fixed diagnostics (22.208051ms) +✔ caller executable/environment injection is rejected before spawning (0.291078ms) +✔ valid fixture tree validates and lists without secrets (63.970757ms) +✔ unknown-field refuses (0.370893ms) +✔ invalid-id refuses uppercase and traversal shapes (0.261188ms) +✔ plain-http baseUrl requires allowInsecureTransport (0.293791ms) +✔ native provider rejects allowInsecureTransport (0.129416ms) +✔ unsupported credential type and kind refuse (0.147734ms) +✔ account provider-path mismatch refuses (0.159622ms) +✔ profile account refs must be provider/account shaped (0.233305ms) +✔ seat selection accepts fork pin field, validates account refs (0.220704ms) +✔ harness manifest id must equal executable (gate 1) (0.29162ms) +✔ CLI validate: duplicate provider id across files refuses (27.931521ms) +✔ CLI validate: missing referenced provider/account refuse (27.980366ms) +✔ CLI validate: broken JSON refuses without secret echo (31.169394ms) +✔ CLI usage errors exit 2 (50.973987ms) +✔ credential.json sibling presence does not break validation and is never read (60.426351ms) +✔ D1 missing, empty and structurally empty roots refuse, no list projection (166.595122ms) +✔ D1 required directory auth cannot be absent (55.764868ms) +✔ D1 required directory auth/providers cannot be absent (56.75391ms) +✔ D1 required directory auth/accounts cannot be absent (60.867275ms) +✔ D1 required directory auth/settings cannot be absent (56.50072ms) +✔ D1 required directory harnesses cannot be absent (61.143592ms) +✔ D1 root file and unreadable metadata refuse (113.404564ms) +✔ D2 no symlink traversal at auth/providers/openai-codex.json (51.213504ms) +✔ D2 no symlink traversal at auth/accounts/openai-codex/homelab-openai (59.339058ms) +✔ D2 no symlink traversal at auth/providers (56.95513ms) +✔ D2 no symlink traversal at auth (49.766558ms) +✔ D2 root and ancestor symlinks and lexical traversal refuse (151.549276ms) +✔ private filesystem modes enforced for root (49.70807ms) +✔ private filesystem modes enforced for auth (54.711057ms) +✔ private filesystem modes enforced for auth/providers/openai-codex.json (51.620886ms) +✔ private filesystem modes enforced for auth/accounts/openai-codex/homelab-openai/account.json (62.725591ms) +✔ D3 numeric version 1 only across all record kinds (1.199285ms) +✔ D4 nested unknown keys and missing per-kind required fields refuse (57.875715ms) +✔ D5 unenrolled default refuses even when account exists (60.175414ms) +✔ D6 provider/account credential type must match (63.433663ms) +✔ D7 every harness endpoint enforces HTTP opt-in and shape (0.451978ms) +✔ D8 URLs reject embedded credentials and unsupported protocols without echo (161.56929ms) +✔ D9 malformed JSON diagnostics contain no content excerpt (63.180907ms) +✔ D10 missing metadata is missing-path, not invalid-json (63.808319ms) +✔ D10 library returns no partial entries on any invalid record (72.044287ms) +✔ null/scalar/array metadata refuses without stack or echo (238.730944ms) +✔ credential sibling is never opened, even when an unreadable symlink (32.67413ms) +✔ oversized metadata refuses before parsing (55.562791ms) +ℹ tests 69 +ℹ suites 0 +ℹ pass 69 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 2082.067438 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-runs.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-runs.log new file mode 100644 index 000000000..fc16461de --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-runs.log @@ -0,0 +1,51 @@ +✔ isRunId accepts the run id shape and nothing else (0.87737ms) +✔ a missing data root or runs directory lists nothing (1.377415ms) +✔ runs as a regular file lists nothing, as before (0.539356ms) +✔ listRunIds keeps r- names only, sorted oldest first (0.659306ms) +✔ listRunRecords returns each result, or null for an incomplete or unreadable one (1.717898ms) +✔ readRunRecord returns documents and artifacts in directory order (0.864835ms) +✔ readRunRecord is null for a missing run, a dangling link or a file (0.572009ms) +✔ readRunRecord and readRunDocument refuse an invalid run id before touching the disk (0.572053ms) +✔ readRunDocument reads only the three run documents (0.458486ms) +✔ a link inside the data root is followed (0.790709ms) +✔ a data root that is itself a link is trusted as configured (0.621599ms) +✔ a run directory linked out of the data root is never read (0.558544ms) +✔ a document linked out of the data root reads as null (0.709476ms) +✔ a runs directory linked out of the data root refuses (0.49435ms) +✔ a relative link that climbs out of the data root refuses (0.375312ms) +✔ a sibling whose name starts with the data root's name is outside it (0.420897ms) +✔ a link loop refuses instead of reading as missing (0.517072ms) +✔ an unreadable runs directory refuses instead of listing nothing (0.373316ms) +✔ an unreadable run directory refuses instead of reading as missing (0.394414ms) +✔ a link to the data root's parent is outside it (0.33664ms) +✔ listRunIds sorts whatever order the directory returns (0.639166ms) +✔ listRunRecords lists an r- name that isn't a valid run id, as before (0.415318ms) +✔ the readers write nothing (1.662179ms) +✔ no pointer is null (1.4944ms) +✔ the pointer release.sh writes reads back (0.962081ms) +✔ a pointer that isn't the version 1 shape refuses with exit 2 (1.395135ms) +✔ a pointer that is a directory refuses with exit 4 (0.941344ms) +✔ a state file linked out of the data root refuses (0.779196ms) +✔ a state directory linked out of the data root refuses (0.474752ms) +✔ a state directory linked out to nothing reads as no release and an empty log (0.395329ms) +✔ a missing log is empty (0.298533ms) +✔ the log reads oldest first and counts malformed lines (0.824064ms) +✔ last must be a positive integer (0.393687ms) +✔ the state readers write nothing (0.690372ms) +✔ list prints each run in the established format (77.287778ms) +✔ list prints a damaged result.json as unknown and keeps listing the runs after it (58.997452ms) +✔ list prints each result field that isn't a string as unknown or - (64.131167ms) +✔ show prints the run in the established format (61.077132ms) +✔ show of a missing run and an invalid id exit 4 as before (93.886985ms) +✔ list and show refuse a runs directory linked out of the data root (118.760848ms) +✔ show refuses a run linked out of the data root; list reports it unknown (119.476037ms) +✔ list shows an r- name that isn't a valid run id, as before (62.943745ms) +✔ show refuses an invalid id before reading the config (42.191878ms) +ℹ tests 43 +ℹ suites 0 +ℹ pass 43 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 752.085064 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-seat.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-seat.log new file mode 100644 index 000000000..270961e8f --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-seat.log @@ -0,0 +1,132 @@ +✔ a first launch clones the root at its branch, with the root's path as origin (60.827458ms) +✔ the clone is not at its place until git clone has finished (36.810105ms) +✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (93.952178ms) +✔ a clone ahead of the root keeps its commits and counts as current (65.609768ms) +▶ a dirty clone, one on another branch and one diverged are kept as they are + ✔ a modified file (43.821109ms) + ✔ an untracked file (39.765414ms) + ✔ a staged file (41.914066ms) + ✔ another branch (39.647827ms) + ✔ a detached HEAD (38.591946ms) + ✔ a diverged branch (58.896117ms) +✔ a dirty clone, one on another branch and one diverged are kept as they are (264.206952ms) +▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it + ✔ user.name (35.48614ms) + ✔ user.email (32.172222ms) +✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (68.244146ms) +✔ a commit git can't read after the fast-forward is null (65.489051ms) +✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (28.966649ms) +▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it + ✔ core.fsmonitor (50.699848ms) + ✔ core.hooksPath (54.682437ms) + ✔ a hook file (41.873923ms) + ✔ include.path (49.56049ms) + ✔ includeIf (44.663168ms) + ✔ a filter driver (47.170251ms) + ✔ origin moved (40.959664ms) + ✔ a second origin url (38.278213ms) + ✔ the origin url twice, both the root (43.70191ms) + ✔ an ext:: origin (42.8085ms) + ✔ a branch tracking another remote (43.708321ms) + ✔ a branch merging a tag (47.192451ms) + ✔ a fetch line onto local branches (47.029146ms) + ✔ no origin (42.443854ms) + ✔ a config file over the size cap (39.017524ms) + ✔ config a symlink to /dev/zero (40.553155ms) + ✔ the clone a symlink to the bait (39.422421ms) + ✔ the clone a file (36.401318ms) + ✔ the clone a plain directory (45.419037ms) + ✔ .git a gitdir: file (39.024313ms) + ✔ .git a symlink (32.825566ms) + ✔ .git/logs a symlink (34.524386ms) + ✔ .git/refs/heads a symlink (38.716738ms) + ✔ .git/objects a symlink (40.027824ms) + ✔ a reflog hard-linked to a file outside (43.844768ms) + ✔ HEAD a fifo (45.458188ms) + ✔ a commondir file (41.777188ms) + ✔ an alternates file (41.560464ms) + ✔ a gitlink staged, no .gitmodules (62.062807ms) + ✔ a gitlink and .gitmodules staged (62.005175ms) + ✔ a gitlink to a repository with its own gitlink (67.752985ms) + ✔ a gitlink and .gitmodules committed (57.23621ms) + ✔ a gitlink and submodule.active in config (63.911127ms) + ✔ a .git/modules with no gitlink (42.234562ms) +✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1554.340891ms) +▶ a root that can't be cloned refuses with the project id and leaves nothing behind + ✔ missing (11.01148ms) + ✔ not a repository (11.113624ms) + ✔ a plain directory inside another repository (16.050702ms) + ✔ unreadable (10.17506ms) + ✔ on no branch (11.38639ms) + ✔ missing an object (17.091228ms) +✔ a root that can't be cloned refuses with the project id and leaves nothing behind (77.687322ms) +✔ a clone whose root is on no branch, or gone, is kept and named (30.195378ms) +✔ no credential or forge remote of the root reaches a clone (48.883784ms) +✔ every project in the business file gets its own clone at its own branch (37.89921ms) +✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.510174ms) +✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.432315ms) +✔ a timeout signals git's process group, so a process git started dies with it (515.786635ms) +✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (514.572536ms) +✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.287426ms) +✔ sandboxProblem names a missing bwrap and a bwrap that fails (12.947407ms) +✔ every bind says why; the bundle and session file stay read-only over the run directory (3.255718ms) +✔ the host's git socket is bound only when given, read-only and before the writable binds (1.663215ms) +✔ the git identity is the instance's, at @.mosaic.invalid, and sandboxArgv refuses without it (2.781016ms) +✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1702.973595ms) +✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2551.252908ms) +✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (266.178511ms) +✔ resolveSeat: by name under --repo resolves the repo layout (2.670434ms) +✔ resolveSeat: by path resolves the fleet layout (0.64297ms) +✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (1.474729ms) +✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (1.239344ms) +✔ makeRegistration produces a record that validates; each shape violation throws SeatError (1.765265ms) +✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (2.603167ms) +✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.825288ms) +✔ CLI launch: registers, execs the fake launch script, and passes args through (46.072485ms) +✔ CLI launch: --harness lands in the record (39.645932ms) +✔ CLI launch: the launch script's own exit code passes through (41.290571ms) +✔ CLI launch: relaunching a seat rewrites the one registration record (84.986261ms) +✔ CLI launch: omitting --task records an empty string, not null (44.578865ms) +✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (99.893538ms) +✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (170.689599ms) +✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.513559ms) +✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.697037ms) +✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.863753ms) +✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.465005ms) +✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (355.208486ms) +✔ family: exactly one launch.max key in the model name, else null (1.188636ms) +✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (1.132807ms) +✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.425516ms) +✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (2.401352ms) +✔ session file and launch log: 0600, the session file written once (1.694962ms) +✔ endReason maps the runner's exit codes; a signal is killed (0.203344ms) +✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.99212ms) +✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.587778ms) +✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (320.942778ms) +✔ workRef and validBranch take only what a ref name can hold (2.387413ms) +✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (192.680759ms) +✔ a rewritten branch refuses non-fast-forward and the work ref stays (161.713913ms) +✔ a branch with no history in common with main refuses unrelated-history (70.215638ms) +✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (52.430685ms) +✔ main is fetched from the root again before each push, so a clone of a newer root pushes (175.183638ms) +✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (120.096133ms) +✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (102.658474ms) +✔ only a v2 bundle with the named branch is read (62.903929ms) +✔ a branch named main, or named for another task, moves only this task's work ref (110.79186ms) +✔ a record that throws moves the work ref back, or removes a new one (161.393277ms) +✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (401.17446ms) +✔ a root that can't be read refuses root-unreadable (34.934201ms) +✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2196.722787ms) +✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.696247ms) +✔ a working repository path that isn't a directory refuses (30.595214ms) +✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (115.577961ms) +✔ review of a project with no working repository refuses unknown-commit (14.748648ms) +✔ the runner's git tools hold the host's limits and branch rule (1.296559ms) +ℹ tests 120 +ℹ suites 0 +ℹ pass 120 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 5127.986433 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-tasks.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-tasks.log new file mode 100644 index 000000000..52f2c556e --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-tasks.log @@ -0,0 +1,100 @@ +✔ the boot config is checked before anything starts (90.385443ms) +✔ a business with no tracker entry refuses task verbs (111.619029ms) +✔ credential.expiring and .expired are recorded once per instance (212.131249ms) +✔ a token file that changes on disk records credential.changed (117.224089ms) +✔ autostart polls, reconciles and retries a startup the tracker was down for (140.983784ms) +✔ a refusal a restart must clear is not retried by the poll (94.431298ms) +✔ a poll that fires while two are queued is dropped (100.865463ms) +✔ close waits for a running verb and refuses one that has not started (219.847273ms) +✔ the bundled Vikunja is the pinned upstream image the runbook names (0.785578ms) +✔ every published port is on 127.0.0.1, and no secret is in the file (0.307805ms) +✔ the committed table loads frozen; its verbs are the broker task verbs (2.206526ms) +✔ a write names a verb the table has as its own key, not one it inherits (0.807042ms) +✔ the schema refuses any other shape (4.158536ms) +✔ the Field table in the slice 1 plan names the verbs each field is written by (0.994247ms) +✔ each verb refuses, asks for a decision and writes as the table and the role files say (1203.016156ms) +✔ the list holds the PRD's requirement ids, in its order, at its version (2.134796ms) +✔ the committed list loads frozen (0.920614ms) +✔ the schema refuses any other shape (3.666458ms) +✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (345.938397ms) +✔ the project list holds recorded project objects in the recorded list envelope (106.109199ms) +✔ the recorded task bodies pass the checks S3 applies to every read (0.419505ms) +✔ the client works against the fake over real HTTP with the platform fetch (242.134619ms) +✔ a correct install starts, and the first reconcile records tasks that already exist (113.748232ms) +✔ verbs refuse while a business is starting and after startup refused it (132.259831ms) +✔ startup refuses a token that can do more than its role needs (398.243441ms) +✔ startup refuses an unsupported version and flags an untested one (275.515148ms) +✔ startup refuses a board that the runbook did not install (353.290143ms) +✔ startup refuses a project the sync bot cannot read (90.516243ms) +✔ startup refuses a configured label the pm bot cannot see (91.314861ms) +✔ startup refuses an expired credential and a missing sync credential (168.048071ms) +✔ an unreachable tracker refuses with tracker-unavailable (87.415424ms) +✔ an edit in the UI is recorded once, with the fields that changed (205.691415ms) +✔ a move between open buckets is seen on the board, though updated does not change (167.615617ms) +✔ a person's comment is counted and a bot's is not (270.636649ms) +✔ the hourly reconcile catches a comment through comment_count (222.600268ms) +✔ a task closed in the UI leaves the open view with its done bucket (395.363194ms) +✔ a task that leaves the board is recorded as deleted, moved or out of reach (264.385356ms) +✔ a poll that read before a verb wrote does not overwrite the verb (171.675524ms) +✔ a tracker fault during a tick is reported and the next tick catches up (149.611331ms) +✔ a malformed answer refuses the tick with tracker-shape (133.337313ms) +✔ no token value reaches the database, the log or a refusal (256.552414ms) +✔ the first look at a task counts only comments inside the window (152.322841ms) +✔ with descendants off the adapter reads no project list and no child, as in v0 (126.323324ms) +✔ a three-level tree is read per project, and a project outside it is not (108.102991ms) +✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (207.900631ms) +✔ a root without the installed buckets refuses with descendants on (94.687505ms) +✔ the project list refuses without read_all, and skips archived projects and saved filters (202.448207ms) +✔ descendants must be true or false (101.135683ms) +✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (182.849203ms) +✔ a child made after startup joins the tree at the next reconcile (154.722522ms) +✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (173.754938ms) +✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (191.575609ms) +✔ a reconcile that fails keeps the previous tree (118.003057ms) +✔ a closed task the cursor missed takes its own project's done bucket (123.390974ms) +✔ closed tasks read at startup take their own project's done bucket (80.578907ms) +✔ a closed task the cursor returns takes its own project's done bucket (111.122126ms) +✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (124.077209ms) +✔ a task in a bucket outside the five keeps its raw bucket id (95.025581ms) +✔ bucket 0 on a watch-only task never becomes a bucket or a state (194.714726ms) +✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (136.639933ms) +✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (123.099806ms) +✔ task.create needs a recorded human request and a requirement id (191.386874ms) +✔ task.create takes only an approved requirement id (211.999214ms) +✔ task.create cites the request a received message carries, not the message's id (182.179037ms) +✔ only labels named in the business file can be written (217.536834ms) +✔ task.schedule sets and clears a due date and relations (292.60283ms) +✔ assign and reassign move the role bots and record task.assigned (306.361609ms) +✔ task.update.assigned is for the assignee and records task.state (291.721626ms) +✔ a wrong expected digest records task.conflict and writes nothing (154.689594ms) +✔ a cross-role verb needs a resolved decision, used once (227.995324ms) +✔ task.close needs a verdict; after it every verb refuses with task-done (190.502677ms) +✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (246.313754ms) +✔ a lost answer is settled by a re-read and never retried (174.89207ms) +✔ a create whose answer is lost is reported uncertain, and the poll finds the task (105.961895ms) +✔ a task the sync bot cannot read refuses and records nothing (88.023576ms) +✔ verbs and polls for one business run one at a time (160.097653ms) +✔ a due date with milliseconds is written to the second (148.001606ms) +✔ every write landed and the final read failed: the verb succeeds and records what it wrote (109.343203ms) +✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (75.763784ms) +✔ a create whose final read fails succeeds and records task.created (86.114383ms) +✔ an edit between the last write and the final read shows as external on the next poll (147.772981ms) +✔ task.created is recorded when a later label write fails (70.973616ms) +✔ every verb acts in an installed child, on the child's own board (237.752721ms) +✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (132.6591ms) +✔ with descendants off, task.create takes only the root project (75.644046ms) +✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (100.781207ms) +✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (136.711707ms) +✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (92.010789ms) +✔ a verb and a create in the child record the final read of the child's board (88.109462ms) +✔ a create in the child whose final read fails records the child's todo bucket (93.166403ms) +✔ a lost answer in the child is settled by a re-read of the child's board (115.401307ms) +✔ every related task is read before authority, not only the first (92.641535ms) +ℹ tests 92 +ℹ suites 0 +ℹ pass 92 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 4964.231628 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-webui.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-webui.log new file mode 100644 index 000000000..92362c4ce --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/pkg-webui.log @@ -0,0 +1,117 @@ +✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (6778.020005ms) +✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (6698.287034ms) +✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (4215.699558ms) +Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286} +✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (7345.527672ms) +✔ the README says a refused field table names the file or the key at fault, never a path (1.474033ms) +✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (7596.57673ms) +✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (375.877305ms) +✔ decisions route serves the roles and recent lists from the reader view (410.515123ms) +✔ credentials route serves the broker credential status from the reader view (291.107025ms) +✔ replies route serves the replies to one message from the reader view (772.035843ms) +✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (208.473881ms) +✔ bus refusals map to statuses and never carry a path or a stack (74.060705ms) +✔ humanCall speaks the human transport protocol without blocking the server (2086.987787ms) +✔ busReader takes --business, else the live bus host, else refuses (684.270084ms) +✔ humanCall kills a transport that runs past its timeout (529.627584ms) +✔ serve refuses a --business value that is not a business id (342.418577ms) +✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (4093.666205ms) +✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3855.754115ms) +✔ conversation view: a newer session with no readable history keeps the marker (2012.426901ms) +✔ conversation view: seats without history say so and offer no reply (1820.562194ms) +✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (5302.64946ms) +✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54649.421658ms) +✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (328.537241ms) +✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (9760.882338ms) +✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (2710.039103ms) +✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2801.481127ms) +✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (5732.396689ms) +✔ copy writes nothing when an archived path is missing at the commit (1185.548336ms) +✔ a copy that loses the rename race leaves no read-only temp directory behind (454.615043ms) +✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (639.138425ms) +✔ a copy that meets a target holding files says exists: and moves nothing into it (499.717921ms) +✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (605.61114ms) +✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (932.737226ms) +✔ serve refuses a --checkout that is not an absolute directory path (226.136666ms) +✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (51.657916ms) +✔ preview options are all three or none, and each is checked (11.328342ms) +✔ the CLI refuses a partial or invalid preview flag set at start (2762.196438ms) +✔ the CLI with all three flags serves the preview mode (168.260454ms) +✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (24.949054ms) +✔ the header name matches without regard to case, and the value compare is exact (5.21771ms) +✔ the public name with the header reads the bus views, and the Host and Origin are checked first (49.198592ms) +✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (19.974405ms) +✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (6.497195ms) +✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (17.130665ms) +✔ a repeated Host is 400 before any other check, in preview mode and without it (6.557147ms) +✔ without the preview flags the public name is refused and writes still reach the board (4.185901ms) +✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (2.194878ms) +✔ credential state from the date alone, as the bus states it (0.270469ms) +✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1860.769255ms) +✔ queue: a refused read fails closed with the store's text, redacted (1236.900601ms) +✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (4579.886715ms) +✔ business: names, vars on the allowlist, authority, credential metadata only (16.78214ms) +✔ business: missing or invalid file refuses with the module's text, redacted (21.904331ms) +✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (14.353853ms) +✔ settings: release, board, loopback address, notifier binding name only (407.940849ms) +✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (82.182039ms) +✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (4376.256025ms) +✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (23088.584546ms) +✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (7439.205122ms) +✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13000.475636ms) +✔ startServer takes send only as a function and only with the preview mode (5.68796ms) +✔ the CLI refuses --send without the preview flags, and without a configured bus (395.886657ms) +✔ the CLI with --send and a configured bus sends through the human transport and logs one line (121.243141ms) +✔ without --send the route is read-only like every other write, and config says no send (8.245033ms) +✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (5.427431ms) +✔ config says send only on the public name with --send on (1.870772ms) +✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.614631ms) +✔ each request check refuses before anything is sent, and logs the refusal without the body (13.698236ms) +✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (2.520871ms) +✔ a crafted role name cannot forge a log line (1.982486ms) +✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (6.193125ms) +✔ through the human transport the request is exactly the business, message.send and the keys (113.56715ms) +✔ against a real broker: the message is written once as a human send, and its refusals map (2083.525229ms) +✔ loopback host and board origin fail closed (7.441832ms) +✔ real board fixture passes through WebUI; assets and isolated seen/reply work (780.942041ms) +✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (40.907239ms) +✔ unreachable board reports URL; CLI rejects unsupported options (382.100131ms) +✔ render prints the unit without the preview flags (8.408633ms) +✔ render carries every serve flag, the preview set included (5.730358ms) +✔ a partial preview set is refused (13.128761ms) +✔ a value the unit cannot carry is refused, for every flag (351.815856ms) +✔ the rendered unit names none of the human proof agent markers and sets no agent variable (25.222133ms) +✔ install into --dir with --no-reload writes the file whole, then reports unchanged (224.533714ms) +✔ install without --no-reload runs daemon-reload and nothing that starts the unit (169.791684ms) +✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (192.396373ms) +✔ status prints the unit state and GET /healthz on the installed port (309.157204ms) +✔ usage: an unknown verb or flag, and start or enable, exit 4 (97.404282ms) +✔ without --send, render is the template with its placeholders filled, byte for byte (40.549941ms) +✔ render --send with the preview set ends ExecStart with --send and changes nothing else (61.16339ms) +✔ --send without the whole preview set is refused and writes nothing (192.914557ms) +✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (409.315237ms) +✔ uninstall and status take no --send (29.5296ms) +✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (686.74215ms) +✔ when the state read fails, install and uninstall refuse with one line and change nothing (67.129617ms) +✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (64.502062ms) +✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (370.25947ms) +✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (23.46996ms) +✔ the uid header takes only an Authentik uid; the username header still takes a username (651.672788ms) +✔ a preview value cannot start with - or . (66.646324ms) +✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (567.27076ms) +✔ tokens.css and icons.svg are byte copies of docs/design (1.517915ms) +✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.060431ms) +✔ shipped strings are unchanged, and the web keeps its write boundary (2.228376ms) +✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (7564.548162ms) +✔ five states on Board, Inbox, Tasks, Agents and Trail (2473.33535ms) +✔ Queue, Business and Settings in their five states, with no move button (5120.56022ms) +✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (2195.940379ms) +✔ the server log names no config path when the system config refuses (318.88209ms) +ℹ tests 108 +ℹ suites 0 +ℹ pass 108 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 55070.971356 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-auth.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-auth.log new file mode 100644 index 000000000..ac2287606 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-auth.log @@ -0,0 +1,17 @@ +OK status with missing harness credential exits 3 and still lists accounts +OK status reports harness credential (read-only) + mosaic accounts +OK api key material never reaches output +OK oauth token material never reaches output +OK unparseable credential file exits 2 +OK symlinked credential file exits 4 +OK env-side credential names reported +OK env var values never reach output +OK accounts without an accounts dir reports none and creates nothing +OK accounts lists files and marks the active one +OK loose account perms flagged in listing +OK agent --auth with missing account file refuses (exit 4) +OK agent --auth with non-0600 account file refuses +OK agent --auth with invalid account name refuses +OK auth.sh without valid config refuses + +selftest: 15 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-conductor.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-conductor.log new file mode 100644 index 000000000..62afc513c --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-conductor.log @@ -0,0 +1,23 @@ +On branch refactor +Your branch is up to date with 'origin/refactor'. + +nothing to commit, working tree clean +OK dry-run: allowed change, exit 0, nothing committed (exit 0) +OK dry-run committed nothing +OK apply: allowed change exits 0 (exit 0) +OK apply: attribution in commit subject +OK apply: target tree clean after commit +OK disallowed path refused (exit 1) +OK disallowed path: target untouched +OK syntax gate refused broken .mjs (exit 1) +OK syntax gate: target untouched +OK suite failure refused (exit 1) +OK suite failure: target reverted to clean +OK disabled policy refused (exit 2) +OK disabled policy: target untouched +OK failed run refused (exit 1) +OK failed run: target untouched +OK missing run exits 4 (exit 4) +OK invalid policy exits 2 (exit 2) + +selftest: 17 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-config.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-config.log new file mode 100644 index 000000000..76c05ef74 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-config.log @@ -0,0 +1,26 @@ +OK absent adapter defaults to pi +OK adapter mock validates (exit 0) +OK unsupported adapter exits 2 (exit 2) +OK env exports adapter +OK bootstrap creates default when absent (exit 0) +OK bootstrap wrote config file +OK bootstrap is idempotent on existing config (exit 0) +OK bootstrap did not rewrite existing config +OK validate missing config exits 3 (exit 3) +OK malformed JSON exits 2 (exit 2) +OK unsupported configVersion exits 2 (exit 2) +OK unknown top-level key exits 2 (exit 2) +OK unknown execution key exits 2 (exit 2) +OK unsupported backend exits 2 (exit 2) +OK unsupported environment exits 2 (exit 2) +OK relative dataRoot exits 2 (exit 2) +OK non-canonical dataRoot exits 2 (exit 2) +OK filesystem root dataRoot exits 2 (exit 2) +OK home directory dataRoot exits 2 (exit 2) +OK dataRoot containing config dir exits 2 (exit 2) +OK control character in provider exits 2 (exit 2) +OK symlinked config file exits 2 (exit 2) +OK env exports resolve correctly +OK failed validation modified nothing + +selftest: 24 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-discord.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-discord.log new file mode 100644 index 000000000..b013f9ffa --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-discord.log @@ -0,0 +1,70 @@ +toolchain: node v26.8.1 + +OK syntax: packages/discord/src/approvals.mjs +OK syntax: packages/discord/src/authorize.mjs +OK syntax: packages/discord/src/binding.mjs +OK syntax: packages/discord/src/cli.mjs +OK syntax: packages/discord/src/connector.mjs +OK syntax: packages/discord/src/context.mjs +OK syntax: packages/discord/src/engine-pi.mjs +OK syntax: packages/discord/src/errors.mjs +OK syntax: packages/discord/src/gateway.mjs +OK syntax: packages/discord/src/git.mjs +OK syntax: packages/discord/src/journal.mjs +OK syntax: packages/discord/src/notify.mjs +OK syntax: packages/discord/src/rest.mjs +OK syntax: packages/discord/src/setspark.mjs +OK syntax: packages/discord/src/tools.mjs +OK syntax: packages/discord/src/web.mjs +OK syntax: packages/discord/bin/git-credential.mjs +OK syntax: packages/discord/extension/tools.mjs +OK syntax: packages/discord/tests/approvals.test.mjs +OK syntax: packages/discord/tests/authorize.test.mjs +OK syntax: packages/discord/tests/binding.test.mjs +OK syntax: packages/discord/tests/connector.test.mjs +OK syntax: packages/discord/tests/context.test.mjs +OK syntax: packages/discord/tests/engine.test.mjs +OK syntax: packages/discord/tests/fake-pi.mjs +OK syntax: packages/discord/tests/gateway.test.mjs +OK syntax: packages/discord/tests/git.test.mjs +OK syntax: packages/discord/tests/helpers.mjs +OK syntax: packages/discord/tests/journal.test.mjs +OK syntax: packages/discord/tests/notify.test.mjs +OK syntax: packages/discord/tests/recover.test.mjs +OK syntax: packages/discord/tests/rest.test.mjs +OK syntax: packages/discord/tests/setspark.test.mjs +OK syntax: packages/discord/tests/tools.test.mjs +OK syntax: packages/discord/tests/web.test.mjs +OK syntax: packages/discord/fixtures/claim-worker.mjs +OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs +OK syntax: scripts/discord.sh +OK syntax: scripts/discord-service.sh +OK packages/discord declares no dependencies +OK no bot-token-shaped string in packages/discord +OK fixture binding uses placeholder ids only +OK fixture binding validates +OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool +OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start +OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root +OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token +OK real pi with protocol vault adds reserve_id to the git verbs +OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key +OK real pi refuses a git key on a read-only root (fail closed) +OK real pi with the pilot flags (--no-tools) exposes no tool at all +OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed) +OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT +OK node --test packages/discord/tests/ (ℹ pass 178) +OK scripts/discord.sh --help exits 0 +OK scripts/discord.sh check without a binding exits 4 +OK scripts/discord.sh recover without a binding exits 4 +OK scripts/discord.sh reload without a binding exits 4 +OK scripts/discord-service.sh without a command exits 4 +OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP +OK service install writes the rendered unit (0644) and leaves no temp file +OK service install a second time reports unchanged +OK systemd-analyze verify accepts the rendered unit +OK service uninstall removes the unit file +OK service install with an unknown flag exits 4 +OK service install with USER unset finishes and names the account for lingering + +discord suite: 66 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-extension-package.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-extension-package.log new file mode 100644 index 000000000..63983d113 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-extension-package.log @@ -0,0 +1,21 @@ +OK initial ordinary-file install +OK installed tree matches canonical source +OK installed tree has no symlinks +OK check detects installation drift +OK sync refuses to overwrite installation drift +OK check detects an extra destination file +OK check detects an extra destination directory +OK check rejects a destination symlink +OK sync accepts a canonical source update +OK updated installation matches canonical source +scripts/test-extension-package.sh: line 14: 3998969 Killed "$@" > /dev/null 2>&1 +OK forced interruption kills the replacing process +OK next invocation recovers old consistent installation +OK interrupted replacement rolled back +OK sync succeeds after interruption recovery +OK unlocked stale lock file does not block +OK active lock refuses a concurrent sync +OK source symlink fails closed +OK nested second entrypoint fails closed + +extension package selftest: 18 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-foundation.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-foundation.log new file mode 100644 index 000000000..6338e1e6d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-foundation.log @@ -0,0 +1,53 @@ +toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0 + +OK syntax: scripts/foundation-inspect.mjs +OK syntax: scripts/foundation/strict-json.mjs +OK syntax: scripts/foundation/canonical.mjs +OK syntax: scripts/foundation/resolve.mjs +OK syntax: scripts/foundation/validate-record.mjs +OK syntax: scripts/foundation/fixtures/build-fixtures.mjs +OK syntax: scripts/foundation/canonical.test.mjs +OK syntax: scripts/foundation/cli.test.mjs +OK syntax: scripts/foundation/fixtures.test.mjs +OK syntax: scripts/foundation/resolve.test.mjs +OK syntax: scripts/foundation/strict-json.test.mjs +OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written) +OK fixture generator runs +OK checked-in fixtures/bundles equal a fresh generation +OK checked-in fixtures/raw equal a fresh generation +OK checked-in fixtures/index.json equal a fresh generation +OK checked-in demo bundles equal a fresh generation +OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT +OK node --test scripts/foundation/ (ℹ pass 80) +OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof) + platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999) + node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases) + schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10 + profile column (schema-valid records only): profile-valid 510, profile-invalid 30 + profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns +OK oracle: zero schema-column disagreements with the pinned checker +OK oracle: strict-only profile refusals are counted and asserted +OK demo: permitted read preview exits 0 (exit 0) +OK demo: permitted file.change preview exits 0 (exit 0) +OK demo: assignment.change proposal is unresolved (exit 3) (exit 3) +OK demo: revoked registration is refused (exit 3) (exit 3) +OK demo: message is not authority (exit 3) (exit 3) +OK usage: no arguments exits 2 (exit 2) +OK io: missing file exits 4 (exit 4) +OK io: directory exits 4 (exit 4) +OK io: symlink exits 4 (O_NOFOLLOW) (exit 4) +OK bound: oversize fixture exits 2 (exit 2) +OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2) +OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2) +OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0) +OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed +OK text output starts with the disclaimer +OK json output is valid JSON with result allowed and exactly the charter §7 fields +OK json golden matches byte-for-byte +OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal +OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs +OK canary never printed (bundle run and credential-file run) +OK a non-bundle JSON file is refused at the shape gate, not read into output +OK no field of the non-bundle file is echoed + +selftest: 44 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-queue.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-queue.log new file mode 100644 index 000000000..7b23f3032 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-queue.log @@ -0,0 +1,36 @@ +toolchain: node v26.8.1, git version 2.55.0 + +OK syntax: packages/queue/src/cli.mjs +OK syntax: packages/queue/src/errors.mjs +OK syntax: packages/queue/src/io.mjs +OK syntax: packages/queue/src/lock.mjs +OK syntax: packages/queue/src/queue.mjs +OK syntax: packages/queue/src/review.mjs +OK syntax: packages/queue/src/store.mjs +OK syntax: packages/queue/tests/commit.test.mjs +OK syntax: packages/queue/tests/data.test.mjs +OK syntax: packages/queue/tests/dispatch.test.mjs +OK syntax: packages/queue/tests/gate-owner.test.mjs +OK syntax: packages/queue/tests/helpers.mjs +OK syntax: packages/queue/tests/lock.test.mjs +OK syntax: packages/queue/tests/migration.test.mjs +OK syntax: packages/queue/tests/review.test.mjs +OK syntax: packages/queue/tests/store.test.mjs +OK syntax: packages/queue/tests/write.test.mjs +OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs +OK syntax: packages/queue/tests/fixtures/kill-at.mjs +OK syntax: packages/queue/tests/fixtures/lock-child.mjs +OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh +OK syntax: scripts/queue-commit.sh +OK syntax: scripts/git-hooks/pre-commit +OK syntax: scripts/mosaic +OK queue-commit.sh, the guard and scripts/mosaic are executable +OK packages/queue declares no dependencies +ℹ tests 156 +ℹ pass 156 +ℹ fail 0 +OK node --test packages/queue/tests/ +OK scripts/mosaic queue help +skip queue verify and render --check: this checkout (/home/jwoltje/darkwing-scratch/rt-4bc9/land-work.4fdytP/lw-3931111-1792002745) is not the queue's canonical root (/mnt/storage/src/mosaic-stack) + +queue suite: 28 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-release.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-release.log new file mode 100644 index 000000000..7202b85d4 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-release.log @@ -0,0 +1,16 @@ +OK valid RELEASE resolves (exit 0) +OK invalid RELEASE exits 1 (exit 1) +OK missing RELEASE exits 1 (exit 1) +OK valid RELEASE leaves image tag consistent with version +OK status safe on empty state (exit 0) +OK status created no pointer +OK fault-injected activation refuses (exit 1) +OK refused activation wrote no pointer +OK refusal logged exactly once with valid fields +OK healthy activation succeeds (exit 0) +OK pointer written with valid fields +OK repeat activation succeeds (log grows) (exit 0) +OK log is append-only across activations +OK rollback without previous refuses (exit 1) + +selftest: 14 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-task.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-task.log new file mode 100644 index 000000000..df6724a77 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land-work-logs.adiLIr/script-task.log @@ -0,0 +1,101 @@ +OK valid task validates (exit 0) +OK unknown task key exits 2 (exit 2) +OK unsupported taskVersion exits 2 (exit 2) +OK invalid task id exits 2 (exit 2) +OK empty prompt exits 2 (exit 2) +OK NUL in expectExact exits 2 (exit 2) +OK out-of-range timeout exits 2 (exit 2) +OK missing mission file exits 4 (exit 4) +OK task with valid mission validates (exit 0) +OK invalid mission exits 2 (exit 2) +OK validate missing task exits 4 (exit 4) +OK validation does not modify the task file +OK prune dry-run exits 0 (exit 0) +OK dry-run deleted nothing +OK prune --keep=2 --yes removes oldest (exit 0) +OK kept exactly 2 newest runs +OK newest run kept, oldest pruned +OK append-only receipt written (3 entries) +OK sessions/workspaces untouched by prune +OK prune with invalid keep exits 4 (exit 4) +OK mock adapter: gate passes on matching mock response (exit 0) +OK mock adapter: expect-mismatch recorded (exit 1) +OK mismatch reason recorded +OK unknown adapter fails closed (exit 1) +OK mission task runs via mock adapter (exit 0) +OK mission section injected into generated prompt +OK retry of mission run succeeds (exit 0) +OK retriedFrom lineage recorded +OK mission section present after retry (relative path resolved) +OK retry of missing run exits 4 (exit 4) +OK skill install bundled ms-tools (exit 0) +OK installed to skills-available +OK double install refuses (exit 1) +OK activate enables skill (exit 0) +OK enabled dir populated +OK uninstall while enabled refuses (exit 1) +OK deactivate moves back to available (exit 0) +OK uninstall removes from available (exit 0) +OK seat with enabled skill launches +OK skill path delivered to adapter +OK shipped researcher contract resolves (ceiling + network) +OK resolve-role refuses a non-role document (conductor policy) (exit 2) +OK resolve-role refuses name/filename mismatch (exit 2) +OK resolve-role refuses unknown network declaration (exit 2) +OK resolve-role refuses duplicate role tool (exit 2) +OK resolve-role refuses unsupported tool (exit 2) +OK resolve-role refuses missing contract file (exit 4) +OK version 1 role prints no contract line +OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer) +OK resolve-role accepts a minimal version 2 role (exit 0) +OK resolve-role refuses an action outside the vocabulary (exit 2) +OK resolve-role refuses a gated-only action in a role file (exit 2) +OK resolve-role refuses a Vikunja verb no role may hold (exit 2) +OK resolve-role refuses a version 2 role whose contract is missing (exit 2) +OK resolve-role refuses a contract that is a symbolic link (exit 2) +OK seat launches under role ceiling +OK role ceiling narrows seat tools (read,write,bash -> read,bash) +OK narrowing recorded loudly +OK missing role contract refuses launch (exit 2) +OK missing-contract refusal names the role +OK empty ceiling intersection -> tool-free seat +OK tool-free outcome recorded loudly +OK overridden agents dir without seat definition refuses (exit 4) +OK seat-resolution refusal names the seat +OK policy: mission only -> mission tools +OK policy: task only -> task tools +OK policy: both -> intersection (task narrowed) +OK policy: empty intersection -> tool-free +OK invalid mission capabilities rejected (exit 2) +mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls) +OK task run with user layer present (exit 0) +OK user context dispatched into generated prompt +OK workspace+tools task runs via mock (exit 0) +OK workspace path + tools delivered to adapter +OK persistent workspace created on host +OK plain task still runs (no workspace/tools) (exit 0) +OK workspace var present but empty when absent +OK tools empty when absent +OK unknown tool exits 2 (exit 2) +OK workspace traversal exits 2 (exit 2) +OK live hello task succeeds with exact marker +OK result.json written in run dir +OK result.json contents are correct +OK wrong expectExact fails with exit 1 (reason: expect-mismatch) +OK each run gets a distinct run dir (no clobber) +OK list shows both runs +OK fork base: teach succeeds (exit 0) +OK fork child recalls ancestor context (exit 0) +OK forked child recalled ancestor code word +OK ancestor session untouched by fork +OK child session dir has its own branch file +OK onboard without name exits 4 (non-interactive) (exit 4) +OK onboard --name renders profile (exit 0) +OK profile written +OK canon structure: required filled, optional placeholdered +OK canon sections present +OK user recall run succeeds +OK recalled user name (response: Jason) +OK no agent identity on headless run + +selftest: 98 passed, 0 failed diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land.err b/agents/darkwing/work/queue-116/r1/replay-4bc9/land.err new file mode 100644 index 000000000..731e7d8e8 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land.err @@ -0,0 +1,24 @@ +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt-4bc9/land-work-logs.ASEJp9 +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/land.out b/agents/darkwing/work/queue-116/r1/replay-4bc9/land.out new file mode 100644 index 000000000..e9a4b3ca5 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/land.out @@ -0,0 +1,2 @@ +land-work: committed 1c0e5e72367749ae6870a38a8c545346fe35243d on refactor (parent 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c), patch-id 26100825e412. NOT pushed - push remains an explicit act. +work/vikunja-19-265 (vikunja:19/265) is merged to refactor as 1c0e5e723; push pending. diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/r229.err b/agents/darkwing/work/queue-116/r1/replay-4bc9/r229.err new file mode 100644 index 000000000..eeb803232 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/r229.err @@ -0,0 +1 @@ +land-work: refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/r229.out b/agents/darkwing/work/queue-116/r1/replay-4bc9/r229.out new file mode 100644 index 000000000..e69de29bb diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/replay-run.log b/agents/darkwing/work/queue-116/r1/replay-4bc9/replay-run.log new file mode 100644 index 000000000..fcd4d1c75 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/replay-run.log @@ -0,0 +1,99 @@ +base 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c want tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f +== 19/265 --dry-run +land-work (dry-run): would commit tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f on refactor at 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, patch-id 26100825e412, with this message: + Squash-merge work/vikunja-19-265 into refactor + + Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, + the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + + Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 + Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 + Work-ref: work/vikunja-19-265 + Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 + Base: refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c + Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 + Gate: full, every package suite and every scripts/test-*.sh + Applied-under: scripts/land-work.sh (conductor) +land-work (dry-run): no ref was written. +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt-4bc9/land-work-logs.adiLIr +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED +dry rc=0 +dry tree cdd3a62c2ed7c25332de5fbde4fcfcc4594e112f matches f7c8537b3^{tree}: yes +dry-run wrote no ref: yes +== 19/265 landing +land-work: committed 1c0e5e72367749ae6870a38a8c545346fe35243d on refactor (parent 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c), patch-id 26100825e412. NOT pushed - push remains an explicit act. +work/vikunja-19-265 (vikunja:19/265) is merged to refactor as 1c0e5e723; push pending. +land-work: gate logs in /home/jwoltje/darkwing-scratch/rt-4bc9/land-work-logs.ASEJp9 +pkg-bus rc=0 ℹ pass 148 ℹ fail 0 +pkg-business rc=0 ℹ pass 67 ℹ fail 0 +pkg-cli rc=0 ℹ pass 184 ℹ fail 0 +pkg-control-board rc=0 ℹ pass 124 ℹ fail 0 +pkg-conversation rc=0 ℹ pass 182 ℹ fail 0 +pkg-discord rc=0 ℹ pass 178 ℹ fail 0 +pkg-harness rc=0 ℹ pass 80 ℹ fail 0 +pkg-ledger rc=0 ℹ pass 86 ℹ fail 0 +pkg-mosaic rc=0 ℹ pass 69 ℹ fail 0 +pkg-runs rc=0 ℹ pass 43 ℹ fail 0 +pkg-seat rc=0 ℹ pass 120 ℹ fail 0 +pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 +pkg-webui rc=0 ℹ pass 108 ℹ fail 0 +script-auth rc=0 +script-conductor rc=0 +script-config rc=0 +script-discord rc=0 +script-extension-package rc=0 +script-foundation rc=0 +script-queue rc=0 ℹ pass 156 ℹ fail 0 +script-release rc=0 +script-task rc=0 +GATE_PASSED +land rc=0 +new 1c0e5e72367749ae6870a38a8c545346fe35243d parent 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c (want 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c) +tree matches f7c8537b3^{tree}: yes +landed diff equals f7c8537b3's own diff: yes +canonical lacks the commit (local only): yes +target refs other than refactor unchanged: yes +working repo refs unchanged: yes +target status after: [?? node_modules ] +worktrees after: 1 +bus unchanged: yes +Squash-merge work/vikunja-19-265 into refactor + +Squash of work/vikunja-19-265 (vikunja:19/265) at 8ae5a149152b35a6d8370924775725e5b36c7b92 onto refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c, +the reviewed diff 0c3826910edbd0b76ef60362b49ac6f8b9bab369..8ae5a149152b35a6d8370924775725e5b36c7b92. Resolved yes by jason via the CLI at 2026-10-14T16:35:32.002Z. + +Decision: f71c73c9-c759-4aca-98d9-3e22e8c42b36 +Verdict: d3f97f9d-f5c6-4f81-924d-d3c0698692f4 +Work-ref: work/vikunja-19-265 +Reviewed-commit: 8ae5a149152b35a6d8370924775725e5b36c7b92 +Base: refactor 4bc908991cacf77b04437cbab0a9c1c0d7eaa77c +Patch-id: 26100825e4128d64e9a84690dba008b9549fe6a5 +Gate: full, every package suite and every scripts/test-*.sh +Applied-under: scripts/land-work.sh (conductor) + +== 19/229 (010d30cbe) must refuse root-file +land-work: refused: root-file: the reviewed diff adds src/parse-requirement-id.mjs src/parse-requirement-id.test.mjs +229 rc=2 root-file: yes +land-work scratch left: 0, other tmp entries: 344 diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/replay.sh b/agents/darkwing/work/queue-116/r1/replay-4bc9/replay.sh new file mode 100644 index 000000000..d2d9644a8 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/replay.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Row 116 replay (packet only): 19/265 against a scratch copy of the working +# repository and a target clone with refactor at BASE0, dry-run then real; +# then the 19/229 fixture decision, which must refuse root-file. +# bash replay.sh [BASE0] (default 1c9a4910d, the brief's base) +# f7c8537b3 was committed on 4bc908991, two docs commits after 1c9a4910d, so +# its tree is only reachable from 4bc908991. From any base the landed diff +# must equal f7c8537b3's own diff, compared as text so the target never +# fetches from the canonical repository. +set -uo pipefail +WT=~/darkwing-scratch/r116/wt +CANON=/mnt/storage/src/mosaic-stack +LIVE_WORKING=$HOME/.mosaic-dev/working/mosaic-stack/stack.git +ROWS=$CANON/agents/sage/work/row116/live-rows.json +HERE="$(cd "$(dirname "$0")" && pwd)" +BASE0="${1:-1c9a4910d}" +R=~/darkwing-scratch/r116/replay-$BASE0 +# Short on purpose: the cli suite puts unix sockets under TMPDIR, and a +# sun_path holds 107 bytes. r116/replay/tmp (46 bytes) failed 8 cli tests. +T=~/darkwing-scratch/rt-${BASE0:0:4} +D=f71c73c9-c759-4aca-98d9-3e22e8c42b36 +D229=d2290000-0000-4000-8000-000000000229 +WANT_TREE="$(git -C "$CANON" rev-parse f7c8537b3^{tree})" +rm -rf "$R" "$T" +mkdir -p "$T" +git clone -q --no-checkout "$CANON" "$R/target" +git -C "$R/target" checkout -q -B refactor "$BASE0" +ln -s "$CANON/node_modules" "$R/target/node_modules" +for n in 265 229; do + mkdir -p "$R/cfg$n/businesses" "$R/data$n/working/mosaic-stack" + chmod 700 "$R/data$n" + cp -a "$LIVE_WORKING" "$R/data$n/working/mosaic-stack/stack.git" + printf '{"configVersion":1,"environment":"development","dataRoot":"%s","execution":{"backend":"docker","provider":"zai","model":"m","adapter":"mock"}}\n' \ + "$R/data$n" > "$R/cfg$n/config.json" + printf '{"id":"mosaic-stack","human":"jason","projects":{"stack":{"root":"%s"}}}\n' "$R/target" > "$R/cfg$n/businesses/mosaic-stack.json" + node "$HERE/rows.mjs" "$ROWS" "$n" > "$R/rows$n.json" && (cd "$WT" && node scripts/land-work/fixture.mjs "$R/data$n" "$R/rows$n.json") \ + || { echo "STOP fixture $n"; exit 9; } +done +lw() { (cd "$WT" && MOSAIC_CONFIG="$R/cfg$1/config.json" TMPDIR="$T" bash scripts/land-work.sh "${@:2}"); } +snap() { + git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' + git -C "$R/target" reflog --format='%H %gs' refactor + git -C "$R/target" status --porcelain=v1 --untracked-files=all + git -C "$R/target" worktree list --porcelain + git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' + sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1 +} +echo "base $(git -C "$R/target" rev-parse refactor) want tree $WANT_TREE" +echo "== 19/265 --dry-run" +snap > "$R/before.txt" +git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' > "$R/working-before.txt" +git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' | grep -v '^refs/heads/refactor ' > "$R/target-refs-before.txt" +rc=0; lw 265 "$D" --dry-run > "$R/dry.out" 2> "$R/dry.err" || rc=$? +snap > "$R/after-dry.txt" +cat "$R/dry.out"; tail -n 40 "$R/dry.err" +echo "dry rc=$rc" +DRY_TREE="$(sed -n 's/^land-work (dry-run): would commit tree \([0-9a-f]*\) .*/\1/p' "$R/dry.out")" +echo "dry tree $DRY_TREE matches f7c8537b3^{tree}: $([ "$DRY_TREE" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "dry-run wrote no ref: $(cmp -s "$R/before.txt" "$R/after-dry.txt" && echo yes || echo NO)" +[ "$rc" -eq 0 ] || { echo "STOP dry-run rc=$rc"; exit 1; } +echo "== 19/265 landing" +rc=0; lw 265 "$D" > "$R/land.out" 2> "$R/land.err" || rc=$? +cat "$R/land.out"; tail -n 40 "$R/land.err" +echo "land rc=$rc" +NEW="$(git -C "$R/target" rev-parse refactor)" +echo "new $NEW parent $(git -C "$R/target" rev-parse "$NEW^") (want $(git -C "$CANON" rev-parse $BASE0))" +echo "tree matches f7c8537b3^{tree}: $([ "$(git -C "$R/target" rev-parse "$NEW^{tree}")" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "landed diff equals f7c8537b3's own diff: $(diff <(git -C "$R/target" diff --binary "$NEW^" "$NEW") <(git -C "$CANON" diff --binary f7c8537b3^ f7c8537b3) >/dev/null && echo yes || echo NO)" +echo "canonical lacks the commit (local only): $(git -C "$CANON" cat-file -e "$NEW" 2>/dev/null && echo NO || echo yes)" +echo "target refs other than refactor unchanged: $(git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' | grep -v '^refs/heads/refactor ' | cmp -s - "$R/target-refs-before.txt" && echo yes || echo NO)" +echo "working repo refs unchanged: $(git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' | cmp -s - "$R/working-before.txt" && echo yes || echo NO)" +echo "target status after: [$(git -C "$R/target" status --porcelain=v1 --untracked-files=all | tr '\n' ' ')]" +echo "worktrees after: $(git -C "$R/target" worktree list | wc -l)" +echo "bus unchanged: $([ "$(sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1)" = "$(tail -n1 "$R/before.txt")" ] && echo yes || echo NO)" +git -C "$R/target" log -1 --format=%B "$NEW" +echo "== 19/229 (010d30cbe) must refuse root-file" +rc=0; lw 229 "$D229" --dry-run > "$R/r229.out" 2> "$R/r229.err" || rc=$? +cat "$R/r229.out" "$R/r229.err" +echo "229 rc=$rc root-file: $(grep -q 'refused: root-file' "$R/r229.err" && echo yes || echo NO)" +echo "land-work scratch left: $(ls -d "$T"/land-work.* 2>/dev/null | wc -l), other tmp entries: $(ls -A "$T" | grep -cv '^land-work')" diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/target-refs-before.txt b/agents/darkwing/work/queue-116/r1/replay-4bc9/target-refs-before.txt new file mode 100644 index 000000000..033d5ad27 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/target-refs-before.txt @@ -0,0 +1,63 @@ +refs/remotes/origin/HEAD bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/docs/1507-chat-01c-r2 f7fab8b64575e00d13654fa114abb74273e15b05 +refs/remotes/origin/feat/1311-credential-seat-store 87c12a27267c9ea8d06b71f249b191f6e08b766b +refs/remotes/origin/fix/retry-lineage-v1 afd5827db8af02cf03c514c605a9ef9ab763c467 +refs/remotes/origin/fix/roles-dir-v1 527bc581cada649fc1d503c309f19fc501b38cf8 +refs/remotes/origin/foundation/adapter-seam-v1 594b8d711c1238cbdbc5b13284a00f222e6cf9d2 +refs/remotes/origin/foundation/agent-seats-v1 9bd4f1c4056d28e3b0806d13289667c8d536d80e +refs/remotes/origin/foundation/config-v1 81f58b15c8497bb25e9a0d2fa9f22aa71db9cddb +refs/remotes/origin/foundation/interactive-agent-v1 7db4c5c2ed66254e6504ea9c40f7fcd971c2a63f +refs/remotes/origin/foundation/mission-policy-v1 2ff49adff432790149031443b978560585dfe697 +refs/remotes/origin/foundation/mission-task-v1 7f0408d417709b8f33b59a7094119e06cf947aeb +refs/remotes/origin/foundation/operator-ergonomics-v1 24bdef75fa096f2520efbdf4de670bcabae84101 +refs/remotes/origin/foundation/release-v1 35ea46466150602357256365e2a2b4c0e28cc9f4 +refs/remotes/origin/foundation/retention-v1 88eef507b0cfa80f4153afd566c4fed61e138eff +refs/remotes/origin/foundation/session-fork-v1 88d9cf750f3d20c30f0dad07562135e9b32db343 +refs/remotes/origin/foundation/sessions-v1 be555497009607cf0a5f75c174924d292febc5d4 +refs/remotes/origin/foundation/skill-lifecycle-v1 9fd16b9739fdafa331f4f872a94f2337ef9dc6e1 +refs/remotes/origin/foundation/user-context-v1 a7b612435b374f578364f7e065e0ba8b61b09d2d +refs/remotes/origin/foundation/workspaces-capabilities-v1 b017e66e175c8b7efa2be38fda89978914de72f0 +refs/remotes/origin/main 9a5fbdbda74b16adf488fe28138b2ba69ea5e669 +refs/remotes/origin/orchestration/conductor-v1 83c4e9851efd885c9e8b6af7e845c672780602f0 +refs/remotes/origin/refactor bea5dfa47fd57b49dc29c1aa781d99cde263acac +refs/remotes/origin/worktree-agent-a1044a9b545fa3a36 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a44468a48c485520e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a4fe093597cbfbb5b 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-a7038df8212b2da8a 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-aae703ffcabbad4b7 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/remotes/origin/worktree-agent-abe72e00ca2bcdf7e 924438016e2eb1c2ca352bfbf9107143b8b342bb +refs/tags/adapter-seam-v1 d539744a51c1529c034aad0b6b6b25caa5618f1e +refs/tags/agent-seats-v1 e53d86d55344c8ac91e4403c1930d2d354193372 +refs/tags/archive/ms24-fork-20260823 328967705692db073c63a381ed3c406b6c7c2f68 +refs/tags/auto-apply-v1 ce1a28d6fbea7fb1cdfc06502b2bf8ab4788da7b +refs/tags/conductor-v1 ac665b360eb7abd17af7e7030ff764c0adb4f247 +refs/tags/config-hello-v1 8912dfb2c8ca43bd211b3607a2a06e2d8d11cf40 +refs/tags/fed-v0.1.0-m1 8650a7da2369f7bdea489f3749ca4657457ba5ed +refs/tags/fed-v0.2.0-m2 4ece6dc643126d3b763fc942301660b2a594d856 +refs/tags/interactive-agent-v1 661c954cc217ac847c04c33794e9de7b28b7a807 +refs/tags/mission-policy-v1 7ae1cee48ec036578b1c71d03cb5d985fe89bfc2 +refs/tags/mission-task-v1 6d51cc67874b23df762400f7b9f6b12d9ed3cb61 +refs/tags/mosaic-v0.0.24 f6cc91aa66470d2ecf006b56bd5ec81917be7dd2 +refs/tags/mosaic-v0.0.25 d5b1a92372244b38e6facb5d61d52a2bb456562f +refs/tags/mosaic-v0.0.26 56ebfa239910dbe4b4a5ecd988a9257ae7638cb5 +refs/tags/mosaic-v0.0.27 bd76df1a50d0ce650bbcf8ff3cf0d164ac3bbc03 +refs/tags/mosaic-v0.0.28 1bfd8570d6ea69b26db81655c120a3af4943987a +refs/tags/mosaic-v0.0.29 81c1775a03d14d1cf5babcbccab300e40eb0e348 +refs/tags/mosaic-v0.0.31 aa221bf92ea7da535153f782489978bf2085951f +refs/tags/onboarding-v1 f08298e1a8fbfbc98dfb721552bcd24fdacf9785 +refs/tags/operator-ergonomics-v1 744b19c5bea305bb63ac91539eae7b0a3f3ecc69 +refs/tags/poc-container-hello-v0 988007f34e5dcd756ee35dad73c76cbf72712364 +refs/tags/release-model-v1 5184afed6471548d44df449f29c39b8863f8f89c +refs/tags/retention-v1 99be1ef526bb9fa1347445bfb4033dcdc0072b33 +refs/tags/session-fork-v1 4a87942c2087c0f7129312e37985f432d7eed031 +refs/tags/sessions-v1 6fbe9f08b5fb211ca79cc76bda3ce43e6bf8c110 +refs/tags/skill-lifecycle-v1 91aa52e052c0886cf3ff93055ef6db905f02b997 +refs/tags/v0.0.39-alpha 528700ceea2d31ab781e08a8ea38232a2fbbbce1 +refs/tags/v0.0.4 b5325ad11afea129b8b88b2f7d7b9b05f7a27fb5 +refs/tags/v0.0.5 5ed69075c42543401e91929e01bac84329eadfe1 +refs/tags/v0.0.6 3f261b7d21297ff4cfe860b4f7e50a5993a497fd +refs/tags/v0.0.7 36ed6b19b229ab5621237b401b49784d165b05be +refs/tags/v0.0.8 5e54f099142310608ff83301232a7d3e5ca91d31 +refs/tags/v0.1.0 6da6e6dc24d806f02c8042783ee393acf8317942 +refs/tags/v0.2.0 a4537c90b7cd368161e86769dbadfe5d7d1342f1 +refs/tags/workspace-capabilities-v1 67d6e8ac44623d721e13b50a8a9d873eeebb23fc diff --git a/agents/darkwing/work/queue-116/r1/replay-4bc9/working-before.txt b/agents/darkwing/work/queue-116/r1/replay-4bc9/working-before.txt new file mode 100644 index 000000000..c94303f3d --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay-4bc9/working-before.txt @@ -0,0 +1,3 @@ +refs/heads/main 644ef5310ed3d2cb3282774fb9c2b48a40552beb +refs/heads/work/vikunja-19-229 010d30cbe65ae54f140fc524adab5e92264d2964 +refs/heads/work/vikunja-19-265 8ae5a149152b35a6d8370924775725e5b36c7b92 diff --git a/agents/darkwing/work/queue-116/r1/replay/replay.sh b/agents/darkwing/work/queue-116/r1/replay/replay.sh new file mode 100644 index 000000000..d2d9644a8 --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay/replay.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Row 116 replay (packet only): 19/265 against a scratch copy of the working +# repository and a target clone with refactor at BASE0, dry-run then real; +# then the 19/229 fixture decision, which must refuse root-file. +# bash replay.sh [BASE0] (default 1c9a4910d, the brief's base) +# f7c8537b3 was committed on 4bc908991, two docs commits after 1c9a4910d, so +# its tree is only reachable from 4bc908991. From any base the landed diff +# must equal f7c8537b3's own diff, compared as text so the target never +# fetches from the canonical repository. +set -uo pipefail +WT=~/darkwing-scratch/r116/wt +CANON=/mnt/storage/src/mosaic-stack +LIVE_WORKING=$HOME/.mosaic-dev/working/mosaic-stack/stack.git +ROWS=$CANON/agents/sage/work/row116/live-rows.json +HERE="$(cd "$(dirname "$0")" && pwd)" +BASE0="${1:-1c9a4910d}" +R=~/darkwing-scratch/r116/replay-$BASE0 +# Short on purpose: the cli suite puts unix sockets under TMPDIR, and a +# sun_path holds 107 bytes. r116/replay/tmp (46 bytes) failed 8 cli tests. +T=~/darkwing-scratch/rt-${BASE0:0:4} +D=f71c73c9-c759-4aca-98d9-3e22e8c42b36 +D229=d2290000-0000-4000-8000-000000000229 +WANT_TREE="$(git -C "$CANON" rev-parse f7c8537b3^{tree})" +rm -rf "$R" "$T" +mkdir -p "$T" +git clone -q --no-checkout "$CANON" "$R/target" +git -C "$R/target" checkout -q -B refactor "$BASE0" +ln -s "$CANON/node_modules" "$R/target/node_modules" +for n in 265 229; do + mkdir -p "$R/cfg$n/businesses" "$R/data$n/working/mosaic-stack" + chmod 700 "$R/data$n" + cp -a "$LIVE_WORKING" "$R/data$n/working/mosaic-stack/stack.git" + printf '{"configVersion":1,"environment":"development","dataRoot":"%s","execution":{"backend":"docker","provider":"zai","model":"m","adapter":"mock"}}\n' \ + "$R/data$n" > "$R/cfg$n/config.json" + printf '{"id":"mosaic-stack","human":"jason","projects":{"stack":{"root":"%s"}}}\n' "$R/target" > "$R/cfg$n/businesses/mosaic-stack.json" + node "$HERE/rows.mjs" "$ROWS" "$n" > "$R/rows$n.json" && (cd "$WT" && node scripts/land-work/fixture.mjs "$R/data$n" "$R/rows$n.json") \ + || { echo "STOP fixture $n"; exit 9; } +done +lw() { (cd "$WT" && MOSAIC_CONFIG="$R/cfg$1/config.json" TMPDIR="$T" bash scripts/land-work.sh "${@:2}"); } +snap() { + git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' + git -C "$R/target" reflog --format='%H %gs' refactor + git -C "$R/target" status --porcelain=v1 --untracked-files=all + git -C "$R/target" worktree list --porcelain + git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' + sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1 +} +echo "base $(git -C "$R/target" rev-parse refactor) want tree $WANT_TREE" +echo "== 19/265 --dry-run" +snap > "$R/before.txt" +git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' > "$R/working-before.txt" +git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' | grep -v '^refs/heads/refactor ' > "$R/target-refs-before.txt" +rc=0; lw 265 "$D" --dry-run > "$R/dry.out" 2> "$R/dry.err" || rc=$? +snap > "$R/after-dry.txt" +cat "$R/dry.out"; tail -n 40 "$R/dry.err" +echo "dry rc=$rc" +DRY_TREE="$(sed -n 's/^land-work (dry-run): would commit tree \([0-9a-f]*\) .*/\1/p' "$R/dry.out")" +echo "dry tree $DRY_TREE matches f7c8537b3^{tree}: $([ "$DRY_TREE" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "dry-run wrote no ref: $(cmp -s "$R/before.txt" "$R/after-dry.txt" && echo yes || echo NO)" +[ "$rc" -eq 0 ] || { echo "STOP dry-run rc=$rc"; exit 1; } +echo "== 19/265 landing" +rc=0; lw 265 "$D" > "$R/land.out" 2> "$R/land.err" || rc=$? +cat "$R/land.out"; tail -n 40 "$R/land.err" +echo "land rc=$rc" +NEW="$(git -C "$R/target" rev-parse refactor)" +echo "new $NEW parent $(git -C "$R/target" rev-parse "$NEW^") (want $(git -C "$CANON" rev-parse $BASE0))" +echo "tree matches f7c8537b3^{tree}: $([ "$(git -C "$R/target" rev-parse "$NEW^{tree}")" = "$WANT_TREE" ] && echo yes || echo NO)" +echo "landed diff equals f7c8537b3's own diff: $(diff <(git -C "$R/target" diff --binary "$NEW^" "$NEW") <(git -C "$CANON" diff --binary f7c8537b3^ f7c8537b3) >/dev/null && echo yes || echo NO)" +echo "canonical lacks the commit (local only): $(git -C "$CANON" cat-file -e "$NEW" 2>/dev/null && echo NO || echo yes)" +echo "target refs other than refactor unchanged: $(git -C "$R/target" for-each-ref --format='%(refname) %(objectname)' | grep -v '^refs/heads/refactor ' | cmp -s - "$R/target-refs-before.txt" && echo yes || echo NO)" +echo "working repo refs unchanged: $(git -C "$R/data265/working/mosaic-stack/stack.git" for-each-ref --format='%(refname) %(objectname)' | cmp -s - "$R/working-before.txt" && echo yes || echo NO)" +echo "target status after: [$(git -C "$R/target" status --porcelain=v1 --untracked-files=all | tr '\n' ' ')]" +echo "worktrees after: $(git -C "$R/target" worktree list | wc -l)" +echo "bus unchanged: $([ "$(sha256sum "$R/data265/bus/bus.sqlite" | cut -d' ' -f1)" = "$(tail -n1 "$R/before.txt")" ] && echo yes || echo NO)" +git -C "$R/target" log -1 --format=%B "$NEW" +echo "== 19/229 (010d30cbe) must refuse root-file" +rc=0; lw 229 "$D229" --dry-run > "$R/r229.out" 2> "$R/r229.err" || rc=$? +cat "$R/r229.out" "$R/r229.err" +echo "229 rc=$rc root-file: $(grep -q 'refused: root-file' "$R/r229.err" && echo yes || echo NO)" +echo "land-work scratch left: $(ls -d "$T"/land-work.* 2>/dev/null | wc -l), other tmp entries: $(ls -A "$T" | grep -cv '^land-work')" diff --git a/agents/darkwing/work/queue-116/r1/replay/rows.mjs b/agents/darkwing/work/queue-116/r1/replay/rows.mjs new file mode 100644 index 000000000..4839162ea --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/replay/rows.mjs @@ -0,0 +1,38 @@ +// Row 116 replay rows: the live f71c73c9 rows Sage saved, or a 19/229 +// decision of the same shape over verdict 1fbd1ed1. Prints fixture.mjs input. +import { readFileSync } from 'node:fs'; +const [file, which] = process.argv.slice(2); +const j = JSON.parse(readFileSync(file, 'utf8')); +const ev = (r) => ({ table: 'events', business: 'mosaic-stack', ...r }); +const bySeq = (a, b) => a.seq - b.seq; +// task.created rows are left out: the schema's trigger needs the human.input +// request they cite, which isn't in the dump, and land-work never reads them. +const kept = (r) => r.kind !== 'task.created'; +let rows; +if (which === '265') { + rows = [ + { table: 'decisions', ...j.decision[0] }, + ...[...j.raise_allowed, ...j.verdict_events].filter(kept).sort(bySeq).map(ev), + ...j.decision_events.map((r) => ({ table: 'decision_events', ...r })), + ]; +} else { + const D = 'd2290000-0000-4000-8000-000000000229'; + const d = j.decision[0]; + const options = [ + { key: 'yes', text: 'Squash-merge work/vikunja-19-229 into refactor' }, + { key: 'no', text: "Don't merge yet" }, + ]; + rows = [ + { table: 'decisions', ...d, id: D, at: '2026-10-14T16:40:00.000Z', raised_by_run: 'rfixture229', + question: 'Can I squash-merge work/vikunja-19-229 into refactor? Row 116 fixture over verdict 1fbd1ed1.', + options: JSON.stringify(options) }, + ...j.task229.filter(kept).sort(bySeq).map(ev), + ev({ seq: 900, id: '2290d000-0000-4000-8000-000000000900', kind: 'action.allowed', subject: D, actor_role: 'pm', + actor_run: 'rfixture229', at: '2026-10-14T16:40:00.001Z', + body: { decision: D, action: 'git.merge.protected', operation: 'decision.raise', task_ref: null, target: 'refactor', approvalChoice: 'yes', holderRun: null } }), + ev({ seq: 901, id: '2290d000-0000-4000-8000-000000000901', kind: 'human.input', subject: D, actor_role: null, + at: '2026-10-14T16:41:00.001Z', body: { kind: 'answer', decision: D, op: 'resolved', choice: 'yes' } }), + { table: 'decision_events', seq: 3, decision: D, at: '2026-10-14T16:41:00.000Z', op: 'resolved', by: 'jason', choice: 'yes', note: null, via: 'cli' }, + ]; +} +process.stdout.write(JSON.stringify(rows)); diff --git a/agents/darkwing/work/queue-116/r1/repro.sh b/agents/darkwing/work/queue-116/r1/repro.sh new file mode 100755 index 000000000..a4113066b --- /dev/null +++ b/agents/darkwing/work/queue-116/r1/repro.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# Apply build.patch to a fresh export of BASE and compare every manifest digest. +set -euo pipefail +P=~/darkwing-scratch/r116/pkt +X=~/darkwing-scratch/r116/repro +rm -rf "$X"; mkdir -p "$X" +git -C /mnt/storage/src/mosaic-stack archive 1223a0f37 | tar -x -C "$X" +(cd "$X" && git apply "$P/build.patch") +(cd "$X" && sha256sum -c --quiet "$P/candidate-manifest.sha256") && echo DIGESTS_OK