feat(legacy-meter): schedule 8h capture activity on railiance01
Add legacy-meter-8h-capture cron (0 */8 * * * UTC), pass hours through the state-hub resolver, and label progress summaries by window size.
This commit is contained in:
parent
b59bf92341
commit
f41cf14977
5 changed files with 104 additions and 2 deletions
31
activity-definitions/legacy-meter-8h-capture.md
Normal file
31
activity-definitions/legacy-meter-8h-capture.md
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
id: legacy-meter-8h-capture
|
||||||
|
name: Legacy-Meter 8h Capture
|
||||||
|
enabled: true
|
||||||
|
owner: custodian-agent
|
||||||
|
governance: custodian
|
||||||
|
status: active
|
||||||
|
trigger:
|
||||||
|
type: cron
|
||||||
|
cron_expression: "0 */8 * * *"
|
||||||
|
timezone: UTC
|
||||||
|
misfire_policy: skip
|
||||||
|
context_sources:
|
||||||
|
- type: state-hub
|
||||||
|
query: legacy_meter_weekly_review
|
||||||
|
required: true
|
||||||
|
params:
|
||||||
|
hours: 8
|
||||||
|
evidence_sinks:
|
||||||
|
- type: state-hub-progress
|
||||||
|
event_type: legacy_meter_8h_capture
|
||||||
|
author: activity-core
|
||||||
|
workplan_id: 44e2e123-9934-4b5e-8b50-1bac548c5b70
|
||||||
|
bind_to: context.legacy_meter_weekly_review
|
||||||
|
---
|
||||||
|
|
||||||
|
# Legacy-Meter 8h Capture
|
||||||
|
|
||||||
|
Runs every eight hours UTC. Fetches State Hub `/legacy-meter/weekly-review?hours=8`
|
||||||
|
and posts `legacy_meter_8h_capture` progress for STATE-WP-0073 / STATE-WP-0070
|
||||||
|
seven-window retirement gating.
|
||||||
|
|
@ -328,6 +328,41 @@ data:
|
||||||
Railiance projection of the Custodian-owned definition in
|
Railiance projection of the Custodian-owned definition in
|
||||||
`activity-definitions/weekly-legacy-meter-review.md`. Posts
|
`activity-definitions/weekly-legacy-meter-review.md`. Posts
|
||||||
`legacy_meter_weekly_review` progress for STATE-WP-0069 retirement gating.
|
`legacy_meter_weekly_review` progress for STATE-WP-0069 retirement gating.
|
||||||
|
legacy-meter-8h-capture.md: |
|
||||||
|
---
|
||||||
|
id: legacy-meter-8h-capture
|
||||||
|
name: Legacy-Meter 8h Capture
|
||||||
|
type: activity-definition
|
||||||
|
version: "1.0"
|
||||||
|
enabled: true
|
||||||
|
owner: custodian
|
||||||
|
governance: custodian
|
||||||
|
status: active
|
||||||
|
created: "2026-07-09"
|
||||||
|
trigger:
|
||||||
|
type: cron
|
||||||
|
cron_expression: "0 */8 * * *"
|
||||||
|
timezone: UTC
|
||||||
|
misfire_policy: skip
|
||||||
|
context_sources:
|
||||||
|
- type: state-hub
|
||||||
|
query: legacy_meter_weekly_review
|
||||||
|
required: true
|
||||||
|
params:
|
||||||
|
hours: 8
|
||||||
|
evidence_sinks:
|
||||||
|
- type: state-hub-progress
|
||||||
|
event_type: legacy_meter_8h_capture
|
||||||
|
author: activity-core
|
||||||
|
workplan_id: 44e2e123-9934-4b5e-8b50-1bac548c5b70
|
||||||
|
bind_to: context.legacy_meter_weekly_review
|
||||||
|
---
|
||||||
|
|
||||||
|
# ActivityDefinition: Legacy-Meter 8h Capture
|
||||||
|
|
||||||
|
Railiance projection of the Custodian-owned definition in
|
||||||
|
`activity-definitions/legacy-meter-8h-capture.md`. Posts
|
||||||
|
`legacy_meter_8h_capture` progress every 8h for STATE-WP-0073 retirement gating.
|
||||||
phase5-stabilization-closeout.md: |
|
phase5-stabilization-closeout.md: |
|
||||||
---
|
---
|
||||||
id: "e7d2b5a8-4c1f-4e9a-b6d3-8f2a1c4e6b09"
|
id: "e7d2b5a8-4c1f-4e9a-b6d3-8f2a1c4e6b09"
|
||||||
|
|
|
||||||
|
|
@ -178,15 +178,24 @@ def _legacy_meter_weekly_review(params: dict[str, Any]) -> dict[str, Any]:
|
||||||
"""Fetch State Hub legacy-meter weekly review for activity-core scheduling."""
|
"""Fetch State Hub legacy-meter weekly review for activity-core scheduling."""
|
||||||
query_params = {
|
query_params = {
|
||||||
key: params[key]
|
key: params[key]
|
||||||
for key in ("days", "window_start", "window_end")
|
for key in ("days", "hours", "window_start", "window_end")
|
||||||
if key in params
|
if key in params
|
||||||
}
|
}
|
||||||
raw = _fetch_json("/legacy-meter/weekly-review", query_params or None)
|
raw = _fetch_json("/legacy-meter/weekly-review", query_params or None)
|
||||||
interfaces = raw.get("interfaces") or []
|
interfaces = raw.get("interfaces") or []
|
||||||
candidates = raw.get("retirement_candidates") or []
|
candidates = raw.get("retirement_candidates") or []
|
||||||
window_calls = sum(int((item.get("window") or {}).get("calls") or 0) for item in interfaces)
|
window_calls = sum(int((item.get("window") or {}).get("calls") or 0) for item in interfaces)
|
||||||
|
window_hours = params.get("hours")
|
||||||
|
window_days = params.get("days")
|
||||||
|
if window_hours is not None:
|
||||||
|
window_label = f"{window_hours}h"
|
||||||
|
elif window_days is not None:
|
||||||
|
window_label = f"{window_days}d"
|
||||||
|
else:
|
||||||
|
window_label = "7d"
|
||||||
return {
|
return {
|
||||||
"kind": "legacy_meter_weekly_review",
|
"kind": "legacy_meter_weekly_review",
|
||||||
|
"window_label": window_label,
|
||||||
"generated_at": raw.get("generated_at"),
|
"generated_at": raw.get("generated_at"),
|
||||||
"window_start": raw.get("window_start"),
|
"window_start": raw.get("window_start"),
|
||||||
"window_end": raw.get("window_end"),
|
"window_end": raw.get("window_end"),
|
||||||
|
|
|
||||||
|
|
@ -538,8 +538,9 @@ def _legacy_meter_summary_text(result: dict[str, Any]) -> str:
|
||||||
candidates = result.get("retirement_candidate_count", 0)
|
candidates = result.get("retirement_candidate_count", 0)
|
||||||
calls = result.get("window_legacy_calls", 0)
|
calls = result.get("window_legacy_calls", 0)
|
||||||
interfaces = result.get("interface_count", 0)
|
interfaces = result.get("interface_count", 0)
|
||||||
|
window_label = result.get("window_label", "7d")
|
||||||
return (
|
return (
|
||||||
f"Legacy-meter weekly review: {candidates} retirement candidate(s) of "
|
f"Legacy-meter {window_label} review: {candidates} retirement candidate(s) of "
|
||||||
f"{interfaces} registered interface(s); {calls} legacy call(s) in window"
|
f"{interfaces} registered interface(s); {calls} legacy call(s) in window"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -768,6 +768,32 @@ def test_legacy_meter_weekly_review_summarises_candidates(monkeypatch) -> None:
|
||||||
assert result["retirement_candidates"][0]["interface_key"] == "mcp:create_workstream"
|
assert result["retirement_candidates"][0]["interface_key"] == "mcp:create_workstream"
|
||||||
|
|
||||||
|
|
||||||
|
def test_legacy_meter_weekly_review_passes_hours_param(monkeypatch) -> None:
|
||||||
|
seen: dict[str, Any] = {}
|
||||||
|
|
||||||
|
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
||||||
|
seen["params"] = kwargs.get("params")
|
||||||
|
return DummyResponse(
|
||||||
|
{
|
||||||
|
"generated_at": "2026-07-09T08:00:00+00:00",
|
||||||
|
"window_start": "2026-07-09T00:00:00+00:00",
|
||||||
|
"window_end": "2026-07-09T08:00:00+00:00",
|
||||||
|
"interfaces": [],
|
||||||
|
"retirement_candidates": [],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
monkeypatch.setenv("STATE_HUB_URL", "http://state-hub.test")
|
||||||
|
monkeypatch.setattr(httpx, "get", fake_get)
|
||||||
|
|
||||||
|
result = StateHubContextResolver().resolve(
|
||||||
|
"legacy_meter_weekly_review", None, {"hours": 8}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert seen["params"] == {"hours": 8}
|
||||||
|
assert result["window_label"] == "8h"
|
||||||
|
|
||||||
|
|
||||||
def test_phase5_stabilization_check_passes(monkeypatch) -> None:
|
def test_phase5_stabilization_check_passes(monkeypatch) -> None:
|
||||||
payloads = {
|
payloads = {
|
||||||
"/state/health": {"status": "ok", "db": "connected"},
|
"/state/health": {"status": "ok", "db": "connected"},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue