# Plan What sds is building, and roughly in what order. One file per epic. ## The id is the commit scope Each epic's filename is its id, and that id never changes. `plan/features.md` is `features`, so its commits read `feat(features): ...`. Archiving moves the file into [complete/](complete/) and never renames it. `plan` is a valid scope too, for changes to this register. ## Status `open` - being worked on or ready to be. `blocked` - cannot start until something in `dependsOn` lands. `continuous` - no exit criterion. Worked whenever adjacent code is open. `declined` - decided against. Not `blocked`, which is waiting: the answer is no rather than not yet. The file stays, because a decision that is not written down gets made again. `shipped` - the exit criterion is met. A shipped epic with nothing open moves to [complete/](complete/). ## The tables are generated `scripts/gen-plan-readme.py` reads every epic's frontmatter and rewrites what sits between the `` fences. Everything outside a fence is hand-written and passed through. The `plan-register` prek hook runs it with `--check`, so a row that disagrees with the file it points at fails the commit. Adding an epic is one file and one command: write `plan/.md` with the frontmatter keys every other epic carries, run the script, stage both. ## Open | id | title | status | depends on | |---|---|---|---| | [harness](harness.md) | The benchmark produces results you can believe | open | - | | [scenarios](scenarios.md) | A suite that spans sizes, maps and technology | open | - | | [protocol](protocol.md) | The observation carries what a bot needs to reason | open | - | | [hierarchy](hierarchy.md) | Units propose, forces decide | open | - | | [ev](ev.md) | Damage as a distribution, not a mean | open | protocol | | [los](los.md) | Line of sight computed here, checked against MegaMek | open | - | | [features](features.md) | A normalised, named feature basis | open | protocol, los, ev | | [scoring](scoring.md) | One basis, not two | open | features | | [tactics](tactics.md) | A force is doing one nameable thing, and can be told to do another | blocked | scoring, hierarchy | | [beliefs](beliefs.md) | What the bot thinks is happening | blocked | features | | [objectives](objectives.md) | What winning means, and what to do when it stops being available | blocked | tactics | | [doctrine](doctrine.md) | Composable lenses - culture, commander, personality, experience | blocked | tactics | | [capability](capability.md) | Forces and doctrines map to each other | blocked | tactics | | [difficulty](difficulty.md) | Fallible, never absurd | blocked | beliefs, doctrine | | [training](training.md) | Weights fitted from recorded play | blocked | features, harness | | [shape](shape.md) | A feature's weight is a curve, not a number | blocked | training, features | | [observability](observability.md) | Read back what the bot believed and chose | open | beliefs | | [artillery](artillery.md) | A shell fired this round lands next round | open | ev, beliefs | | [battle-armor](battle-armor.md) | Battle armor plays, mounted and on foot | open | unit-types, candidates | | [bridges](bridges.md) | A bridge is a floor above the ground | open | protocol | | [buildings](buildings.md) | Buildings are terrain the bot can see, enter and destroy | open | los, protocol | | [c3](c3.md) | A C3 lance shoots from where its friends can see | open | los, candidates | | [candidates](candidates.md) | Propose positions, not four verbs | open | los, ev, features | | [chat](chat.md) | The bot says what it is doing, in the match | open | observability | | [contract](contract.md) | The wire is a contract, and every rule has one home | open | protocol, puzzles | | [exotic-ammo](exotic-ammo.md) | The round in the tube changes the shot | open | ev, features | | [exotic-weapons](exotic-weapons.md) | Weapons that disable rather than damage | open | ev, features | | [fire-modes](fire-modes.md) | Ultra and Rotary autocannon rates are a choice | open | ev | | [heat-damage](heat-damage.md) | Making the enemy hot is a way to win | open | ev, features | | [infantry](infantry.md) | A platoon is a headcount, not a body plan | open | unit-types, features | | [matchup](matchup.md) | The bot can see what it is up against | open | features, scenarios | | [melee](melee.md) | The bot throws a punch | open | features, ev | | [mines](mines.md) | Ground that hurts to walk on | open | protocol, beliefs | | [mounting](mounting.md) | A platoon aboard a transport is worth something the basis cannot say | open | candidates, features | | [smoke-and-fire](smoke-and-fire.md) | Terrain that appears during the match | open | los, buildings | | [teams](teams.md) | More than two sides | open | hierarchy, protocol | | [tsm](tsm.md) | Triple Strength Myomer rewards running hot | open | features | | [unit-types](unit-types.md) | Vehicles and infantry play, not just Meks | open | protocol, features | | [vocabulary](vocabulary.md) | A diagrammed reference for every feature and label | open | features, training | ## Continuous | id | title | status | depends on | |---|---|---|---| ## Not pursued | id | title | status | depends on | |---|---|---|---| ## Complete Nothing open, nothing left to decide. These live in [complete/](complete/) so the list above stays the list of things somebody might work on. They are not deleted: how something was built, and what it cost to learn, is worth more after it works than before. Their ids stay valid commit scopes. | id | title | |---|---|