STATE-WP-0069: schedule weekly legacy-meter review monitoring
Add legacy_meter_weekly_review state-hub resolver query, weekly activity definition (Mon 08:30 Berlin), Railiance runtime projection, and progress sink posting for STATE-WP-0069 retirement gating.
This commit is contained in:
parent
bad91099e8
commit
efa361541b
8 changed files with 267 additions and 1 deletions
|
|
@ -137,6 +137,64 @@ def test_state_hub_progress_sink_posts_compact_probe_summary(monkeypatch) -> Non
|
|||
assert "token=secret" not in serialized
|
||||
|
||||
|
||||
def test_legacy_meter_weekly_review_sink_posts_progress(monkeypatch) -> None:
|
||||
posts: list[dict[str, Any]] = []
|
||||
|
||||
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
||||
return DummyResponse([])
|
||||
|
||||
def fake_post(url: str, **kwargs: Any) -> DummyResponse:
|
||||
posts.append({"url": url, **kwargs})
|
||||
return DummyResponse({"id": "progress-legacy-meter-1"})
|
||||
|
||||
monkeypatch.setattr(httpx, "get", fake_get)
|
||||
monkeypatch.setattr(httpx, "post", fake_post)
|
||||
|
||||
persist_ops_inventory_evidence(
|
||||
{
|
||||
"activity_id": "weekly-legacy-meter-review",
|
||||
"run_id": "12345678-aaaa-bbbb-cccc-123456789abc",
|
||||
"scheduled_for": "2026-07-08T06:30:00+00:00",
|
||||
"version_used": 1,
|
||||
"context_sources": [
|
||||
{
|
||||
"type": "state-hub",
|
||||
"query": "legacy_meter_weekly_review",
|
||||
"bind_to": "context.legacy_meter_weekly_review",
|
||||
"params": {
|
||||
"days": 7,
|
||||
"evidence_sinks": [
|
||||
{
|
||||
"type": "state-hub-progress",
|
||||
"state_hub_url": "http://state-hub.test",
|
||||
"event_type": "legacy_meter_weekly_review",
|
||||
"workplan_id": "923bb94a-d16c-422c-b81e-16328bd7b60c",
|
||||
}
|
||||
],
|
||||
},
|
||||
}
|
||||
],
|
||||
"context": {
|
||||
"legacy_meter_weekly_review": {
|
||||
"kind": "legacy_meter_weekly_review",
|
||||
"interface_count": 12,
|
||||
"retirement_candidate_count": 2,
|
||||
"window_legacy_calls": 5,
|
||||
"retirement_candidates": [],
|
||||
"checks": {"has_retirement_candidates": True},
|
||||
"overall_pass": True,
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
body = posts[0]["json"]
|
||||
assert body["event_type"] == "legacy_meter_weekly_review"
|
||||
assert "2 retirement candidate(s)" in body["summary"]
|
||||
assert body["workplan_id"] == "923bb94a-d16c-422c-b81e-16328bd7b60c"
|
||||
assert body["workstream_id"] == "923bb94a-d16c-422c-b81e-16328bd7b60c"
|
||||
|
||||
|
||||
def test_state_hub_progress_prefers_workplan_id(monkeypatch) -> None:
|
||||
posts: list[dict[str, Any]] = []
|
||||
|
||||
|
|
|
|||
|
|
@ -78,6 +78,24 @@ def test_external_configmap_projects_disabled_ops_probe_definition(tmp_path) ->
|
|||
]
|
||||
|
||||
|
||||
def test_external_configmap_projects_weekly_legacy_meter_review(tmp_path) -> None:
|
||||
config = _by_kind_name("ConfigMap", "actcore-external-activity-definitions")
|
||||
raw_definition = config["data"]["weekly-legacy-meter-review.md"]
|
||||
definition_path = tmp_path / "weekly-legacy-meter-review.md"
|
||||
definition_path.write_text(raw_definition, encoding="utf-8")
|
||||
|
||||
definition = parse_file(definition_path)
|
||||
|
||||
assert definition.id == "weekly-legacy-meter-review"
|
||||
assert definition.enabled is True
|
||||
assert definition.trigger_config["cron_expression"] == "30 8 * * 1"
|
||||
source = definition.context_sources[0]
|
||||
assert source["query"] == "legacy_meter_weekly_review"
|
||||
assert source["params"]["evidence_sinks"][0]["event_type"] == (
|
||||
"legacy_meter_weekly_review"
|
||||
)
|
||||
|
||||
|
||||
def test_external_configmap_projects_enabled_daily_wsjf_definition(tmp_path) -> None:
|
||||
config = _by_kind_name("ConfigMap", "actcore-external-activity-definitions")
|
||||
raw_definition = config["data"]["daily-statehub-wsjf-triage.md"]
|
||||
|
|
|
|||
|
|
@ -706,6 +706,68 @@ def test_daily_triage_digest_is_curated_scalar_json(monkeypatch) -> None:
|
|||
assert digest["ranked_suggestions"][0]["origin_ref"] == "issue-core-ingestion-api-key"
|
||||
|
||||
|
||||
def test_legacy_meter_weekly_review_summarises_candidates(monkeypatch) -> None:
|
||||
payloads = {
|
||||
"/legacy-meter/weekly-review": {
|
||||
"generated_at": "2026-07-08T08:30:00+00:00",
|
||||
"window_start": "2026-07-01T08:30:00+00:00",
|
||||
"window_end": "2026-07-08T08:30:00+00:00",
|
||||
"activity_core_handoff": {
|
||||
"activity_id": "statehub-legacy-interface-review",
|
||||
"scheduler_owner": "activity-core",
|
||||
},
|
||||
"interfaces": [
|
||||
{
|
||||
"interface": {
|
||||
"interface_key": "rest_api:GET /workstreams/",
|
||||
"interface_kind": "rest_api",
|
||||
"replacement_ref": "GET /workplans/",
|
||||
},
|
||||
"window": {"calls": 2},
|
||||
"retirement_candidate": False,
|
||||
},
|
||||
{
|
||||
"interface": {
|
||||
"interface_key": "mcp:create_workstream",
|
||||
"interface_kind": "mcp_tool",
|
||||
"replacement_ref": "create_workplan",
|
||||
},
|
||||
"window": {"calls": 0},
|
||||
"retirement_candidate": True,
|
||||
"retirement_reason": "no measured usage in review window",
|
||||
},
|
||||
],
|
||||
"retirement_candidates": [
|
||||
{
|
||||
"interface": {
|
||||
"interface_key": "mcp:create_workstream",
|
||||
"interface_kind": "mcp_tool",
|
||||
"replacement_ref": "create_workplan",
|
||||
},
|
||||
"window": {"calls": 0},
|
||||
"retirement_candidate": True,
|
||||
"retirement_reason": "no measured usage in review window",
|
||||
}
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
def fake_get(url: str, **kwargs: Any) -> DummyResponse:
|
||||
path = url.replace("http://state-hub.test", "")
|
||||
return DummyResponse(payloads.get(path, {}))
|
||||
|
||||
monkeypatch.setenv("STATE_HUB_URL", "http://state-hub.test")
|
||||
monkeypatch.setattr(httpx, "get", fake_get)
|
||||
|
||||
result = StateHubContextResolver().resolve("legacy_meter_weekly_review", None, {"days": 7})
|
||||
|
||||
assert result["kind"] == "legacy_meter_weekly_review"
|
||||
assert result["interface_count"] == 2
|
||||
assert result["retirement_candidate_count"] == 1
|
||||
assert result["window_legacy_calls"] == 2
|
||||
assert result["retirement_candidates"][0]["interface_key"] == "mcp:create_workstream"
|
||||
|
||||
|
||||
def test_phase5_stabilization_check_passes(monkeypatch) -> None:
|
||||
payloads = {
|
||||
"/state/health": {"status": "ok", "db": "connected"},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue