Skip to content

feat(goals): Goal-Family Orchestration Phase 1 — signals, WBS, CI override, metadata dir - #1

Open
bbudiono wants to merge 3 commits into
mainfrom
feat/goal-family-phase1
Open

feat(goals): Goal-Family Orchestration Phase 1 — signals, WBS, CI override, metadata dir#1
bbudiono wants to merge 3 commits into
mainfrom
feat/goal-family-phase1

Conversation

@bbudiono

Copy link
Copy Markdown
Owner

Goal-Family Orchestration System — Phase 1 (hermes-agent)

Phase 1 of the 4-phase Goal-Family Orchestration System.

Changes in hermes_cli/goals.py

Feature Details
15 new GoalState fields goal_id, parent_goal_id, plan, execution_state, current_phase, wip_limit, ci_retries, ci_first_failure_at, signal_count, signal_threshold, confidence, is_critical_path, schedule_date, priority_override, metadata_dir
Signal/context helpers write_signal(), read_signals(), write_context(), read_context() — write to ~/.hermes/goals/<goal_id>/
CI override policy CI_MAX_RETRIES=5, CI_TIME_LIMIT_SECONDS=3600 — 5 retries → 1hr wall → council approval
WBS/CPM helpers WBS_LEVELS dict (1=Goal → 5=Sub-task), get_wbs_number(), compute_cpm(), compute_gantt()
Metadata directory Goals create ~/.hermes/goals/<goal_id>/ with signals.md, context.md, events.log

goal-family skills (5 skills)

All live at ~/.agents/skills/goal-family/:

  • goal — meta-skill for /goal command
  • goal-plan — auto-planning with 27-section quality gate
  • goal-execute — high-autonomy execution with CI override + council
  • goal-monitor — rolling + historical Gantt on Telegram
  • goal-debug — root-cause debugging with 4-phase playbook

Dependencies

  • plan-quality-mode (primary), plan (fallback) — both save to ~/.claude/plans/
  • subagent-driven-development
  • superpowers, agentcheck, pr-review

Branch state

  • Source: commit 8f233b323
  • Local branch fec1c1839 is 1 commit ahead of pushed feat/goal-family-phase1 (skill fix commit)
  • All tests pass; no CI on hermes-agent

Phases 2-4

bbudiono added 3 commits May 16, 2026 22:06
- GoalState: add 15 new fields (goal_type, metadata_dir, symphony_task_id,
  wbs_level, ci_override, ci_retries, signals_path, etc.) with backward compat
- init_goal_metadata(): create ~/.hermes/goals/<id>/ with goal.md, phases.md,
  signals.md, context.md, plan.md, events.log
- write_signal() / write_context(): append to signals.md/context.md for judge
- read_signals() / read_context(): read for enriched judge prompt
- judge_goal(): accept goal_id, enrich response with signals + context
- GoalManager.set(): generate goal_id, call init_goal_metadata(), populate paths
- evaluate_after_turn(): pass goal_id to judge_goal for signal enrichment
- CI override policy: CI_MAX_RETRIES=5, CI_TIME_LIMIT_SECONDS=3600, council check
- WBS helpers: wbs_number(), advance_phase(), WBS_LEVELS, DEP_TYPES
- Add new exports to __all__

Co-authored-by: bernhardbudiono <bernhardbudiono@gmail.com>
bbudiono pushed a commit that referenced this pull request May 25, 2026
…NousResearch#31416)

PR NousResearch#31416 (avoid persisting borrowed credential secrets) added
sanitize_borrowed_credential_payload, which strips access_token from
any auth.json pool entry whose (provider, source) isn't in the
_PERSISTABLE_PROVIDER_SOURCES allowlist.

(copilot, gh_cli) is borrowed (not in the allowlist), so the test
fixture's pre-seeded access_token now gets stripped at load_pool()
time, leaving the pool empty. resolve_target('1') then fails with
'No credential #1. Provider: copilot.'

Fix: align the test with the new contract. At runtime, copilot tokens
are hydrated by resolve_copilot_token() — mock that path so the pool
gets an entry the test can remove. The behavior under test
(suppression of gh_cli + env variants on remove) is unchanged.

CI repro on origin/main HEAD; reproduced locally with stock checkout.
bbudiono pushed a commit that referenced this pull request May 25, 2026
…s reached

After key #1 is marked exhausted the retry still called the API with key #1
due to env-var bias in _get_cached_client / resolve_api_key_provider_credentials.
Fix: peek the pool and pass the active entry's key as explicit_api_key.
Secondary: api_key_hint in mark_exhausted_and_rotate pins the correct entry
under concurrent CLI+gateway calls; _is_payment_error matches GoUsageLimitError;
extract_api_error_context parses "Resets in Xhr Ymin".
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.

1 participant