One big step per feature. Drop a gear when it stalls.
Source runs full-1, rep-2 and rep-1 at tdd-experiment c3dd988
Contents
Step size
What it changes: Step size. Large first then shrink on a stall.
No award in this survey.
One method of the study, from runs full-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-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: Step size. Idea: One big step per feature. Drop a gear when it stalls. What it changes in the search: Step size. Large first then shrink on a stall.
throughout:2. Set four gears: feature, class, method, fake-it. Start in the feature gear.repeat per feature until none is open:1. Write one failing end-to-end acceptance test for the next feature.3. Attempt the whole feature in one assistant prompt against the acceptance test.4. Shrink rule: one failed attempt or 10 minutes red. Revert and drop a gear.5. In lower gears drive each class or method with its own unit test.6. Fake-it gear is classic TDD. Split any test still stuck there.7. Once acceptance passes add edge-case unit tests. Refactor on green.8. Return to the feature gear for the next feature.
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 16.1
Stage flow of Coarse-to-fine TDD
Step 2.Lane: Throughout.
Steps 1, 3 to 8.Lane: Agent.
Loop: repeat per feature, back to Steps 1, 3 to 8.
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.
Loop: repeat per feature, back to Steps 1, 3 to 8.
Stages
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
Step 2
throughout:
2. Set four gears: feature, class, method, fake-it. Start in the feature gear.
none
none
Steps 1, 3 to 8
repeat per feature until none is open:
1. Write one failing end-to-end acceptance test for the next feature. 3. Attempt the whole feature in one assistant prompt against the acceptance test. 4. Shrink rule: one failed attempt or 10 minutes red. Revert and drop a gear. 5. In lower gears drive each class or method with its own unit test. 6. Fake-it gear is classic TDD. Split any test still stuck there. 7. Once acceptance passes add edge-case unit tests. Refactor on green. 8. Return to the feature gear for the next feature.
unit feature
10 minutes red is 2 red-green cycles. An attempt stays uncommitted until green, and a shrink reverts it with git restore.
Survey build
One build in run full-1.
15/15Functional mark
6E
926,685Cost to completion
537,832M
420,899M_io
6PMD findings
noAlignment
Replicates
Repeat builds: 5 in run rep-2.
1.000Median adjusted mutation, over 5 replicates in rep-2
3Median classes, over 5 replicates in rep-2
926,033Median cost to completion, over 5 replicates in rep-2
16Median CQP, over 5 replicates in rep-2
M against Classic greedy TDD: U 9, Holm p 1.000; adjusted mutation against Classic greedy TDD: U 11, Holm p 1.000Planned contrast, exact, Holm, rep-2
1.06Consistency score C, exploratory over rep-1 and rep-2, lower is more consistent
Verdict
One survey build and 5 replicates in rep-2. The survey build passed 0.39 of the hidden tests at 500000 weighted tokens, level with Most informative next test and behind Held-out TDD at 0.42. It reached adjusted mutation 1.000 with 3 classes and 6 PMD violations. The M test of its 5 rep-2 replicates against Classic greedy TDD did not detect a difference (U 9 and Holm p 1.000). The replicates passed a median 0.34 of the hidden tests at 500000 weighted tokens in a different batch from the survey build. Tag: recomputed.
Report summary
The report's class diagram for this design is identical to Figure 16.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 (6 violations)
Mutation score
102/111, 0 not run, adjusted 102/102 (0 of 9 survivors fail hidden tests)
Classes
3
Simple Constructs /5
4
Minimal Duplication /5
4
Modular Structure /5
5
Problem Alignment (tentative) /5
4
Weighted tokens
969,366
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
Classes3joint 6th highest of 11 single survey builds, one per method
Cost to completion926,6856th lowest of 11 single survey builds, one per method
Strict PMD violations68th lowest of 11 single survey builds, one per method
Median adjusted mutation1.000over 5 replicates in rep-2
Median classes3over 5 replicates in rep-2
Median cost to completion926,033over 5 replicates in rep-2
Median CQP16over 5 replicates in rep-2
Planned contrastM against Classic greedy TDD: U 9, Holm p 1.000; adjusted mutation against Classic greedy TDD: U 11, Holm p 1.000exact, Holm, rep-2
Consistency score C1.06exploratory 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/coarse-to-fine. 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
683 (src 237, own tests 446)
recomputed
Lines of code
539 (src 182, own tests 357)
recomputed
Classes
3
recomputed
Methods
23
recomputed
Fields
6
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
102/111, 0 not run, adjusted 102/102 (0 of 9 survivors fail hidden tests)
recomputed
PMD lines
6 (6 violations)
recomputed
Dependency edges
3
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4.4, 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: Sowing logic is direction-neutral, and direction lives only in BoardRenderer's mirrored layout behind one boolean. Changing or adding a direction touches one small class.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House and seed counts are constructor parameters of Board, chosen in one line of play(). The renderer and prompt derive everything from houseCount().
Reason: Classes and methods are short, consistently formatted and readable on one screen. The sow loop with its side/index/inStore flags takes some care to follow.
Reason: Names such as hasMoves, score, capture and gameOver match the domain, and the Javadoc explains the sowing rule. Players as raw 0/1 and the expression 1 - player are less explanatory than named constants.
Reason: Plain arrays, loops and small helpers with no needless abstraction. The single sow loop that handles the store and side switching is a little dense.
Reason: Rendering shares its houses/pad/border helpers between both layouts and the two-row board avoids mirrored logic. The two branches in render still repeat a similar line structure.
Reason: Board holds the rules, BoardRenderer the output and Kalah the game loop and IO, each with one clear responsibility and narrow interfaces.
Code quality principles. Item: 8. Problem Alignment. Score /5: 5.
Reason: The code models houses, stores, sowing, capture, extra move and scoring directly in the game's terms. It recognises that the sowing direction is a matter of presentation.
Test quality. Item: Test quality. Score /5: 5.
Reason: BoardTest pins sowing, the store skip, laps, capture edge cases, extra move and scoring with clear independent names. Acceptance tests cover every scenario in all four variants plus a generated full-game end check for each variant.
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.
Step log, 6 rows and 10 columns
2026-10-15T23:55:38Z. Step: L1,3-8 iteration 1. Unit: Board display and quit before any move. Tests added: 10. Cycles: 3. Sha: 31b97b3. Agent: coarse-to-fine:L1,3-8#1. Tokens: 1244750. Seconds: 154.443.
Actions: Wrote UNITS.md (6 features). Feature gear: acceptance QuitAcceptanceTest with specs for the three non-example variants under test/accept, red, then Board, BoardRenderer and Kalah.play in one attempt. First green run failed only on the specs: the Write and Edit tools strip the trailing space after the prompt, so the spec files were fixed with sed (conflict with the no-sed edit rule, logged here). Production code was unchanged, so no shrink. Green, then edge unit tests for Board and BoardRenderer, then refactor (import Arrays) on green. Example full-game tests stay red until later units.
Actions: Feature gear: acceptance SowAcceptanceTest with sow.txt specs for all four variants (one plain move each, then quit) plus the example simple_start.txt, red. One attempt added Board.sow and the turn loop in Kalah.play and went green, so no shrink. The Write tool again stripped the trailing prompt space in the specs, fixed with sed (conflict with the no-sed edit rule, logged here). Then five sowing edge tests in BoardTest (empty chosen house, own store then opponent, skip opponent store and lap, 13-seed lap, seed conservation), green. Refactor on green merged the duplicated side switch in sow. Example tests for empty house, capture and game end stay red until later units.
2026-10-15T23:59:16Z. Step: L1,3-8 iteration 3. Unit: Extra move when the last seed lands in the store. Tests added: 8. Cycles: 2. Sha: 2712ed2. Agent: coarse-to-fine:L1,3-8#3. Tokens: 674146. Seconds: 92.987.
Actions: Feature gear: acceptance ExtraMoveAcceptanceTest with extra.txt specs for all four variants (P1 sows house 3 into its store, is prompted again, then quits), red on the repeated P1 prompt. One attempt made Board.sow return whether the last seed landed in the mover's store and Kalah.play keep the turn on true, green first try, so no shrink. The Write tool again stripped the trailing prompt space in the specs, fixed with sed (conflict with the no-sed edit rule, logged here). Then four edge tests in BoardTest (store end for either player, end in own house, pass own store into opponent, lap back into own store), green. No refactor needed on green. Example tests for capture, empty house and game end stay red until later units.
Actions: Feature gear: acceptance CaptureAcceptanceTest with capture.txt specs for all four variants (P1 empties its last house, P2 moves, P1 lands its last seed in that empty house and captures P2's house 1, then P2 quits), red on the capture board. One attempt added Board.capture after sowing, and acceptance went green with the example exactlapemptycapture also passing, so no shrink. The earlier unit test testSowOfThirteenReturnsOneSeedToTheEmptiedHouse pinned the pre-capture lap and conflicted with README rule 3, so it was rewritten to expect the capture. The Write tool again stripped the trailing prompt space in the specs, fixed with sed (conflict with the no-sed edit rule, logged here). Then three edge tests in BoardTest (empty opposite house, P2 capture with seed conservation, landing in the opponent's empty house), green. No refactor needed on green. Example tests for empty house and game end stay red until later units.
Actions: Feature gear: acceptance EmptyHouseAcceptanceTest with empty.txt specs for all four variants (P1 sows 1, P2 sows 1, P1 picks its empty house 1, sees "House is empty. Move again.", the board and its own prompt again, then quits), red on the missing notice. One attempt made Kalah.play check Board.seeds before sowing and keep the turn, green first try with the example useempty also passing, so no shrink. To keep the prompt's trailing space the spec files were generated by small shell scripts in .scratch (sed -n slices of sow.txt and printf), which conflicts with the no-script edit rule, logged here. Then two edge acceptance tests (P1 picks the empty house twice in a row in clockwise 7-5, P2 picks its empty house in anti-clockwise 6-4), green. No refactor needed on green. Example full-game tests stay red until the game-end unit.
2026-10-16T00:14:04Z. Step: L1,3-8 iteration 6. Unit: Game end with final scores and winner or tie. Tests added: 11. Cycles: 3. Sha: 015c555. Agent: coarse-to-fine:L1,3-8#6. Tokens: 1023449. Seconds: 114.089.
Actions: Feature gear: acceptance GameEndAcceptanceTest plays a whole game in all four variants through a new ScriptedIO fake that answers each prompt with the next house number in a cycle (capped, then quits), and checks "Game over", the board, tab-indented scores summing to all seeds and the matching winner or tie line. It also plays the example full_game2 and full_game_tie specs. Red on the missing game end. One attempt added Board.hasMoves and Board.score and made Kalah.play stop when the player to move has no seeds and print the result, green first try with every test class green including both example full-game tests, so no shrink. Then five edge tests in BoardTest (moves at the start, no moves once own houses are empty, starting score, store plus houses, seeds sown to the opponent count for the opponent), green. Refactor on green merged the duplicated game-over output into Kalah.gameOver. No spec files were written this iteration, so no sed or script edits.
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: coarse-to-fine TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone.
Credits and wall-clock time are measured by the harness. The figures below come from the repository records only.
| metric | value | source |
|---|---|---|
| Minutes to first green acceptance test | 5 by the cycle rule (one red-green cycle). Commit clock shows 1 min 26 s from the units checklist (9d51e63 12:53:51) to the first green acceptance commit (fac808e 12:55:17). Harness time is authoritative. | LOG.md row 1, git log |
| Gear drops per feature | 0 for each of the 6 features. Every acceptance test went green on the first feature-gear attempt, so no feature shrank to a finer gear. | LOG.md rows 1 to 6 |
| Lines discarded per revert | 0. No reverts were made. git log has no revert commit and LOG.md records no revert. | git log, LOG.md |
| Mutation score on feature-gear code | Not measured. No `./run.sh mutate` run is recorded in LOG.md or git log. | LOG.md |
## Per feature
| # | feature | feature-gear commit | gear drops | reverts | cycles | tests added |
|---|---|---|---|---|---|---|
| 1 | Board display and quit before any move | fac808e | 0 | 0 | 3 | 10 |
| 2 | Sowing a move and alternating turns | d01d639 | 0 | 0 | 3 | 10 |
| 3 | Extra move when the last seed lands in the store | f3feb60 | 0 | 0 | 2 | 8 |
| 4 | Capture into the store | 3c76779 | 0 | 0 | 2 | 7 |
| 5 | Choosing an empty house asks again | 184c5ee | 0 | 0 | 2 | 6 |
| 6 | Game end with final scores and winner or tie | 48e8b83 | 0 | 0 | 3 | 11 |
| | total | | 0 | 0 | 15 | 52 |
Note. Feature 4 rewrote one earlier unit test that pinned the pre-capture lap and conflicted with README rule 3. That is a test correction and not a revert.
Branch method/rep-2-r03. 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 (8 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
784 (src 278, own tests 506)
recomputed
Lines of code
605 (src 207, own tests 398)
recomputed
Classes
7
recomputed
Methods
30
recomputed
Fields
6
recomputed
Bench median ms
549
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
139/146, 0 not run, adjusted 139/140 (1 of 7 survivors fail hidden tests)
recomputed
PMD lines
8 (8 violations)
recomputed
Dependency edges
15
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 by one BoardLayout strategy picked in a single ternary in play(). The sowing logic is shared, so a new direction needs only a new layout class.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House count and seed count are Board constructor arguments chosen in one line. Every loop, border and capture uses getHouseCount(), so any size works with either direction.
Reason: Names and Javadoc are clear, and QUIT is a named constant. The literals 3 - side, 2 - player and the pit == 0 store sentinel carry meaning that no constant or name explains.
Reason: Most methods are flat and short. The sow loop combines a side flip, a store increment and a reset to pit 0 used as a sentinel, so it takes some care to follow.
Reason: Cell formatting is centralised in BoardCells. Small repeats remain: housesAscending and housesDescending are near copies, and the Game over line followed by a board print appears twice in play().
Reason: Board holds the rules, BoardCells and the layouts handle the rows, BoardPrinter handles borders and Kalah runs the game loop. Each class has one job and few dependencies.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Board models houses and stores directly, and its sowing reads like the game rules. The parallel houses and stores arrays need the pit 0 sentinel to stand for a store, which is a little removed from the board's real cycle of pits.
Test quality. Item: Test quality. Score /5: 5.
Reason: Unit tests cover sowing, wraparound, captures, edge cases on 7-house boards, the game end and both layouts, with descriptive names. Acceptance tests cover all four variants. Test IO helpers keep each case independent.
Audit flags
0 high and 0 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.
Step log, 5 rows and 10 columns
2026-10-29T07:42:16Z. Step: L1,3-8 iteration 1. Unit: Initial board for all four variants and quit before any move. Tests added: 19. Cycles: 8. Sha: b56008c. Agent: rep-2-r03:L1,3-8#1. Tokens: 2460403. Seconds: 415.804.
Actions: Wrote UNITS.md with 5 features. Acceptance QuitAcceptanceTest red on stub. Feature gear attempt failed because the edit tools strip trailing spaces from fixture prompt lines. Shrink rule applied: production attempt reverted with git restore and the new untracked files removed. Fixtures rebuilt by copying examples quit.txt and editing board lines. Class gear drove Board, BoardCells, AnticlockwiseLayout, ClockwiseLayout, BoardPrinter and Kalah each with its own test. Acceptance green. Edge tests added for two-digit cells and out-of-range houses. No refactor needed. Full ./run.sh test: all new tests green, 5 example tests red pending later features. Conflict: standing guidance asks for a CI guard per bug. The fixture whitespace defect is test data and its guard is the acceptance test itself.
2026-10-29T07:48:04Z. Step: L1,3-8 iteration 2. Unit: Sowing a move and passing the turn. Tests added: 6. Cycles: 2. Sha: 70b44f3. Agent: rep-2-r03:L1,3-8#2. Tokens: 1162146. Seconds: 364.055.
Actions: Acceptance SowAcceptanceTest red: one new anti-clockwise 6-4 fixture built by copying the clockwise 7-5 simple_start.txt and editing only board lines so prompt trailing spaces survive, plus the clockwise 7-5 example. Feature gear: Board.sow and the Kalah move loop in one attempt. Acceptance green on the first attempt so no shrink. Edge tests added for passing the own store, skipping the opponent store with a wrap to own houses and the seven-house board. No refactor needed. Full ./run.sh test: 4 example tests red pending later features, ExampleClockwiseTest.testSimpleStart75 now green.
2026-10-29T07:50:50Z. Step: L1,3-8 iteration 3. Unit: Choosing an empty house asks for another move. Tests added: 5. Cycles: 2. Sha: 3ec1d34. Agent: rep-2-r03:L1,3-8#3. Tokens: 668529. Seconds: 143.359.
Actions: Acceptance UseEmptyAcceptanceTest red: one new anti-clockwise 6-4 fixture copied from the clockwise useempty.txt with only board lines edited so prompt trailing spaces survive, plus the clockwise 6-4 example. Feature gear: empty-house check in the Kalah move loop in one attempt. Acceptance green on the first attempt so no shrink. Edge tests added with a new ScriptedIO helper for a repeated empty choice, player two choosing an empty house and an unchanged board after an empty choice. No refactor needed. Full ./run.sh test: 3 example tests red pending capture, extra turn and game end, ExampleClockwiseTest.testUseEmpty now green. Conflict: the implementer guidance forbids sed edits. UNITS.md was ticked with sed as a one-line mechanical change.
2026-10-29T07:55:13Z. Step: L1,3-8 iteration 4. Unit: Extra turn on a store landing and capture including an exact lap. Tests added: 11. Cycles: 2. Sha: 1210441. Agent: rep-2-r03:L1,3-8#4. Tokens: 1083990. Seconds: 265.98.
Actions: Acceptance StoreAndCaptureAcceptanceTest red: one new anti-clockwise 6-4 extra-turn fixture copied from simple_start_sta_6_4.txt with board, input and prompt-name edits that kept prompt trailing spaces, plus the anti-clockwise 6-4 exactlapemptycapture example. Feature gear: Board.sow returns whether the last seed hit the own store and captures on an own empty house, and the Kalah loop keeps the player on a store landing. Acceptance green on the first attempt so no shrink. Full run then showed BoardTest.testSowSkipsOpponentStoreAndWrapsToOwnHouses red because its last sow is a real capture. Its expectations predated the capture rule and were updated to it. Edge tests added for store landings for both players, no capture with an empty opposite, no capture in an opponent house, the seven-house opposite mapping and a seven-house exact lap. No refactor needed. Full ./run.sh test: only testFullGame2 and testFullGameTie red pending game end, testExactLapEmptyCapture now green.
2026-10-29T07:58:00Z. Step: L1,3-8 iteration 5. Unit: Game end with final scores and the winner or a tie. Tests added: 7. Cycles: 2. Sha: e4397d3. Agent: rep-2-r03:L1,3-8#5. Tokens: 586249. Seconds: 162.33.
Actions: Acceptance GameEndAcceptanceTest red using the anti-clockwise 6-4 full_game2 example (player 2 wins) and the clockwise 6-4 full_game_tie example. Feature gear: Board.hasMoves and Board.getScore plus a Kalah loop that ends when the player to move has no seeds and prints scores and the winner or a tie. Acceptance green on the first attempt so no shrink. Edge tests added for moves on a full board, no moves after emptying houses, score counting of store plus houses, the starting score and seeds sown to the opponent counting for the opponent. No refactor needed. Full ./run.sh test: 15 classes green including all example tests. Gap: no test drives a player 1 win message because play() offers no small board. Conflict: UNITS.md ticked with sed as a one-line mechanical change against the no-sed implementer guidance.
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: coarse-to-fine TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone.
Credits and wall-clock time are measured by the harness. The figures below come only from the repository.
## Minutes to first green acceptance test
The first acceptance test to go green was QuitAcceptanceTest in iteration 1 at commit 10e2487.
It took 8 red-green cycles. At 5 minutes per cycle that is 40 minutes.
Commit timestamps put it 4 min 46 s after the checklist commit 2410929. The harness holds the real elapsed time.
| iteration | unit | cycles to green acceptance | cycle minutes |
|---|---|---|---|
| 1 | initial board and quit | 8 | 40 |
| 2 | sowing and passing the turn | 2 | 10 |
| 3 | empty house asks again | 2 | 10 |
| 4 | extra turn and capture | 2 | 10 |
| 5 | game end and result | 2 | 10 |
## Gear drops per feature
| iteration | unit | gear drops | gear path |
|---|---|---|---|
| 1 | initial board and quit | 1 | feature to class |
| 2 | sowing and passing the turn | 0 | feature |
| 3 | empty house asks again | 0 | feature |
| 4 | extra turn and capture | 0 | feature |
| 5 | game end and result | 0 | feature |
Total 1 drop over 5 features. Mean 0.2 per feature.
The one drop came from a fixture defect. The edit tools stripped trailing spaces from prompt lines. It was not a design misstep.
## Lines discarded per revert
| iteration | reverts | lines discarded |
|---|---|---|
| 1 | 1 | not recorded |
| 2 to 5 | 0 | 0 |
The iteration 1 revert used git restore on uncommitted work and removed new untracked files. Git keeps no record of it and LOG.md gives no line count. The figure is unknown.
## Mutation score on feature-gear code
Not measured. This step names no checks, so ./run.sh mutate was not run.
The feature-gear code it would cover is Board.sow, Board.hasMoves, Board.getScore and the Kalah move loop from iterations 2 to 5.
Branch method/rep-2-r06. 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 (5 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
691 (src 214, own tests 477)
recomputed
Lines of code
547 (src 168, own tests 379)
recomputed
Classes
3
recomputed
Methods
20
recomputed
Fields
4
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
103/111, 0 not run, adjusted 103/103 (0 of 8 survivors fail hidden tests)
recomputed
PMD lines
5 (5 violations)
recomputed
Dependency edges
3
recomputed
Review scores (superseded)
Alterability 5, Code quality principles 4.6, 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 lives entirely in BoardPrinter as one boolean that mirrors the layout. Board's sowing order is the same for both directions, so the flag touches nothing else.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: Board is parameterised by house count and seeds, and the printer and the input range read houseCount(). The variant is chosen in one line of play().
Reason: Names like sow, captureAt, hasSeeds, score and storeCell come from the domain, and the short Javadocs explain why. Players as bare 0/1 and the expression 1 - player are a little cryptic.
Reason: The rules (Board), the rendering (BoardPrinter) and the turn flow with IO (Kalah) are split cleanly with small interfaces.
Code quality principles. Item: 8. Problem Alignment. Score /5: 5.
Reason: The structure mirrors the Kalah rules directly: houses, stores, sow, capture, the seeds-left end condition and score. The variants map to constructor arguments and a printer flag.
Test quality. Item: Test quality. Score /5: 5.
Reason: Acceptance specs cover six features across all four variants, and unit tests pin sow laps, store skipping, the extra turn, capture edge cases, game end, scoring, tie or win output and the empty-house flow. Names are descriptive and each case is independent.
Audit flags
0 high and 7 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.
Step log, 6 rows and 10 columns
2026-10-29T06:45:31Z. Step: L1,3-8 iteration 1. Unit: Show the starting board of each variant and quit with q. Tests added: 8. Cycles: 3. Sha: 02c54b3. Agent: rep-2-r06:L1,3-8#1. Tokens: 1274209. Seconds: 219.836.
Actions: Wrote UNITS.md (6 features). Acceptance test QuitAcceptanceTest over 4 variants went red. Feature gear attempt (Board, BoardPrinter, Kalah.play) failed once only because the Write tool stripped the trailing space after the prompt in the 3 new spec files. The code was unchanged and correct, so no shrink or revert. The spec data was fixed with one sed call, which conflicts with the edit-tools-only guidance because those tools cannot keep trailing spaces. Acceptance went green in the feature gear. Added edge unit tests BoardTest and BoardPrinterTest with a RecordingIO fake. Refactor on green tidied an import. The 5 remaining example test failures belong to later units.
2026-10-29T06:48:16Z. Step: L1,3-8 iteration 2. Unit: Sow a chosen house and pass the turn to the other player. Tests added: 7. Cycles: 2. Sha: 98be2e0. Agent: rep-2-r06:L1,3-8#2. Tokens: 755197. Seconds: 162.12.
Actions: Acceptance test SowAcceptanceTest over 4 variants (each player sows its last house past its own store) went red. Spec files were generated by a scratch shell script to keep the trailing prompt space, which conflicts with the edit-tools-only guidance. Feature gear attempt (Board.sow and the turn loop in Kalah.play) went green first try, so no shrink. Added edge unit tests in BoardTest for a plain sow, skipping the opponent store and a 13 seed lap. Refactor on green found nothing to change. Full ./run.sh test has 4 example failures left, all for later units (extra turn, capture, empty house, game end).
2026-10-29T06:50:18Z. Step: L1,3-8 iteration 3. Unit: Give another move when the last seed lands in the player's store. Tests added: 8. Cycles: 2. Sha: 17d10e2. Agent: rep-2-r06:L1,3-8#3. Tokens: 531355. Seconds: 120.126.
Actions: Acceptance test ExtraTurnAcceptanceTest over 4 variants (P1 sows house 3 into its store, moves again, quits) went red at the second P1 prompt. Spec files were generated by a scratch shell script to keep the trailing prompt space, which conflicts with the edit-tools-only guidance. A sed call ticked UNITS.md, which also conflicts with that guidance. Feature gear attempt (Board.sow returns true when the last seed lands in the own store, Kalah.play keeps the player) went green first try, so no shrink. Added edge unit tests in BoardTest for P2 ending in its store, passing the store, stopping short of it and a full lap ending in it. Refactor on green found nothing to change. Full ./run.sh test has 4 example failures left, all for later units (empty house, capture, game end).
2026-10-29T06:52:22Z. Step: L1,3-8 iteration 4. Unit: Reject an empty house with a message and ask again. Tests added: 8. Cycles: 2. Sha: 9af8319. Agent: rep-2-r06:L1,3-8#4. Tokens: 494459. Seconds: 122.389.
Actions: Acceptance test EmptyHouseAcceptanceTest over 4 variants (P1 and P2 sow house 1, P1 picks its empty house 1, sees the message, is asked again, quits) went red at the message line. Spec files were generated by a scratch shell script to keep the trailing prompt space, which conflicts with the edit-tools-only guidance. A shell append wrote this LOG.md row, which also conflicts with that guidance. Feature gear attempt (Kalah.play prints House is empty. Move again. and keeps the same player) went green first try, so no shrink. Example testUseEmpty now passes too. Added edge unit tests in KalahEmptyHouseTest with a scripted IO for P2 choosing an empty house, repeated empty choices, an unchanged board after the message and no message for a house with seeds. Refactor on green found nothing to change. Full ./run.sh test has 3 example failures left, all for later units (capture, game end).
2026-10-29T06:55:30Z. Step: L1,3-8 iteration 5. Unit: Capture when the last seed lands in an empty own house opposite seeds. Tests added: 8. Cycles: 3. Sha: 0e5370c. Agent: rep-2-r06:L1,3-8#5. Tokens: 800258. Seconds: 195.834.
Actions: Acceptance test CaptureAcceptanceTest over 4 variants (P1 sows house n, P2 sows house n, P1 sows house 1 and captures into its empty house n, P2 quits) went red at the capture board. Spec files were generated by a scratch shell script with a heredoc to keep the trailing prompt space, which conflicts with the edit-tools-only guidance. Feature gear attempt (Board.sow calls captureAt when the last seed lands alone in an own house with seeds opposite) made acceptance and example testExactLapEmptyCapture green first try, so no shrink. It turned the iteration 2 BoardTest 13 seed lap test red because that test pinned the pre-capture result; the test now expects the capture the spec requires, a change to an existing test. Added edge unit tests in BoardCaptureTest for a P2 capture, an empty opposite house, an empty opponent house and a non-empty own house. Refactor on green found nothing to change. Full ./run.sh test has 2 example failures left, both at Game over for the game end unit.
2026-10-29T06:59:46Z. Step: L1,3-8 iteration 6. Unit: End the game when the player to move has no seeds and print scores and the winner or a tie. Tests added: 14. Cycles: 3. Sha: c63c0f5. Agent: rep-2-r06:L1,3-8#6. Tokens: 1202517. Seconds: 254.852.
Actions: Acceptance test GameEndAcceptanceTest over 4 variants (each player picks its lowest non-empty house until the player to move has no seeds; P2 wins in each) went red at Game over. Spec files came from a scratch bash simulator, checked first by replaying the 4 example 6-4 specs byte for byte; scripting the spec data conflicts with the edit-tools-only guidance. Feature gear attempt (Board.hasSeeds and Board.score, Kalah.play checks for seeds before the prompt and prints the score lines and Player N wins! or A tie!) went green first try, so no shrink. Examples testFullGame2 and testFullGameTie now pass and the full ./run.sh test is green with no failures. Added edge unit tests in BoardGameEndTest (seeds left for either player, score of houses plus store) and KalahResultTest (P1 wins, P2 wins, tie, captured seeds count), which made printResult package-private. Refactor on green moved the shared Game over output into one helper.
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: Coarse-to-fine TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone. Credits and wall-clock time are measured by the harness.
## Minutes to first green acceptance test
The first acceptance test (QuitAcceptanceTest over 4 variants) went green in iteration 1, commit 02c54b3. Iteration 1 ran 3 red-green cycles. One cycle stands for 5 minutes, so the cycle proxy is at most 15 minutes. The log shows the green came after one failed feature gear attempt, which puts it at cycle 2 or 10 minutes (unchecked). Git commit times show 2 min 20 s from the UNITS.md commit e6e2d9f to 02c54b3. Real elapsed time is measured by the harness.
## Gear drops per feature
| feature | commit | gear drops |
|---|---|---|
| Starting board and quit | 02c54b3 | 0 |
| Sow and pass the turn | 4d246ae | 0 |
| Extra turn on own store | de6ccb4 | 0 |
| Reject empty house | d0139eb | 0 |
| Capture | ece2d3b | 0 |
| Game end and result | f6bcdb3 | 0 |
Every feature went green in the feature gear with no shrink. The one failed attempt in iteration 1 came from spec data that lost a trailing space. The code stayed unchanged so no gear drop was logged. Total 0 drops over 6 features.
## Lines discarded per revert
No reverts. Git log has no revert commits and LOG.md logs no git restore. Lines discarded total 0.
## Mutation score on feature-gear code
Not measured. No logged step ran `./run.sh mutate` and this call names no checks to run. The score stays open until a mutation run on `src/` is made.
Branch method/rep-2-r12. 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 (2 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
576 (src 231, own tests 345)
recomputed
Lines of code
473 (src 184, own tests 289)
recomputed
Classes
5
recomputed
Methods
25
recomputed
Fields
4
recomputed
Bench median ms
552
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
131/138, 0 not run, adjusted 131/131 (0 of 7 survivors fail hidden tests)
recomputed
PMD lines
2 (2 violations)
recomputed
Dependency edges
9
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 one ternary in play() choosing ClockwiseView or AnticlockwiseView. Board and game rules stay untouched, so every combination with sevenfive works.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: Board size is one ternary that passes houseCount and seedsPerHouse to Board. Sowing, capture and both views derive everything from houseCount().
Reason: Small classes with consistent formatting and short methods. Board.sow has a dense while loop that juggles side and pit indices and the lastInStore flag, which takes some effort to follow.
Reason: Names such as hasSeeds, captureAt, announceResult and topRow read well and the Javadoc explains the sowing rules. The idioms 3 - player and 1 - side are left unexplained, and n and pit are terse.
Reason: The public API uses 1-based players and houses throughout and both views follow one pattern. Inside Board the 0-based side and pit indexing differs from the public API, and java.util.Arrays is fully qualified rather than imported.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: No dead code was found. The starter stub output was replaced and every helper is used.
Reason: ClockwiseView and AnticlockwiseView are near mirror images that differ only in row order and store placement. In play() the game-over println and render pair is repeated in two branches.
Reason: Clean split into Board for state and rules, BoardView subclasses for layout and Kalah for the turn loop and IO. Each class has one responsibility.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Board, houses, stores, sow and capture map directly to Kalah terms. Treating sowing direction purely as a display concern fits the spec output, but the code never states that mapping, so a reader may wonder where clockwise sowing lives.
Test quality. Item: Test quality. Score /5: 4.
Reason: BoardTest pins sowing, store skipping, extra turns, captures including the 7-house opposite rule, and scoring with descriptive names. View, game-loop and spec-file acceptance tests add coverage, but acceptance specs cover clockwise and 7-5 only thinly and no clockwise 7-5 spec exists.
Audit flags
0 high and 11 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.
Step log, 8 rows and 10 columns
2026-10-29T06:44:42Z. Step: L1,3-8 iteration 1. Unit: Show the anti-clockwise 6-4 board and quit before any move. Tests added: 3. Cycles: 1. Sha: 34c7126. Agent: rep-2-r12:L1,3-8#1. Tokens: 1074455. Seconds: 170.867.
Actions: Wrote UNITS.md with 8 features. Wrote acceptance spec test/specs/anticlockwise_6_4/quit_at_start.txt and AcceptanceTest, saw it red. Feature gear: one attempt added Board, AnticlockwiseView and the Kalah quit loop, acceptance green first try so no shrink. Added edge-case unit tests BoardTest and AnticlockwiseViewTest with a RecordingIO fake. Full ./run.sh test: own tests green, 5 example tests red as expected for later features. No refactor needed. Conflict: the UNITS.md tick was made with sed against the no-scripted-edits guidance
2026-10-29T06:46:38Z. Step: L1,3-8 iteration 2. Unit: Sow one anti-clockwise move and pass the turn. Tests added: 4. Cycles: 1. Sha: 4da7f02. Agent: rep-2-r12:L1,3-8#2. Tokens: 564508. Seconds: 111.747.
Actions: Wrote acceptance spec test/specs/anticlockwise_6_4/sow_and_pass.txt (P1 sows house 1, P2 sows house 6 round onto P1's side, then quit) and saw AcceptanceTest red. Feature gear: one attempt added Board.sow and turn passing in Kalah, acceptance green first try so no shrink. Added 3 edge-case BoardTest tests: a 13-seed sow that feeds the own store and skips the opponent store, P2 sowing into its own store, and a 7-house sow. Full ./run.sh test: own tests green, 5 example tests red as expected for later features. No refactor needed
2026-10-29T06:48:40Z. Step: L1,3-8 iteration 3. Unit: Give another move when the last seed lands in the player's store. Tests added: 5. Cycles: 1. Sha: 82c7fb0. Agent: rep-2-r12:L1,3-8#3. Tokens: 540035. Seconds: 120.712.
Actions: Wrote acceptance spec test/specs/anticlockwise_6_4/extra_turn.txt (P1 sows house 3 into its store and moves again, then sows house 1 so P2 moves, then quit) and saw AcceptanceTest red on the turn prompt. Feature gear: one attempt made Board.sow return whether the last seed landed in the mover's store and Kalah keep the turn on true, acceptance green first try so no shrink. Added 4 edge-case BoardTest tests: store endings for both players, house endings for both players, a 14-seed full lap ending in the own store, and a sow ending on the opponent side. Full ./run.sh test: own tests green, 5 example tests red as expected for later features. No refactor needed. Conflict: the Write tool stripped the spec's trailing prompt spaces so they were restored with sed against the no-scripted-edits guidance
2026-10-29T06:51:56Z. Step: L1,3-8 iteration 4. Unit: Capture into the store from an empty own house, including an exact lap. Tests added: 4. Cycles: 2. Sha: 7a5909d. Agent: rep-2-r12:L1,3-8#4. Tokens: 700488. Seconds: 195.688.
Actions: Wrote acceptance spec test/specs/anticlockwise_6_4/capture.txt (P1 empties house 6, P2 sows into P1 house 1, P1 sows house 2 ending in its empty house 6 and captures P2 house 1, then quit) and saw AcceptanceTest red on the store count. Feature gear: one attempt added a capture check after Board.sow, acceptance green first try so no shrink. Added 4 edge-case BoardTest tests: an exact 13-seed lap back into the emptied house, no capture when the opposite house is empty, a P2 capture, and no capture on a non-empty own house. The iteration 2 13-seed sow test pinned pre-capture behaviour of an exact lap, so it now sows 12 seeds to keep its skip-the-opponent-store intent. Full ./run.sh test: own tests green, example testExactLapEmptyCapture now green, 4 example tests red as expected for later features. No refactor needed. Conflict: the UNITS.md tick and this LOG.md row were written with sed and echo against the no-scripted-edits guidance
2026-10-29T06:54:01Z. Step: L1,3-8 iteration 5. Unit: Reject an empty house and ask again. Tests added: 4. Cycles: 1. Sha: da3c201. Agent: rep-2-r12:L1,3-8#5. Tokens: 538624. Seconds: 124.478.
Actions: Wrote acceptance spec test/specs/anticlockwise_6_4/reject_empty.txt (P1 sows house 1, P2 sows house 1, P1 picks its empty house 1 and sees House is empty. Move again. with the same board and prompt, then quit) and saw AcceptanceTest red on line 23. Feature gear: one attempt added an empty-house check before Board.sow in Kalah, acceptance green first try so no shrink. Gave RecordingIO a scripted integer input and added 3 edge-case KalahTest tests: repeated empty picks keep the same player, a P2 empty pick is rejected, and an empty pick leaves the board unchanged. Full ./run.sh test: own tests green, 4 example tests red as expected for later features. No refactor needed. Conflict: the spec's trailing prompt spaces, the UNITS.md tick and this LOG.md row were written with sed and echo against the no-scripted-edits guidance
2026-10-29T06:57:13Z. Step: L1,3-8 iteration 6. Unit: End the game when the player to move has no seeds, with scores and a winner or tie. Tests added: 6. Cycles: 1. Sha: fb8365b. Agent: rep-2-r12:L1,3-8#6. Tokens: 942219. Seconds: 192.818.
Actions: Found an 11-move game after which P2 has no seeds with a scratch Python playout search, wrote it as acceptance spec test/specs/anticlockwise_6_4/game_end.txt (Game over, board, scores 37 to 11, Player 1 wins!) and saw AcceptanceTest red where the P2 prompt replaced Game over. Feature gear: one attempt added Board.hasSeeds and Board.score and a game-end check before each prompt in Kalah, acceptance green first try so no shrink. Added 5 edge-case tests: BoardTest for an all-empty board, a 1-house sow that empties the mover's side and score as houses plus store, and KalahTest for a 14-move tie and an 11-move game where P1 has no seeds and P2 wins with no prompt after the end. Full ./run.sh test: own tests green, example testFullGame2 now green, 3 clockwise example tests red as expected for later features. No refactor needed. Conflict: the spec file was assembled with echo and cat from the search output against the no-scripted-edits guidance to keep its trailing prompt spaces
2026-10-29T06:59:42Z. Step: L1,3-8 iteration 7. Unit: Show and sow the clockwise board. Tests added: 4. Cycles: 1. Sha: e141789. Agent: rep-2-r12:L1,3-8#7. Tokens: 885361. Seconds: 146.723.
Actions: Wrote acceptance spec test/specs/clockwise_6_4/sow_and_pass.txt (P1 sows house 1, P2 sows house 6 round onto P1's side, then quit, drawn with P1's houses right to left and P1's store top left) and saw AcceptanceTest red on line 3. Sowing and capture work by house number so only the view differs. Feature gear: one attempt pulled the frame into an abstract BoardView, made AnticlockwiseView supply its two rows and added ClockwiseView, chosen in Kalah by the clockwise flag. Acceptance green first try so no shrink. Added 3 edge-case ClockwiseViewTest tests: a 7-house board, store placement after two sows, and two-digit counts. Full ./run.sh test: own tests green, example testUseEmpty and testFullGameTie now green, only testSimpleStart75 red as expected for the 7-5 feature. The BoardView extraction was the refactor. Conflict: Write stripped the spec's trailing prompt spaces so they were restored with sed against the no-scripted-edits guidance
2026-10-29T07:02:09Z. Step: L1,3-8 iteration 8. Unit: Play with 7 houses and 5 seeds. Tests added: 4. Cycles: 1. Sha: 4b9d043. Agent: rep-2-r12:L1,3-8#8. Tokens: 652254. Seconds: 135.453.
Actions: Wrote acceptance spec test/specs/anticlockwise_7_5/extra_turn_and_wrap.txt (P1 sows house 3 into its store and moves again, sows house 1 and passes, P2 sows house 7 round onto P1's side, then quit) and saw AcceptanceTest red on line 2 where the 6-house frame was drawn. Feature gear: one attempt made Kalah build Board(7, 5) when sevenfive is set since the views already scale with house count, acceptance green first try so no shrink. Added 3 edge-case tests: BoardTest for a 7-house capture taking the opposite house counted from 7, and KalahTest for a 1 to 7 prompt range (RecordingIO now records the upper bound) and a clockwise 7-5 sow into the store earning another move. Full ./run.sh test: all own tests and all example tests green, including testSimpleStart75. No refactor needed. Conflict: Write stripped the spec's trailing prompt spaces so they were restored with sed, and the UNITS.md tick and this LOG.md row were written with sed and echo, against the no-scripted-edits guidance
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: coarse-to-fine TDD. Sources are LOG.md and git log. GAP.md and ATTEMPTS.md do not exist in this clone.
Credits and wall-clock time are measured by the harness. The figures below come from the repository record only.
## Minutes to first green acceptance test
The first acceptance test went green in iteration 1 in its first red-green cycle. At 5 minutes per cycle that is 5 minutes.
Git timestamps agree. The feature checklist commit f6c2432 is at 19:43:07 and the first green feature commit 455a88d is at 19:43:51 (+1300).
Real elapsed time is measured by the harness.
## Gear drops per feature
No feature dropped to a finer gear. Every LOG.md row records the feature gear acceptance going green on the first attempt with no shrink.
| iteration | feature | gear drops | cycles |
|---|---|---|---|
| 1 | Show the anti-clockwise 6-4 board and quit | 0 | 1 |
| 2 | Sow one move and pass the turn | 0 | 1 |
| 3 | Extra move on a store ending | 0 | 1 |
| 4 | Capture from an empty own house | 0 | 2 |
| 5 | Reject an empty house | 0 | 1 |
| 6 | Game end with scores and winner or tie | 0 | 1 |
| 7 | Clockwise board | 0 | 1 |
| 8 | 7 houses and 5 seeds | 0 | 1 |
| total | 8 features | 0 | 9 |
Iteration 4 used a second cycle to adjust the iteration 2 13-seed sow test after capture changed exact-lap behaviour. That was a test fix and no gear drop.
## Lines discarded per revert
No reverts. git log holds no revert commit and LOG.md records none. Lines discarded are 0.
## Mutation score on feature-gear code
Not measured. No ./run.sh mutate run appears in LOG.md and no mutation report exists in the clone.
The final ./run.sh test in iteration 8 had all project tests and all example tests green.
Branch method/rep-2-r13. 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
623 (src 215, own tests 408)
recomputed
Lines of code
498 (src 166, own tests 332)
recomputed
Classes
3
recomputed
Methods
18
recomputed
Fields
6
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
100/107, 0 not run, adjusted 100/101 (1 of 7 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 BoardPrinter as one boolean that flips house order and store side. Board and the game loop stay direction-free because sowing is the same in house-number terms.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House and seed counts are constructor parameters of Board, chosen in one line of Kalah.play. The printer and sowing derive everything from houseCount().
Reason: Short classes and methods with clear layout. Kalah.java mixes tabs and spaces, and Board uses fully qualified java.util.Arrays without an import.
Reason: Names such as canMove, sow, capture, score and printResult read like the rules. Locals in sow such as side, pit, lastSide and lastPit take some tracing, and player 0/1 needs the class comment.
Reason: Uniform style across Board and BoardPrinter. Minor drift in Kalah indentation, PLAYERS constant beside hard-coded 1 - player, and mixed import styles.
Code quality principles. Item: 4. Used Content. Score /5: 5.
Reason: Every field, method and constant is used. The stub output was removed and nothing dead remains.
Reason: Mostly plain loops and conditionals. The sow loop carries several state flags (inStore, lastSide, lastPit) that make the wrap and store logic harder to follow than needed.
Reason: Source has little repetition and the printer shares one row method for both players. Game over plus print board appears twice in play, and tests repeat prompt constants and lastPrompt helpers.
Reason: Clean split between Board for rules and state, BoardPrinter for output and Kalah for the turn loop and IO. Each piece is testable alone.
Code quality principles. Item: 8. Problem Alignment. Score /5: 5.
Reason: Concepts map directly to the domain: houses, stores, sow, capture, score and turns. Direction treated as a presentation concern matches the rules exactly.
Test quality. Item: Test quality. Score /5: 4.
Reason: Board tests pin sowing, wrap, store skip, extra turn and every capture condition with small boards and clear names, and acceptance tests cover several variants. Some tests chain sow calls to set up state and helpers are duplicated, and no anticlockwise 7-5 full play test exists.
Audit flags
1 high and 7 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-r13:L1,3-8#1
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 Bash call of rep-2-r13:L1,3-8#1 at agent-a163c8538d4fe2ac8.jsonl:110, which edits the clone's own acceptance specs. 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.
Step log, 6 rows and 10 columns
2026-10-29T07:39:24Z. Step: L1,3-8 iteration 1. Unit: Board display and quit for all four variants. Tests added: 7. Cycles: 2. Sha: 3e14780. Agent: rep-2-r13:L1,3-8#1. Tokens: 1414569. Seconds: 241.766.
Actions: Wrote UNITS.md with 6 features. Acceptance QuitAcceptanceTest red, then feature-gear attempt (Board, BoardPrinter, Kalah quit) green first try with no shrink. Edit and Write strip trailing spaces so the prompt lines of the two new spec files got their trailing space through awk, against the no-scripted-edits guidance. Added Board and BoardPrinter edge-case unit tests on green. Example tests for later features stay red as expected
2026-10-29T07:41:34Z. Step: L1,3-8 iteration 2. Unit: Sowing a move and passing the turn. Tests added: 5. Cycles: 2. Sha: b1052f7. Agent: rep-2-r13:L1,3-8#2. Tokens: 673735. Seconds: 128.629.
Actions: Acceptance SowAcceptanceTest (own STA 6-4 spec plus STC 7-5 simple_start) red, then feature-gear attempt (Board.sow, play loop) green first try with no shrink. Write strips trailing spaces so the spec prompt lines got their trailing space through sed, against the no-scripted-edits guidance. Added three Board.sow edge-case unit tests on green, no refactor needed. Example tests for extra turn, empty house and capture stay red as expected
Actions: Acceptance EmptyHouseAcceptanceTest (own STA 6-4 empty_house spec plus STC 6-4 useempty) red, then feature-gear attempt (empty check in the play loop) green first try with no shrink. Spec file built from the sow_and_pass spec lines through sed to keep trailing prompt spaces, and two test literals fixed through sed, against the no-scripted-edits guidance. Widened RecordingIO with scripted input and added three Kalah empty-house edge-case unit tests on green, no refactor needed. Example tests for extra turn, capture and game end stay red as expected
2026-10-29T07:46:29Z. Step: L1,3-8 iteration 4. Unit: Extra turn when the last seed lands in the player's store. Tests added: 8. Cycles: 2. Sha: 3bb8e79. Agent: rep-2-r13:L1,3-8#4. Tokens: 610589. Seconds: 146.31.
Actions: Acceptance ExtraTurnAcceptanceTest (own STA 6-4 extra_turn spec) red at line 14, then feature-gear attempt (Board.sow returns whether the last seed hit the own store, play loop keeps the player) green first try with no shrink. Write strips trailing spaces so the spec prompt lines got their trailing space through sed, and the UNITS.md tick went through sed, against the no-scripted-edits guidance. Added five Board.sow and two Kalah extra-turn edge-case unit tests on green, no refactor needed. Example tests for capture and game end stay red as expected
2026-10-29T07:48:41Z. Step: L1,3-8 iteration 5. Unit: Capture when the last seed lands in an empty own house. Tests added: 6. Cycles: 2. Sha: 1a47341. Agent: rep-2-r13:L1,3-8#5. Tokens: 665605. Seconds: 139.689.
Actions: Acceptance CaptureAcceptanceTest (example STA 6-4 exactlapemptycapture spec) red at line 111, then feature-gear attempt (Board.sow tracks the last house and captures a lone seed with a non-empty opposite house) green first try with no shrink. Full ./run.sh test shows only the full-game examples red, which belong to the game end feature. Added five Board capture edge-case unit tests on green (both players, empty opposite, non-empty own house, empty opponent house), no refactor needed
2026-10-29T07:50:49Z. Step: L1,3-8 iteration 6. Unit: Game end with final scores, winner and tie. Tests added: 10. Cycles: 2. Sha: d7dda2e. Agent: rep-2-r13:L1,3-8#6. Tokens: 506218. Seconds: 140.111.
Actions: Acceptance GameEndAcceptanceTest (example STA 6-4 full_game2 win and STC 6-4 full_game_tie) red, then feature-gear attempt (Board.canMove and Board.score, play loop ends when the player to move has empty houses and prints scores and result, quit keeps its old output) green first try with no shrink. Full ./run.sh test green with all examples passing. Added six Board game-end and two Kalah quit edge-case unit tests on green, one Board expectation fixed before its first run, no refactor needed. UNITS.md now 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: coarse-to-fine 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. The figures below are the cycle proxy and commit timestamps only.
## Minutes to first green acceptance test
The first acceptance test QuitAcceptanceTest went green in the first red-green cycle of iteration 1.
One cycle stands for 5 minutes, so the cycle proxy is 5 minutes.
Commit timestamps show 1.7 minutes from the feature checklist (74cf009 at 20:36:50) to the first green commit (ec7bf99 at 20:38:31).
The authoritative wall clock time is measured by the harness.
## Gear drops per feature
Every feature-gear attempt went green on its first try with no shrink.
| feature | acceptance test | gear drops | cycles |
|---|---|---|---|
| Board display and quit | QuitAcceptanceTest | 0 | 2 |
| Sowing and passing the turn | SowAcceptanceTest | 0 | 2 |
| Rejecting an empty house | EmptyHouseAcceptanceTest | 0 | 2 |
| Extra turn | ExtraTurnAcceptanceTest | 0 | 2 |
| Capture | CaptureAcceptanceTest | 0 | 2 |
| Game end | GameEndAcceptanceTest | 0 | 2 |
| total | | 0 | 12 |
## Lines discarded per revert
No reverts happened. Git log has no revert commits and LOG.md records none. Lines discarded are 0.
## Mutation score on feature-gear code
Not measured. No `./run.sh mutate` run is recorded in LOG.md or git log, and this step names no check to run.
Branch method/rep-2-r16. 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
473 (src 238, own tests 235)
recomputed
Lines of code
371 (src 183, own tests 188)
recomputed
Classes
3
recomputed
Methods
24
recomputed
Fields
6
recomputed
Bench median ms
268
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
118/125, 0 not run, adjusted 118/118 (0 of 7 survivors fail hidden tests)
recomputed
PMD lines
10 (10 violations)
recomputed
Dependency edges
3
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 only flips the drawing because house numbers ascend in the sowing direction either way. The whole change sits in BoardRenderer's two row methods behind one flag, and Board needs no change.
Alterability. Item: Change Case 2: 7 houses with 5 seeds. Score /5: 5.
Reason: House and seed counts are constructor arguments chosen in one line of play(). Rendering, sowing and capture all derive from houseCount().
Reason: The layout is consistent and the classes and methods are short. The sow loop uses while(true) with nested store and side branches, which takes some effort to follow.
Reason: Names like hasMoves, isEmpty, score and the sow javadoc explain intent well. Bare expressions such as 3 - player and 1 - side, and the P1/P2 constants used as player numbers, are left unexplained.
Reason: Players are numbered 1-based in the public API and houses 1-based throughout, and the style is uniform. Board indexes 0-based internally while BoardRenderer keeps its own P1/P2 constants, which mixes conventions a little.
Code quality principles. Item: 4. Used Content. Score /5: 4.
Reason: Nearly everything is used. Board.of is a factory used only by tests that ships in production code, and the stub's main stays as required.
Reason: Plain arrays, loops and small methods throughout. The infinite loop with early returns in sow and capture's combined guard condition are denser than they need to be.
Reason: The houses helper and pad are shared by both directions, and gameOver is reused. topRow and bottomRow mirror each other with near-identical string assembly, and the store and house summing loops repeat a pattern.
Reason: Game state and rules sit in Board, drawing sits in BoardRenderer, and Kalah only runs the turn loop. Each piece is testable on its own.
Code quality principles. Item: 8. Problem Alignment. Score /5: 4.
Reason: Houses, stores, sowing, capture and score map directly to the domain. The direction concept lives only in rendering, which is clever but less explicit about the rule as the spec states it.
Test quality. Item: Test quality. Score /5: 4.
Reason: Board tests pin sowing, the skipped opponent store, extra turns, capture edge cases including the exact lap, and end-of-game scoring, and the names are clear. Acceptance tests cover all four variants for quit, but sow, capture and empty-house flows each run in only two variants.
Audit flags
0 high and 3 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.
Step log, 5 rows and 10 columns
2026-10-29T06:44:15Z. Step: L1,3-8 iteration 1. Unit: Board display for all four variants and quitting with 'q'. Tests added: 9. Cycles: 2. Sha: c3549d2. Agent: rep-2-r16:L1,3-8#1. Tokens: 735789. Seconds: 143.084.
Actions: Wrote UNITS.md with 5 features. Acceptance QuitAcceptanceTest (4 variants, 3 new specs under test/acceptance) went red. Feature gear passed it on the first attempt with Board, BoardRenderer and a quit loop in Kalah. No shrink needed. Added 5 edge-case unit tests (BoardTest, BoardRendererTest) and extracted BoardRenderer.rows on green. 5 example tests for later units stay red as expected. Standing guidance asks for one commit per group; the step's UNITS.md commit plus a feature commit were made.
2026-10-29T06:46:21Z. Step: L1,3-8 iteration 2. Unit: Sowing a move in either direction and passing the turn. Tests added: 5. Cycles: 2. Sha: 90148e4. Agent: rep-2-r16:L1,3-8#2. Tokens: 744859. Seconds: 123.557.
Actions: Acceptance SowAcceptanceTest (clockwise 7-5 simple_start example plus new anti-clockwise 6-4 wrap spec under test/acceptance) went red. Feature gear passed it on the first attempt with Board.sow and a move loop in Kalah that renders and passes the turn. No shrink needed. Added 3 edge-case BoardTest tests (own store from last house, opponent store skipped on a lap). No refactor needed on green. ExampleClockwiseTest.testSimpleStart75 now passes. 4 example tests for later units stay red as expected. The Write tool trimmed trailing prompt spaces in the spec, so sed restored them; this conflicts with the standing rule against scripted edits.
2026-10-29T06:48:21Z. Step: L1,3-8 iteration 3. Unit: Rejecting an empty house with a retry prompt. Tests added: 5. Cycles: 2. Sha: b24f742. Agent: rep-2-r16:L1,3-8#3. Tokens: 596339. Seconds: 123.247.
Actions: Acceptance EmptyHouseAcceptanceTest (clockwise 6-4 useempty example plus new anti-clockwise 7-5 spec under test/acceptance) went red. Feature gear passed it on the first attempt with an empty-house check in the Kalah move loop that prints the notice, redraws and keeps the turn. No shrink needed. Added 3 edge-case BoardTest tests for Board.isEmpty (none empty at start, emptied only for its owner, refilled by an opponent lap); they went red on compile, then Board.isEmpty was extracted and used in Kalah on green. ExampleClockwiseTest.testUseEmpty now passes. 3 example tests for later units stay red as expected. The Write tool trimmed trailing prompt spaces in the spec, so sed restored them; this conflicts with the standing rule against scripted edits. Feature and UNITS.md tick share one commit as the step asks.
2026-10-29T06:51:45Z. Step: L1,3-8 iteration 4. Unit: Extra turn when the last seed lands in the store, and captures including an exact lap. Tests added: 7. Cycles: 2. Sha: 1909eeb. Agent: rep-2-r16:L1,3-8#4. Tokens: 975457. Seconds: 199.681.
Actions: Acceptance CaptureAcceptanceTest (anti-clockwise 6-4 exactlapemptycapture example plus new clockwise 7-5 extra-turn and capture spec under test/acceptance) went red. Feature gear passed it on the first attempt: Board.sow returns true on a store landing and captures from an own house left holding one seed, and Kalah keeps the turn on true. No shrink needed. Added 5 edge-case BoardTest tests (store landing, capture, empty opposite, opponent house, exact lap); they went red on compile, then a package-private Board.of test factory made them green. Refactored capture to take the mover index on green. ExampleAnticlockwiseTest.testExactLapEmptyCapture now passes. The 2 full-game examples stay red at game end, which is the next unit. The Write tool trimmed trailing prompt spaces in the spec and sed restored them, and sed ticked UNITS.md; this conflicts with the standing rule against scripted edits. Feature and UNITS.md tick share one commit as the step asks.
2026-10-29T06:53:52Z. Step: L1,3-8 iteration 5. Unit: Game end when the player to move has no seeds, with scores and the winner or a tie. Tests added: 7. Cycles: 2. Sha: 7e97e4c. Agent: rep-2-r16:L1,3-8#5. Tokens: 451773. Seconds: 123.801.
Actions: Acceptance GameEndAcceptanceTest (clockwise 6-4 full_game_tie and anti-clockwise 6-4 full_game2 examples) went red. Feature gear passed it on the first attempt with Board.hasMoves and Board.score and a Kalah loop that ends when the mover has no seeds and prints both scores and Kalah.result. No shrink needed. Added 5 edge-case unit tests (BoardTest hasMoves and score, KalahTest P1 wins, P2 wins, tie); they passed on the existing code. Extracted gameOver on green to share the quit and end paths. All 10 test classes pass including both full-game examples. No new 7-5 game-end spec was written because the two examples cover the end path. sed ticked UNITS.md and appended this row; this conflicts with the standing rule against scripted edits. Feature and UNITS.md tick share one commit as the step asks.
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: coarse-to-fine 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. The figures below that use minutes are cycle-count proxies at 5 minutes per red-green cycle.
## Minutes to first green acceptance test
| measure | value | source |
|---|---|---|
| cycles to first green acceptance test | 1 | LOG.md iteration 1. QuitAcceptanceTest passed on the first feature-gear attempt. |
| proxy minutes | 5 | 1 cycle at 5 minutes |
| commit timestamps | 06:43:05Z UNITS.md to 06:44:15Z first green feature commit c3549d2 | git log |
Wall-clock minutes are measured by the harness.
## Gear drops per feature
| feature | commit | gear drops |
|---|---|---|
| Board display and quit | c3549d2 | 0 |
| Sowing in either direction | 90148e4 | 0 |
| Empty house rejection | b24f742 | 0 |
| Extra turn and capture | 1909eeb | 0 |
| Game end and result | 7e97e4c | 0 |
Every LOG.md row records that the feature gear passed its acceptance test on the first attempt with no shrink. Total 0 drops over 5 features.
## Lines discarded per revert
No reverts. git log holds no revert commit and LOG.md records no `git restore` or `git revert`. Lines discarded are 0.
## Mutation score on feature-gear code
Not measured. No `./run.sh mutate` result is recorded in LOG.md or git log and this call ran no checks.
## Totals from LOG.md
| measure | value |
|---|---|
| features done | 5 of 5 |
| red-green cycles | 10 |
| tests added | 33 |
| feature commits | 5 |