Skip to content

fix(ooda): declarative standing seed goals + warm-board self-heal (#4927) - #4941

Open
rysweet wants to merge 1 commit into
mainfrom
feat/issue-4927-nodeoptions-max-old-space-size32768-saved-preferen
Open

fix(ooda): declarative standing seed goals + warm-board self-heal (#4927)#4941
rysweet wants to merge 1 commit into
mainfrom
feat/issue-4927-nodeoptions-max-old-space-size32768-saved-preferen

Conversation

@rysweet

@rysweet rysweet commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Problem (#4927 / #4930 / #4934, root-caused in #4935)

The standing goal articulate-repo-hygiene-backlog was re-parked every OODA cycle and fed the goal 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"):

  • Declarative standing: bool (default false) on SeedGoal with a .standing() builder, and on 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).
  • reconcile_standing_markers: idempotent load-time self-heal that stamps the standing marker onto already-persisted goals matching a standing seed's normalized title slug (exact slug match only, never fuzzy prose), fixing the live warm-board goal. Wired into the OODA cold-start path in cycle.rs.
  • Refactor mark_standing onto a shared mark_standing_in_place.

The ooda_loop breaker driver already exempts perpetual goals (!is_perpetual() filter + classify_standing_idle → benign perpetual_idled); this PR only feeds that predicate correctly.

Tests

New unit + integration coverage proves:

  • a standing seed → perpetual goal (cold start) and an ordinary seed stays non-perpetual;
  • reconcile_standing_markers self-heals the persisted hygiene goal by id/slug, is idempotent, and ignores unmatched / non-standing / already-perpetual goals;
  • end-to-end: a reconciled standing hygiene goal is never re-parked, escalated, or issue-filed over N+1 cycles, while the same goal left unmarked still escalates — proving the tag is exactly the fix.

Validation

  • cargo build, targeted + affected-module tests, cargo clippy --lib clean.
  • Pre-commit (Rust-only gate, 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 in mkdocs.yml nav.

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

)

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>
@github-actions

Copy link
Copy Markdown

📊 Coverage Summary

Generated by cargo llvm-cov --workspace --summary-only (nightly, excluding test files)

Module Lines Covered Coverage
Total 209127 176313 84.3%

Coverage data from CI run. Test files matching tests?/ are excluded from line counts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

OODA no-progress breaker: goal stuck after guided retry (UNCLEAR-CRITERIA)

1 participant