fix(ooda): declarative standing seed goals + warm-board self-heal (#4927) - #4941
Open
rysweet wants to merge 1 commit into
Open
fix(ooda): declarative standing seed goals + warm-board self-heal (#4927)#4941rysweet wants to merge 1 commit into
rysweet wants to merge 1 commit into
Conversation
) The live standing goal `articulate-repo-hygiene-backlog` was re-parked every OODA cycle and fed the UNCLEAR-CRITERIA issue storm (#4927/#4930/ #4934, root-caused in #4935) purely because it was never tagged perpetual: the no-progress breaker's `!is_perpetual()` exemption never fired for it. Close the gap at the seed-declaration + reconcile surface, reusing the single existing `ActiveGoal::is_perpetual()` predicate (no second notion of "perpetual"): - Add declarative `standing: bool` (default false) to `SeedGoal` with a `.standing()` builder, and to `TomlSeedGoal` via `#[serde(default)]` while KEEPING `deny_unknown_fields` (a typo'd flag still fails loud). - Carry `standing` through the identity file_loader conversion. - `seed_board_from_seed_goals` marks a `standing` seed perpetual at cold-start; ordinary seeds are pushed unchanged (no reclassification). - Add idempotent load-time `reconcile_standing_markers` that stamps the standing marker onto already-persisted goals matching a `standing` seed's normalized title slug (EXACT match only, never fuzzy prose), self-healing the live warm-board goal. Wire it into the OODA cold-start path in cycle.rs. - Refactor `mark_standing` onto a shared in-place `mark_standing_in_place`. Additive and non-breaking: ordinary goal convergence is unchanged, proven by tests. Docs: new howto + reference, linked in mkdocs nav. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
📊 Coverage Summary
Coverage data from CI run. Test files matching |
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.
Problem (#4927 / #4930 / #4934, root-caused in #4935)
The standing goal
articulate-repo-hygiene-backlogwas re-parked every OODA cycle and fed thegoal stuck after guided retry (UNCLEAR-CRITERIA)issue storm — purely because it was never tagged perpetual. The no-progress breaker's!is_perpetual()exemption therefore never fired for it, so a genuinely perpetual/standing goal was treated as a convergence-required goal that churned the escalation loop.Fix
Close the gap at the seed-declaration + reconcile surface, reusing the single existing
ActiveGoal::is_perpetual()predicate (no second notion of "perpetual"):standing: bool(defaultfalse) onSeedGoalwith a.standing()builder, and onTomlSeedGoalvia#[serde(default)]while keepingdeny_unknown_fields(a typo'd flag still fails loud).standingthrough the identityfile_loaderconversion.seed_board_from_seed_goalsmarks astandingseed perpetual at cold-start; ordinary seeds are pushed unchanged (no reclassification).reconcile_standing_markers: idempotent load-time self-heal that stamps the standing marker onto already-persisted goals matching astandingseed's normalized title slug (exact slug match only, never fuzzy prose), fixing the live warm-board goal. Wired into the OODA cold-start path incycle.rs.mark_standingonto a sharedmark_standing_in_place.The
ooda_loopbreaker driver already exempts perpetual goals (!is_perpetual()filter +classify_standing_idle→ benignperpetual_idled); this PR only feeds that predicate correctly.Tests
New unit + integration coverage proves:
standingseed → perpetual goal (cold start) and an ordinary seed stays non-perpetual;reconcile_standing_markersself-heals the persisted hygiene goal by id/slug, is idempotent, and ignores unmatched / non-standing / already-perpetual goals;Validation
cargo build, targeted + affected-module tests,cargo clippy --libclean.cargo fmt --check, release clippy-D warnings) and pre-push (full lib test suite: 484 passed, all-targets/all-features clippy-D warnings) all green.Docs
New how-to (
docs/howto/declare-a-standing-seed-goal.md) and reference (docs/reference/standing-seed-goal-declaration-api.md), linked inmkdocs.ymlnav.Additive and non-breaking. PRD preserved; no Bridge naming; structured lifecycle logging consistent with the surrounding OODA-start block.
Closes #4927
Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com