Skip to content

Commit d9c2cc9

Browse files
Waterline v2 health: expose redacted readiness issue codes for operator surface gaps (#288)
1 parent 62627b6 commit d9c2cc9

5 files changed

Lines changed: 469 additions & 20 deletions

File tree

app/Http/Controllers/V2HealthController.php

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,13 @@ public function show()
4242
'name' => 'engine_source',
4343
'status' => 'error',
4444
'message' => $engineSource['message'] ?? 'Waterline is not currently using the v2 operator bridge.',
45-
'meta' => [
46-
'configured' => $engineSource['configured'] ?? null,
47-
'resolved' => $engineSource['resolved'] ?? null,
48-
'uses_v2' => $engineSource['uses_v2'] ?? false,
49-
'v2_operator_surface_available' => $engineSource['v2_operator_surface_available'] ?? false,
50-
'issue_count' => count(is_array($engineSource['issues'] ?? null) ? $engineSource['issues'] : []),
51-
],
45+
'meta' => $this->engineSourceMeta($engineSource),
5246
],
5347
],
5448
'engine_source' => $engineSource,
5549
'readiness_contract' => $engineSource['readiness_contract'] ?? null,
50+
'readiness_issues' => $this->engineSourceReadinessIssues($engineSource),
51+
'readiness_issue_codes' => $this->engineSourceReadinessIssueCodes($engineSource),
5652
];
5753
$payload['coordination_alerts'] = $this->coordinationAlerts(
5854
$payload['checks'],
@@ -72,13 +68,7 @@ public function show()
7268
'name' => 'engine_source',
7369
'status' => 'ok',
7470
'message' => $engineSource['message'] ?? 'Waterline is using the v2 operator bridge.',
75-
'meta' => [
76-
'configured' => $engineSource['configured'] ?? null,
77-
'resolved' => $engineSource['resolved'] ?? null,
78-
'uses_v2' => $engineSource['uses_v2'] ?? false,
79-
'v2_operator_surface_available' => $engineSource['v2_operator_surface_available'] ?? false,
80-
'issue_count' => count(is_array($engineSource['issues'] ?? null) ? $engineSource['issues'] : []),
81-
],
71+
'meta' => $this->engineSourceMeta($engineSource),
8272
]);
8373
$snapshot['namespace'] = $namespace;
8474
$snapshot['operator_scope'] = OperatorScope::payload();
@@ -102,6 +92,53 @@ public function show()
10292
return response()->json($snapshot, HealthCheck::httpStatus($snapshot));
10393
}
10494

95+
/**
96+
* @param array<string, mixed> $engineSource
97+
* @return array<string, mixed>
98+
*/
99+
private function engineSourceMeta(array $engineSource): array
100+
{
101+
$readinessIssues = $this->engineSourceReadinessIssues($engineSource);
102+
103+
return [
104+
'configured' => $engineSource['configured'] ?? null,
105+
'resolved' => $engineSource['resolved'] ?? null,
106+
'uses_v2' => $engineSource['uses_v2'] ?? false,
107+
'v2_operator_surface_available' => $engineSource['v2_operator_surface_available'] ?? false,
108+
'issue_count' => count(is_array($engineSource['issues'] ?? null) ? $engineSource['issues'] : []),
109+
'readiness_issue_count' => count($readinessIssues),
110+
'readiness_issue_codes' => $this->engineSourceReadinessIssueCodes($engineSource),
111+
'readiness_issues' => $readinessIssues,
112+
];
113+
}
114+
115+
/**
116+
* @param array<string, mixed> $engineSource
117+
* @return list<array<string, mixed>>
118+
*/
119+
private function engineSourceReadinessIssues(array $engineSource): array
120+
{
121+
return is_array($engineSource['readiness_issues'] ?? null)
122+
? array_values(array_filter($engineSource['readiness_issues'], 'is_array'))
123+
: [];
124+
}
125+
126+
/**
127+
* @param array<string, mixed> $engineSource
128+
* @return list<string>
129+
*/
130+
private function engineSourceReadinessIssueCodes(array $engineSource): array
131+
{
132+
if (is_array($engineSource['readiness_issue_codes'] ?? null)) {
133+
return array_values(array_filter($engineSource['readiness_issue_codes'], 'is_string'));
134+
}
135+
136+
return array_values(array_unique(array_filter(array_map(
137+
static fn (array $issue): mixed => $issue['code'] ?? null,
138+
$this->engineSourceReadinessIssues($engineSource),
139+
), 'is_string')));
140+
}
141+
105142
/**
106143
* @param array<string, mixed> $snapshot
107144
* @return array<string, mixed>

app/Support/EngineSourceReadiness.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ public static function pinnedV2Unavailable(?array $status = null): bool
2222

2323
/**
2424
* @param array<string, mixed>|null $status
25-
* @return array{message: string, operator_scope: array<string, mixed>, engine_source: array<string, mixed>}
25+
* @return array{
26+
* message: string,
27+
* operator_scope: array<string, mixed>,
28+
* engine_source: array<string, mixed>,
29+
* readiness_issues: list<mixed>,
30+
* readiness_issue_codes: list<mixed>
31+
* }
2632
*/
2733
public static function unavailablePayload(?array $status = null): array
2834
{
@@ -32,6 +38,12 @@ public static function unavailablePayload(?array $status = null): array
3238
'message' => self::unavailableMessage($status),
3339
'operator_scope' => OperatorScope::payload(),
3440
'engine_source' => $status,
41+
'readiness_issues' => is_array($status['readiness_issues'] ?? null)
42+
? array_values($status['readiness_issues'])
43+
: [],
44+
'readiness_issue_codes' => is_array($status['readiness_issue_codes'] ?? null)
45+
? array_values($status['readiness_issue_codes'])
46+
: [],
3547
];
3648
}
3749

0 commit comments

Comments
 (0)