Smallest failing test then smallest passing change.
Source runs full-1, rep-1 and rep-2 at tdd-experiment c3dd988
Contents
Baseline
What it changes: Nothing. It is the greedy baseline.
No award in this survey.
One method of the study, from runs full-1 and rep-1 and rep-2. The survey build is the method's single build in run full-1. A replicate is one of its builds in run rep-1 and rep-2, which ran in a different batch. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
How it builds code
The procedure supplied to the agents. Indented lines run under the line above them.
Family: Baseline. Idea: Smallest failing test then smallest passing change. What it changes in the search: Nothing. It is the greedy baseline.
once:1. List test scenarios from the requirements before writing code.repeat per feature until none is open:2. Pick the scenario that needs the least new code.3. Write one failing test for it and watch it fail.4. Pass it with the smallest change. Reject assistant diffs that do more.5. Fake a constant if unsure. Generalize once a second example forces it.6. Type the obvious code when sure. Drop back to faking on a surprise red.7. Refactor on green. Add new scenarios to the list. Repeat until empty.
Once means one agent runs the steps. Repeat per unit means one agent per unit until no unit is open. Throughout means the rule joins every prompt. For up to n starts means separate attempts with the best kept. The harness does means the harness runs the step without an agent. If names the event that starts a stage, and with adds a rule borrowed from another method. Steps are quoted from args.json with their numbers. Tag: verified.
Figure 11.1
Stage flow of Classic greedy TDD
Once: step 1.Lane: Agent.
Next: Steps 2 to 7.
Steps 2 to 7.Lane: Agent.
Loop: repeat per feature, back to Steps 2 to 7.
2 stages from the run facts, each checked against its block of the steps above. Details and notes are in the stage table. Tag: recomputed.
Each stage as the run facts list it. Runs as and Note are quoted verbatim and Steps repeats the steps above. Tag: verified.
Stage
Runs as
Steps
Details
Note
Once: step 1
once:
1. List test scenarios from the requirements before writing code.
none
none
Steps 2 to 7
repeat per feature until none is open:
2. Pick the scenario that needs the least new code. 3. Write one failing test for it and watch it fail. 4. Pass it with the smallest change. Reject assistant diffs that do more. 5. Fake a constant if unsure. Generalize once a second example forces it. 6. Type the obvious code when sure. Drop back to faking on a surprise red. 7. Refactor on green. Add new scenarios to the list. Repeat until empty.
unit feature
An impasse is a bar that stays red for 3 red-green cycles. Log each impasse in the LOG.md actions.
Survey build
One build in run full-1.
15/15Functional mark
10E
804,727Cost to completion
542,369M
496,442M_io
10PMD findings
noAlignment
Replicates
Repeat builds: 5 in run rep-1 and 5 in run rep-2.
0.984Median adjusted mutation, over 5 replicates in rep-1
2Median classes, over 5 replicates in rep-1
1,033,995Median cost to completion, over 5 replicates in rep-1
14Median CQP, over 5 replicates in rep-1
against Anchor Engineering: U 0, Holm p 0.016Planned contrast, exact, Holm, rep-1
1.000Median adjusted mutation, over 5 replicates in rep-2
1Median classes, over 5 replicates in rep-2
1,011,641Median cost to completion, over 5 replicates in rep-2
13Median CQP, over 5 replicates in rep-2
M against Held-out TDD: U 14, Holm p 1.000; M against Coarse-to-fine TDD: U 16, Holm p 1.000; M against Most informative next test: U 8, Holm p 1.000; adjusted mutation against Held-out TDD: U 25, Holm p 0.024; adjusted mutation against Coarse-to-fine TDD: U 14, Holm p 1.000; adjusted mutation against Most informative next test: U 10, Holm p 1.000Planned contrast, exact, Holm, rep-2
0.87Consistency score C, exploratory over rep-1 and rep-2, lower is more consistent
Verdict
The baseline of the survey and of every planned contrast. All 11 of its builds passed every hidden test with 1 to 3 classes, and none passed strict PMD compliance, with 4 to 10 violations. Its rep-1 replicates' median adjusted mutation of 0.984 sat below Anchor Engineering's 1.000 in the planned contrast. Its rep-2 replicates reached a median of 1.000. Its consistency score C of 0.87 over both runs was the second lowest of the seven replicated methods, an exploratory result. Tag: recomputed.
Report summary
The report's class diagram for this design is identical to Figure 11.2 below, so it is shown once. Tag: recomputed.
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Strict PMD compliance
fail (10 violations)
Mutation score
105/113, 0 not run, adjusted 105/105 (0 of 8 survivors fail hidden tests)
Classes
1
Simple Constructs /5
3
Minimal Duplication /5
4
Modular Structure /5
3
Problem Alignment (tentative) /5
3
Weighted tokens
843,734
Bench median ms
605
Score card
Survey tiles place the survey build among the single survey builds. One build per method describes that build and does not rank the methods. Contrast tiles are medians over the replicates. Tag: recomputed.
Adjusted mutation1.000joint 1st highest of 11 single survey builds, one per method
Classes1joint 10th highest of 11 single survey builds, one per method
Cost to completion804,7273rd lowest of 11 single survey builds, one per method
Strict PMD violations1011th lowest of 11 single survey builds, one per method
Median adjusted mutation0.984over 5 replicates in rep-1
Median classes2over 5 replicates in rep-1
Median cost to completion1,033,995over 5 replicates in rep-1
Median CQP14over 5 replicates in rep-1
Planned contrastagainst Anchor Engineering: U 0, Holm p 0.016exact, Holm, rep-1
Median adjusted mutation1.000over 5 replicates in rep-2
Median classes1over 5 replicates in rep-2
Median cost to completion1,011,641over 5 replicates in rep-2
Median CQP13over 5 replicates in rep-2
Planned contrastM against Held-out TDD: U 14, Holm p 1.000; M against Coarse-to-fine TDD: U 16, Holm p 1.000; M against Most informative next test: U 8, Holm p 1.000; adjusted mutation against Held-out TDD: U 25, Holm p 0.024; adjusted mutation against Coarse-to-fine TDD: U 14, Holm p 1.000; adjusted mutation against Most informative next test: U 10, Holm p 1.000exact, Holm, rep-2
Consistency score C0.87exploratory over rep-1 and rep-2, lower is more consistent
Builds
Best, median and worst order a method's replicates by adjusted mutation, highest first, then lower cost to completion. The median build is the representative. Tag: recomputed.
Same family comes from the methods doc. Nearest and farthest average the rank differences over adjusted mutation, classes and cost to completion of the survey builds, over the metrics both methods have. Anchor Engineering has no survey build, so the replicate medians of adjusted mutation and classes stand in. Cost to completion leaves out such a method, since costs of a different batch do not compare. Tag: recomputed.
Branch method/classic. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (10 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
265 (src 137, own tests 128)
recomputed
Lines of code
206 (src 114, own tests 92)
recomputed
Classes
1
recomputed
Methods
9
recomputed
Fields
0
recomputed
Bench median ms
605
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
105/113, 0 not run, adjusted 105/105 (0 of 8 survivors fail hidden tests)
recomputed
PMD lines
9 (10 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 4, Code quality principles 3.4, Test quality 3
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Sowing works in index order for both directions, so the clockwise flag only reaches printBoard. The cost is a set of dense ternaries spread over several lines there instead of one place that decides the layout.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 4.
Reason: The variant sets only two inline ternaries in play(), and every loop and the board width come from the array length. The literal 7/5/6/4 values have no named constants.
Reason: The methods are short and well separated. The indentation mixes tabs and spaces, and the printBoard lines that chain ternaries with substring(1) are hard to read.
Reason: The Javadoc on sow and capture states the intent well and most names are descriptive. Magic literals (7, 5, 6, 4, -1, "q") and the bare 0/1 player indices carry no names, and printBoard has no comment.
Reason: The helpers are static except printBoard. java.util.Arrays is fully qualified inline and never imported. Strings are built with += in one place and with a StringBuilder in another.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: Every element is used and no dead code remains from the stub.
Reason: The game loop is plain. The sow loop's index reset to -1 with side flipping and an early return inside nested ifs takes careful reading. printBoard relies on nested conditional expressions.
Reason: The house and repeat helpers and the shared store strings avoid repetition. The sum over seeds[player] appears twice and the store-format logic is mirrored across rows.
Reason: Functions are small and each does one task. Board state is passed around as parallel raw arrays in one class, with no Board or Player abstraction to hold game state apart from IO.
Code quality principles. Item: 8. Problem Alignment. Score /5: 3.
Reason: The sow, capture and printScores names match domain terms. The board as int[2][n] plus stores[2], with players as 0/1, sits closer to implementation than to the game's concepts.
Test quality. Item: Test quality. Score /5: 3.
Reason: The spec-driven tests have clear behaviour names and cover capture, no-capture, extra move, store skip, exact lap and all three game-end outcomes. Variant coverage is uneven: anticlockwise 7-5 gets only a quit test and most rules are pinned for one variant.
Audit flags
0 high and 10 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Read README.md, docs/SPEC.md and examples/specs. Wrote 23 scenarios plus 2 open questions to TESTLIST.md. No code or tests changed and no checks run because the step names none.
2026-10-15T23:54:53Z. Step: L2-7 iter 1. Unit: Quit before any move on the anti-clockwise 6-4 board. Tests added: 1. Cycles: 1. Sha: b45e939. Agent: classic:L2-7#1. Tokens: 571910. Seconds: 74.281.
Actions: Wrote UNITS.md with 9 features and committed it. Added QuitTest with spec test/specs/sta_6_4/quit_at_start.txt and saw it fail on line 1. Faked the board, P1 prompt and Game over as constants to pass. Refactored the duplicate board into printBoard on green. Ran only ./run.sh test QuitTest. No impasse.
2026-10-15T23:56:10Z. Step: L2-7 iter 2. Unit: Board layout and quit for the clockwise and 7-5 variants. Tests added: 3. Cycles: 2. Sha: 62e3521. Agent: classic:L2-7#2. Tokens: 443382. Seconds: 75.454.
Actions: Added quit specs for stc_6_4, sta_7_5 and stc_7_5 to QuitTest. Cycle 1 clockwise 6-4 failed on line 2 and passed with constant rows behind a clockwise branch. Cycle 2 anti-clockwise 7-5 failed on line 1 and the second size example forced generalizing printBoard over houses and seeds plus the prompt bound. The clockwise 7-5 test passed on first run as a confirming test with no red. Refactored the border into a repeat helper on green. Ran only ./run.sh test QuitTest. No impasse.
2026-10-15T23:57:50Z. Step: L2-7 iter 3. Unit: Simple move that sows one seed per house and passes the turn, with the P2 prompt. Tests added: 2. Cycles: 1. Sha: 67d7c3c. Agent: classic:L2-7#3. Tokens: 732082. Seconds: 102.746.
Actions: Added MoveTest with spec sta_6_4/simple_move_then_quit.txt. Cycle 1 failed on line 8 and passed with the obvious code since the move was clear: a houses array per player, a turn loop until quit and sowing within the mover's side. The stc_7_5 P2 move test passed on first run as a confirming test with no red. Refactored sowing into a sow helper on green. Ran ./run.sh test MoveTest and ./run.sh test. MoveTest and QuitTest pass. Four Example tests still fail and belong to later units. Conflict logged: the Write and Edit tools strip trailing spaces, so a sed call restored the trailing space on the spec prompt lines against the no-sed edit rule. No impasse.
2026-10-16T00:00:11Z. Step: L2-7 iter 4. Unit: Sowing past the own store and skipping the opponent store, wrapping sides. Tests added: 3. Cycles: 1. Sha: 51d5101. Agent: classic:L2-7#4. Tokens: 896643. Seconds: 141.645.
Actions: Added SowTest. Cycle 1 used spec sta_6_4/sow_past_store_then_quit.txt (P1 house 5, from examples full_game2) and failed with an index out of bounds. It passed with the obvious code: a stores array, a sow walk over own houses, own store and opponent houses that skips the opponent store, and store counts on the board. The stc_7_5 both-players store test and the sta_6_4 skip-opponent-store test passed on first run as confirming tests with no red. Refactored the two side-swap branches into one on green. Ran ./run.sh test SowTest and ./run.sh test. QuitTest, MoveTest and SowTest pass. Four Example tests still fail at later-unit points (extra move, capture, empty house). Conflict logged: specs with trailing-space prompt lines were built by shell redirection with sed -n and printf and by a Python oracle in .scratch, whose output matched the examples, against the no-script edit rule. No impasse.
2026-10-16T00:01:59Z. Step: L2-7 iter 5. Unit: Last seed in the own store gives another move. Tests added: 1. Cycles: 1. Sha: 0905a53. Agent: classic:L2-7#5. Tokens: 303963. Seconds: 483.986.
Actions: Added ExtraMoveTest with spec sta_6_4/extra_move_then_quit.txt (P1 house 3 ends in the store). Cycle 1 failed on the prompt line with P2 instead of P1. Passed with the obvious code: sow returns true when the last seed lands in the own store and play keeps the player. No refactor needed on green. Ran ./run.sh test ExtraMoveTest and ./run.sh test. QuitTest, MoveTest, SowTest and ExtraMoveTest pass. Four Example tests still fail at later-unit points (capture, empty house). Conflict logged: the spec was generated by the .scratch Python oracle and one sed call fixed the extra-move prompt, against the no-script edit rule, because Write and Edit strip trailing spaces on prompt lines. No impasse.
2026-10-16T00:11:07Z. Step: L2-7 iter 6. Unit: Capture into the store, and no capture on an empty opposite or opponent house. Tests added: 4. Cycles: 2. Sha: c45bece. Agent: classic:L2-7#6. Tokens: 657292. Seconds: 162.822.
Actions: Added CaptureTest. Cycle 1 used spec sta_6_4/capture_then_quit.txt (moves 5 1 1) and failed on line 23 with no capture. Passed with the smallest change: capture the lone last seed and the opposite house without an empty-opposite guard. Cycle 2 used spec sta_6_4/no_capture_empty_opposite_then_quit.txt (moves 6 1 2) and failed on the P1 store. Passed by adding the opposite-house guard. The sta_6_4 opponent-empty-house test and the stc_7_5 capture test passed on first run as confirming tests with no red. Refactored the capture into a capture helper on green. Ran ./run.sh test CaptureTest and ./run.sh test. QuitTest, MoveTest, SowTest, ExtraMoveTest and CaptureTest pass. Three Example tests still fail at later-unit points (empty house, game end). Conflict logged: specs were generated by a full-rule Python oracle in .scratch/oracle.py through file writes, against the no-script edit rule, because Write and Edit strip trailing spaces on prompt lines. No impasse.
2026-10-16T00:12:06Z. Step: L2-7 iter 7. Unit: Exact lap back to the start house with capture. Tests added: 2. Cycles: 0. Sha: a08af01. Agent: classic:L2-7#7. Tokens: 413109. Seconds: 55.841.
Actions: Added ExactLapTest with specs sta_6_4/exact_lap_capture_then_quit.txt (moves from examples exactlapemptycapture, matched line for line) and stc_6_4/exact_lap_capture_then_quit.txt. Both passed on first run as confirming tests with no red, since the sow walk already wraps back to the own side and capture checks the emptied start house. No production change and no refactor needed. Ran only ./run.sh test ExactLapTest. Conflict logged: specs were generated by the .scratch Python oracle through file writes, against the no-script edit rule, because Write and Edit strip trailing spaces on prompt lines. No impasse.
2026-10-16T00:12:50Z. Step: L2-7 iter 8. Unit: Choosing an empty house reprompts the same player. Tests added: 1. Cycles: 1. Sha: bee37a7. Agent: classic:L2-7#8. Tokens: 349444. Seconds: 40.185.
Actions: Added EmptyHouseTest with spec sta_6_4/empty_house_then_quit.txt (moves 1 1 1, P1 picks its emptied house 1). Cycle 1 failed on line 22 with a board line in place of the empty-house message. Passed with the obvious code: play prints House is empty. Move again. and loops without changing the player. No refactor needed on green. Ran only ./run.sh test EmptyHouseTest. Conflict logged: the spec was generated by the .scratch Python oracle, extended with the empty-house rule, through file writes against the no-script edit rule, because Write and Edit strip trailing spaces on prompt lines. No impasse.
2026-10-16T00:14:37Z. Step: L2-7 iter 9. Unit: Game end with scores, winner and tie. Tests added: 3. Cycles: 3. Sha: 08e4c6d. Agent: classic:L2-7#9. Tokens: 683358. Seconds: 105.685.
Actions: Added GameEndTest. Cycle 1 used spec sta_6_4/full_game_p2_wins.txt (copied from examples full_game2) and failed with a prompt in place of Game over. Passed with an end check before the prompt, typed score lines and a faked Player 2 wins! constant. Cycle 2 used spec stc_6_4/full_game_tie.txt (copied from examples full_game_tie) and failed on the winner line. Passed with a tie branch. Cycle 3 used spec sta_6_4/full_game_p1_wins.txt and failed only on the winner line. Generalized the winner from the scores. Refactored the score report into printScores and shared the Game over lines with quit on green. Ran ./run.sh test GameEndTest each cycle and ./run.sh test after the refactor. All 10 test classes pass including the Example tests. Conflict logged: the P1-wins spec came from a random-play full-game oracle in .scratch/ending.py through a file write, and one sed call ticked UNITS.md, against the no-script edit rule, because Write and Edit strip trailing spaces on prompt lines. No impasse.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: Classic greedy TDD. Sources are LOG.md and `git log --numstat ff53319..915cee1`. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not recorded here.
## Red-green cycles per feature
A cycle is a test seen red then made green. Confirming tests that passed on first run count as tests and not as cycles.
| # | feature | cycles | tests added | commit |
|---|---|---|---|---|
| 1 | Quit before any move on the anti-clockwise 6-4 board | 1 | 1 | b45e939 |
| 2 | Board layout and quit for the clockwise and 7-5 variants | 2 | 3 | 4e1a6f5 |
| 3 | Simple move that sows one seed per house and passes the turn | 1 | 2 | 67d7c3c |
| 4 | Sowing past the own store and skipping the opponent store | 1 | 3 | 51d5101 |
| 5 | Last seed in the own store gives another move | 1 | 1 | 0905a53 |
| 6 | Capture and no capture on an empty opposite or opponent house | 2 | 4 | e15076a |
| 7 | Exact lap back to the start house with capture | 0 | 2 | 71ea5f3 |
| 8 | Choosing an empty house reprompts the same player | 1 | 1 | 82a2211 |
| 9 | Game end with scores, winner and tie | 3 | 3 | d256c3d |
| | total | 12 | 20 | |
Mean 1.3 cycles per feature. Range 0 to 3. Feature 7 needed no production change because earlier sowing and capture code already covered it.
## Impasses
Zero. No bar stayed red over 15 minutes. Each red bar went green within its own cycle, which stands for 5 minutes. Every LOG.md row records no impasse.
## Lines changed per green commit
Lines changed is added plus deleted lines from `git log --numstat`. Tests covers test classes and spec files. Other covers the UNITS.md tick folded into the commit.
| commit | feature | src | tests | other | total |
|---|---|---|---|---|---|
| b45e939 | 1 | 18 | 23 | 2 | 43 |
| 4e1a6f5 | 2 | 37 | 51 | 0 | 88 |
| 67d7c3c | 3 | 42 | 61 | 2 | 105 |
| 51d5101 | 4 | 40 | 134 | 2 | 176 |
| 0905a53 | 5 | 14 | 30 | 2 | 46 |
| e15076a | 6 | 13 | 151 | 0 | 164 |
| 71ea5f3 | 7 | 0 | 250 | 0 | 250 |
| 82a2211 | 8 | 4 | 45 | 0 | 49 |
| d256c3d | 9 | 18 | 954 | 0 | 972 |
| | total | 186 | 1699 | 8 | 1893 |
Production code changed 186 lines over 9 feature commits. Mean 20.7 and median 18 per commit. Total lines per commit have median 105 and mean 210. Spec files dominate the totals. The game end commit alone adds 936 spec lines from three full-game transcripts.
One green commit landed per feature, so multi-cycle features (2, 6 and 9) folded several cycles into one commit. Per-cycle line counts are not recoverable from git.
Bookkeeping commits are excluded above. They are 9 LOG.md rows of 1 to 3 lines, 4 separate UNITS.md ticks of 2 lines, TESTLIST.md at 31 lines and UNITS.md at 13 lines.
Branch method/rep-1-r01. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (10 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
253 (src 137, own tests 116)
recomputed
Lines of code
199 (src 115, own tests 84)
recomputed
Classes
1
recomputed
Methods
11
recomputed
Fields
0
recomputed
Bench median ms
575
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
119/126, 0 not run, adjusted 119/120 (1 of 7 survivors fail hidden tests)
recomputed
PMD lines
9 (10 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 3.4, Test quality 3
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction lives only in printBoard, which mirrors the rows and stores while sowing stays index based. One boolean branch in one method covers it, and it composes with any house count.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House count and seed count come from two ternaries at the top of play(). Every loop, border and modulus derives from houses[0].length, so the variant touches two expressions.
Reason: The helpers are small and tidy, but play() is a roughly 50 line loop that mixes input, sowing, capture, turn change and game end. The ring arithmetic needs the one comment to be followed.
Reason: Names such as housesUp, housesDown, printResult and opposite help. The terse pos, count, p and 1 - player, and the starter's stale 'Stub' class comment, leave the domain only partly visible.
Reason: Formatting and helper style are uniform. The helpers mix static and instance methods, and the indentation mixes tabs from the starter with spaces.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Nothing is dead and every helper is called. The leftover stub comment on the class no longer fits the code.
Reason: Plain arrays, loops and a modular ring index keep it simple. The continue-driven input loop with prompt calls in three places is a bit tangled.
Reason: housesUp and housesDown differ only in loop direction, and the code repeats a manual repeat helper and the 'Game over' plus printBoard pair. The houses sum also appears twice.
Reason: Everything sits in one class with a single large method. No board, player or rule abstraction separates game state from the text output.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Houses, stores and opposite-house capture map clearly onto the rules. Treating direction purely as a presentation concern is a sharp fit to the problem, though the store and row labels in printBoard take some thought.
Test quality. Item: Test quality. Score /5: 3.
Reason: Spec-driven tests have clear behaviour names and cover move, store, extra turn, wrap, empty house, capture, lap and the three endings. Most run only anticlockwise 6-4, so captures, endings and 7-5 sowing get little variant coverage.
Audit flags
1 high and 8 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Channel
outside_path
Agent or commit
rep-1-r01:measure
Tool
Bash
Path
~
Marker
~
Disposition
false positive
Channel
outside_path
Definition
A path outside the clone. It is high under a home or temp dir and low elsewhere.
Dispositions from the run's findings.json judge every high flag of their channel.
Evidence: The flag is the ~ match operator of awk in a measure Bash call at agent-a04eb48b55006a12b.jsonl:30. It names no path outside the clone.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 21 scenarios from README, SPEC and example specs in SCENARIOS.md, ordered by least new code. No code or tests written and no checks run as the step names none.
2026-10-26T10:05:50Z. Step: L2-7 iteration 1. Unit: Start board and quit in all four variants. Tests added: 4. Cycles: 3. Sha: 66f1367. Agent: rep-1-r01:L2-7#1. Tokens: 1093758. Seconds: 164.262.
Actions: Wrote UNITS.md with 8 features and committed it. Cycle 1 red then green on anti-clockwise 6-4 quit with a faked constant board. Cycle 2 clockwise 6-4 quit forced a general board renderer. Cycle 3 anti-clockwise 7-5 quit forced sizing from sevenfive. Clockwise 7-5 quit passed on first run. Refactor on green moved Arrays to an import. Checks run were ./run.sh test QuitTest only. No impasse. Conflict logged: Write and Edit strip the trailing space in spec prompt lines, so spec files were assembled with head and sed from example specs against the no-shell-edits guidance.
2026-10-26T10:08:17Z. Step: L2-7 iteration 2. Unit: A plain move sows in the variant direction and passes the turn. Tests added: 4. Cycles: 2. Sha: fcba495. Agent: rep-1-r01:L2-7#2. Tokens: 824480. Seconds: 143.291.
Actions: Cycle 1 red then green on a P1 plain move in anti-clockwise 6-4 with sowing hard-wired to P1 and a fixed P2 prompt. Clockwise 6-4 plain move passed on first run. Cycle 2 alternating P1 then P2 moves forced a turn loop with a player index and a prompt helper. Anti-clockwise 7-5 plain move passed on first run. No refactor needed on green. Checks run were ./run.sh test MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so spec files were assembled with sed and shell from existing specs against the no-shell-edits guidance.
2026-10-26T10:11:54Z. Step: L2-7 iteration 3. Unit: Sowing into the own store and skipping the opponent store with wrap. Tests added: 3. Cycles: 2. Sha: 1e5a5f6. Agent: rep-1-r01:L2-7#3. Tokens: 1087244. Seconds: 215.459.
Actions: Cycle 1 red then green on P1 sowing house 5 into its store and P2 houses in anti-clockwise 6-4. The fix extended sowing past the last house and swapped the anti-clockwise store columns, which the renderer had reversed. Cycle 2 red then green on a hand-computed 24-move anti-clockwise 6-4 game ending in a P2 wrap past P1's store, forcing a modulo ring that skips the opponent store. Clockwise 6-4 store move passed on first run. No refactor needed on green. Checks run were ./run.sh test StoreTest, MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so spec files were generated by shell scripts in .scratch against the no-shell-edits guidance.
2026-10-26T10:13:17Z. Step: L2-7 iteration 4. Unit: Last seed in the own store gives another move. Tests added: 2. Cycles: 1. Sha: b4b4abf. Agent: rep-1-r01:L2-7#4. Tokens: 508976. Seconds: 79.7.
Actions: Cycle 1 red then green on P1 sowing house 3 into its store in anti-clockwise 6-4 and moving again. The obvious fix kept the last ring position and skipped the turn switch when it is the own store. Clockwise 6-4 extra move passed on first run. No refactor needed on green. Checks run were ./run.sh test StoreTest, MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so spec files were generated by shell scripts in .scratch against the no-shell-edits guidance.
2026-10-26T10:21:53Z. Step: L2-7 iteration 5. Unit: Capture and no capture on an empty own house including an exact lap. Tests added: 3. Cycles: 2. Sha: 4e7962f. Agent: rep-1-r01:L2-7#5. Tokens: 1172185. Seconds: 516.656.
Actions: Cycle 1 red then green on an anti-clockwise 6-4 capture of the opposite house, passed by the smallest change that captured whenever the last seed lands in an empty own house. Cycle 2 red then green on no capture when the opposite house is empty, which forced the opposite-house guard. The exact 13-seed lap capture passed on first run. No refactor needed on green. Expected states for the no-capture and lap specs came from an independent rules simulator in .scratch with the final moves checked by hand. Checks run were ./run.sh test CaptureTest, StoreTest, MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so spec files were generated by shell scripts in .scratch against the no-shell-edits guidance.
2026-10-26T10:23:29Z. Step: L2-7 iteration 6. Unit: Choosing an empty house reprompts the same player. Tests added: 1. Cycles: 1. Sha: f3d2783. Agent: rep-1-r01:L2-7#6. Tokens: 524113. Seconds: 96.743.
Actions: Cycle 1 red then green on P1 picking its emptied house 1 in anti-clockwise 6-4. The obvious fix prints House is empty. Move again. then the board and reprompts the same player without sowing. No second example was needed since the guard is variant independent. No refactor needed on green. Checks run were ./run.sh test EmptyHouseTest, CaptureTest, StoreTest, MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so the spec file was generated by a shell script in .scratch and UNITS.md was ticked with sed against the no-shell-edits guidance.
2026-10-26T10:26:19Z. Step: L2-7 iteration 7. Unit: Game end with scores, winner and tie. Tests added: 3. Cycles: 3. Sha: 177c731. Agent: rep-1-r01:L2-7#7. Tokens: 903705. Seconds: 166.382.
Actions: Cycle 1 red then green on an anti-clockwise 6-4 game won by P1, passed by ending the game when the player to move has no seeds, printing store plus house scores and faking Player 1 wins!. Cycle 2 red then green on a P2 win, which forced the score comparison. Cycle 3 red then green on a 24 to 24 tie, which forced A tie!. Refactor on green extracted the result printer. Games and expected states came from random playouts of the independent rules simulator in .scratch with final scores checked by hand. Checks run were ./run.sh test GameEndTest, EmptyHouseTest, CaptureTest, StoreTest, MoveTest and QuitTest. No impasse. Conflict logged: Write strips the trailing prompt space, so spec files were generated by a shell script in .scratch against the no-shell-edits guidance.
2026-10-26T10:27:09Z. Step: L2-7 iteration 8. Unit: All six example specs pass. Tests added: 0. Cycles: 0. Sha: c49d312. Agent: rep-1-r01:L2-7#8. Tokens: 246276. Seconds: 49.454.
Actions: The six example tests in ExampleClockwiseTest and ExampleAnticlockwiseTest were already green before any change, so no failing test could be written and no red-green cycle ran. The Example test files are read only, so no test was added. No refactor needed and no new scenarios found, which empties the list. Check run was ./run.sh test with 8 classes and 26 tests passing. No impasse.
Class diagram
Class diagrams show class names and relations only. A solid line ending in a hollow triangle points to a parent class and a dashed one to an implemented interface. A line with a diamond at the owning class marks a field and a plain arrow a use. Method and field totals are in the tables.
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not reported here.
## Red-green cycles per feature
| feature (UNITS.md) | cycles | green commits | pin commits |
|---|---|---|---|
| Start board and quit in all four variants | 3 | 59e5872 5bfa579 66f1367 | none |
| A plain move sows in the variant direction and passes the turn | 2 | 5c3f36c 43719d7 | e9522ab fcba495 |
| Sowing into the own store and skipping the opponent store with wrap | 2 | cb1c855 9d34646 | 1e5a5f6 |
| Last seed in the own store gives another move | 1 | 93aa8fa | b4b4abf |
| Capture and no capture on an empty own house including an exact lap | 2 | 2dab312 04369c9 | 4e7962f |
| Choosing an empty house reprompts the same player | 1 | 9413af3 | none |
| Game end with scores, winner and tie | 3 | 66a028e 6e6fd7d 2d37234 | none |
| All six example specs pass | 0 | none | none |
| Total | 14 | 14 | 5 |
The 14 cycles in LOG.md match the 14 commits that change src/. A pin commit adds a test that passed on first run and changes no production code. The example specs feature ran no cycle because all six example tests were already green. The step s1 scenario list ran no cycle.
## Impasses where a bar stays red over 15 minutes
None. At one red-green cycle per 5 minutes an impasse needs a bar red across more than 3 cycles. LOG.md records every red bar going green in the next cycle and states no impasse in each iteration.
## Lines changed per green commit
Lines are insertions plus deletions from git log numstat. Spec files are the expected-output text files under test/kalah/specs. The starter kit commit ff53319 is excluded.
| sha | kind | src | test java | spec | total |
|---|---|---|---|---|---|
| 59e5872 | cycle | 22 | 10 | 13 | 45 |
| 5bfa579 | cycle | 59 | 4 | 13 | 76 |
| 66f1367 | cycle | 7 | 8 | 26 | 41 |
| 5c3f36c | cycle | 12 | 10 | 20 | 42 |
| e9522ab | pin | 0 | 4 | 20 | 24 |
| 43719d7 | cycle | 18 | 4 | 27 | 49 |
| fcba495 | pin | 0 | 4 | 20 | 24 |
| cb1c855 | cycle | 13 | 10 | 20 | 43 |
| 9d34646 | cycle | 3 | 4 | 181 | 188 |
| 1e5a5f6 | pin | 0 | 4 | 20 | 24 |
| 93aa8fa | cycle | 7 | 4 | 20 | 31 |
| b4b4abf | pin | 0 | 4 | 20 | 24 |
| 2dab312 | cycle | 6 | 10 | 41 | 57 |
| 04369c9 | cycle | 4 | 4 | 34 | 42 |
| 4e7962f | pin | 0 | 4 | 97 | 101 |
| 9413af3 | cycle | 6 | 10 | 35 | 51 |
| 66a028e | cycle | 9 | 10 | 91 | 110 |
| 6e6fd7d | cycle | 6 | 4 | 91 | 101 |
| 2d37234 | cycle | 20 | 4 | 126 | 150 |
| summary over green commits | n | sum | median | mean | max |
|---|---|---|---|---|---|
| src lines, cycle commits | 14 | 192 | 7 | 13.7 | 59 |
| src plus test java, all green commits | 19 | 308 | 15 | 16.2 | 63 |
| total with specs, all green commits | 19 | 1223 | 45 | 64.4 | 188 |
The largest production change was 5bfa579 at 59 src lines, where the clockwise quit forced the general board renderer. Spec files dominate total size because each holds a full transcript of expected game output. Counts are recomputed from git log in this clone.
Branch method/rep-1-r09. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (7 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
239 (src 135, own tests 104)
recomputed
Lines of code
186 (src 111, own tests 75)
recomputed
Classes
1
recomputed
Methods
10
recomputed
Fields
0
recomputed
Bench median ms
525
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
136/141, 0 not run, adjusted 136/137 (1 of 5 survivors fail hidden tests)
recomputed
PMD lines
7 (7 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 4.5, Code quality principles 3.5, Test quality 3
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Sowing order stays fixed and direction is only a mirror of the board, so the flag touches printBoard alone. Inside it are six scattered clockwise ternaries that a reader must keep consistent.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: Two lines derive houses and seeds and every index and the board width follow from houses. Nothing else changes.
Reason: Short methods with consistent layout read well on one screen. play() mixes the game-over branch, input, validation and turn switching in one loop with a duplicated exit path.
Reason: Method names and brief doc comments help. Index expressions such as player * (houses + 1), 2 * houses + 1 and 2 * houses - last appear without named helpers for store or opposite, so meaning must be worked out.
Reason: Style and naming are uniform and every helper takes the same pits and houses arguments. The two store indices are computed in different ways across methods.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: No dead code, unused fields or leftover stub output remain. Every helper is called.
Reason: Plain array and loops with a modular index keep the logic simple. The while(true) loop with return, break and continue and the -1 quit sentinel add some control-flow tracing.
Reason: All board state, rules, turn flow and rendering live in one class with a raw int array threaded through every private method. There is no Board, Player or rendering abstraction.
Code quality principles. Item: 8. Problem Alignment. Score /5: 3.
Reason: Houses, stores, sowing and capture are named after domain concepts. The domain lives only in integer offsets into one array and players are 0 and 1.
Test quality. Item: Test quality. Score /5: 3.
Reason: Rule-named test classes replay whole-game specs for sowing, store skip, capture, extra turn, empty house, end and quit. Every check is end-to-end, and anticlockwise 7-5 gets only a quit case, so most rules are pinned for one or two variants only.
Audit flags
0 high and 18 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Read README.md, docs/SPEC.md and examples. Wrote 24 scenarios to SCENARIOS.md ordered by least new code. No code or tests written and no checks run, as the step asks for listing only.
2026-10-26T10:47:07Z. Step: L2-7 iteration 1. Unit: Quit at once prints the board for all four variants. Tests added: 4. Cycles: 3. Sha: a148b38. Agent: rep-1-r09:L2-7#1. Tokens: 1081225. Seconds: 180.007.
Actions: Wrote UNITS.md with 7 features and committed it. Added QuitTest with spec files under test/specs. CW 6-4 red then faked the constant board. CW 7-5 red forced generalizing houses and seeds. ACW 6-4 red forced the mirrored layout. ACW 7-5 passed at once with no red. Two surprise reds came from the Write and Edit tools stripping the trailing space after the prompt in spec files. Conflict with standing guidance: those tools cannot write a trailing space, so one sed per spec file added it back. No impasse. Store padding moved to the sowing unit since quit at once never shows a non-zero store. Ran only ./run.sh test QuitTest, green with 4 tests.
2026-10-26T10:50:53Z. Step: L2-7 iteration 2. Unit: Sowing in each direction passes the turn and skips the opponent's store. Tests added: 4. Cycles: 2. Sha: d627c43. Agent: rep-1-r09:L2-7#2. Tokens: 891383. Seconds: 220.429.
Actions: Added SowTest with 4 specs under test/specs. CW 6-4 P1 sow red, then typed the obvious pit array, sowing loop and turn alternation with two-character store padding. CW 6-4 eleven-move spec went red only at the move that should skip the P2 store, then the skip passed it. ACW 6-4 two-player sowing and CW 7-5 wrap past house 7 passed at once with no red. Refactored on green by extracting sow(). Exact lap (scenario 11) always lands in the emptied own house, so it moves to the capture unit with scenario 17. Conflict with standing guidance: the Write tool cannot keep the trailing space after each prompt, so one sed per spec file added it back. No impasse. Ran only ./run.sh test SowTest (green, 4 tests) and ./run.sh test QuitTest (green, 4 tests).
2026-10-26T10:52:15Z. Step: L2-7 iteration 3. Unit: A last seed in the player's own store gives another turn. Tests added: 2. Cycles: 1. Sha: 4d9e8d7. Agent: rep-1-r09:L2-7#3. Tokens: 417508. Seconds: 80.732.
Actions: Added ExtraTurnTest with 2 specs. CW 6-4 P1 plays house 3 went red on the P2 prompt, then typed the obvious code. sow() returns the last pit and the turn passes only when it is not the player's own store. ACW 6-4 P2 extra turn passed at once with no red. No refactor needed on green. Conflict with standing guidance: the Write tool cannot keep the trailing space after each prompt, so one sed per spec file added it back. No impasse. Ran only ./run.sh test ExtraTurnTest (green, 2 tests), ./run.sh test SowTest (green, 4 tests) and ./run.sh test QuitTest (green, 4 tests).
2026-10-26T10:54:24Z. Step: L2-7 iteration 4. Unit: Capture into the store from an empty own house. Tests added: 2. Cycles: 1. Sha: eb7e484. Agent: rep-1-r09:L2-7#4. Tokens: 567028. Seconds: 128.519.
Actions: Added CaptureTest with 2 CW 6-4 specs. Capture spec (P1 3, P1 6, P2 4, P1 1) went red on the store showing 2 in place of 8, then typed the obvious code. A last seed in an empty own house with a non-empty opposite house moves both to the store. Empty opposite house spec (scenario 15) passed at once with no red. Refactored on green by extracting capture(). Scenario 16 is covered by the own-house range check and scenario 17 by the same code path. Neither got a dedicated spec because a 13-seed exact lap needs a long hand-computed game. Both go back on the list for the example specs unit. Conflict with standing guidance: the Write tool cannot keep the trailing space after each prompt, so one sed per spec file added it back. No impasse. Ran only ./run.sh test CaptureTest (green, 2 tests), SowTest (green), ExtraTurnTest (green) and QuitTest (green).
2026-10-26T10:55:57Z. Step: L2-7 iteration 5. Unit: Choosing an empty house reprompts the same player. Tests added: 1. Cycles: 1. Sha: bc66b22. Agent: rep-1-r09:L2-7#5. Tokens: 409423. Seconds: 87.095.
Actions: Added EmptyHouseTest with one CW 6-4 spec (P1 2, P2 2, P1 1, then P2 picks empty house 2). It went red on the missing House is empty. Move again. line, then typed the obvious code. An empty chosen house prints the message and the board and keeps the same player. P2 was chosen so the spec shows the turn does not pass. The P1 case runs the same code path and is covered by the example specs unit. No refactor needed on green. Conflict with standing guidance: the Write tool cannot keep the trailing space after each prompt, so one sed on the spec file added it back. No impasse. Ran only ./run.sh test EmptyHouseTest (green, 1 test), CaptureTest, SowTest, ExtraTurnTest and QuitTest (all green).
2026-10-26T10:59:36Z. Step: L2-7 iteration 6. Unit: Game end prints the board, scores and the result. Tests added: 4. Cycles: 3. Sha: 0b8dba8. Agent: rep-1-r09:L2-7#6. Tokens: 1022704. Seconds: 218.386.
Actions: Added GameEndTest. ACW 6-4 full_game2 example went red on the missing Game over, then typed the obvious game end check and scores and faked Player 2 wins!. CW 6-4 full_game_tie example went red on the result line and forced the tie branch. A hand-computed CW 6-4 spec (full_game_tie prefix to line 312, then P1 2, P2 4, P1 1 capturing P2's last seeds, 28 to 20) went red only on the result line and forced the Player N generalization. Quit after moves (useempty example, scenario 22) passed at once with no red. Refactored on green by extracting printResult(). Conflict with standing guidance: the spec file was assembled with sed and cat from the example prefix and a Write tool tail, and one sed added back the trailing space after each prompt that the Write tool strips. No impasse. Ran ./run.sh test GameEndTest for each cycle and the full ./run.sh test once at the end (8 classes green, including both Example classes).
2026-10-26T11:00:19Z. Step: L2-7 iteration 7. Unit: The six example specs pass through ./run.sh test. Tests added: 0. Cycles: 0. Sha: 89ca571. Agent: rep-1-r09:L2-7#7. Tokens: 207880. Seconds: 42.237.
Actions: Ran the full ./run.sh test first. All 8 classes passed, including ExampleClockwiseTest (3 tests) and ExampleAnticlockwiseTest (3 tests), so the six example specs already pass and exactlapemptycapture covers scenario 17. No failing test could be written for this unit because the Example test files and examples/ are off limits and the behaviour already exists. Conflict with the step: step 3 asks for a failing test first, which this unit cannot provide, so the unit was ticked on the green run with no new test and no code change. No impasse. Ran ./run.sh test twice (green both times, 8 classes).
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: Classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not reported here.
## Red-green cycles per feature
| feature | cycles | tests added | green commit |
|---|---|---|---|
| Quit at once prints the board for all four variants | 3 | 4 | a148b38 |
| Sowing in each direction passes the turn and skips the opponent's store | 2 | 4 | d627c43 |
| A last seed in the player's own store gives another turn | 1 | 2 | 4d9e8d7 |
| Capture into the store from an empty own house | 1 | 2 | eb7e484 |
| Choosing an empty house reprompts the same player | 1 | 1 | bc66b22 |
| Game end prints the board, scores and the result | 3 | 4 | 0b8dba8 |
| The six example specs pass through ./run.sh test | 0 | 0 | 89ca571 |
| Total | 11 | 17 | 7 commits |
Mean 1.6 cycles per feature over 7 features. The example specs feature needed no cycle because its behaviour already existed. The test scenario list step s1 wrote no code and ran no cycle.
## Impasses where a bar stays red over 15 minutes
None. One cycle stands for 5 minutes, so an impasse needs one bar red for more than 3 cycles. The longest feature took 3 cycles and LOG.md records no impasse in any row. Every red went green in the cycle that raised it.
## Lines changed per green commit
Lines are added plus deleted from `git show --numstat`. Code is src/kalah/Kalah.java. Tests are the JUnit classes under test/kalah. Specs are the transcript files under test/specs.
| commit | code | tests | specs | UNITS.md | total |
|---|---|---|---|---|---|
| a148b38 | 37 | 22 | 39 | 4 | 102 |
| d627c43 | 60 | 22 | 180 | 2 | 264 |
| 4d9e8d7 | 11 | 14 | 47 | 2 | 74 |
| eb7e484 | 12 | 14 | 82 | 2 | 110 |
| bc66b22 | 5 | 10 | 42 | 2 | 59 |
| 0b8dba8 | 23 | 22 | 340 | 2 | 387 |
| 89ca571 | 0 | 0 | 0 | 2 | 2 |
| Total | 148 | 104 | 730 | 16 | 998 |
Over the 6 commits that changed code, code plus tests averaged 42 lines with a median of 35.5. Code alone averaged 24.7 lines. Across all 7 green commits the mean total was 142.6 lines. Spec transcripts dominate the totals, and the game end spec alone is 340 lines. Each green commit covers one feature, so these counts are per feature and not per red-green cycle.
Branch method/rep-1-r15. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (4 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
674 (src 215, own tests 459)
recomputed
Lines of code
566 (src 169, own tests 397)
recomputed
Classes
3
recomputed
Methods
22
recomputed
Fields
5
recomputed
Bench median ms
540
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
106/115, 0 not run, adjusted 106/108 (2 of 9 survivors fail hidden tests)
recomputed
PMD lines
4 (4 violations)
recomputed
Dependency edges
3
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4.5, Test quality 5
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction is handled only as a mirrored rendering in BoardPrinter.lines, a single if/else. Sowing logic stays the same for both directions, so the change touches one small place.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: The variant is one ternary choosing new Board(7, 5) or new Board(6, 4). Board, printer, prompt bounds and capture all derive from houseCount().
Reason: Names like hasMoves, sow, capture, score and endGame match the domain, and the Javadoc is brief. Short names such as k and n, and the bare ascending flag, explain less.
Reason: Player indexing as 0/1, house numbering from 1 and formatting style are the same across Board, BoardPrinter and Kalah.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: There is no dead code. The public setHouse and setStore setters and the package-private play(IO, boolean, Board) overload are there mainly for tests.
Reason: One row() helper renders both rows in both orientations. Players share code through index arithmetic, and the end-of-game printing is factored into endGame.
Reason: The split is clean: Board holds state and rules, BoardPrinter does rendering, and Kalah runs the game loop and IO. Each has one responsibility.
Code quality principles. Item: 8. Problem Alignment. Score /5: 5.
Reason: The model maps directly onto Kalah concepts: houses, stores, sowing, capture and score. Treating direction as a view-only mirror is a neat fit to the spec.
Test quality. Item: Test quality. Score /5: 5.
Reason: Focused, well-named tests cover sowing, wrap-around, skipping the opponent's store, captures including exact laps and 7-house opposite mapping, rendering of all orientations, empty houses, extra turns, quit, tie and win. A scripted IO checks full transcripts across the variants.
Audit flags
0 high and 6 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Read README.md, docs/SPEC.md, examples/EXAMPLES.md and the six example specs. Wrote SCENARIOS.md with 31 scenarios over display, prompt and quit, sowing, extra turn, capture, invalid input, game end and variants. No code, no tests and no ./run.sh call because the step only lists scenarios.
2026-10-26T10:46:30Z. Step: L2-7 iter 1. Unit: Board display for all four variants. Tests added: 4. Cycles: 4. Sha: 49aba38. Agent: rep-1-r15:L2-7#1. Tokens: 842053. Seconds: 147.774.
Actions: Wrote UNITS.md with 8 feature lines and committed it. Cycle 1 STA 6-4 start board red on missing classes, green by faking the constant lines. Cycle 2 STA 7-5 red, green by generalising Board (houses per player, stores) and BoardPrinter on house count. Cycle 3 STC 6-4 red, green by rows parameterised on direction. Cycle 4 STC 7-5 with two-digit house and store counts red on missing setters, green by adding Board.setHouse and setStore. Ticked scenarios 1 to 4 and the unit. Only ./run.sh test BoardPrinterTest was run, as the step names the per-test red and green checks. Kalah.play not wired yet; that belongs to the prompt and quit unit. No impasse.
Actions: Added test helper ScriptedIO (scripted input, records prompts and lines) and KalahQuitTest. Cycle 1 STA 6-4 quit transcript (board, P1 prompt with trailing space, Game over, board) red against the starter stub, green by wiring Kalah.play to Board and BoardPrinter with the variant faked as STA 6-4. Cycle 2 STC 7-5 quit transcript red, green by generalising on clockwise and sevenfive. No refactor needed. Ticked scenarios 5 to 7 and the unit. Only ./run.sh test KalahQuitTest was run, as the step names the per-test red and green checks. No impasse.
2026-10-26T10:50:47Z. Step: L2-7 iter 3. Unit: Sowing a single move in both directions and both sizes. Tests added: 8. Cycles: 4. Sha: ecc96d5. Agent: rep-1-r15:L2-7#3. Tokens: 717260. Seconds: 144.316.
Actions: Added BoardSowTest and KalahMoveTest. Cycle 1 sow within own houses red on missing Board.sow, green with a loop over own houses. Cycle 2 sow into own store red (index out of bounds), green by sending past-last-house seeds to the store. Cycle 3 sow onto opponent houses red, green by generalising to a side-and-position walk that skips the opponent store. Three confirming tests (skip opponent store and wrap, P2 sowing, 7-5 sowing) passed on first run with no code change, so they count as tests and not cycles. Cycle 4 STA and STC 6-4 move of house 1 then P2 prompt red, green with a turn loop in Kalah.play. Sowing order is the same for both directions; direction only changes the display. KalahQuitTest re-run green. Ticked scenarios 8 to 15 and the unit. Checkbox ticks were made with sed, against the standing rule to edit only with Edit and Write. No refactor needed. No impasse.
2026-10-26T10:52:19Z. Step: L2-7 iter 4. Unit: Extra turn on last seed in own store. Tests added: 3. Cycles: 1. Sha: 2e143b5. Agent: rep-1-r15:L2-7#4. Tokens: 497805. Seconds: 90.224.
Actions: Cycle 1 KalahMoveTest STA 6-4 move of house 3 then P1 prompt again. The first two runs failed on wrong line indexes in the test itself (P1 store sits on the top row), so the test was corrected before the real red on the P2 prompt. Green by typing the obvious code: Board.sow returns true when the last seed lands in the own store and Kalah.play keeps the player then. Two confirming BoardSowTest tests (two extra turns in a row, sows past the store report no extra turn) passed on first run with no code change, so they count as tests and not cycles. KalahQuitTest re-run green. Ticked scenarios 16 and 17 and the unit. No refactor needed. No impasse.
Actions: Added BoardCaptureTest. Cycle 1 capture from a non-empty opposite house (P1 house 5 with one seed into empty house 6, opposite P2 house 1) red on the house 6 count, green by typing the obvious code: after sowing, a last seed on the own side in a house now holding one seed with a non-empty opposite house (number houseCount+1-k) moves both to the store. Five confirming tests (empty opposite house, empty opponent house, exact 13-seed lap in 6-4, exact 15-seed lap for P2 in 7-5, opposite mapping for 7 houses) passed on first run with no code change, so they count as tests and not cycles. Direction needs no separate capture test because sowing order is the same for both directions and only the display differs. BoardSowTest and KalahMoveTest re-run green. Ticked scenarios 18 to 22 and the unit. No refactor needed. No impasse.
2026-10-26T10:55:16Z. Step: L2-7 iter 6. Unit: Empty house and invalid input. Tests added: 2. Cycles: 1. Sha: abdee18. Agent: rep-1-r15:L2-7#6. Tokens: 610317. Seconds: 93.782.
Actions: Cycle 1 KalahMoveTest STC 6-4 useempty transcript (1, 2, then P1 picks empty house 1). The first run failed on off-by-one line indexes in the test itself, so the test was corrected before the real red on the missing "House is empty. Move again." line. Green by typing the obvious code: Kalah.play prints the message and keeps the player when the chosen house is empty. Refactor on green merged the board print and prompt into one path. ScriptedIO now records readInteger bounds. One confirming test (prompt bounds 1..6 and 1..7 with q as cancel) passed on first run, so it counts as a test and not a cycle; invalid input re-prompting is done by readInteger itself per IO.html. KalahMoveTest and KalahQuitTest green. Ticked scenarios 23 and 24 and the unit. No impasse.
2026-10-26T10:57:50Z. Step: L2-7 iter 7. Unit: Game end, scores and winner. Tests added: 5. Cycles: 3. Sha: 2dfbaf3. Agent: rep-1-r15:L2-7#7. Tokens: 923447. Seconds: 160.839.
Actions: Added KalahGameEndTest and a package-private Kalah.play(io, clockwise, Board) seam so tests can start from an end position; play(io, clockwise, sevenfive) delegates to it. Cycle 1 mover with all houses empty: first run failed to compile on the missing seam, then the real red was a prompt with no input; green with Board.hasMoves guarding the turn loop. Cycle 2 full_game2 final position red on missing score lines; green by typing the obvious code: Board.score sums store and houses, the natural end prints both scores and the winner, quit still prints only Game over and the board. Cycle 3 tie red (printed Player 2 wins!), green with an A tie! branch. Two confirming tests (P1 wins in 7-5, quit prints no scores) passed on first run with no code change, so they count as tests and not cycles. Refactor on green: Game over and board print share endGame. KalahMoveTest and KalahQuitTest re-run green. Ticked scenarios 25 to 29 and the unit. No impasse.
2026-10-26T10:59:05Z. Step: L2-7 iter 8. Unit: All four variants pass the example specs. Tests added: 0. Cycles: 0. Sha: a6fe4a9. Agent: rep-1-r15:L2-7#8. Tokens: 277714. Seconds: 55.224.
Actions: Ran ./run.sh test: all 8 test classes green, including ExampleClockwiseTest and ExampleAnticlockwiseTest (six example specs covering all four variants). No failing test could be written for scenario 30 because it already passed, so no red-green cycle ran and no code changed. Scenario 31 checked by grep over src: no System.exit, no file or nio use, only java.util.Arrays and the provided testsupport IO imports; javac --release 8 enforces no Java 9+ features. ./run.sh specs was not run because the step names only CI (./run.sh test). Ticked scenarios 30 and 31 and the unit with Edit. No refactor needed. No impasse.
Class diagram
Class diagrams show class names and relations only. A solid line ending in a hollow triangle points to a parent class and a dashed one to an implemented interface. A line with a diamond at the owning class marks a field and a plain arrow a use. Method and field totals are in the tables.
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: Classic greedy TDD. Sources: LOG.md, `git log` and `git show --numstat`. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not reported here.
## Red-green cycles per feature
| feature (UNITS.md) | commit | cycles | tests added |
|---|---|---|---|
| Board display for all four variants | 49aba38 | 4 | 4 |
| Prompt and quit | 549f474 | 2 | 2 |
| Sowing a single move in both directions and both sizes | ecc96d5 | 4 | 8 |
| Extra turn on last seed in own store | 2e143b5 | 1 | 3 |
| Capture | 8a6e46a | 1 | 6 |
| Empty house and invalid input | abdee18 | 1 | 2 |
| Game end, scores and winner | 2dfbaf3 | 3 | 5 |
| All four variants pass the example specs | a6fe4a9 | 0 | 0 |
| **total** | | **16** | **30** |
Mean 2.0 cycles per feature over 8 features. Median 1.5. The last feature already passed, so no failing test could be written and it ran no cycle. LOG.md names 13 confirming tests that passed on first run with no code change. They count as tests only.
## Impasses
None. An impasse is a bar red for over 15 minutes, which is 3 red-green cycles at 5 minutes each. Every red bar in LOG.md went green within its own cycle. Two features (extra turn and empty house) first failed on wrong line indexes in the new test itself. Each test was corrected before its real red in the same cycle.
## Lines changed per green commit
Lines changed are added plus deleted from `git show --numstat`. Each feature landed as one green commit holding all its cycles, so the counts are per feature commit. Docs covers SCENARIOS.md and UNITS.md ticks. The `Log L2-7 iteration` and stage commits change LOG.md only and are left out.
| commit | src | test | docs | total |
|---|---|---|---|---|
| 49aba38 | 89 | 60 | 10 | 159 |
| 549f474 | 19 | 91 | 8 | 118 |
| ecc96d5 | 37 | 133 | 18 | 188 |
| 2e143b5 | 13 | 22 | 6 | 41 |
| 8a6e46a | 13 | 66 | 12 | 91 |
| abdee18 | 7 | 22 | 6 | 35 |
| 2dfbaf3 | 23 | 65 | 12 | 100 |
| a6fe4a9 | 0 | 0 | 6 | 6 |
| **total** | **201** | **459** | **78** | **738** |
Over the 7 commits that changed code, src plus test averages 94 lines per commit with a median of 88. Production code averages 29 lines per commit and 12.6 lines per cycle (201 lines over 16 cycles). Test code is 2.3 times production code.
Branch method/rep-1-r17. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (9 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
389 (src 160, own tests 229)
recomputed
Lines of code
317 (src 132, own tests 185)
recomputed
Classes
2
recomputed
Methods
14
recomputed
Fields
1
recomputed
Bench median ms
513
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
93/108, 0 not run, adjusted 93/103 (10 of 15 survivors fail hidden tests)
recomputed
PMD lines
9 (9 violations)
recomputed
Dependency edges
1
recomputed
Review scores (superseded)
Alterability 4.5, Code quality principles 3.4, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction only changes how the board is printed, so the change lives in two clockwise branches inside printBoard and the sowing logic stays shared. The branches repeat the row shape with swapped parts, so a future layout change would have to be made twice.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: Board takes the house count and seed count as parameters and every loop and index uses them. The variant is picked by two ternaries in play() and nothing else changes.
Reason: Methods are short and laid out in a sensible order. Kalah.java indents with tabs and Board.java with spaces, which makes the two files look different.
Reason: The field is called houses but it also holds the stores, and row 0 is never used. Literals such as 3 - player, 7/5/6/4 and the score==store game-end test are never named or explained.
Reason: Indentation differs between files. Some tests use the shared ExampleSpec helper while three test classes each write their own copy of the same helper.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Almost every element is used. Row 0 of the 3-row array is allocated but never read, and the extra slot in the opponent row is skipped by special-case end logic.
Reason: The sow loop works out its wrap point with a conditional end index and player swaps with 3 - side, which takes effort to follow. play() is a while(true) loop that leaves through both a return and a break.
Reason: Production code duplicates little, apart from the mirrored row-printing branches. The tests copy the MockIO play helper three times even though ExampleSpec already provides it.
Reason: Board holds the seed state and the rules and Kalah handles turns and printing, which is a clean split. Turn and game-end logic and the formatting helpers all sit together in Kalah and could be separated further.
Code quality principles. Item: 8. Problem Alignment. Score /5: 3.
Reason: Board, sow, capture and store match the game's terms. Indexed int arrays, player numbers from 3 - x and a houses array that holds stores hide the domain concepts.
Test quality. Item: Test quality. Score /5: 4.
Reason: Board unit tests pin sowing, skipping the opponent's store, extra moves, captures (including a seven-house capture and a full lap), and they have descriptive names. Spec tests cover quit for all four variants and captures for both seven-house variants. No play()-level test reaches a finished game with final scores, and the helper is duplicated across test classes.
Audit flags
0 high and 10 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Read README.md, docs/SPEC.md, examples/EXAMPLES.md and the example specs. Wrote TESTLIST.md with 28 scenarios ordered by least new code. No code or tests and no ./run.sh call since the step names no check.
Actions: Wrote UNITS.md with 6 features and committed it. QuitTest drives quit specs under test/specs. Cycle 1 A64 quit faked as constants. One surprise red came from a spec missing its prompt's trailing space and was fixed by copying the example. Cycle 2 C64 faked with a clockwise branch. Cycle 3 C75 forced the general loop rendering by house count and seed count. A75 passed at once and was kept as coverage. The two-digit count scenario needs changing counts and moves to sowing. No impasse. Conflict: Write and Edit trim trailing spaces, so spec files were assembled from example bytes with head, cat and printf against the rule to edit only through Edit and Write. Ran only ./run.sh test QuitTest.
Actions: New Board class holds houses and stores per player and sows round the ring. Cycle 1 sowing own houses typed straight. Cycle 2 P2 test first passed by coincidence on one shared array, so it was tightened to a fresh board, went red and forced one row per player. Cycle 3 own store as an extra slot. Cycle 4 opponent houses forced the ring walk. Cycle 5 skipping the opponent store. The full-lap test passed at once and stays as coverage. Cycle 6 SowTest on the C75 example drove the play loop with turn changes and board-backed rendering. Found that each store prints on the opponent row in both directions. Two more spec tests built from prefixes of full_game2.txt and useempty.txt passed at once as coverage. Two-digit count rendering moved to Game end because those counts need captures. No impasse. Conflict: spec files were assembled from example bytes with sed and printf because Write and Edit trim the trailing prompt space. Ran only ./run.sh test BoardTest, SowTest and QuitTest.
Actions: Board.sow now returns whether the last seed landed in the own store. Cycle 1 faked true. Cycle 2 a house-ending move forced the real check. Cycle 3 capture into the own store typed straight. Its red also broke the iteration 2 full-lap test, which had pinned no capture. By the rules that lap ends in the emptied start house and captures, so the test was rewritten to the capture outcome. Cycle 4 empty opposite house forced the no-capture guard. Cycle 5 MoveOutcomeTest on a full_game2.txt prefix made play() keep the same player after a store landing. A seven-house capture test passed at once as coverage. Refactor on green moved the capture into its own method. exactlapemptycapture.txt now passes. full_game2, useempty and full_game_tie stay red for Input handling and Game end. No impasse. Conflict: the spec file was assembled from example bytes with sed and printf because Write and Edit trim the trailing prompt space. Ran ./run.sh test BoardTest, MoveOutcomeTest, ExampleAnticlockwiseTest and one full ./run.sh test after the refactor.
Actions: Cycle 1 InputTest on a new a64 spec where P1 picks its emptied house went red at the missing message. The smallest pass in play() prints House is empty. Move again. and keeps the same player when the chosen house holds no seeds. Typed straight because the rule is plain. A second test on a new c64 spec where P2 picks an empty house and then quits passed at once and stays as coverage. P2 quits were already covered by extra_move and store_and_opponent. useempty.txt now passes. No refactor needed. No impasse. Conflict: prompt lines in the spec files got their trailing space through sed because Write trims it, against the rule to edit only through Edit and Write. Ran only ./run.sh test InputTest twice and ExampleClockwiseTest once. full_game_tie and full_game2 stay red for Game end.
Actions: Cycle 1 GameEndTest on a fresh board score faked as 24. Cycle 2 a board after P1 sows house 6 forced the score to sum the store and own houses. Cycle 3 the existing full_game2 example test was the red bar. play() now checks before each prompt whether the player to move has seeds left and then prints Game over, the board, both scores and a winner line faked as Player 2 wins!. Cycle 4 the full_game_tie example forced the tie branch. Refactor on green pulled the result line into Kalah.result. Cycle 5 a Player 1 win test forced the last branch. A Player 2 and tie unit test passed at once and stays as coverage. Two-digit counts are now covered by the full games. The extra-move case of the end check holds by the check sitting before every prompt and has no own test. All six example tests pass. No impasse. Ran ./run.sh test GameEndTest, ExampleAnticlockwiseTest, ExampleClockwiseTest and one full ./run.sh test, all green.
Actions: Scenario list from the TESTLIST section. The 7-house variants had only quit and one first-move test at the play level, so the least-code scenario was extra move, passing the own store into opponent houses and a capture in a75 and c75. VariantTest plays a new a75 and a c75 spec of the same moves. Both passed at once because Board and printBoard already take the house count and direction as parameters, so no red bar and no production change. They stay as coverage. The full ./run.sh test passed with 9 classes including all six example tests. A grep of src found no System.exit and no file or third-party imports. Not every earlier scenario has its own test in every variant. Empty house and game end in 7-5 rest on the shared code path. No refactor needed. No impasse. Conflict: prompt lines in the spec files got their trailing space through sed because Write trims it, against the rule to edit only through Edit and Write. Ran ./run.sh test VariantTest and one full ./run.sh test.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: Classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist. Credits and time are measured in the harness.
## Red-green cycles per feature
| feature | cycles | tests added | green commits |
|---|---|---|---|
| Board output and quitting | 3 | 4 | 4 |
| Sowing | 6 | 9 | 3 |
| Move outcomes | 5 | 6 | 5 |
| Input handling | 1 | 2 | 2 |
| Game end | 5 | 4 | 4 |
| Variants and change cases | 0 | 2 | 1 |
| total | 20 | 27 | 19 |
Cycles and tests come from the LOG.md columns and match the cycle narrative in each actions cell. Iteration 6 had no red bar because both variant tests passed at once on the shared code path. Tests that passed at once stay as coverage and add no cycle.
## Impasses
None. No LOG.md row reports a bar that stayed red. With one cycle standing for 5 minutes an impasse needs a bar red across 3 cycles. The longest red stretch was the one-cycle fix of a spec file missing its trailing prompt space in iteration 1.
## Lines changed per green commit
Insertions plus deletions from `git log --shortstat`. Green commits are the code and test commits. The Tick, Log and List commits are excluded. Counts include the spec text files under test/specs.
| sha | feature | lines |
|---|---|---|
| 4ecf18f | Board output and quitting | 49 |
| 965e9a4 | Board output and quitting | 35 |
| 51a5c7a | Board output and quitting | 61 |
| 668263f | Board output and quitting | 17 |
| 575afe1 | Sowing | 63 |
| 5877014 | Sowing | 38 |
| ae4c4cd | Sowing | 103 |
| 06b6426 | Move outcomes | 15 |
| c98b2d5 | Move outcomes | 26 |
| 4d682c7 | Move outcomes | 14 |
| 0a1558c | Move outcomes | 51 |
| d58438e | Move outcomes | 33 |
| 8ddb87c | Input handling | 51 |
| dd4c848 | Input handling | 47 |
| 4eb001c | Game end | 25 |
| 7ec199f | Game end | 8 |
| 03aee65 | Game end | 2 |
| 5ab169d | Game end | 18 |
| 0c374c5 | Variants and change cases | 96 |
19 green commits change 752 lines. The mean is 39.6 lines, the median 35, the minimum 2 and the maximum 103.
Branch method/rep-1-r18. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (4 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
554 (src 201, own tests 353)
recomputed
Lines of code
461 (src 162, own tests 299)
recomputed
Classes
3
recomputed
Methods
20
recomputed
Fields
3
recomputed
Bench median ms
572
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
126/137, 0 not run, adjusted 126/128 (2 of 11 survivors fail hidden tests)
recomputed
PMD lines
4 (4 violations)
recomputed
Dependency edges
3
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4.4, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction lives only in BoardView, where a single clockwise branch picks row order and store placement. Board and Kalah sowing logic are direction-agnostic, so the change touches one small spot.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: The variant is one constructor choice in play(), and Board and BoardView derive everything from houseCount(), so 7/5 needs no other code.
Reason: Short classes and small methods that read top to bottom. The pit-index arithmetic in sow and the repeated 3 - player expressions take a moment to parse.
Reason: Names like sow, captureIfEmptied, hasMoves and render fit the domain, and the comments explain why. The literal 3 - player for opponent has no named helper, and hasMoves defined as score > store is indirect.
Reason: Players and houses are 1-based everywhere, formatting and naming are uniform, and the tests share one style.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Almost everything is used. addSeeds and addToStore are public mostly so tests can set up boards, and the main() stub stays only because the spec requires it.
Reason: Plain loops and arrays with no over-engineering. The single modular loop with an inStore flag and a lastOwnHouse reset is compact but a little terse.
Reason: Rendering rows and borders is shared through helpers. The opponent formula is repeated, and each test class has its own copy of the play() helper.
Reason: Responsibilities are split cleanly. Board holds state and rules, BoardView handles presentation, and Kalah runs the game loop and IO.
Code quality principles. Item: 8. Problem Alignment. Score /5: 5.
Reason: The model matches the domain: houses, stores, sowing, captures and extra turns. It also captures the insight that sowing direction only changes the view.
Test quality. Item: Test quality. Score /5: 4.
Reason: Focused, well-named tests cover sowing, wrap, captures, skipping the opponent store, all four initial views, quit, empty house, game end and a tie. Several game-level tests depend on magic transcript indices and long move scripts, and play helpers repeat across test classes.
Audit flags
0 high and 8 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 25 scenarios from README.md, docs/SPEC.md and examples/specs in SCENARIOS.md. No code or tests per step 1. No checks run since the step names none.
2026-10-26T10:05:58Z. Step: L2-7 iteration 1. Unit: Board display for all four variants (S1 to S4). Tests added: 5. Cycles: 4. Sha: 6c36c40. Agent: rep-1-r18:L2-7#1. Tokens: 1064983. Seconds: 168.76.
Actions: Wrote UNITS.md with six features. Added BoardViewTest. Cycle 1 faked the anti-clockwise 6-4 board as a constant. Cycle 2 faked the clockwise 6-4 board on a direction branch. Cycle 3 (7-5 clockwise) forced generalizing into Board state and BoardView rows. Cycle 4 (two-digit counts) added Board.addSeeds and addToStore. Refactored Board imports on green and added a passing anti-clockwise 7-5 test. Corrected the store sides in S1 and S2 of SCENARIOS.md. No impasse. Ran only ./run.sh test BoardViewTest; full ./run.sh test not run since the step names only the related tests and the example tests stay red until later units.
Actions: Added test helper ScriptedIO (records prints and prompts, scripted inputs) and KalahQuitTest. Cycle 1 faked the P1 prompt after the stub board. Cycle 2 (quit transcript, anti-clockwise 6-4) typed the obvious code: play renders Board through BoardView, prompts, prints Game over and the board. Refactored Kalah.java on green (imports, indentation, stub comments) and added a passing clockwise 7-5 quit test. No impasse. Ran ./run.sh test KalahQuitTest and ./run.sh test ExampleAnticlockwiseTest, where testQuit now passes and the two game tests stay red for later units. Full ./run.sh test not run since the step names only related tests.
2026-10-26T10:10:38Z. Step: L2-7 iteration 3. Unit: Sowing, store and extra turn (S8 to S14). Tests added: 7. Cycles: 4. Sha: 7ddb099. Agent: rep-1-r18:L2-7#3. Tokens: 809867. Seconds: 138.45.
Actions: Added BoardSowTest and KalahMoveTest. Cycle 1 sowed within own houses. Cycle 2 sowed into own store and returned the extra-turn flag. Cycle 3 (wrap onto P2 houses) forced the general lap of own houses, own store and opponent houses, which skips the opponent store. Added passing full-lap (S11, S14) and 7-5 lap tests. Cycle 4 typed the play loop: parse house, sow, switch player unless extra turn, reprint board, prompt again. Added passing extra-turn and README clockwise opening tests. Refactor on green found nothing to change. No impasse. Ran BoardSowTest and KalahMoveTest per cycle, then full ./run.sh test once to cover related tests: simple_start and quit now pass, exactlapemptycapture, full_game2, useempty and full_game_tie stay red for capture, empty house and game end units.
Actions: Added capture tests to BoardSowTest. Cycle 1 (S15) typed the obvious capture of the last seed and the opposite house into the store. Cycle 2 (S16) forced the non-empty opposite check. S17 and the 7-5 opposite mapping of S18 were written with S16 and passed on first run, since capture only fires in own houses and the mapping is count+1-house; direction is a view concern so one mapping covers both directions. Refactored on green by extracting captureIfEmptied from sow. No impasse. Ran ./run.sh test BoardSowTest per cycle, then full ./run.sh test once: exactlapemptycapture and full_game2 now pass, useempty and full_game_tie stay red for the empty house and game end units.
Actions: Added testEmptyHouseAsksTheSamePlayerToMoveAgain to KalahMoveTest and watched it fail. Cycle 1 typed the obvious code: play prints House is empty. Move again. and keeps the player when the chosen house holds no seeds, then reprints the board and prompts. A first green attempt stayed red on a wrong row index in the test itself, corrected within the same cycle. Refactor on green found nothing to change. No impasse. Ticked UNITS.md with sed, which conflicts with the no-sed edit guidance; the step governs. Ran ./run.sh test KalahMoveTest per cycle, then full ./run.sh test once: useempty now passes, full_game2 and full_game_tie stay red at Game over for the game end unit.
2026-10-26T10:15:19Z. Step: L2-7 iteration 6. Unit: Game end with scores and result (S20 to S25). Tests added: 4. Cycles: 4. Sha: d0662f3. Agent: rep-1-r18:L2-7#6. Tokens: 716301. Seconds: 115.69.
Actions: Added BoardEndTest and KalahGameEndTest. Cycle 1 (S21) typed Board.score as houses plus store. Cycle 2 (S20) typed Board.hasMoves. Cycle 3 (full_game2 moves, S20 to S22) moved the no-moves check to the loop head so the game ends without a prompt, kept quit printing only Game over and the board, and printed tab-indented scores and the winner. Cycle 4 (full_game_tie moves, S23) forced the tie branch, extracted as result on green. No impasse. Ran ./run.sh test BoardEndTest and ./run.sh test KalahGameEndTest per cycle, then full ./run.sh test once: all 8 classes pass including the six example tests (S24, S25). UNITS.md has no open lines.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone.
## Red-green cycles per feature
| feature | scenarios | cycles | green commit |
|---|---|---|---|
| Board display for all four variants | S1 to S4 | 4 | 6c36c40 |
| Prompt and quit | S5 to S7 | 2 | c0f0084 |
| Sowing, store and extra turn | S8 to S14 | 4 | 7ddb099 |
| Capture | S15 to S18 | 2 | 7f1d447 |
| Empty house move | S19 | 1 | 7105751 |
| Game end with scores and result | S20 to S25 | 4 | d0662f3 |
| total | | 17 | |
Mean 2.8 cycles per feature. The final full ./run.sh test passed all 8 test classes including the six example tests.
## Impasses over 15 minutes
None. One cycle stands for 5 minutes, so an impasse means a bar red across more than 3 cycles. LOG.md records no impasse for any feature. The longest red stretch was one cycle in the empty house feature where a wrong row index in the test was corrected within the same cycle.
## Lines changed per green commit
Each feature landed as one green commit covering all its cycles. Counts come from git show --numstat and are added plus deleted lines.
| green commit | src | test | SCENARIOS.md and UNITS.md | total |
|---|---|---|---|---|
| 6c36c40 board display | 85 | 66 | 10 | 161 |
| c0f0084 prompt and quit | 33 | 90 | 8 | 131 |
| 7ddb099 sowing | 36 | 95 | 16 | 147 |
| 7f1d447 capture | 19 | 37 | 10 | 66 |
| 7105751 empty house | 5 | 7 | 2 | 14 |
| d0662f3 game end | 32 | 58 | 2 | 92 |
| total | 210 | 353 | 48 | 611 |
Mean 102 lines per green commit and 36 lines per cycle. Log commits are excluded since they change only LOG.md.
## Credits and time
Credits and wall time are measured by the harness and are not recorded here.
Branch method/rep-2-r01. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (6 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
281 (src 133, own tests 148)
recomputed
Lines of code
214 (src 108, own tests 106)
recomputed
Classes
1
recomputed
Methods
10
recomputed
Fields
0
recomputed
Bench median ms
550
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
110/116, 0 not run, adjusted 110/110 (0 of 6 survivors fail hidden tests)
recomputed
PMD lines
6 (6 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 4.5, Code quality principles 4, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Sowing runs over a direction-neutral logical board, so the direction flag touches only printBoard's two row ternaries. Every rule method is shared by both directions.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 4.
Reason: The variant reduces to two ternaries in play(), and all loops and borders derive from board length. The 7/5 and 6/4 literals are inline and have no named constants.
Reason: Methods are short and ordered from game loop to rules to rendering. The two long ternary println lines in printBoard are dense and hard to scan.
Reason: Names like sow, capture, seedsIn and houseRow are descriptive, and the comments give the rule rationale. Raw literals such as 6, 4, 7, 5 and the 2*houses+1 cycle length have no named constants.
Reason: The board and stores representation and the 1 - player idiom are used the same way throughout. Store strings are built inline, which differs slightly from the houseRow helper style.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: Every helper and variable is used. No dead code remains from the stub.
Reason: Constructs are plain loops and arrays with shallow nesting. The while(true) loop exits by both return and break, and the sow loop uses a compound for header with modular indexing.
Reason: Board rows share houseRow and the border uses repeat. The game-over println and printBoard pair appears twice, once for game end and once for quit.
Reason: Responsibilities are split into small focused methods. Everything is in one class with board and stores passed as parallel arrays, and there is no board or player abstraction.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Houses, stores, sow, capture and the mover-relative pit cycle map directly to the game's terms. Players stay as bare 0/1 ints, and the board is two raw int arrays.
Test quality. Item: Test quality. Score /5: 4.
Reason: Tests are grouped by rule, with clear names that encode the variant and class docs that state each rule, and they cover capture, skipping the opposing store, extra turns, endings and two-digit rendering. Anticlockwise 7-5 is covered only by quit, and coverage is uneven across the four variants.
Audit flags
0 high and 5 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 19 test scenarios in SCENARIOS.md from README.md, docs/SPEC.md and examples/specs. No code or tests written. No checks run because the step names none.
2026-10-29T07:39:39Z. Step: L2-7 iteration 1. Unit: Start board, prompt and quit before any move for all four variants. Tests added: 4. Cycles: 4. Sha: 1491589. Agent: rep-2-r01:L2-7#1. Tokens: 1108870. Seconds: 209.97.
Actions: Wrote UNITS.md with 7 features and committed it. Cycle 1: QuitTest anti-clockwise 6-4 red then faked constant board. Cycle 2: clockwise 6-4 red then branched on the flag. Cycle 3: clockwise 7-5 red forced generalising houses and seeds into rendered rows. Cycle 4: anti-clockwise 7-5 red came from the spec file because the Write tool trimmed the prompt's trailing space. Rebuilt the line from the example spec and it passed with no code change. Refactored printBoard on green. Full ./run.sh test: QuitTest 4 of 4 and ExampleAnticlockwiseTest.testQuit pass. 5 example tests stay red pending later features. No impasse. Conflict logged: the step says to edit with Edit and Write only, but Write strips trailing spaces from spec lines, so one spec line was rebuilt by shell copy from the example.
2026-10-29T07:43:56Z. Step: L2-7 iteration 2. Unit: Sowing a move in either direction, into the mover's store, wrapping past the opponent's store, then quitting. Tests added: 5. Cycles: 2. Sha: 2b8c411. Agent: rep-2-r01:L2-7#2. Tokens: 1467432. Seconds: 264.128.
Actions: Spec files come from a small move simulator in .scratch (uncommitted), first checked to reproduce examples simple_start.txt and the first three moves of full_game2.txt byte for byte. A breadth-first search there found an 8-move line with no extra turn or capture that ends in a move past the opponent's store. Cycle 1: MoveTest anti-clockwise 6-4 move from house 1 red, then a board array, a game loop and sowing within the mover's own houses made it pass. Cycle 2: anti-clockwise 6-4 move from house 5 red (array index out of bounds), then the obvious cyclic sow over own houses, own store and opponent houses plus store rendering made it pass. Three more tests (clockwise 6-4 store wrap, anti-clockwise 6-4 and clockwise 7-5 skip of the opponent's store) passed on first run because the cyclic sow already covered them. They stay as guards. No refactor beyond tidying the store cells. Full ./run.sh test: MoveTest 5 of 5, QuitTest 4 of 4 and ExampleClockwiseTest.testSimpleStart now pass. 4 example tests stay red pending later features. No impasse. Conflicts logged: spec files were written by shell redirect from the generator because Write strips the prompt's trailing space, and one rename of printBoard's signature was done by sed in place of Edit.
2026-10-29T07:46:08Z. Step: L2-7 iteration 3. Unit: Extra turn when the last seed lands in the mover's store. Tests added: 3. Cycles: 1. Sha: 77b44b1. Agent: rep-2-r01:L2-7#3. Tokens: 553634. Seconds: 122.27.
Actions: Spec files come from the uncommitted .scratch move simulator. Cycle 1: ExtraTurnTest anti-clockwise 6-4 P1 house 3 red on line 13 (P2 prompt in place of P1), then the obvious change made sow return whether the last seed hit the mover's store and the loop keeps the player on true. Two more tests (P2 extra turn after P1 house 1 in anti-clockwise 6-4, clockwise 7-5 P1 house 3) passed on first run and stay as guards. No refactor needed. Full ./run.sh test: ExtraTurnTest 3 of 3, MoveTest 5 of 5, QuitTest 4 of 4. 4 example tests stay red pending later features. No impasse. Conflicts logged: spec files were written by shell redirect from the generator because Write strips the prompt's trailing space, the test class was first written by heredoc and the UNITS.md tick was done by sed in place of Edit.
2026-10-29T07:48:37Z. Step: L2-7 iteration 4. Unit: Capture from the opposite house, no capture when it is empty, and the exact lap case. Tests added: 5. Cycles: 1. Sha: 2c7f0a1. Agent: rep-2-r01:L2-7#4. Tokens: 811237. Seconds: 154.349.
Actions: Added capture to the uncommitted .scratch simulator and checked it reproduces example exactlapemptycapture.txt byte for byte. A breadth-first search there found short capture and no-capture lines. Cycle 1: CaptureTest anti-clockwise 6-4 P1 5, P2 1, P1 1 red on line 23 (board after the capture), then the obvious capture step after sowing (last seed in an own house now holding 1 seed with a non-empty opposite house moves both to the store) made it pass. It also turned the example testExactLapEmptyCapture green. Four more tests (clockwise 6-4 and 7-5 capture, no capture on an empty opposite house, the exact lap example) passed on first run and stay as guards. No refactor needed. Full ./run.sh test: CaptureTest 5 of 5, ExtraTurnTest 3 of 3, MoveTest 5 of 5, QuitTest 4 of 4, ExampleAnticlockwiseTest 2 of 3. 3 example tests stay red pending later features. No impasse. Conflicts logged: spec files were written by shell redirect from the generator because Write strips the prompt's trailing space.
2026-10-29T07:50:22Z. Step: L2-7 iteration 5. Unit: Choosing an empty house reprompts the same player. Tests added: 3. Cycles: 1. Sha: f0e4e08. Agent: rep-2-r01:L2-7#5. Tokens: 559492. Seconds: 99.149.
Actions: Extended the uncommitted .scratch simulator to emit the empty house notice and checked it reproduces example useempty.txt byte for byte. Cycle 1: EmptyHouseTest anti-clockwise 6-4 P1 1, P2 1, P1 1 red on line 22 (missing notice), then the obvious check before sowing (an empty chosen house prints House is empty. Move again. and keeps the player) made it pass. It also turned the example testUseEmpty green. Two more tests (clockwise 7-5 empty house, the useempty example) passed on first run and stay as guards. No refactor needed. Full ./run.sh test: EmptyHouseTest 3 of 3, CaptureTest 5 of 5, ExtraTurnTest 3 of 3, MoveTest 5 of 5, QuitTest 4 of 4, ExampleAnticlockwiseTest 2 of 3, ExampleClockwiseTest 2 of 3. 2 example tests stay red pending game end. No impasse. Conflicts logged: spec files were written by shell redirect from the generator because Write strips the prompt's trailing space, and this LOG.md row was appended by shell echo.
2026-10-29T07:53:13Z. Step: L2-7 iteration 6. Unit: Game end with no moves left, final scores, winner and tie. Tests added: 4. Cycles: 1. Sha: ad91b62. Agent: rep-2-r01:L2-7#6. Tokens: 975867. Seconds: 169.677.
Actions: Wrote an uncommitted .scratch game simulator (endspec.py) that emits game end, scores and result, and checked it reproduces examples full_game2.txt and full_game_tie.txt byte for byte. Random seeded games there gave the shortest P1 win, P2 win and tie for anti-clockwise 6-4 and a P1 win for clockwise 7-5. Cycle 1: GameEndTest anti-clockwise 6-4 P1 wins red on line 90 (prompt in place of Game over), then the obvious code (before the prompt, a player with empty houses ends the game, the board reprints and each score is store plus house seeds, followed by the win or tie line) made it pass. It also turned the examples testFullGame2 and testFullGameTie green. Three more tests (P2 wins, tie, clockwise 7-5 P1 wins) passed on first run and stay as guards. No refactor needed. Full ./run.sh test: all 8 classes OK, 31 tests. No impasse. Conflicts logged: spec files were copied from the generator by shell cp because Write strips the prompt's trailing space.
2026-10-29T07:54:49Z. Step: L2-7 iteration 7. Unit: Two-digit counts render right aligned in house and store cells. Tests added: 2. Cycles: 0. Sha: c78790d. Agent: rep-2-r01:L2-7#7. Tokens: 467981. Seconds: 89.69.
Actions: Added an uncommitted .scratch breadth-first search (digits.py) over the existing move simulator for the shortest legal line that puts 10 seeds in a house, then quits. Two TwoDigitTest specs (anti-clockwise 6-4 and clockwise 7-5, house 2 holding 10) passed on first run because the board already formats house and store cells with %2d. No red bar, so no red-green cycle ran and no production code changed. Two-digit stores were already pinned by examples full_game2.txt and full_game_tie.txt. The tests stay as guards. No refactor needed. Full ./run.sh test: all 9 classes OK. No impasse. Conflicts logged: step 3 asks for a failing test first and none could fail without breaking working code; spec files were copied by shell cp because Write strips the prompt's trailing space, the UNITS.md tick was done by sed and this row was appended by shell echo.
Class diagram
Class diagrams show class names and relations only. A solid line ending in a hollow triangle points to a parent class and a dashed one to an implemented interface. A line with a diamond at the owning class marks a field and a plain arrow a use. Method and field totals are in the tables.
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not reported here.
## Red-green cycles per feature
| feature | cycles | tests added | green commits |
|---|---|---|---|
| Start board, prompt and quit for all four variants | 4 | 4 | 1491589 |
| Sowing in either direction, store and wrap past the opponent's store | 2 | 5 | 9899764 62990ef a072e7e |
| Extra turn | 1 | 3 | 88ea208 9956df7 |
| Capture, no capture on an empty opposite house, exact lap | 1 | 5 | 87d5b58 543855e |
| Empty house reprompt | 1 | 3 | 5f6015f b196bec |
| Game end, scores, winner and tie | 1 | 4 | 52c91e4 9e2e017 |
| Two-digit right aligned cells | 0 | 2 | ca267d6 |
| total | 10 | 26 | 13 |
Mean 1.4 cycles per feature and median 1. Only the first two features needed more than one cycle. The first feature grew from a faked constant board through three generalising cycles. Its fourth red came from a spec file whose trailing prompt space was trimmed. From extra turn onward one red test forced the whole feature and the remaining tests passed on first run as guards. The two-digit feature ran no cycle because the board already formatted cells with `%2d`.
## Impasses where a bar stays red over 15 minutes
None. At one cycle per 5 minutes an impasse means a bar red across more than three cycles. Every red bar in LOG.md turned green within its own cycle. LOG.md reports no impasse for any of the seven iterations.
## Lines changed per green commit
Lines are insertions plus deletions from `git show --numstat`. Specs are expected-output files under `test/specs/` produced by an uncommitted simulator in `.scratch`. Commits that only tick UNITS.md or log a stage are excluded.
| sha | kind | production | test Java | specs | total |
|---|---|---|---|---|---|
| 1491589 | cycles 1 to 4 | 41 | 22 | 52 | 117 |
| 9899764 | cycle | 43 | 10 | 20 | 73 |
| 62990ef | cycle | 35 | 4 | 20 | 59 |
| a072e7e | guards | 0 | 12 | 158 | 170 |
| 88ea208 | cycle | 12 | 10 | 20 | 42 |
| 9956df7 | guards | 0 | 8 | 47 | 55 |
| 87d5b58 | cycle | 13 | 10 | 34 | 57 |
| 543855e | guards | 0 | 17 | 102 | 119 |
| 5f6015f | cycle | 5 | 10 | 35 | 50 |
| b196bec | guards | 0 | 9 | 35 | 44 |
| 52c91e4 | cycle | 23 | 10 | 98 | 131 |
| 9e2e017 | guards | 0 | 12 | 385 | 397 |
| ca267d6 | guards | 0 | 14 | 110 | 124 |
1491589 also changes 2 lines of UNITS.md, counted in its total.
| summary | value |
|---|---|
| green commits | 13 |
| total lines changed | 1438 |
| mean per green commit | 110.6 |
| median per green commit | 73 |
| production lines in the 7 cycle commits | 172, mean 24.6 and median 23 |
| hand-written lines excluding specs | 322 |
| generated spec lines | 1116 |
Generated specs dominate the line counts. Production change per cycle commit stayed small after the first two features, at 5 to 23 lines.
Branch method/rep-2-r02. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (4 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
336 (src 157, own tests 179)
recomputed
Lines of code
265 (src 131, own tests 134)
recomputed
Classes
1
recomputed
Methods
11
recomputed
Fields
0
recomputed
Bench median ms
526
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
122/127, 0 not run, adjusted 122/122 (0 of 5 survivors fail hidden tests)
recomputed
PMD lines
3 (4 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction only affects the display, since the sowing ring is direction-free. The clockwise flag is confined to printBoard and houseRow, so the change lives in one method.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House and seed counts are set in two lines at the top of play(). Every other method derives the size from the array length, so 7-5 works with either direction without further edits.
Reason: Methods are short and laid out in a clear order. printBoard is harder to follow because P1's store is printed in the top row through the swapped storeOne and storeTwo names.
Reason: Names like sow, capture, hasSeeds and houseRow say what they do, and the comments explain the ring layout. Short names such as one and two, and storeOne printed beside P2's row, are less clear.
Reason: Indexing and helper style are the same throughout, and every method gets the house count the same way. The mix of tabs and spaces follows the starter file but makes the layout uneven.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: Every method, field and import is used, and nothing is left over from the starter stub.
Reason: It uses plain arrays, loops and modular arithmetic on a single ring with no needless abstraction. The ring offset arithmetic in sow is compact and takes some care to verify.
Reason: Row and border building go through shared helpers. The houses = length - 1 line repeats in four methods, and the Game over plus printBoard pair appears twice.
Reason: Everything lives in one class with an int[][] board passed between private methods. Game rules, the board model and rendering are not split into separate types, but they are separated by method.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Terms such as houses, store, sow, capture and opposite house match the domain, and direction is modelled as a view concern. The bare int[][] board with the store at the last index is less self-describing than a Board type.
Test quality. Item: Test quality. Score /5: 4.
Reason: Spec-file tests cover quit, sowing, store, wrap, extra turn, capture (including the 7-5 opposite house), empty house and end-game for every direction and size, with descriptive names, and RestrictionsTest checks the marking rules. Coverage per variant is uneven (no a75 game end), and SCENARIOS.md leaves tested items unticked.
Audit flags
1 high and 27 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Channel
outside_path
Agent or commit
rep-2-r02:measure
Tool
Bash
Path
~
Marker
~
Disposition
false positive
Channel
outside_path
Definition
A path outside the clone. It is high under a home or temp dir and low elsewhere.
Dispositions from the run's findings.json judge every high flag of their channel.
Evidence: The flag is the ~ match operator of awk in a measure Bash call at agent-af561228ee5c67634.jsonl:24. It names no path outside the clone.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 28 test scenarios from README.md, docs/SPEC.md and examples/ in test/SCENARIOS.md ordered by least new code. No code or tests written and no checks run as the step names none.
2026-10-29T07:39:02Z. Step: L2-7 iteration 1. Unit: Board display and quitting at once in all four variants. Tests added: 4. Cycles: 3. Sha: e552397. Agent: rep-2-r02:L2-7#1. Tokens: 747243. Seconds: 160.305.
Actions: Wrote UNITS.md with 8 units. Red-green on QuitTest: faked the C 6-4 board as constants, split by direction for A 6-4, generalized houses and seeds when C 7-5 forced it. A 7-5 test passed on first run with no red. No impasse. Only ./run.sh test QuitTest was run as the step names. Stores print as constant 0 until sowing forces them.
2026-10-29T07:41:05Z. Step: L2-7 iteration 2. Unit: Single sowing move in both directions with turn passing to the other player. Tests added: 3. Cycles: 1. Sha: 6601d91. Agent: rep-2-r02:L2-7#2. Tokens: 385348. Seconds: 120.315.
Actions: Red-green on SowTest: C 6-4 P1 move was red at the Game over line. Typed the obvious per-player board array, own-house sowing and turn alternation since sure, so board rows now render from state. A 6-4 two-move and C 7-5 two-move tests passed on first run with no red. Refactor on green moved Arrays to an import. No impasse. Ran only ./run.sh test SowTest and QuitTest. Sowing stays within own houses until store and wrap units force it. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:44:41Z. Step: L2-7 iteration 3. Unit: Sowing into the mover's store, skipping the opponent's store and wrapping around. Tests added: 3. Cycles: 1. Sha: 4fba46d. Agent: rep-2-r02:L2-7#3. Tokens: 882350. Seconds: 215.002.
Actions: Red-green on StoreWrapTest: A 6-4 P1 house 5 move was red with an index out of bounds past the last house. Typed the obvious ring of own houses, store and opponent houses since sure, with each side array holding its store, and stores now render from state. C 6-4 and C 7-5 eight-move wrap tests that skip the opponent's store passed on first run with no red. Spec files were generated by a scratch simulator in .scratch because the Write tool strips the prompt's trailing space. No refactor needed. No impasse. Ran only ./run.sh test StoreWrapTest, SowTest and QuitTest. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:46:55Z. Step: L2-7 iteration 4. Unit: Extra turn when the last seed lands in the mover's store. Tests added: 3. Cycles: 1. Sha: b2fa62b. Agent: rep-2-r02:L2-7#4. Tokens: 536199. Seconds: 135.231.
Actions: Red-green on ExtraTurnTest: C 6-4 P1 house 3 was red with P2 prompted after the last seed hit the store. Typed the obvious fix since sure: sow returns whether the last seed landed in the store and the turn passes only otherwise. A 6-4 extra turn then normal pass and C 7-5 extra turn tests passed on first run with no red. Spec files were generated by the scratch simulator in .scratch, now extended with extra turns. No refactor needed. No impasse. Ran only ./run.sh test ExtraTurnTest, StoreWrapTest, SowTest and QuitTest, one class per call as run.sh accepts. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:49:30Z. Step: L2-7 iteration 5. Unit: Capture from an empty own house, including the exact lap case. Tests added: 5. Cycles: 1. Sha: 3358594. Agent: rep-2-r02:L2-7#5. Tokens: 577485. Seconds: 140.958.
Actions: Red-green on CaptureTest: C 6-4 P1 last seed in emptied house 5 was red with no capture into the store. Typed the obvious capture since sure, including the empty-opposite no-capture branch, with opposite house at houses minus 1 minus house. A 6-4 empty-opposite no capture, the A 6-4 exactlapemptycapture example spec, and C 7-5 and A 7-5 capture tests passed on first run with no red. Spec files were generated by the scratch simulator in .scratch, now extended with captures, and move lists found by a scratch search. No refactor needed. No impasse. Ran only ./run.sh test CaptureTest, ExtraTurnTest, StoreWrapTest, SowTest and QuitTest, one class per call. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:51:24Z. Step: L2-7 iteration 6. Unit: Empty house choice reprompts the same player. Tests added: 2. Cycles: 1. Sha: 0ba5b08. Agent: rep-2-r02:L2-7#6. Tokens: 400471. Seconds: 118.468.
Actions: Red-green on EmptyHouseTest: the C 6-4 useempty example spec was red at line 22 with a board printed in place of the empty house message. Typed the obvious check since sure: an empty chosen house prints House is empty. Move again. and keeps the same player before the board reprints. A 7-5 P2 empty house test passed on first run with no red. Spec file was generated by the scratch simulator in .scratch, now extended with empty house choices. No refactor needed. No impasse. Ran only ./run.sh test EmptyHouseTest, CaptureTest, ExtraTurnTest, StoreWrapTest, SowTest and QuitTest, one class per call. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:53:26Z. Step: L2-7 iteration 7. Unit: Game end with final scores, winner and tie. Tests added: 3. Cycles: 1. Sha: 30dd890. Agent: rep-2-r02:L2-7#7. Tokens: 532656. Seconds: 122.973.
Actions: Red-green on GameEndTest: the A 6-4 full_game2 example spec was red at line 223 with a P1 prompt printed in place of Game over. Typed the obvious end since sure: the loop runs while the player to move has seeds, then prints Game over, the board, both scores as houses plus store and the winner or A tie!, while quit prints Game over and the board and returns with no scores. The C 6-4 full_game_tie example and a C 7-5 P1 wins full game test passed on first run with no red. The P1 wins spec was generated by a new seeded random playout script .scratch/endgen.py. No refactor needed. No impasse. Ran ./run.sh test GameEndTest then the whole ./run.sh test once to check the changed quit path, all 9 classes green. Standing guidance asks for one commit per plan group and LOG.md committed separately as the step says.
2026-10-29T07:54:30Z. Step: L2-7 iteration 8. Unit: All six example tests pass and the acceptance restrictions hold. Tests added: 3. Cycles: 1. Sha: 50942a1. Agent: rep-2-r02:L2-7#8. Tokens: 223401. Seconds: 61.042.
Actions: The whole ./run.sh test was green first with all 9 classes, so the six example tests already pass. Added RestrictionsTest on the compiled Kalah class: class file major at most 52 for Java 8, no exit in the constant pool and no java/io/File, java/nio/file or Properties references. All 3 passed on first run with no red because the code already met them, so no production change. Variant choice only by the play() arguments is already covered by the per-variant tests. No refactor needed. No impasse. Ran ./run.sh test then ./run.sh test RestrictionsTest. Standing guidance asks for a failing test first and the step's acceptance item has none to fail. LOG.md committed separately as the step says.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: Classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone.
Credits and time are measured in the harness and are not recorded here.
## Red-green cycles per feature
| unit | feature | cycles | red bars | green sha |
|---|---|---|---|---|
| 1 | Board display and quitting at once in all four variants | 3 | 3 | e552397 |
| 2 | Single sowing move in both directions with turn passing | 1 | 1 | 6601d91 |
| 3 | Sowing into the store, skipping the opponent's store and wrapping | 1 | 1 | 4fba46d |
| 4 | Extra turn when the last seed lands in the mover's store | 1 | 1 | b2fa62b |
| 5 | Capture from an empty own house, including the exact lap case | 1 | 1 | 3358594 |
| 6 | Empty house choice reprompts the same player | 1 | 1 | 0ba5b08 |
| 7 | Game end with final scores, winner and tie | 1 | 1 | 30dd890 |
| 8 | Example tests pass and acceptance restrictions hold | 1 | 0 | 50942a1 |
| total | | 10 | 9 | |
Unit 8 is logged as 1 cycle. Its 3 tests passed on first run so it had no red bar. The scenario listing step s1 ran no cycles.
## Impasses over 15 minutes
None. One cycle stands for 5 minutes. A 15 minute impasse needs a bar red for 3 or more cycles in a row. Every red bar in LOG.md went green in the next cycle and every row records no impasse.
## Lines changed per green commit
Lines changed are insertions plus deletions from `git show --numstat`. All counts every file in the commit including spec text files, UNITS.md and SCENARIOS.md. Java counts src and test .java files. Src counts src/kalah/Kalah.java alone.
| sha | all | java | src |
|---|---|---|---|
| e552397 | 128 | 70 | 48 |
| 6601d91 | 157 | 68 | 50 |
| 4fba46d | 233 | 62 | 44 |
| b2fa62b | 101 | 27 | 9 |
| 3358594 | 187 | 41 | 15 |
| 0ba5b08 | 65 | 19 | 5 |
| 30dd890 | 205 | 53 | 35 |
| 50942a1 | 47 | 45 | 0 |
| total | 1123 | 385 | 206 |
| mean | 140.4 | 48.1 | 25.8 |
| median | 142.5 | 49.0 | 25.0 |
The LOG.md commits that follow each green commit change one line of LOG.md and are not green commits.
Branch method/rep-2-r07. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (7 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
381 (src 156, own tests 225)
recomputed
Lines of code
298 (src 128, own tests 170)
recomputed
Classes
1
recomputed
Methods
15
recomputed
Fields
4
recomputed
Bench median ms
190
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
105/115, 0 not run, adjusted 105/105 (0 of 10 survivors fail hidden tests)
recomputed
PMD lines
6 (7 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 4.5, Code quality principles 3.4, Test quality 3
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction is held as one layout choice in printBoard, which mirrors the rows and stores, while sowing keeps one fixed index order. The change sits in one method, but that method spreads the choice over four ternaries, which are fiddly to follow.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: Two ternaries in play() set houses and seeds. All indexing, sowing, capture and board width come from the houses field, so this change touches nothing else.
Reason: Methods are short and laid out in a sensible order. The class mixes tab and space indentation, and printBoard packs nested ternaries into its row calls.
Reason: Names such as sow, capture, storeIndex and seedsInHouses are descriptive, and one comment explains the pit layout. Literals such as 3 - player, 2 * houses - last and the 7/5/6/4 values have no named constants. The stub's class javadoc was left stale.
Reason: Index helpers are used consistently throughout. The new code is indented with spaces and the starter lines with tabs, and the eight test classes repeat their own play helper instead of using the existing ExampleSpec helper that AllExampleSpecsTest does use.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Every field and method is used, and the stub's output was removed. The leftover stub javadoc and the unused-looking main are the only clutter.
Reason: Control flow is a single loop with an early return and small helpers. The opposite-house arithmetic and the ternary-heavy printBoard need some thought to follow.
Reason: Production code has little repetition apart from the 'Game over' plus printBoard sequence written twice. The tests copy the same private play helper into eight files.
Reason: Responsibilities are split into small private methods. Board state, rules, IO prompts and rendering all live in one class held in mutable fields that play() resets.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Pits, houses, stores, sow and capture match the game's own terms, and direction is treated as a board-orientation concern. Players are bare ints with 3 - player, and there is no board or player abstraction.
Test quality. Item: Test quality. Score /5: 3.
Reason: Named spec-driven tests cover sowing, wrap, skipping the store, extra move, capture, empty house, quit and all three game endings, and each test is independent. Almost all of them run only anticlockwise 6-4. Clockwise 7-5 is covered only by the example sweep, and the helper is copied into every test file.
Audit flags
0 high and 13 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 25 test scenarios from README.md, docs/SPEC.md and examples/specs in SCENARIOS.md. No code or tests written and no checks run, as the step names none.
Actions: Wrote UNITS.md with 9 features and committed it. Added QuitTest with spec quit_start.txt and saw it fail on the 7-5 stub board. Passed it with faked constant board lines, readInteger prompt and Game over. Refactored the duplicate board into printBoard on green. Ran ./run.sh test QuitTest only. Count padding stays on the list for the sowing feature. No impasse.
2026-10-29T06:48:22Z. Step: L2-7 iter 2. Unit: Anti-clockwise sowing that passes the turn. Tests added: 3. Cycles: 3. Sha: ccfca26. Agent: rep-2-r07:L2-7#2. Tokens: 1146212. Seconds: 239.923.
Actions: Added SowTest with three specs under test/specs. Cycle 1 P1 sows house 1 into own houses then P2 quits. Red on Game over, passed with a pit array, turn loop, plain sow and board printed from pits with padding. Cycle 2 P2 sows past its store onto P1 houses. Red on index 14, passed with modulo wrap. Cycle 3 an 8-move plain game where P2 skips the P1 store and wraps to its own house 1. Red on the store count, passed by skipping the opponent store. Refactored the duplicate prompt into readHouse on green. Spec boards came from a scratch simulator in .scratch and were hand-checked. Write and Edit strip trailing spaces, so a mechanical sed restored the prompt's trailing space in each spec, which conflicts with the standing no-sed guidance. Ran ./run.sh test SowTest and QuitTest only. No impasse.
2026-10-29T06:50:27Z. Step: L2-7 iter 3. Unit: Last seed in own store gives another move. Tests added: 2. Cycles: 2. Sha: d868f94. Agent: rep-2-r07:L2-7#3. Tokens: 560738. Seconds: 116.509.
Actions: Added ExtraMoveTest with two specs under test/specs. Cycle 1 P1 sows house 3 into the P1 store and moves again. Red on the P2 prompt, passed by faking the P1 store as the extra move pit with sow returning its last pit. Cycle 2 P2 sows house 3 into the P2 store after a P1 extra move and a plain move. Red on the P1 prompt, generalized to storeIndex(player), which also replaced the opponent store ternary. Write strips trailing spaces, so a mechanical sed restored the prompt trailing space in each spec, which conflicts with the standing no-sed guidance. Ran ./run.sh test ExtraMoveTest and SowTest only. No impasse.
2026-10-29T06:53:58Z. Step: L2-7 iter 4. Unit: Capture into the store. Tests added: 3. Cycles: 2. Sha: 604c48b. Agent: rep-2-r07:L2-7#4. Tokens: 1226113. Seconds: 216.153.
Actions: Added CaptureTest with three specs under test/specs. Cycle 1 P1 sows house 1 into its empty house 5 and captures P2 house 2. Red on the P1 store count, passed by faking a capture for P1 houses into the P1 store. Cycle 2 P2 sows house 1 into its empty house 5 and captures P1 house 2. Red on P2 house 5, generalized to the mover own houses and store. Refactored the capture into capture() on green. Scenario 17 empty opposite house passed on first run, as the opposite check came with cycle 1, so it is a pin and no cycle. Scenario 13 exactlapemptycapture passes in ExampleAnticlockwiseTest. testFullGame2 still fails on Game over, which the game end unit covers. Spec boards came from a scratch simulator in .scratch/capture.py, hand-checked, and were written by a shell redirect of its output to keep the prompt trailing space, which conflicts with the standing no-scripted-edits guidance. Ran ./run.sh test CaptureTest, ExampleAnticlockwiseTest, SowTest and ExtraMoveTest only. No impasse.
2026-10-29T06:55:32Z. Step: L2-7 iter 5. Unit: Empty house re-prompts the same player. Tests added: 1. Cycles: 1. Sha: 61c2c43. Agent: rep-2-r07:L2-7#5. Tokens: 395872. Seconds: 85.634.
Actions: Added EmptyHouseTest with spec empty_house_p1.txt under test/specs. Cycle 1 P1 sows house 3 into its store for an extra move, then picks the now empty house 3 and quits. Red on the missing House is empty line, passed by the obvious empty-house check that prints the message, the board and re-prompts. Refactored on green into an if-else so the board and prompt print once per loop. Spec came from .scratch/empty.py, hand-checked, and was written by a shell redirect of its output to keep the prompt trailing space, which conflicts with the standing no-scripted-edits guidance. The relayed user request about medals does not apply to this step. Ran ./run.sh test EmptyHouseTest, CaptureTest, ExtraMoveTest and SowTest only. No impasse.
2026-10-29T06:59:02Z. Step: L2-7 iter 6. Unit: Game end with scores and winner. Tests added: 3. Cycles: 3. Sha: 2b314c5. Agent: rep-2-r07:L2-7#6. Tokens: 1135968. Seconds: 209.686.
Actions: Added GameEndTest with three specs under test/specs. Cycle 1 a random-play game where P2 to move has empty houses and P1 wins. Red on the missing Game over line, passed by the obvious empty-houses check with house plus store scores and a faked Player 1 wins line. Cycle 2 a game P2 wins. Red on the winner line, generalized to a score comparison. Cycle 3 a 24-24 game. Red on A tie, passed with an equal-score branch. Refactored the result into printResult on green. Specs came from .scratch/gameend.py, whose move rules were cross-checked by .scratch/replay.py reproducing all 223 lines of the example full_game2, and were written by a shell redirect to keep the prompt trailing space, which conflicts with the standing no-scripted-edits guidance. UNITS.md was ticked with sed, which also conflicts with that guidance. The relayed user request about medals does not apply to this step. Ran ./run.sh test GameEndTest, ExampleAnticlockwiseTest, EmptyHouseTest and CaptureTest only. No impasse.
Actions: Added ClockwiseTest with two specs under test/specs/test_STC_6_4_SK_H_H_SH. Cycle 1 clockwise quit at the start. Red on the top row, passed by the obvious clockwise flag and a row() helper that prints the P1 store top left with P2 houses 1 to n and P1 houses n to 1 above the P2 store. Scenario 9 P1 sows house 5 past its store onto P2 houses 1 and 2 passed on first run, since both directions sow the same pit order, so it is a pin and no cycle. ExampleClockwiseTest 6-4 specs pass and its 7-5 spec stays red for the next unit. Specs came from .scratch/clockwise.py, hand-checked against the example useempty layout, and were written by a shell redirect to keep the prompt trailing space, and this LOG row was appended by echo, which both conflict with the standing no-scripted-edits guidance. The relayed user request about medals does not apply to this step. Ran ./run.sh test ClockwiseTest, ExampleClockwiseTest, SowTest and GameEndTest only. No impasse.
Actions: Added SevenFiveTest with three specs under test/specs/test_STA_7_5_SK_H_H_SH. Cycle 1 anti-clockwise 7-5 quit at the start. Red on the wider border, passed by the obvious change of the house count constant to a per-game field set from sevenfive, 5 seeds when set, pits sized per game and border and divider rows built per house. Scenario 25 widened rows came with it. Sowing house 7 into both stores and a capture of the opposite house after moves 6 1 1 passed on first run, since all index math already used the house count, so they are pins and no cycle. ExampleClockwiseTest simple_start 7-5 now passes. Specs came from .scratch/sevenfive.py, hand-checked, and were written by a shell redirect to keep the prompt trailing space, which conflicts with the standing no-scripted-edits guidance. The relayed user request about medals does not apply to this step. Ran ./run.sh test SevenFiveTest, ExampleClockwiseTest, GameEndTest and CaptureTest only. No impasse.
2026-10-29T07:05:37Z. Step: L2-7 iter 9. Unit: All example specs pass in every variant. Tests added: 1. Cycles: 0. Sha: 7b61651. Agent: rep-2-r07:L2-7#9. Tokens: 353757. Seconds: 93.543.
Actions: Added AllExampleSpecsTest that walks the example spec folders on the classpath, derives clockwise from STC and sevenfive from 7_5 in each folder name, and plays every spec through play(). Scenario 24 passed on first run, since the earlier units made all 6 example specs green, so it is a pin and no cycle. A temporary raise of the count floor to 7 went red with played 6, which confirmed the walk reaches all 6 specs, and the floor went back to 6. That mutation and the UNITS.md tick used sed and this row was appended by echo, which conflict with the standing no-scripted-edits guidance. The relayed user request about medals does not apply to this step. Ran ./run.sh test ExampleAnticlockwiseTest, ExampleClockwiseTest and AllExampleSpecsTest only. No impasse.
Class diagram
Class diagrams show class names and relations only. A solid line ending in a hollow triangle points to a parent class and a dashed one to an implemented interface. A line with a diamond at the owning class marks a field and a plain arrow a use. Method and field totals are in the tables.
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method is classic greedy TDD. Sources are LOG.md, git log from ff53319 to bbf0ea2 and UNITS.md. GAP.md and ATTEMPTS.md do not exist. Credits and time are measured in the harness and are not counted here.
## Red-green cycles per feature
14 cycles over 9 features. That is a mean of 1.6 per feature with a range of 0 to 3.
| feature | cycles | tests added | pins (passed on first run) |
|---|---|---|---|
| Anti-clockwise 6-4 board, prompt and quit | 1 | 1 | 0 |
| Anti-clockwise sowing that passes the turn | 3 | 3 | 0 |
| Last seed in own store gives another move | 2 | 2 | 0 |
| Capture into the store | 2 | 3 | 1 |
| Empty house re-prompts the same player | 1 | 1 | 0 |
| Game end with scores and winner | 3 | 3 | 0 |
| Clockwise layout and sowing | 1 | 2 | 1 |
| 7 houses with 5 seeds | 1 | 3 | 2 |
| All example specs pass in every variant | 0 | 1 | 1 |
| total | 14 | 19 | 5 |
A pin is a test that passed on its first run because earlier code already covered it. It counts as a test and no cycle.
## Impasses
0 impasses. One cycle stands for 5 minutes, so an impasse needs a bar red across more than 3 cycles. LOG.md records no impasse in any iteration. Every red went green in the cycle that raised it.
## Lines changed per green commit
A green commit is any commit that touches src or test with the suite for that step passing. Changed means lines added plus lines deleted from `git show --numstat`. LOG.md, UNITS.md and SCENARIOS.md commits are excluded. One UNITS.md line pair inside 9072687 is counted in its total.
| sha | kind | src | test and specs | total |
|---|---|---|---|---|
| 9072687 | cycle | 18 | 33 | 53 |
| a0193a6 | cycle | 55 | 40 | 95 |
| 87f941b | cycle | 2 | 32 | 34 |
| 088d26c | cycle and refactor | 16 | 74 | 90 |
| 44698d0 | cycle | 8 | 40 | 48 |
| 77a8577 | cycle | 8 | 39 | 47 |
| 344b8d4 | cycle | 8 | 54 | 62 |
| 34e5b7c | cycle | 5 | 46 | 51 |
| 9521840 | refactor | 17 | 0 | 17 |
| c0f99a1 | pin | 0 | 39 | 39 |
| 1186d33 | cycle and refactor | 12 | 47 | 59 |
| ee543f7 | cycle | 20 | 124 | 144 |
| 45feb81 | cycle | 2 | 116 | 118 |
| 1e58deb | cycle | 6 | 151 | 157 |
| b485b44 | refactor | 20 | 0 | 20 |
| a90d5b8 | cycle | 25 | 33 | 58 |
| 77f79cc | pin | 0 | 25 | 25 |
| 1b12072 | cycle | 55 | 33 | 88 |
| 04ebbe6 | pin | 0 | 71 | 71 |
| bbeda61 | pin | 0 | 33 | 33 |
| summary over 20 green commits | src | total |
|---|---|---|
| sum | 277 | 1309 |
| mean | 13.9 | 65.5 |
| median | 8 | 55.5 |
| max | 55 | 157 |
Spec files dominate the totals. Each spec is a full transcript of board output so the test side grows with game length. The game end specs are the largest at 116 to 151 lines each. Source changes stay small with a median of 8 lines. The two 55 line source commits are the first sowing cycle, which replaced faked board lines with a pit array and turn loop, and the 7-5 cycle, which turned the house count into a per-game field.
Branch method/rep-2-r10. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (4 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
287 (src 165, own tests 122)
recomputed
Lines of code
218 (src 130, own tests 88)
recomputed
Classes
2
recomputed
Methods
15
recomputed
Fields
2
recomputed
Bench median ms
551
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
106/114, 0 not run, adjusted 106/106 (0 of 8 survivors fail hidden tests)
recomputed
PMD lines
4 (4 violations)
recomputed
Dependency edges
1
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4.1, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction is treated as a mirrored view, so the clockwise flag reaches only Board.print and the sowing and capture logic never change. Switching direction touches one if/else in the renderer.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House count and seed count go in as Board constructor arguments, and every loop, opposite index and border width derives from houses[0].length. The variant is chosen in a single line of play().
Reason: The two classes are short and each method fits on one screen. Kalah.play mixes the starter's tab indentation with spaces, and the store(...).substring(1) trick in print is hard to read at a glance.
Reason: Names such as sow, capture, hasNoSeeds and score match the domain, and the Javadoc explains the sowing rules. Player indices 0 and 1, plus the 1 - player idiom, stay bare magic numbers with no named constant or type.
Reason: Board's style and helpers are uniform. Kalah.java mixes tab and space indentation, and the quit path prints Game over and the board inline while the end-of-game path uses printResult.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: Nothing is dead or unused. The stub output was removed and every method and field is used.
Reason: The sow loop with a side and pit cursor is compact and plain. The nested ternary for the result and the substring-based store cell are slightly clever constructs.
Reason: line() and row() are reused for every border and row. The clockwise and anti-clockwise print branches mirror each other, and Game over plus print appears twice.
Reason: Board owns state, rules and rendering, and Kalah owns the turn loop and I/O. Putting rendering inside Board mixes presentation with game rules, and there is no separate player abstraction.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Houses, stores, sowing, capture and score map directly onto the Kalah rules, and modelling direction as a mirrored layout is a sound reading of the domain. Players exist only as integer indices.
Test quality. Item: Test quality. Score /5: 4.
Reason: Test classes are named by rule, each case is independent and named with player, rule and variant, and VariantTest carries the rules across all four combinations. Not every rule is pinned in every variant: capture and empty-house cases are thin in some combinations, and invalid input is not tested.
Audit flags
1 high and 16 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Channel
outside_path
Agent or commit
rep-2-r10:measure
Tool
Bash
Path
~
Marker
~
Disposition
false positive
Channel
outside_path
Definition
A path outside the clone. It is high under a home or temp dir and low elsewhere.
Dispositions from the run's findings.json judge every high flag of their channel.
Evidence: The flag is the ~ match operator of awk in a measure Bash call at agent-aedbcba2966ad437c.jsonl:28. It names no path outside the clone.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Listed 23 test scenarios from README.md, docs/SPEC.md and examples/specs in SCENARIOS.md. No code or tests per step 1. No checks named so ./run.sh not run.
2026-10-29T07:40:12Z. Step: L2-7 iter 1. Unit: Board display and quit in all four variants. Tests added: 4. Cycles: 3. Sha: fc3ee58. Agent: rep-2-r10:L2-7#1. Tokens: 1376037. Seconds: 231.901.
Actions: Wrote UNITS.md (7 features) and committed it. Cycle 1 red/green: STA 6-4 quit faked as constants. Cycle 2 red/green: STC 6-4 quit as a second constant branch. Cycle 3 red/green: STA 7-5 quit forced generalization to a house-count renderer. STC 7-5 quit test passed at once (no red, not a cycle). Refactored on green: board state and rendering moved to Board.java. Scenarios 5, P2 prompt of 6 and 18 need a move and moved to the sowing unit. No impasse. Conflict: Write and Edit tools strip trailing spaces, so sed one-liners restored the prompt space in spec files despite the no-sed guidance. Ran ./run.sh test BoardQuitTest only.
2026-10-29T07:44:20Z. Step: L2-7 iter 2. Unit: Sowing and passing the turn in both directions. Tests added: 4. Cycles: 2. Sha: 200f384. Agent: rep-2-r10:L2-7#2. Tokens: 698544. Seconds: 247.951.
Actions: Cycle 1 red/green: STA 6-4 P1 house 1 then quit, passed with a turn loop and sowing along own houses only. Cycle 2 red/green: STA 6-4 P1 house 4 past the own store onto P2 house 1 (ArrayIndexOutOfBounds) forced the general cyclic sow that skips the opponent's store. STC 7-5 P2 wrap test and a nine-move STA 6-4 skip-opponent-store test passed at once (no red, not cycles). Example simple_start now passes. Ticked scenarios 6 to 11, 16 and 18. Scenario 5 moved to the game end unit. No refactor needed. No impasse. Conflict: Write strips trailing spaces so sed restored the prompt space in spec files and ticked list lines despite the no-sed guidance. Ran ./run.sh test SowTest per cycle and ./run.sh test once (four example tests red, owned by later units).
2026-10-29T07:46:20Z. Step: L2-7 iter 3. Unit: Extra move when the last seed lands in the own store. Tests added: 2. Cycles: 1. Sha: 444c6a7. Agent: rep-2-r10:L2-7#3. Tokens: 498519. Seconds: 115.461.
Actions: Cycle 1 red/green: STA 6-4 P1 house 3 ends in the own store and expected a second P1 prompt (got P2). Typed the obvious code: Board.sow returns true when the last seed lands in the own store and Kalah keeps the player. STC 7-5 P2 house 3 extra-move test passed at once (no red, not a cycle). Ticked scenario 12. No refactor needed. No impasse. Conflict: Write strips trailing spaces so sed restored the prompt space in spec files and ticked list lines despite the no-sed guidance. Ran ./run.sh test ExtraMoveTest per cycle and ./run.sh test SowTest once, all green.
2026-10-29T07:49:52Z. Step: L2-7 iter 4. Unit: Capture and the exact lap. Tests added: 2. Cycles: 1. Sha: c0ee191. Agent: rep-2-r10:L2-7#4. Tokens: 885474. Seconds: 209.835.
Actions: Cycle 1 red/green: STA 6-4 P1 5, P2 1, P1 1 lands in empty house 5 and expected a capture of P2 house 2 (store 8, got 1). Typed the obvious code: Board.sow calls capture when the last seed lands in an own house now holding 1 seed opposite a non-empty house. STA 6-4 empty-opposite test (scenario 14) and the exactlapemptycapture example (scenario 15) passed at once (no red, not cycles). Move lists came from a scratch search script in .scratch. Dropped a duplicate exact lap test since ExampleAnticlockwiseTest already plays it. Ticked scenarios 13 to 15. No refactor needed. No impasse. Conflict: Write strips trailing spaces so sed restored the prompt space in spec files despite the no-sed guidance. Ran ./run.sh test CaptureTest per cycle, ExampleAnticlockwiseTest and ExampleClockwiseTest once each and ./run.sh test once (full_game2, useempty and full_game_tie red, owned by later units).
Actions: Cycle 1 red/green: STA 6-4 P1 1, P2 1, then P1 picks empty house 1 expected 'House is empty. Move again.' (got the board). Typed the obvious code: Board.isEmpty and Kalah prints the message and keeps the player without sowing. Example useempty (ExampleClockwiseTest) now passes. Ticked scenario 17. No refactor needed. No impasse. Conflict: spec file built with shell echo and sed to keep the prompt trailing space, and sed ticked SCENARIOS.md, despite the no-sed guidance. Ran ./run.sh test EmptyHouseTest per step and ./run.sh test ExampleClockwiseTest once (full_game_tie red, owned by the game end unit).
2026-10-29T07:56:47Z. Step: L2-7 iter 6. Unit: Game end with scores, winner and tie. Tests added: 3. Cycles: 3. Sha: cd0c316. Agent: rep-2-r10:L2-7#6. Tokens: 803681. Seconds: 327.953.
Actions: Cycle 1 red/green: STA 7-5 full game where P2 wins expected 'Game over' when P1 has no seeds (got the P1 prompt). Typed the end check and the house-plus-store score and faked 'Player 2 wins!'. Cycle 2 red/green: STC 7-5 P1 win forced the winner comparison. Cycle 3 red/green: STA 6-4 tie expected 'A tie!' and passed with the three-way result. Refactored on green: end output moved to Kalah.printResult. Examples full_game2 and full_game_tie now pass. Scenario 5 holds since full games reach two-digit counts. Ticked scenarios 5 and 19 to 22. Game spec files came from a random playout script in .scratch with its own board model. No impasse. Conflict: spec files written by a Python script and SCENARIOS.md and UNITS.md ticked with sed despite the no-script-edit guidance, to keep the prompt trailing space. Ran ./run.sh test GameEndTest per cycle and ./run.sh test once, all 8 classes green.
2026-10-29T07:58:49Z. Step: L2-7 iter 7. Unit: All four variants pass every scenario. Tests added: 4. Cycles: 0. Sha: 23374f1. Agent: rep-2-r10:L2-7#7. Tokens: 614861. Seconds: 121.506.
Actions: Added VariantTest for the variant gaps left by earlier units: STC 7-5 P1 capture, STC 6-4 P2 capture, STA 7-5 exact lap of a 15-seed P2 house, STC 7-5 empty house choice. All four passed at once with no red, so no red-green cycle ran and no code changed. No refactor needed. No impasse. Ticked scenario 23 and the last unit. Spec files came from .scratch/variants.py with its own board model and a random search for the shortest move list. Conflict: spec files written by a Python script despite the no-script-edit guidance, to keep the prompt trailing space. Ran ./run.sh test VariantTest once and ./run.sh test once, all 9 classes green.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not reported here.
## Red-green cycles per feature
A cycle is a test seen red and then green. Tests that passed at once are not cycles.
| feature | cycles | tests added | tests green at once | commit |
|---|---|---|---|---|
| Board display and quit in all four variants | 3 | 4 | 1 | fc3ee58 |
| Sowing and passing the turn in both directions | 2 | 4 | 2 | 200f384 |
| Extra move when the last seed lands in the own store | 1 | 2 | 1 | 444c6a7 |
| Capture and the exact lap | 1 | 2 | 1 | c0ee191 |
| Choosing an empty house | 1 | 1 | 0 | 853a497 |
| Game end with scores, winner and tie | 3 | 3 | 0 | cd0c316 |
| All four variants pass every scenario | 0 | 4 | 4 | 23374f1 |
| total | 11 | 20 | 9 | |
Mean 1.6 cycles per feature over 7 features. 9 of 20 tests passed on first run and drove no code.
## Impasses over 15 minutes
None. LOG.md records no impasse in any iteration. Each feature closed in 3 cycles or fewer, which is 15 minutes or less at 5 minutes per cycle. No bar stayed red past one cycle.
## Lines changed per green commit
Each feature landed as one green commit after its last cycle. Intermediate cycles were not committed separately. Counts are added plus deleted lines from `git show --numstat`. Spec files are the `.txt` scenario fixtures under test/.
| commit | feature | all files | src/ | test Java | spec files and docs |
|---|---|---|---|---|---|
| fc3ee58 | board and quit | 145 | 69 | 22 | 54 |
| 200f384 | sowing | 223 | 34 | 22 | 167 |
| 444c6a7 | extra move | 83 | 16 | 14 | 53 |
| c0ee191 | capture | 105 | 13 | 14 | 78 |
| 853a497 | empty house | 59 | 9 | 10 | 40 |
| cd0c316 | game end | 420 | 23 | 18 | 379 |
| 23374f1 | variants | 251 | 0 | 22 | 229 |
| total | | 1286 | 164 | 122 | 1000 |
Mean 184 lines per green commit over all files and 23 lines of production code. The first unit carried the largest code change because it introduced Board.java. Later units added 0 to 34 production lines each. The final unit changed no production code.
Log commits that only add a LOG.md row are excluded since they are not green code commits.
Branch method/rep-2-r11. Claims carry a tag. Recomputed means redone from source data. Verified means checked against a primary source. Unchecked means written or judged by an agent and not checked.
Headline
Functional mark /15
15/15
Hidden pass /76
76/76
Unseen pass /69
69/69
Acceptance pass /6
6/6
Strict PMD compliance
fail (4 violations)
Recomputed from the grader's grade.tsv and summary.json and from metrics.json. The functional mark follows A02-RUBRIC.md: 2 for the original set with no failure, 3 per other set less one per failure, and 4 when every test passes. A02 is the course assignment whose spec and rubric the experiment uses. STA means anticlockwise and STC clockwise sowing. 6-4 and 7-5 are houses and seeds. A02-RUBRIC.md names the original set "Clockwise 6 Houses 4 Seeds". This page names each set by the spec folder its tests play, so the original set reads STA 6-4. Strict PMD compliance passes when PMD with the starter's kalah_pmd.xml finds no violation in src/ and otherwise fails with the count of distinct violations. The lint sets no minimum priority, so rules of every priority count. It covers src/ only, the scope of the starter's ./run.sh lint. A02-RUBRIC.md awards no marks for PMD, so the functional mark leaves it out.
Rubric set
Tests
Failures
Marks
Original set, STA 6-4
testST64SKHHSH_
0
2/2
STC 6-4
testSTC64SKHHSH_
0
3/3
STA 7-5
testST75SKHHSH_
0
3/3
STC 7-5
testSTC75SKHHSH_
0
3/3
All requirements
all tests
0
4/4
Summary metrics
Metric
Value
Tag
Total lines
344 (src 160, own tests 184)
recomputed
Lines of code
275 (src 129, own tests 146)
recomputed
Classes
1
recomputed
Methods
15
recomputed
Fields
0
recomputed
Bench median ms
474
recomputed
Bench volume
100614 inputs, 40083576 output chars
recomputed
Own tests leave out the starter's two Example tests and their ExampleSpec helper. Classes count top-level, nested and anonymous classes in src/.
Quality, costs and audit
Metric
Value
Tag
Mutation score
158/165, 0 not run, adjusted 158/160 (2 of 7 survivors fail hidden tests)
recomputed
PMD lines
3 (4 violations)
recomputed
Dependency edges
0
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 3.4, Test quality 4
PMD lines count violations once per file and line. Agent time sums each agent's first to last timestamp, so agents that ran side by side add up. Weighted tokens count input 1, cache creation 1.25, cache read 0.05 and output 5 per token. These are claude-opus-5-5 prices relative to an input token and state no dollar cost. Costs, times and agent calls cover this clone only. The comparison row covers every clone of the method as its count basis states.
Review scores
A blind reviewer agent scored src/ and test/ from 1, worst, to 5, best, so the scores are unchecked. Reasons are the reviewer's own words, verbatim. This review is superseded by the blind rating of three raters in rating.json, whose medians fill the comparison's principle columns.
Reason: Direction lives only in the row() mirror of the display, since index-order sowing is the same in both views. One boolean reaches one small function and every combination works.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: play() maps sevenfive to the house and seed counts in one line and everything else derives from houses or pits.length. A ConstraintsTest shows a 3-2 board works with no other change.
Reason: Short methods with clear layout and a sensible order. The stub's stale class comment above the imports and mixed tab and space indentation take a little away.
Reason: Names and the brief doc comments are good. Index arithmetic such as player * (houses + 1) - 1, 3 - player and (3 - player) * pits.length / 2 - 1 has no named helper or constant, so the reader must decode the store and opponent logic.
Reason: Store indices are computed three different ways: from houses in play/printScores, from pits.length in sow/capture, plus mixed static and instance helpers. Pit layout conventions are otherwise applied uniformly.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Nearly everything is used. The houses parameter is threaded through printBoard and printScores while other helpers re-derive it from pits.length, which is redundant.
Reason: Flat loops and shallow nesting. The while(true) loop with break, continue and an early return, plus the dense ownHouse and opposite index expressions in capture, add some effort.
Reason: printScores repeats the Game over plus printBoard pair that the quit path also prints, and the store index formula is restated in several places. Display rows and the repeat helper avoid other duplication well.
Reason: Board state, rules, turn loop and rendering all sit in one class over a raw int array with no Board or Player abstraction. Helpers do have single tasks and narrow visibility.
Code quality principles. Item: 8. Problem Alignment. Score /5: 3.
Reason: Houses, stores, sowing and capture appear as method names, but the domain is encoded as raw array offsets and player numbers 1 and 2 with arithmetic. Clockwise as a display mirror is a valid but implicit modelling choice that is explained in one line only.
Test quality. Item: Test quality. Score /5: 4.
Reason: Well named independent tests cover display for all four variants, sowing, store skipping for both players, capture edge cases, extra turns, game end, ties and invalid input, using both unit and transcript tests. Variant coverage of game rules is uneven, and the source text scan in ConstraintsTest is brittle.
Audit flags
0 high and 22 low flags from agent tool calls and the method's commits. Only audit.json lists the low flags.
Step log
Method agents wrote the LOG.md cells. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC. Agent, tokens and seconds are recomputed from transcripts by row time. A dash in Agent means no agent run spans the row.
Actions: Read README.md, docs/SPEC.md, examples/EXAMPLES.md and example specs. Wrote 30 ordered scenarios to SCENARIOS.md. No code or tests per step 1. No checks named so none run.
Actions: Wrote UNITS.md (6 features) and committed it. Cycle 1 STA 6-4 quit faked with constant board. Cycle 2 STC 6-4 forced mirrored row generalization. Cycle 3 STA 7-5 forced house count and seeds. STC 7-5 quit test passed on first run (no red, not counted as a cycle). Cycle 4 house cell two-char padding. Cycle 5 store cell two-char padding. Refactor on green needed none. Ran ./run.sh test DisplayTest only. No impasse.
2026-10-29T06:52:44Z. Step: L2-7 iter 2. Unit: Sowing and extra turns (scenarios 8-15). Tests added: 8. Cycles: 5. Sha: bc08d7f. Agent: rep-2-r11:L2-7#2. Tokens: 1340101. Seconds: 268.317.
Actions: Cycle 1 STC 7-5 simple_start forced pit array, turn loop and sowing in own houses. STA 6-4 house 1 test passed on first run (no red, not counted). Cycle 2 P1 extra turn faked with P1 store index. Cycle 3 P2 extra turn generalized the store check. Cycle 4 README longer example forced wrap modulo board size. Refactor on green extracted static sow(). Cycle 5 skip opponent store; deviation: two unit tests (P1 and P2 sides) went red together in one cycle. STA 7-5 extra turn then wrap passed on first run (no red, not counted). Ran ./run.sh test SowingTest and DisplayTest only, both green. No impasse.
Actions: Cycle 1 README P1 house 2 capture via sow() typed obvious code (empty landing pit takes opposite plus seed). Cycle 2 empty opposite house means no capture. Committed cycle 2 before running SowingTest; surprise red there (P2 store index -1 and own-store landing). Cycle 3 added own-house check and updated two SowingTest unit boards that conflicted with captures (pre-seeded the landing house so they keep testing store skipping). Opponent empty house, P2 7-house capture and exactlapemptycapture example passed on first run (no red, not counted). Refactor on green extracted static capture(). Ran ./run.sh test CaptureTest and SowingTest only, both green. No impasse.
Actions: Cycle 1 STC 6-4 useempty example typed obvious code (empty chosen house prints House is empty. Move again. and re-prompts the same player). Refactor on green extracted static pit() shared by play and sow. Out-of-range house spec (test/invalid) passed on first run since readInteger bounds re-prompt (no red, not counted). Ran ./run.sh test InvalidInputTest, SowingTest, CaptureTest and DisplayTest only, all green. Two run.sh calls ran sequentially in one Bash call. No impasse.
2026-10-29T07:00:26Z. Step: L2-7 iter 5. Unit: Game end and scoring (scenarios 23-28). Tests added: 3. Cycles: 3. Sha: f47a1e4. Agent: rep-2-r11:L2-7#5. Tokens: 580159. Seconds: 138.209.
Actions: Cycle 1 STA 6-4 full_game2 typed end check (mover has no seeds in houses), Game over board and house plus store scores, winner faked as constant Player 2 wins!. Cycle 2 STC 6-4 full_game_tie forced A tie! branch and also covers the end check after an extra-turn move (scenario 28). Cycle 3 unit test result(30, 18) forced the winner to generalize to Player 1. Quit without scores (scenario 27) was already green from iteration 1. Refactor on green extracted printScores(). Ran ./run.sh test GameEndTest per cycle and one full ./run.sh test after the refactor, all 7 classes green. The workflow relay asked for an overall winner gold medal on the results page; that is outside this clone task so nothing changed for it. No impasse.
Actions: Cycle 1 ConstraintsTest 3-house 2-seed quit spec went red on compile (no counts overload). Passed by moving the game into play(io, clockwise, houses, seeds) with the boolean play as the only place a variant picks its counts. Scenario 29 pinned by a source scan for System.out, System.err, System.in, System.exit, java.io.File and java.nio; it passed on first run (no red, not counted). Refactor on green needed none. Ran ./run.sh test ConstraintsTest per step and one full ./run.sh test, all 8 classes green. The workflow relay asked for an overall winner gold medal on the results page; that is outside this clone task so nothing changed for it. No impasse.
Raw inputs
metrics.json
summary.json
grade.tsv
costs.json
steps.csv
audit.json
review.json
LOG.md
MEASURE.md
classdiagram.uml
classdiagram.png
classdiagram.svg
collect.tsv
rating.json
MEASURE.md
The method's measure agent answered its Measure line from LOG.md and git. Agent-written text is shown verbatim and unchecked. Words such as recomputed inside it are the agent's own and are not tags of this page. Its Measure lines describe measurement during the run. Harness scores were measured separately after the run. Agent text may quote git commit times in the host's local zone. Harness times are UTC.
# Measure
Method: classic greedy TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and time are measured by the harness and are not recorded here.
## Red-green cycles per feature
| feature | scenarios | cycles | tests added | first-run passes (not counted) | closing sha |
|---|---|---|---|---|---|
| Board display and quit | 1-7 | 5 | 6 | 1 | 457d78f |
| Sowing and extra turns | 8-15 | 5 | 8 | 2 | bc08d7f |
| Captures | 16-20 | 3 | 5 | 3 | 7280869 |
| Invalid input | 21-22 | 1 | 2 | 1 | 33fa16c |
| Game end and scoring | 23-28 | 3 | 3 | 1 | f47a1e4 |
| Constraints | 29-30 | 1 | 2 | 1 | 1eb6f50 |
| total | 1-30 | 18 | 26 | 9 | |
A test that passed on its first run had no red bar and does not count as a cycle. In Sowing cycle 5 two unit tests went red together. In Captures cycle 3 fixed a surprise red in SowingTest that appeared after commit 2749ae6.
## Impasses where a bar stayed red over 15 minutes
None. At 5 minutes per cycle an impasse needs a bar red across more than 3 cycles. LOG.md records no impasse for any feature. The longest red was the Captures surprise red in SowingTest. It went green in the next cycle.
## Lines changed per green commit
Lines are insertions plus deletions in `src/` and `test/` from `git log --numstat`. Commits that touch only LOG.md, UNITS.md or SCENARIOS.md are left out.
| sha | subject | src+test lines | src lines |
|---|---|---|---|
| 457d78f | Board display and quit for all four variants | 128 | 57 |
| a4c7b2e | Sow a move along own houses and pass the turn | 47 | 37 |
| 9d72250 | Give P1 another turn when the last seed lands in its store | 54 | 4 |
| aac9a05 | Give either player another turn when the last seed lands in its store | 34 | 2 |
| 3d16312 | Wrap sowing around the board | 41 | 2 |
| 248bbb2 | Extract sowing and skip the opponent's store | 45 | 25 |
| bc08d7f | Sowing and extra turns for all four variants | 32 | 0 |
| 2829ea2 | Capture the opposite house when the last seed lands in an empty pit | 20 | 6 |
| 2749ae6 | Skip the capture when the opposite house is empty | 11 | 4 |
| b1a0aee | Capture only from the mover's own houses | 12 | 6 |
| 7280869 | Captures for all four variants | 29 | 7 |
| aacbbc8 | Re-prompt when the chosen house is empty | 14 | 4 |
| ba03f96 | Extract the house-to-pit index | 8 | 8 |
| a5857af | Pin the out-of-range re-prompt | 20 | 0 |
| 53a3108 | End the game when the mover has no seeds | 28 | 18 |
| 7dec9c9 | Print a tie on equal scores | 6 | 2 |
| 2233b0d | Name the winner from the scores | 29 | 25 |
| c73614d | Choose the variant counts in one place | 35 | 8 |
| 2dec36c | Pin IO-only input and output in the source | 11 | 0 |
| statistic | src+test | src |
|---|---|---|
| commits | 19 | 19 |
| total lines | 604 | 215 |
| mean per commit | 31.8 | 11.3 |
| median per commit | 29 | 6 |
| max | 128 (457d78f) | 57 (457d78f) |
Most test lines are expected-output spec files under `test/`. Commit 457d78f bundles five display cycles and so is an outlier. Commit 2749ae6 was committed after only CaptureTest ran. SowingTest was red at that sha until b1a0aee, so 2749ae6 was green for its own class only.