I2844 — plan validate refuses a milestone whose GitHub title would be over 255 characters
Both engines' plan validate (lib/project.awk and plan.rs) refuse a milestone whose projected GitHub title, \"<id> — <title>\" as scripts/github-sync title_of writes it, is over 255 characters, counted in characters rather than bytes, and name the milestone and the projected length.
READY wave 0 · p1 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I2844 will be accepted.
Objective
Both engines' plan validate (lib/project.awk and plan.rs) refuse a milestone whose projected GitHub title, \"<id> — <title>\" as scripts/github-sync title_of writes it, is over 255 characters, counted in characters rather than bytes, and name the milestone and the projected length.
Why
On 2026-10-20 master 82ac259d0ae's github-projection went red (run 39392245555, exit 13): 1 of 368 mutations failed, POST milestones answering HTTP 422, because a-prompt-reaches-the-work-it-serves projected to 282 characters. That left the release top's (#1434) structure job unclearable from a branch. The title itself was shortened in the release top; nothing stopped the next one.
Current state
No check bounds a milestone title. The first sign of an over-long one is the GitHub API refusing it during the projection on master.
Desired state
plan validate fails with milestone_title_too_long, naming the milestone and its projected character count, for any milestone over 255 projected characters, in the shell engine and the executable alike. A title exactly at the limit passes, and multi-byte characters count once.
Scope
- lib/project.awk
- apps/majordomus-cli/src/plan.rs
- test/cases/3244_a_milestone_title_fits_on_github.sh
- .ai/repo/project/issues/I2844.yaml
Out of scope
- Shortening any milestone title (done in the release top #1434)
- Issue titles, whose GitHub limit is a separate question
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A milestone projecting to 256 characters fails plan validate in both engines with milestone_title_too_long naming the milestone and 256
- A milestone projecting to exactly 255 characters, one of them multi-byte, passes
- Case 3244 fails on master's lib/project.awk
Validation
- bin/majordomus plan validate
- bash test/run.sh 3244_a_milestone_title_fits_on_github
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib plan::tests::a_milestone_title_github_would_refuse_is_refused
Evidence required
- a_milestone_title_fits_on_github_case
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I2844.yaml. Read it back with majordomus plan show I2844.