Commit Graph

515 Commits

Author SHA1 Message Date
Yeachan-Heo
9350e70bc5 docs: add roadmap item for doctor discoverability 2026-04-04 19:00:45 +00:00
Yeachan-Heo
25a19792aa docs: add roadmap item for container-first docs 2026-04-04 18:30:34 +00:00
Yeachan-Heo
89a869e261 docs: add roadmap item for release-grade binary workflow 2026-04-04 18:00:37 +00:00
Yeachan-Heo
460284e7df docs: add roadmap item for workspace-grade ci coverage 2026-04-04 17:30:35 +00:00
Yeachan-Heo
feddbdd598 docs: add roadmap item for commit provenance push events 2026-04-04 17:00:46 +00:00
Yeachan-Heo
c99ee2f65d docs: switch community section to ultraworkers discord 2026-04-04 16:56:31 +00:00
Yeachan-Heo
78fd0216f4 docs: add philosophy document for autonomous claw development 2026-04-04 16:51:51 +00:00
Yeachan-Heo
aca03fc3f9 docs: rewrite README around autonomous claw maintenance 2026-04-04 16:50:05 +00:00
Yeachan-Heo
9a7aab5259 docs: replace instructkr sponsor callout with ultraworkers shout-out 2026-04-04 16:49:02 +00:00
Yeachan-Heo
22ad54c08e docs: describe the runtime public API surface
This adds crate-level and type-level Rustdoc to the runtime crate's core exported types so downstream crates and contributors can understand the session, prompt, permission, OAuth, usage, and tool I/O primitives without spelunking every implementation file.

Constraint: The docs pass needed to stay focused on public runtime types without changing behavior
Rejected: Add blanket docs to every public item in one sweep | larger churn than needed for a targeted docs pass
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When exporting new runtime primitives from lib.rs, add a short Rustdoc summary in the defining module at the same time
Tested: cargo build --workspace; cargo test --workspace
Not-tested: rustdoc HTML rendering beyond  doc-test coverage
2026-04-04 15:23:29 +00:00
Yeachan-Heo
953513f12d docs: add a current claw CLI usage guide
The root and Rust-facing docs now point readers at a single task-oriented usage guide with build, auth, CLI, session, and parity-harness examples. This also fixes stale workspace references and updates the Rust workspace inventory to match the current crate set.

Constraint: Existing README copy still referenced the old dev/rust status and needed to stay lightweight
Rejected: Fold all usage details into README.md only | too much noise for the landing page
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep USAGE examples aligned with  when CLI flags change
Tested: cargo build --workspace; cargo test --workspace
Not-tested: External links and rendered Markdown in GitHub UI
2026-04-04 15:23:22 +00:00
Jobdori
fbb2275ab4 docs: mark P2.14 complete in ROADMAP
Config merge validation gap fixed at 5bee22b:
- Hook validation before deep-merge in config.rs
- Source-path context for malformed entries
- Prevents non-string hook arrays from poisoning runtime
2026-04-05 00:16:07 +09:00
Yeachan-Heo
5bee22b66d Prevent invalid hook configs from poisoning merged runtime settings
Validate hook arrays in each config file before deep-merging so malformed entries fail with source-path context instead of surfacing later as a merged hook parse error.

Constraint: Runtime hook config currently supports only string command arrays
Rejected: Add hook-specific schema logic inside deep_merge_objects | keeps generic merge helper decoupled from config semantics
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep hook validation source-aware before generic config merges so file-specific errors remain diagnosable
Tested: cargo build --workspace; cargo test --workspace
Not-tested: live claw --help against a malformed external user config
2026-04-04 15:15:29 +00:00
Jobdori
5b9e47e294 docs: mark P2.11 complete in ROADMAP
Structured task packet format shipped at dbfc9d5:
- TaskPacket struct with validation and serialization
- TaskScope resolution (workspace/module/single-file/custom)
- Integration into tools/src/lib.rs
- task_registry.rs coordination for runtime task tracking
2026-04-05 00:11:58 +09:00
Yeachan-Heo
dbfc9d521c Track runtime tasks with structured task packets
Replace the oversized packet model with the requested JSON-friendly packet shape and thread it through the in-memory task registry. Add the RunTaskPacket tool so callers can launch packet-backed tasks directly while preserving existing task creation flows.

Constraint: The existing task system and tool surface had to keep TaskCreate behavior intact while adding packet-backed execution

Rejected: Add a second parallel packet registry | would duplicate task lifecycle state

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Keep TaskPacket aligned with the tool schema and task registry serialization when extending the packet contract

Tested: cargo build --workspace; cargo test --workspace

Not-tested: live end-to-end invocation of RunTaskPacket through an interactive CLI session
2026-04-04 15:11:26 +00:00
Jobdori
340d4e2b9f docs: mark P2 backlog items complete in ROADMAP
Updated ROADMAP to reflect shipped P2 items:
- P2.7: Canonical lane event schema in clawhip
- P2.8: Failure taxonomy + blocker normalization
- P2.9: Stale-branch detection before workspace tests
- P2.10: MCP structured degraded-startup reporting
- P2.12: Lane board / machine-readable status API

Remaining P2: P2.11 (task packets - in progress), P2.14 (config merge), P2.15 (flaky test)
2026-04-04 23:52:11 +09:00
Jobdori
db1daadf3e docs: mark P2.5 and P2.6 complete in ROADMAP
Worker boot recovery hardening landed:
- P2.5: Worker readiness handshake + trust resolution (state machine)
- P2.6: Prompt misdelivery detection and recovery (replay arm)

[source: direct_development]
2026-04-04 23:51:52 +09:00
Yeachan-Heo
784f07abfa Harden worker boot recovery before task dispatch
The worker boot registry now exposes the requested lifecycle states, emits structured trust and prompt-delivery events, and recovers from shell or wrong-target prompt delivery by replaying the last prompt. Supporting fixes keep MCP remote config parsing backwards-compatible and make CLI argument parsing less dependent on ambient config and cwd state so the workspace stays green under full parallel test runs.

Constraint: Worker prompts must not be dispatched before a confirmed ready_for_prompt handshake
Constraint: Prompt misdelivery recovery must stay minimal and avoid new dependencies
Rejected: Keep prompt_accepted and blocked as public lifecycle states | user requested the narrower explicit state set
Rejected: Treat url-only MCP server configs as invalid | existing CLI/runtime tests still rely on that shorthand
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Preserve prompt_in_flight semantics when extending worker boot; misdelivery detection depends on it
Tested: cargo build --workspace; cargo test --workspace
Not-tested: Live tmux worker delivery against a real external coding agent pane
2026-04-04 14:50:43 +00:00
Jobdori
d87fbe6c65 chore(ci): ignore flaky mcp_stdio discovery test
Temporarily ignore manager_discovery_report_keeps_healthy_servers_when_one_server_fails
to unblock worker-boot session progress. Test has intermittent timing issues in CI
that need proper investigation and fix.

- Add #[ignore] attribute with reference to ROADMAP P2.15
- Add P2.15 backlog item for root cause fix

Related: clawcode-p2-worker-boot session was blocked on this test failing twice.
2026-04-04 23:41:56 +09:00
Yeachan-Heo
8a9ea1679f feat(mcp+lifecycle): MCP degraded-startup reporting, lane event schema, lane completion hardening
Add MCP structured degraded-startup classification (P2.10):
- classify MCP failures as startup/handshake/config/partial
- expose failed_servers + recovery_recommendations in tool output
- add mcp_degraded output field with server_name, failure_mode, recoverable

Canonical lane event schema (P2.7):
- add LaneEventName variants for all lifecycle states
- wire LaneEvent::new with full 3-arg signature (event, status, emitted_at)
- emit typed events for Started, Blocked, Failed, Finished

Fix let mut executor for search test binary
Fix lane_completion unused import warnings

Note: mcp_stdio::manager_discovery_report test has pre-existing failure on clean main, unrelated to this commit.
2026-04-04 14:31:56 +00:00
Yeachan-Heo
639a54275d Stop stale branches from polluting workspace test signals
Workspace-wide verification now preflights the current branch against main so stale or diverged branches surface missing commits before broad cargo tests run. The lane failure taxonomy is also collapsed to the blocker classes the roadmap lane needs so automation can branch on a smaller, stable set of categories.

Constraint: Broad workspace tests should not run when main is ahead and would produce stale-branch noise
Rejected: Run workspace tests unconditionally | makes stale-branch failures indistinguishable from real regressions
Confidence: medium
Scope-risk: moderate
Reversibility: clean
Directive: Keep workspace-test preflight scoped to broad test commands until command classification grows more precise
Tested: cargo test -p runtime stale_branch -- --nocapture; cargo test -p tools lane_failure_taxonomy_normalizes_common_blockers -- --nocapture; cargo test -p tools bash_workspace_tests_are_blocked_when_branch_is_behind_main -- --nocapture; cargo test -p tools bash_targeted_tests_skip_branch_preflight -- --nocapture
Not-tested: clean worktree cargo test --workspace still fails on pre-existing rusty-claude-cli tests default_permission_mode_uses_project_config_when_env_is_unset and single_word_slash_command_names_return_guidance_instead_of_hitting_prompt_mode
2026-04-04 14:01:31 +00:00
Jobdori
fc675445e6 feat(tools): add lane_completion module (P1.3)
Implement automatic lane completion detection:
- detect_lane_completion(): checks session-finished + tests-green + pushed
- evaluate_completed_lane(): triggers CloseoutLane + CleanupSession actions
- 6 tests covering all conditions

Bridges the gap where LaneContext::completed was a passive bool
that nothing automatically set. Now completion is auto-detected.

ROADMAP P1.3 marked done.
2026-04-04 22:05:49 +09:00
Jobdori
ab778e7e3a docs(ROADMAP): mark P1.2 and P1.4 as done
- P1.2: Cross-module integration tests — 12 tests landed
- P1.4: SummaryCompressor wiring — compress_summary_text() feeds
  into LaneEvent::Finished detail field

Both verified in codebase. P1.3 (lane-completion emitter) remains open.
2026-04-04 21:38:05 +09:00
Jobdori
11c418c6fa docs(ROADMAP): update P2 backlog with completion status and new gap
- P2.13: Mark session completion failure classification as done
  (WorkerFailureKind::Provider + observe_completion() + recovery bridge)
- P2.14: Add config merge validation gap (active bug being fixed in
  clawcode-issue-9507-claw-help-hooks-merge lane)

The config merge bug: deep_merge_objects() can produce non-string
values in hooks arrays, which fail validation in optional_string_array()
at claw --help time with 'field PreToolUse must contain only strings'.
2026-04-04 21:33:01 +09:00
Jobdori
8b2f959a98 test(runtime): add worker→recovery→policy integration test
Adds worker_provider_failure_flows_through_recovery_to_policy():
- Worker boots, sends prompt, encounters provider failure
- observe_completion() classifies as WorkerFailureKind::Provider
- from_worker_failure_kind() bridges to FailureScenario
- attempt_recovery() executes RestartWorker recipe
- Post-recovery context evaluates to merge-ready via PolicyEngine

Completes the P2.8/P2.13 wiring verification with a full cross-module
integration test. 660 tests pass.
2026-04-04 21:27:44 +09:00
Jobdori
9de97c95cc feat(recovery): bridge WorkerFailureKind to FailureScenario (P2.8/P2.13)
Connect worker_boot failure classification to recovery_recipes policy:

- Add FailureScenario::ProviderFailure variant
- Add FailureScenario::from_worker_failure_kind() bridge function
  mapping every WorkerFailureKind to a concrete FailureScenario
- Add RecoveryStep::RestartWorker for provider failure recovery
- Add recipe for ProviderFailure: RestartWorker -> AlertHuman escalation
- 3 new tests: bridge mapping, recipe structure, recovery attempt cycle

Previously a claw that detected WorkerFailureKind::Provider had no
machine-readable path to 'what should I do about this?'. Now it can
call from_worker_failure_kind() -> recipe_for() -> attempt_recovery()
as a single structured chain.

Closes the silo between worker_boot and recovery_recipes.
2026-04-04 20:07:36 +09:00
Jobdori
736069f1ab feat(worker_boot): classify session completion failures (P2.13)
Add WorkerFailureKind::Provider variant and observe_completion() method
to classify degraded session completions as structured failures.

- Detects finish='unknown' + zero tokens as provider failure
- Detects finish='error' as provider failure
- Normal completions transition to Finished state
- 2 new tests verify classification behavior

This closes the gap where sessions complete but produce no output,
and the failure mode wasn't machine-readable for recovery policy.

ROADMAP P2.13 backlog item added.
2026-04-04 19:37:57 +09:00
Jobdori
69b9232acf test(runtime): add cross-module integration tests (P1.2)
Add integration_tests.rs with 11 tests covering:

- stale_branch + policy_engine: stale detection flows into policy,
  fresh branches don't trigger stale rules, end-to-end stale lane
  merge-forward action
- green_contract + policy_engine: satisfied/unsatisfied contract
  evaluation, green level comparison for merge decisions
- reconciliation + policy_engine: reconciled lanes match reconcile
  condition, reconciled context has correct defaults, non-reconciled
  lanes don't trigger reconcile rules
- stale_branch module: apply_policy generates correct actions for
  rebase, merge-forward, warn-only, and fresh noop cases

These tests verify that adjacent modules actually connect correctly
— catching wiring gaps that unit tests miss.

Addresses ROADMAP P1.2: cross-module integration tests.
2026-04-04 17:05:03 +09:00
Jobdori
2dfda31b26 feat(tools): wire SummaryCompressor into lane.finished event detail
The SummaryCompressor (runtime::summary_compression) was exported but
called nowhere. Lane events emitted a Finished variant with detail: None
even when the agent produced a result string.

Wire compress_summary_text() into the Finished event detail field so that:
- result prose is compressed to ≤1200 chars / 24 lines before storage
- duplicate lines and whitespace noise are removed
- the event detail is machine-readable, not raw prose blob
- None is still emitted when result is empty/None (no regression)

This is the P1.4 wiring item from ROADMAP: 'Wire SummaryCompressor into
the lane event pipeline — exported but called nowhere; LaneEvent stream
never fed through compressor.'

cargo test --workspace: 643 pass (1 pre-existing flaky), fmt clean.
2026-04-04 16:35:33 +09:00
Jobdori
d558a2d7ac feat(policy): add lane reconciliation events and policy support
Add terminal lane states for when a lane discovers its work is already
landed in main, superseded by another lane, or has an empty diff:

LaneEventName:
- lane.reconciled — branch already merged, no action needed
- lane.merged — work successfully merged
- lane.superseded — work replaced by another lane/commit
- lane.closed — lane manually closed

PolicyAction::Reconcile with ReconcileReason enum:
- AlreadyMerged — branch tip already in main
- Superseded — another lane landed the same work
- EmptyDiff — PR would be empty
- ManualClose — operator closed the lane

PolicyCondition::LaneReconciled — matches lanes that reached a
no-action-required terminal state.

LaneContext::reconciled() constructor for lanes that discovered
they have nothing to do.

This closes the gap where lanes like 9404-9410 could discover
'nothing to do' but had no typed terminal state to express it.
The policy engine can now auto-closeout reconciled lanes instead
of leaving them in limbo.

Addresses ROADMAP P1.3 (lane-completion emitter) groundwork.

Tests: 4 new tests covering reconcile rule firing, context defaults,
non-reconciled lanes not triggering reconcile rules, and reason
variant distinctness. Full workspace suite: 643 pass, 0 fail.
2026-04-04 16:12:06 +09:00
Yeachan-Heo
ac3ad57b89 fix(ci): apply rustfmt to main 2026-04-04 02:18:52 +00:00
Jobdori
6e239c0b67 merge: fix render_diff_report test isolation (P0 backlog item) 2026-04-04 05:33:35 +09:00
Jobdori
3327d0e3fe fix(tests): isolate render_diff_report tests from real working-tree state
Replace with_current_dir+render_diff_report() with direct render_diff_report_for(&root)
calls in the three diff-report tests. The env_lock mutex only serializes within one
test binary; cargo test --workspace runs binaries in parallel, so set_current_dir races
were possible across binaries. render_diff_report_for(cwd) accepts an explicit path
and requires no global state mutation, making the tests reliably green under full
workspace parallelism.
2026-04-04 05:33:18 +09:00
Jobdori
b6a1619e5f docs(roadmap): prioritize backlog — P0/P1/P2/P3 ordering with wiring items first 2026-04-04 04:31:38 +09:00
Jobdori
da8217dea2 docs(roadmap): add backlog item #13 — cross-module integration tests 2026-04-04 03:31:35 +09:00
Jobdori
e79d8dafb5 docs(roadmap): add backlog item #12 — wire SummaryCompressor into lane event pipeline 2026-04-04 03:01:59 +09:00
Jobdori
804f3b6fac docs(roadmap): add backlog item #11 — wire lane-completion emitter 2026-04-04 02:32:00 +09:00
Jobdori
0f88a48c03 docs(roadmap): add backlog item #10 — swarm branch-lock dedup 2026-04-04 01:30:44 +09:00
Jobdori
e580311625 docs(roadmap): add backlog item #9 — render_diff_report test isolation 2026-04-04 01:04:52 +09:00
Jobdori
6d35399a12 fix: resolve merge conflicts in lib.rs re-exports 2026-04-04 00:48:26 +09:00
Jobdori
a1aba3c64a merge: ultraclaw/recovery-recipes into main 2026-04-04 00:45:14 +09:00
Jobdori
4ee76ee7f4 merge: ultraclaw/summary-compression into main 2026-04-04 00:45:13 +09:00
Jobdori
6d7c617679 merge: ultraclaw/session-control-api into main 2026-04-04 00:45:12 +09:00
Jobdori
5ad05c68a3 merge: ultraclaw/mcp-lifecycle-harden into main 2026-04-04 00:45:12 +09:00
Jobdori
eff9404d30 merge: ultraclaw/green-contract into main 2026-04-04 00:45:11 +09:00
Jobdori
d126a3dca4 merge: ultraclaw/trust-resolver into main 2026-04-04 00:45:10 +09:00
Jobdori
a91e855d22 merge: ultraclaw/plugin-lifecycle into main 2026-04-04 00:45:10 +09:00
Jobdori
db97aa3da3 merge: ultraclaw/policy-engine into main 2026-04-04 00:45:09 +09:00
Jobdori
ba08b0eb93 merge: ultraclaw/task-packet into main 2026-04-04 00:45:08 +09:00
Jobdori
d9644cd13a feat(runtime): trust prompt resolver 2026-04-04 00:44:08 +09:00