wc-decision-logger — log the choice, the option set, and the why
Implements footballfantasy/context/frameworks/decision-log-format.md. The key difference from a normal decision log: here we record a choice among presented options, including the recommendation, the override, and the manager's reasoning — because three learning loops feed on exactly that (archetype scoreboard, revealed preferences, specialist calibration). A bare "chose B" teaches nothing.
Inputs (from the Director, after the manager picks)
- The board (option set with lineage + fitness + variance + dissent), the recommended default.
- The manager's pick, any modification, their stated reasoning, the objective θ/k in force.
Workflow
- [ ] 1. Build the log entry (schema below) — capture the full option set + pick + reasoning + override flag
- [ ] 2. Append atomically to tracker/decisions-log.md (never overwrite)
- [ ] 3. Archive the generation to generations/<round>/ (population, fitnesses, offspring lineage, board, pick)
- [ ] 4. Update tracker/archetype-scoreboard.md (which genotype's blocks were chosen)
- [ ] 5. On override/modification, append a revealed-preference note to manager-profile.md
- [ ] 6. Return the decision_id
Entry schema (per decision-log-format.md)
### {iso8601} | {decision_type} | round {round_id}
- decision_id: {round_id}-{decision_type}-{NN}
- objective: θ={..}, k={..}
- board_options: [ A "{handle}" — lineage — fitness — variance ; B … ; C … ]
- recommended_default: {option}
- manager_pick: {A | modified A | own plan}
- manager_modification: {what they changed}
- manager_reasoning: {their stated why — verbatim/close; this is gold}
- override?: {yes/no}
- key_assumptions: {what the pick bets on}
- dissent_carried: {strongest case against the pick}
- confidence: {0–1}
- will_verify_on: {round id}
- outcome: {filled by round-review}
- outcome_recorded_on: {filled later}
- what_we_learned: {filled later}
decision_type ∈ squad-build | matchday | transfer | captain | chip | ad-hoc.
Generation archive (the evolutionary trail)
Write generations/<round>/<decision_type>.md capturing the whole search: the population (each archetype's candidate + self-dissent), the fitness table with decompositions, the offspring with lineage + repair logs, the diversity report, the board, and the manager's pick. This is how the search is audited and how memetic learning reconstructs which genotypes produced winning blocks.
Scoreboard + revealed-preference updates
- Archetype scoreboard: increment the count of "blocks chosen" for each genotype whose block appears in the picked candidate. After the round (via round-review) attach the points outcome so the scoreboard reflects which genotypes win, not just which get picked.
- Revealed preferences: when the manager overrides or modifies, append a one-line note to
manager-profile.mddescribing the tilt (e.g. "took the differential captain but refused the second punt → will gamble the armband, not the whole squad"). These become soft fitness terms.
Guardrails
- Append-only. Never overwrite a prior entry. Outcomes are filled in later by round-review, in place.
- Log the option set and the reasoning, always — not just the pick. The override rows are the highest-value training signal; capture the manager's words.
- One entry per decision; one generation archive per decision. Keep
decision_ids unique and chronological.