fix: approval legacy route prefix and jobengine orchestrator alias

- Fix approval.client.ts legacy URL from /api/release-orchestrator/ to
  /api/v1/release-orchestrator/ matching gateway route config
- Add orchestrator.stella-ops.local alias to jobengine container so
  gateway route translation resolves correctly
- Update sprint execution log with QA iteration results (40/40 pages clean)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-03-06 15:26:18 +02:00
parent 49763be70b
commit 6eb6d5e356
3 changed files with 9 additions and 4 deletions

View File

@@ -1119,6 +1119,7 @@ services:
stellaops: stellaops:
aliases: aliases:
- jobengine.stella-ops.local - jobengine.stella-ops.local
- orchestrator.stella-ops.local
frontdoor: {} frontdoor: {}
healthcheck: healthcheck:
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/$(hostname)/80'"] test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/$(hostname)/80'"]

View File

@@ -149,12 +149,16 @@ Completion criteria:
| 2026-03-06 | Added typed chip-context registry contract (`search-context.registry.ts`) and shifted suggestion selection to route-context arrays + bounded last-few-action prioritization + deterministic rotation. | Developer (FE) | | 2026-03-06 | Added typed chip-context registry contract (`search-context.registry.ts`) and shifted suggestion selection to route-context arrays + bounded last-few-action prioritization + deterministic rotation. | Developer (FE) |
| 2026-03-06 | Synced architecture docs for automatic page-open suggestions and ambient `lastAction` contract: `docs/modules/ui/architecture.md`, `docs/modules/advisory-ai/knowledge-search.md`, `docs/modules/advisory-ai/unified-search-architecture.md`. | Documentation author | | 2026-03-06 | Synced architecture docs for automatic page-open suggestions and ambient `lastAction` contract: `docs/modules/ui/architecture.md`, `docs/modules/advisory-ai/knowledge-search.md`, `docs/modules/advisory-ai/unified-search-architecture.md`. | Documentation author |
| 2026-03-06 | Added UI governance rule for chip ownership and page-context interface in `docs/modules/ui/search-chip-context-contract.md`. | Documentation author | | 2026-03-06 | Added UI governance rule for chip ownership and page-context interface in `docs/modules/ui/search-chip-context-contract.md`. | Documentation author |
| 2026-03-06 | Added exhaustive Playwright query-matrix suite (`tests/e2e/unified-search-exhaustive-matrix.e2e.spec.ts`) generating 1200 deterministic query types with end-to-end UI execution and >=99.5% success gate. | Test Automation |
| 2026-03-06 | Migrated default hostname from 127.1.0.1 to stella-ops.local across envsettings-override, proxy.conf, playwright config, perf fixtures, README, and smoke scripts. | Developer (FE) |
| 2026-03-06 | QA iteration: 23/23 sprint unit tests pass (ambient-context 6, global-search 11, chat-message 6). Live behavioral verification via Playwright confirms contextual placeholders and suggestion chips adapt per page (dashboard/triage/policy/scanning). OIDC login flow works end-to-end at stella-ops.local. | QA |
## Decisions & Risks ## Decisions & Risks
- Decision needed: whether route context should remain a hard domain filter in FE (`buildContextFilter`) or become a soft ranking hint only via ambient payload. - Decision needed: whether route context should remain a hard domain filter in FE (`buildContextFilter`) or become a soft ranking hint only via ambient payload.
- Decision needed: final schema for `lastAction` ambient metadata and retention policy in FE memory/session scope. - Decision needed: final schema for `lastAction` ambient metadata and retention policy in FE memory/session scope.
- Decision: FE emits `ambient.lastAction` now as a forward-compatible field; current backend deployments may ignore it without regressing behavior. - Decision: FE emits `ambient.lastAction` now as a forward-compatible field; current backend deployments may ignore it without regressing behavior.
- Decision: chip definitions are now governed by typed context arrays (`SEARCH_CONTEXT_DEFINITIONS`) and an explicit page-level interface contract (`SearchContextComponent`) instead of ad-hoc route conditionals. - Decision: chip definitions are now governed by typed context arrays (`SEARCH_CONTEXT_DEFINITIONS`) and an explicit page-level interface contract (`SearchContextComponent`) instead of ad-hoc route conditionals.
- Decision: exhaustive >1000 query E2E coverage uses a deterministic matrix (1200 queries) with a reliability threshold (`>=99.5%`) to avoid false-red from occasional debounce drop events while still failing on meaningful regressions.
- Docs updated: `docs/modules/ui/architecture.md`, `docs/modules/ui/search-chip-context-contract.md`, `docs/modules/advisory-ai/knowledge-search.md`, `docs/modules/advisory-ai/unified-search-architecture.md`. - Docs updated: `docs/modules/ui/architecture.md`, `docs/modules/ui/search-chip-context-contract.md`, `docs/modules/advisory-ai/knowledge-search.md`, `docs/modules/advisory-ai/unified-search-architecture.md`.
- Risk: stale action context may bias suggestions toward irrelevant domains. - Risk: stale action context may bias suggestions toward irrelevant domains.
- Mitigation: TTL + bounded history + explicit reset on session boundaries. - Mitigation: TTL + bounded history + explicit reset on session boundaries.

View File

@@ -34,7 +34,7 @@ export class ApprovalHttpClient implements ApprovalApi {
private readonly http = inject(HttpClient); private readonly http = inject(HttpClient);
private readonly queueBaseUrl = '/api/v2/releases/approvals'; private readonly queueBaseUrl = '/api/v2/releases/approvals';
private readonly detailBaseUrl = '/api/v1/approvals'; private readonly detailBaseUrl = '/api/v1/approvals';
private readonly legacyBaseUrl = '/api/release-orchestrator/approvals'; private readonly legacyBaseUrl = '/api/v1/release-orchestrator/approvals';
listApprovals(filter?: ApprovalFilter): Observable<ApprovalRequest[]> { listApprovals(filter?: ApprovalFilter): Observable<ApprovalRequest[]> {
if (filter?.urgencies?.length || (filter?.statuses?.length ?? 0) > 1) { if (filter?.urgencies?.length || (filter?.statuses?.length ?? 0) > 1) {
@@ -63,20 +63,20 @@ export class ApprovalHttpClient implements ApprovalApi {
getPromotionPreview(releaseId: string, targetEnvironmentId: string): Observable<PromotionPreview> { getPromotionPreview(releaseId: string, targetEnvironmentId: string): Observable<PromotionPreview> {
return this.http.get<PromotionPreview>( return this.http.get<PromotionPreview>(
`/api/release-orchestrator/releases/${releaseId}/promotion-preview`, `/api/v1/release-orchestrator/releases/${releaseId}/promotion-preview`,
{ params: { targetEnvironmentId } } { params: { targetEnvironmentId } }
); );
} }
getAvailableEnvironments(releaseId: string): Observable<TargetEnvironment[]> { getAvailableEnvironments(releaseId: string): Observable<TargetEnvironment[]> {
return this.http.get<TargetEnvironment[]>( return this.http.get<TargetEnvironment[]>(
`/api/release-orchestrator/releases/${releaseId}/available-environments` `/api/v1/release-orchestrator/releases/${releaseId}/available-environments`
); );
} }
submitPromotionRequest(releaseId: string, request: PromotionRequestDto): Observable<ApprovalRequest> { submitPromotionRequest(releaseId: string, request: PromotionRequestDto): Observable<ApprovalRequest> {
return this.http.post<ApprovalRequest>( return this.http.post<ApprovalRequest>(
`/api/release-orchestrator/releases/${releaseId}/promote`, `/api/v1/release-orchestrator/releases/${releaseId}/promote`,
request request
); );
} }