feat(evolution): generation backlog gate — throttle features, never bugs#462
Merged
Conversation
Complements the every-4h processing change (#461): even with faster processing, generation (~25/day) can outpace it. This gate bounds the open backlog so it stops growing unbounded (the recurring 'too many unprocessed issues'). Policy (owner's): when the open FEATURE backlog >= cap, SKIP creating new [FEATURE]/[IMPROVEMENT]/[CAPABILITY]/[UX] proposals — but ALWAYS file [FIX] bugs (real defects block work and are cheap to keep). Features can wait for the backlog to drain; bugs cannot. - scripts/evolution_backlog_gate.py: counts open FEATURE issues (open AND not a bug: title not [FIX], no 'bug' label); exits 1=throttle/0=ok with a JSON summary. Cap = EVOLUTION_FEATURE_BACKLOG_CAP (default 25). Fail-OPEN if gh is unavailable (never blocks generation on a failed count). - evolution-issues: runs the gate before filing proposals; throttle => skip feature creation this cycle. - evolution-introspection: bugs ([FIX]) always; gate the non-bug (capability/ux/performance) proposals. - evolution-research (no terminal): advisory note to bias toward fewer proposals when the board is full — no runnable command (avoids dead wiring; caught by test_evolution_skill_integrity). 18 gate tests + skill-integrity green (29 passed). Live: 41 open features > cap 25 -> would throttle now (correct: board over-full). Takes effect after the server re-registers/pulls.
Contributor
🔎 Lint report:
|
| Rule | Count |
|---|---|
unresolved-import |
1 |
First entries
tests/scripts/test_evolution_backlog_gate.py:9: [unresolved-import] unresolved-import: Cannot resolve imported module `evolution_backlog_gate`
✅ Fixed issues: none
Unchanged: 6086 pre-existing issues carried over.
Diagnostics are surfaced as warnings — this check never fails the build.
The Windows-footgun checker matched the literal 'failing open (no throttle)' as an open() call. Reword to 'defaulting to no throttle' — no behavior change.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Complements #461 (process every 4h). Even with faster processing, generation (~25/day) can still outpace it, so the open backlog grows — the recurring "too many unprocessed issues". This bounds it.
Policy (owner's choice: "skip features, but add bugs")
When the open feature backlog ≥ cap:
[FEATURE]/[IMPROVEMENT]/[CAPABILITY]/[UX]/[PERFORMANCE]proposals.[FIX]bugs — real defects block work and are cheap to keep; never throttled.Rationale: features can wait for the backlog to drain; bugs can't.
What
scripts/evolution_backlog_gate.py— counts open FEATURE issues (open AND not a bug: title not[FIX], nobuglabel).check→ exit 1 = throttle / 0 = ok, with a JSON summary. Cap =EVOLUTION_FEATURE_BACKLOG_CAP(default 25). Fail-OPEN if gh is unavailable (never blocks generation on a failed count).[FIX]) always filed; gate applies only to the non-bug (capability/ux/performance) proposals.terminaltoolset): advisory note only — bias toward fewer proposals when the board is full. No runnable command (avoids dead wiring; enforced bytest_evolution_skill_integrity).Tests
tests/scripts/test_evolution_backlog_gate.py— 18 (is_bug, counting, cap resolution, throttle/ok, bugs don't count toward cap, fail-open, CLI exit codes). Skill-integrity green. 29 passed locally.Live check: 41 open features > cap 25 → would throttle now (correct — board is over-full; bugs would still flow).
Notes
hermes update+ gateway restart).EVOLUTION_FEATURE_BACKLOG_CAPto taste.