Skip to content

Commit 51a592b

Browse files
committed
feat(v0.4.10): wire workflows_list, live plugin health, redaction emit sites, flaky test fixes
- http(workflows_list): adopt lossier wire shape on /api/v1/workflows. Returns WorkflowRunSummary rows (kebab-case status, drops phases / machine_state / decision history). GraphQL stays on the full OrchestratorWorkflow shape so the embedded web UI is unaffected. - daemon health: spawn each discovered plugin one-shot under a 3s deadline, run the initialize handshake + health/check, collect the status / uptime_ms / last_error per plugin. Probes fan out via join_all so wall time is bounded. - orchestrator-logging: move log_redact from daemon-runtime into the logging crate and invoke redact_log_entry from Logger::write_entry so every emit site picks up redaction automatically. The daemon control-wire path keeps the redaction-before-persistence guarantee. - tests: fix the two pre-existing flakes documented across many agent reports. plugin_registry_path_falls_back_to_legacy_when_canonical_missing was deterministically broken (set ANIMUS_CONFIG_DIR while expecting legacy fallback); install_succeeds_after_org_added_to_trusted + 4 siblings raced on bare ANIMUS_TRUSTED_ORGS env writes — both now use a process mutex + RAII env guard. - ci: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 set across all 8 in-tree workflow YAML files ahead of the 2026-06-02 GitHub Actions Node 20 cutover.
1 parent 566212c commit 51a592b

21 files changed

Lines changed: 545 additions & 265 deletions

File tree

.github/workflows/auto-tag-release.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ on:
88
permissions:
99
contents: write
1010

11+
env:
12+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
13+
# Forces JS-based actions onto Node 24 ahead of the cutover.
14+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
15+
1116
jobs:
1217
auto-tag:
1318
name: Tag release version

.github/workflows/docs.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ concurrency:
1818
group: pages
1919
cancel-in-progress: false
2020

21+
env:
22+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
23+
# Forces JS-based actions onto Node 24 ahead of the cutover.
24+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
25+
2126
jobs:
2227
build:
2328
runs-on: ubuntu-latest

.github/workflows/protocol-drift.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ concurrency:
2525
group: protocol-drift-${{ github.ref }}
2626
cancel-in-progress: true
2727

28+
env:
29+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
30+
# Forces JS-based actions onto Node 24 ahead of the cutover.
31+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
32+
2833
jobs:
2934
drift:
3035
name: protocol drift check

.github/workflows/release-rollback-validation.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ on:
1515
permissions:
1616
contents: read
1717

18+
env:
19+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
20+
# Forces JS-based actions onto Node 24 ahead of the cutover.
21+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
22+
1823
jobs:
1924
candidate_smoke:
2025
name: candidate-smoke

.github/workflows/release.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ on:
1616
permissions:
1717
contents: read
1818

19+
env:
20+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
21+
# Forces JS-based actions onto Node 24 ahead of the cutover.
22+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
23+
1924
jobs:
2025
web-ui-gates:
2126
name: Web UI Gates

.github/workflows/rust-only-dependency-policy.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ on:
77
permissions:
88
contents: read
99

10+
env:
11+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
12+
# Forces JS-based actions onto Node 24 ahead of the cutover.
13+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14+
1015
jobs:
1116
rust_only_dependency_guardrail:
1217
name: Rust-only dependency guardrail

.github/workflows/rust-workspace-ci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ concurrency:
1111
group: rust-workspace-ci-${{ github.ref }}
1212
cancel-in-progress: true
1313

14+
env:
15+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
16+
# Forces JS-based actions onto Node 24 ahead of the cutover.
17+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
18+
1419
jobs:
1520
rustfmt:
1621
name: rustfmt

.github/workflows/web-ui-ci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ concurrency:
2525
group: web-ui-ci-${{ github.ref }}
2626
cancel-in-progress: true
2727

28+
env:
29+
# GitHub Actions runner Node 20 -> Node 24 deprecation (effective 2026-06-02).
30+
# Forces JS-based actions onto Node 24 ahead of the cutover.
31+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
32+
2833
jobs:
2934
web-ui-matrix:
3035
name: web-ui-matrix (node ${{ matrix.node }})

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,37 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
## [0.4.10] - 2026-05-22
8+
9+
Patch release. Picks up v0.4.9 deferrals plus the broader cleanup the user has been queuing — the long-deferred `workflows_list` wire migration (HTTP only), live per-plugin `health/check` RPC fan-out, log redaction wired into every emit site, the two pre-existing flaky tests fixed at the root cause, and a `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24` sweep ahead of the 2026-06-02 GitHub Actions Node 20 cutover.
10+
11+
### Breaking Changes
12+
13+
- **`http(workflows_list)`: wire shape on `/api/v1/workflows`.** The HTTP endpoint now serves `WorkflowRunSummary` rows (`id`, `definition`, `status`, `subject_id`, `started_at`, `finished_at`) instead of the full `OrchestratorWorkflow`. Daemon-internal fields (`phases`, `machine_state`, `current_phase`, `checkpoint_metadata`, decision history) no longer leak through the public HTTP API. `status` is kebab-case (`in-progress`-style) on the wire; `Escalated` collapses to `Paused` because the wire status enum lacks the variant. GraphQL `workflows` and `workflowsPaginated` still serve the full `OrchestratorWorkflow` shape, so the embedded web UI is unaffected.
14+
15+
### Features
16+
17+
- **`feat(daemon health)`: live per-plugin `health/check` fan-out.** `daemon_health()` now spawns each discovered plugin one-shot, runs the `initialize` handshake, calls `health/check`, and shuts the plugin down — all under a 3s per-plugin deadline. Probes fire concurrently via `futures_util::future::join_all`, so the wall time is roughly one probe regardless of plugin count. Failures land as `Unhealthy` rows with the error string in `last_error`; the daemon's own status stays `Healthy` because plugin-side trouble is an observability concern, not a daemon-liveness one. A long-lived plugin host pool is still v0.5 work, but `daemon health` is not hot-path enough to need it.
18+
- **`feat(orchestrator-logging)`: redaction wired into `Logger::write_entry`.** The v0.4.9 `redact_log_entry` building block moved from `orchestrator_daemon_runtime::control::log_redact` into `orchestrator_logging::log_redact` and is invoked from `Logger::write_entry` immediately before serialization. Every emit site that goes through the logger picks up redaction automatically; the old module path remains as a re-export so external callers stay source-compatible. New regression test (`write_entry_redacts_msg_in_persisted_line`) reads the persisted `events.jsonl` line and asserts the secret never reached disk.
19+
- **`feat(workflows_list)`: `workflows_list_summary` API method.** New `WebApiService::workflows_list_summary(query)` returns `ListPage<WorkflowRunSummary>` — the projection helper `workflow_to_run_summary` maps local `OrchestratorWorkflow` rows onto the wire shape. The HTTP handler at `/api/v1/workflows` calls this method; the existing `workflows_list` is kept for GraphQL.
20+
21+
### Fixes
22+
23+
- **`fix(tests)`: `plugin_registry_path_falls_back_to_legacy_when_canonical_missing`.** The test was setting `ANIMUS_CONFIG_DIR` to a non-empty path while asserting that `default_config_path()` returns the legacy `~/.config/animus/plugins.yaml`. The `config_dir_overridden` guard in `default_config_path()` intentionally skips the legacy fallback when `ANIMUS_CONFIG_DIR` is set, so the test was actually deterministically failing — but ENV_GUARD poisoning and other tests interacting through the same mutex were masking it as a "flake". The fix explicitly clears `ANIMUS_CONFIG_DIR` for the duration of the test (using the existing `EnvVarGuard`) so the legacy-fallback branch is exercised.
24+
- **`fix(tests)`: `install_succeeds_after_org_added_to_trusted` + 4 siblings.** All five trusted-orgs tests in `ops_plugin` were calling `std::env::set_var("ANIMUS_TRUSTED_ORGS", …)` and `remove_var` bare, with no serialization. Concurrent test threads racing on the same process-global env var were the documented flake source. Fix: new `TRUSTED_ORGS_ENV_GUARD` process-level mutex plus a small `ScopedEnv` RAII helper that restores the prior value on drop (panic-safe). All five tests now serialize through the mutex.
25+
26+
### Plugin Cascade
27+
28+
No plugin-repo cascade in v0.4.10 — `animus-protocol` stays pinned at v0.1.4. The wire shape adopted by item A already lives in v0.1.4, so no protocol bump was required.
29+
30+
### Ops / CI
31+
32+
- **`chore(ci)`: `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24` set across all in-tree workflows.** GitHub Actions runners deprecate Node 20 on 2026-06-02; the env var forces JS-based actions onto Node 24 ahead of the cutover. Patched into all 8 `.github/workflows/*.yml` files as a top-level `env:` block.
33+
34+
### Carried Forward
35+
36+
- **Release automation across the 15-repo ecosystem.** Scoping was completed (lighter path: a separate `launchapp-dev/animus-release-automation` repo with a CLI tool that runs the version-pin matrix check + cascade-PR generation), but the implementation work was deferred so the v0.4.10 budget could land items A through F. Filed as the v0.4.11 / v0.5 starting point.
37+
738
## [0.4.9] - 2026-05-22
839

940
Patch release. Picks up v0.4.8 deferrals plus a handful of originally-planned items: the plugin-repo cascade onto animus-protocol v0.1.4, daemon-health per-plugin enumeration, a log redaction layer, and a cleanup pass on the stale `AgentPool` references that have been confusing agent reports for several patches.

Cargo.lock

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)