feat(server): /api/info aggregator + frontend version footer #40

Merged
arcodange merged 1 commits from feat/api-info-aggregator into main 2026-05-05 08:29:28 +02:00
Owner

Sprint 2 of autonomous trainer day 2026-05-05

First substantive feature shipped through the new ICM workspace + verifier-skill pipeline. Mistral implemented backend + BDD scenario through stage 02 before hitting the price limit; Claude completed frontend + Playwright + verifier audit + PR.

What ships

Backend

  • GET /api/info aggregator returning JSON with 6 fields:
    {
      "version": "1.4.0",
      "commit_short": "4a3f1bb",
      "build_date": "2026-05-05T00:00:00Z",
      "uptime_seconds": 1234,
      "cache_enabled": true,
      "healthz_status": "healthy"
    }
    
  • Optional caching via existing cache service (X-Cache: HIT/MISS header). Reuses ADR-0022 cache infrastructure.
  • BDD coverage @critical (3 scenarios; cache scenario @skip @bdd-deferred until BDD harness gains a cache-enabled mode — documented inline).

Frontend

  • AppFooterView (dumb) + AppFooter (smart wrapper) — same SRP split as HealthDashboard / HealthDashboardView (cf. PR #33).
  • layouts/default.vue auto-applied via <NuxtLayout> in app.vue (was just <NuxtPage />).
  • humaniseUptime helper in utils/.
  • Playwright tests assert visible AND content (PR #32 lesson) using route.fulfill mocking — decoupled from the dev-proxy infra.

Docs

  • documentation/API.md /api/info entry with full schema and rationale.
  • ADR-0026 documents the composite-endpoint vs separate-calls choice (Status: Implemented).

Verifier verdict (skill-driven, audit at stage 04)

APPROVE_WITH_NITS

  • Dim A (code quality): APPROVE_WITH_NITS — handleInfo is 51 lines (could split into builder + emitter helpers; X-Cache: DISABLED could improve ops clarity).
  • Dim B (docs homogeneity): APPROVE — /api/info documented + Swagger annotated + ADR-0026 created + cross-refs valid.
  • Dim C (test reliability): APPROVE — no flaky patterns, 1 negative-path Playwright test, data-testid stable selectors, -count=2 passes.

Out-of-scope follow-up

The existing tests/e2e/health.spec.ts happy-path fails locally for the same reason my footer happy-path failed before mocking: the Nuxt dev proxy (/api → http://localhost:8080) doesn't relay during Playwright's webServer-mode run. Same fix (server: false on useFetch + route.fulfill in the test) applies. Worth a separate cleanup PR.

Test plan

  • go test ./features/info/... -count=2 passes (no flakiness)
  • Full BDD suite still green (auth/config/greet/health/info/jwt)
  • go vet ./... clean
  • Playwright tests/e2e/app-footer.spec.ts (2 tests) pass
  • Reviewer to manually verify ADR-0026 design tradeoff is correctly captured
## Sprint 2 of autonomous trainer day 2026-05-05 First substantive feature shipped through the new ICM workspace + verifier-skill pipeline. Mistral implemented backend + BDD scenario through stage 02 before hitting the price limit; Claude completed frontend + Playwright + verifier audit + PR. ## What ships ### Backend - `GET /api/info` aggregator returning JSON with 6 fields: ```json { "version": "1.4.0", "commit_short": "4a3f1bb", "build_date": "2026-05-05T00:00:00Z", "uptime_seconds": 1234, "cache_enabled": true, "healthz_status": "healthy" } ``` - Optional caching via existing cache service (X-Cache: HIT/MISS header). Reuses ADR-0022 cache infrastructure. - BDD coverage @critical (3 scenarios; cache scenario `@skip @bdd-deferred` until BDD harness gains a cache-enabled mode — documented inline). ### Frontend - AppFooterView (dumb) + AppFooter (smart wrapper) — same SRP split as HealthDashboard / HealthDashboardView (cf. PR #33). - layouts/default.vue auto-applied via `<NuxtLayout>` in app.vue (was just `<NuxtPage />`). - humaniseUptime helper in utils/. - Playwright tests assert visible **AND** content (PR #32 lesson) using `route.fulfill` mocking — decoupled from the dev-proxy infra. ### Docs - documentation/API.md /api/info entry with full schema and rationale. - ADR-0026 documents the composite-endpoint vs separate-calls choice (Status: Implemented). ## Verifier verdict (skill-driven, audit at stage 04) **APPROVE_WITH_NITS** - **Dim A** (code quality): APPROVE_WITH_NITS — handleInfo is 51 lines (could split into builder + emitter helpers; X-Cache: DISABLED could improve ops clarity). - **Dim B** (docs homogeneity): APPROVE — /api/info documented + Swagger annotated + ADR-0026 created + cross-refs valid. - **Dim C** (test reliability): APPROVE — no flaky patterns, 1 negative-path Playwright test, data-testid stable selectors, `-count=2` passes. ## Out-of-scope follow-up The existing `tests/e2e/health.spec.ts` happy-path fails locally for the same reason my footer happy-path failed before mocking: the Nuxt dev proxy (`/api → http://localhost:8080`) doesn't relay during Playwright's webServer-mode run. Same fix (`server: false` on useFetch + `route.fulfill` in the test) applies. Worth a separate cleanup PR. ## Test plan - [x] `go test ./features/info/... -count=2` passes (no flakiness) - [x] Full BDD suite still green (auth/config/greet/health/info/jwt) - [x] `go vet ./...` clean - [x] Playwright tests/e2e/app-footer.spec.ts (2 tests) pass - [ ] Reviewer to manually verify ADR-0026 design tradeoff is correctly captured
arcodange added 1 commit 2026-05-05 08:28:36 +02:00
Sprint 2 of autonomous trainer day 2026-05-05. Mistral-implemented
through ICM workspace ship-info-aggregator (bootstrapped backend +
BDD before hitting price limit at stage 02), Claude-completed for
frontend + Playwright + verifier + PR.

Backend:
- GET /api/info aggregator returning version, commit_short, build_date,
  uptime_seconds, cache_enabled, healthz_status (single round trip)
- Optional cache via existing cache service (X-Cache: HIT/MISS)
- BDD scenario @critical covers happy path + version regex; cache
  scenario kept under @skip @bdd-deferred until BDD harness gains a
  cache-enabled mode

Frontend:
- AppFooterView (dumb) + AppFooter (smart wrapper, useFetch) following
  the HealthDashboard / HealthDashboardView pattern
- layouts/default.vue auto-applied via NuxtLayout in app.vue
- humaniseUptime helper in utils/
- Playwright tests use route.fulfill mocking (decoupled from dev-proxy
  infra), assert visible AND content (PR #32 lesson)

Docs:
- documentation/API.md /api/info entry with schema and rationale
- ADR-0026 documents composite endpoint vs separate calls choice

Verifier verdict (skill-driven, audit at stage 04): APPROVE_WITH_NITS.
Nits: handleInfo is 51 lines (could split into builder + emitter);
X-Cache: DISABLED could improve ops clarity.

Out-of-scope follow-up: existing tests/e2e/health.spec.ts happy path
hits the same dev-proxy infra issue as my footer happy path before
mocking. Same fix (server: false + route.fulfill) would apply.
arcodange merged commit a2beadc458 into main 2026-05-05 08:29:28 +02:00
arcodange deleted branch feat/api-info-aggregator 2026-05-05 08:29:28 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: arcodange/dance-lessons-coach#40