What's owed
focus cycle ships as code, help text and tests only. Three contract debts are deliberately deferred:
1. No CMD-CYCLE clause
Every other command has one (CMD-ON … CMD-HELP, MAIN.md:484-610). focus cycle <add|modify --edit-notes|delete> has none.
It should record, at minimum, that cycle add deliberately does not use the duplicate fold from #36. That check lives in the off and past handlers, not in the adapter, so a new handler simply does not opt in — and cycle has its own replace-on-collision prompt instead. Without this written down, a later reader can reasonably "fix" the omission and break the feature.
2. CMD-PAST does not mention the cycle-id guard
CMD-PAST (MAIN.md:517-541) promises nothing about refusing cycle rows. Whatever guard past modify / past delete end up carrying needs to be stated there.
3. CONTRACT_INDEX.md must be regenerated
This is the mechanical one, and the reason the other two are worth batching rather than doing piecemeal. The index is a line-range map into MAIN.md (847 lines) with 55 rows carrying line pointers. Its own header sets the rule:
Ranges are inclusive and were generated against the current contract. If MAIN.md is edited, regenerate this file; a stale index is worse than none.
Inserting a clause shifts every line below it. Measured:
| Insertion point |
Index pointers invalidated |
after CMD-PAST (line 541), where it belongs topically |
63 |
after CMD-HELP (line 610), end of the command block |
42 |
There is no insertion point that avoids it — [NUDGE], [CHECKIN], [SM], [CONV] and [INT] all sit below line 620. The header's own "847 lines" also needs updating.
Why it's needed
START_HERE.md makes the contract the authority and the tests the verifier; where they disagree the contract wins. Undocumented behaviour is therefore removable behaviour — item 1 is the concrete example. And a stale index is called out by its own header as worse than no index at all.
Related: #45 tracks the drift that already exists.
What's owed
focus cycleships as code, help text and tests only. Three contract debts are deliberately deferred:1. No
CMD-CYCLEclauseEvery other command has one (
CMD-ON…CMD-HELP,MAIN.md:484-610).focus cycle <add|modify --edit-notes|delete>has none.It should record, at minimum, that
cycle adddeliberately does not use the duplicate fold from #36. That check lives in theoffandpasthandlers, not in the adapter, so a new handler simply does not opt in — andcyclehas its own replace-on-collision prompt instead. Without this written down, a later reader can reasonably "fix" the omission and break the feature.2.
CMD-PASTdoes not mention the cycle-id guardCMD-PAST(MAIN.md:517-541) promises nothing about refusing cycle rows. Whatever guardpast modify/past deleteend up carrying needs to be stated there.3.
CONTRACT_INDEX.mdmust be regeneratedThis is the mechanical one, and the reason the other two are worth batching rather than doing piecemeal. The index is a line-range map into
MAIN.md(847 lines) with 55 rows carrying line pointers. Its own header sets the rule:Inserting a clause shifts every line below it. Measured:
CMD-PAST(line 541), where it belongs topicallyCMD-HELP(line 610), end of the command blockThere is no insertion point that avoids it —
[NUDGE],[CHECKIN],[SM],[CONV]and[INT]all sit below line 620. The header's own "847 lines" also needs updating.Why it's needed
START_HERE.mdmakes the contract the authority and the tests the verifier; where they disagree the contract wins. Undocumented behaviour is therefore removable behaviour — item 1 is the concrete example. And a stale index is called out by its own header as worse than no index at all.Related: #45 tracks the drift that already exists.