Review: Align k8s manifests with convention and add /metrics endpoint

review-65-2026-03-27-v3 Review

review ready

Verdict: READY

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — Standalone, discovered during platform onboarding
  • [x] Repo — forgejo_admin/linkedin-scheduler-remote
  • [x] User Story — Full As a / I want / So that format
  • [x] Context — Explains why remaining delta matters (inline manifests break convention, ServiceMonitor 404)
  • [x] File Targets — 5 modify/create targets + 4 do-not-touch targets with reasons
  • [x] Acceptance Criteria — 7 criteria
  • [x] Test Expectations — 3 items + run command
  • [x] Constraints — 4 constraints including stale PR #4 handling
  • [x] Checklist — 3 items
  • [x] Related — 2 references
All 11 required sections from template-issue-feature are present and filled.

Traceability

  • [x] story:superuser-onboard — platform operator onboarding services
  • [x] arch:ci-pipeline — CI/CD pipeline infrastructure
  • [x] Forgejo issue — forgejo_admin/linkedin-scheduler-remote#3, open
All three legs of the traceability triangle are complete.

File Targets

  • [x] k8s/deployment.yaml — verified: exists on main, confirmed 3 YAML documents (Deployment + Service + PVC separated by ---). Ticket correctly identifies the split needed.
  • [x] k8s/service.yaml — verified: does NOT exist yet. New file, as ticket states. Service content matches what is inline in deployment.yaml (port 8000, selector app: linkedin-scheduler-remote).
  • [x] k8s/pvc.yaml — verified: does NOT exist yet. New file, as ticket states. PVC content matches inline (linkedin-mcp-data, 100Mi, local-path).
  • [x] k8s/kustomization.yaml — verified: exists, currently lists only deployment.yaml + servicemonitor.yaml. Ticket correctly says to add service.yaml and pvc.yaml.
  • [x] server.py — verified: exists, confirmed NO /metrics endpoint (grep empty). Ticket correctly identifies the gap.
Do-not-touch files verified:
  • [x] .woodpecker.yml — exists, CI pipeline correct (ruff check + kaniko build)
  • [x] Dockerfile — exists
  • [x] k8s/servicemonitor.yaml — exists, scraping /metrics at port http every 30s
  • [x] pyproject.toml — exists, ruff config present

Repo Placement

OK. Issue filed on forgejo_admin/linkedin-scheduler-remote, all changes target that same repo. No cross-repo concern.

Dependencies

No dependencies. Board item #65 has no depends: label. No other board items reference this ticket or share the linkedin-scheduler-remote repo. Sibling item #63 (gcal-mcp-remote CI) is independent work on a different repo.

Acceptance Criteria

7 criteria total. All are verifiable by an agent:
  • AC 1-4: Structural file checks — verifiable via kubectl kustomize k8s/ rendering 4 separate resources
  • AC 5: /metrics endpoint — verifiable via curl http://localhost:8000/metrics
  • AC 6: ArgoCD sync — integration-level, appropriate as post-deploy validation (not agent-automatable in PR)
  • AC 7: CI passes — verifiable by Woodpecker pipeline on PR push
Test commands are real and match the repo tooling (kubectl kustomize, curl, ruff via Woodpecker).

Blast Radius

Low. Verified that notion-mcp-remote already follows the split-file convention (separate deployment.yaml, service.yaml, pvc.yaml, servicemonitor.yaml in k8s/). This change aligns linkedin-scheduler-remote with that established pattern. No downstream consumers affected by the manifest split. The /metrics endpoint is additive — no existing consumers to break.

Decomposition

5 file targets in 1 repo, 7 AC. The 7 AC count exceeds the threshold of 5, but 4 of the 7 are structural file checks handled by a single kustomize extraction pass (copy-paste from multi-doc YAML to individual files). The only substantive code work is the /metrics endpoint addition in server.py. Closing stale PR #4 is a single API call. Estimated agent time: ~3 minutes. No decomposition needed.

Recommendation

No action needed. Ticket is ready for execution.

Prior Reviews

This is the third review (v3). Prior reviews:
  • review-65-2026-03-27 — NEEDS_REFINEMENT: scope was ~80% stale, missing template sections
  • review-65-2026-03-27-v2 — NEEDS_REFINEMENT: 6 of 11 sections still missing, deprecated Plan header, no /metrics AC
All issues from both prior reviews have been resolved in the current issue body. Title was updated to reflect the actual remaining delta. All 11 template sections are now present and accurate.