Appearance
Service Agent Readiness Smoke
Scope
This proof checks that the service responsibility matrix, service-agent dispatch docs, task packs, runtime/deploy manifests, and VitePress docs remain coherent for the current Go microservices rollout.
It does not prove a default public route cutover. Route promotion still needs route-specific live/browser evidence, populated target validation when data is involved, and rollback proof.
Commands
Run these from go-platform/ after changing service task packs, dispatch docs, runtime manifests, Compose, K8s, Helm, or VitePress navigation:
bash
make test-agent-dispatch
make test-service-agent-goal-completion-audit
make test-service-agent-closeout-ledger
make test-service-agent-next-slice-closeout
make test-service-agent-execution-queue
make test-service-readiness
make test-runtime-foundation
make test-compose-migrations
make test-postgres-database-isolation
pnpm docs:build
git diff --checkLatest Local Proof
On 2026-07-15, the integrated readiness path and database-foundation checks passed locally:
bash
make test-service-readiness
make test-compose-migrations
make test-postgres-database-isolationObserved coverage:
test-compose-migrations: rendered Compose requires each runtime service and its migration job to use the same service-owned PostgreSQL role/database, with the runtime waiting for schema migration completion.test-postgres-database-isolation: a disposable PostgreSQL container verified all 20 owner roles against their own databases and rejected all 380 cross-serviceCONNECTchecks; its cleanup trap removed the temporary container.test-agent-dispatch: service-agent manifest, proof ledger, dispatch roster, workflow matrix Dispatch ID rows, wave board, spawn runbook, spawn packets, and alias-only boundaries are coherent.test-service-task-packs: service responsibility matrix, canonical task packs, manifest-derived workflow/roster/spawn packet rows, proof ledger, VitePress links, cutover packs, route proof handoffs, and guard scripts are coherent.test-service-readmes: active service README coverage is coherent.test-service-agent-goal-completion-audit: Service Agent Goal Completion Audit confirms spawn-ready rows remainnot-complete, IAM/Profile default promotion still requires production-like populated target validation with the required migrator run report, and proof bundles keeproutePromotionApproved=falsewhile live cutover bundles must declaretargetProvenance=production-likeand matching candidate/gateway route-table hashes.test-service-agent-closeout-ledger: Service Agent Closeout Ledger confirms everySVC-001throughSVC-023row points to a real accepted bounded-slice handoff file with audit, investigate, code, test, and fix evidence while remainingnot-completeuntil route/default gates are closed.test-service-agent-next-slice-closeout: Service Agent Next Slice Closeout Ledger confirms each futurenextTaskIdhas a separate not-complete closeout row, preserves the accepted first-slice handoff asacceptedFirstHandoff, and requires the next handoff path, workflow verification, route/default state, rollback notes, andRET-USERretirement prerequisites before any next-slice acceptance. The acceptedSVC-001-default-route-proof-bundlerecords gateway route diff, live/browser route evidence, and rollback notes while keeping default promotion blocked. It also validates the acceptedSVC-002-owner-source-gateway-proofhandoff with named admin-service owner APIs, gateway route proof, and a real HTTP BFF aggregation test, plus theSVC-005-iam-membership-school-sync-proofhandoff with IAM write authority, school read-model sync ordering/tombstone proof, and member-write rollback notes, plus theSVC-006-public-route-guard-proofhandoff with classroom tenant-scope, owner-local reference, and legacy-route guard proof, plus theSVC-007-student-course-route-proofhandoff with enrolled student projection, progress guard, static route checks, and explicit live/browser gate, plus theSVC-008-question-save-reload-route-proofhandoff with update/reload persistence, native route guards, and explicit live editor gate, plus theSVC-009-exam-attempt-public-proofhandoff with runtime access contract, snapshot ownership, sensitive-field redaction, and explicit live/browser attempt gate, plus theSVC-010-attempt-public-idempotency-proofhandoff with trusted start-to-result workflow, exact replay, timeout/retake, result visibility/redaction, and explicit live/browser route gate, plus theSVC-011-storage-media-browser-proofhandoff with storage/media parity, upload/read browser evidence, and explicit rollback gate, plus theSVC-012-import-route-proof-bundlehandoff with matching import route, live/browser proof, and explicit rollback gate, plus theSVC-013-formula-adapter-determinism-proofandSVC-014-search-legacy-owner-rebuild-proofandSVC-015-ai-usage-wallet-route-proofandSVC-016-subscription-entitlement-replay-proofandSVC-017-wallet-ledger-route-proofandSVC-018-usage-billing-sync-replay-proofandSVC-019-payment-webhook-reconcile-proofandSVC-020-notification-recipient-route-proofandSVC-021-audit-replay-retention-proofandSVC-022-analytics-rebuildable-projection-proofandSVC-023-admin-owner-source-route-proofandRET-USER-retirement-readiness-proofhandoffs and their required verification/evidence strings.test-service-agent-execution-queue: Service Agent Execution Queue confirms everySVC-001throughSVC-023row has a concrete first queuedtaskId, dependencies, first verification command, and handoff path; because those first handoffs are now accepted, queue statuses arefirst-slice-accepted-...-not-completerather than prompts to respawn the same workers. The guard also validatesdocs/agents/service-agent-next-slice-queue.jsonagainst manifest, proof ledger, closeout ledger, accepted first-slice handoffs, uniquenextTaskIdvalues,workflowVerification,requiredNextHandoffPath, prompt-ready next-slice spawn packets, and theRET-USERretirement-only rule.GOTOOLCHAIN=go1.25.11 go test ./services/... -count=1: all current service packages passed.
The runtime/deploy foundation also passed locally on 2026-07-09 19:16 +07:
bash
make test-runtime-foundationObserved coverage:
- Docker Compose migration wiring.
- IAM/Profile backfill report and loader guards.
- IAM/Profile populated validation and UUID readiness/FK/PK-promotion self-tests.
- IAM/Profile runtime proof and default cutover candidate guard.
- IAM/Profile default cutover proof bundle self-test and offline review-artifact validator self-test, latest bundle summary under
output/qa/iam-profile-default-cutover-proof-bundle-20260710-083035/. That bundle remainsmode=self-test/targetProvenance=fixture_only; the offline artifact review guard rejects it as expected, so it is not default-route promotion evidence. - Monetization route and broker transport guards.
- Search rebuild self-test and pending search route rehearsal guard.
- Notification and parent-alert non-default route-table guards.
- Gateway route examples.
- Frontend gateway boundary guard.
- Service task pack/readme coverage.
- K8s service, migration job, observability, Helm render, and Go Formula runtime coverage.
Docs build and diff hygiene also passed on 2026-07-10:
bash
pnpm docs:build
git diff --checkLocal Runtime Baseline
On 2026-07-10, the currently running local containers returned HTTP 200 for both /healthz and /readyz on their direct host ports:
| Service | Port |
|---|---|
payment-service | 8096 |
wallet-service | 8097 |
billing-service | 8098 |
usage-service | 8099 |
docx-import-service | 8087 |
document-service | 8088 |
This is direct process/readiness evidence only. It does not prove Gateway or browser traffic, production-like data, rollback behavior, or that the running container image contains the newest uncommitted service changes.
Local IAM/Profile Candidate Refresh
On 2026-07-10, local IAM/Profile migrations were applied to their separate local databases before an isolated candidate rehearsal. The review-only diff, Gateway live smoke, Playwright browser smoke, and default-table rollback smoke all passed under:
output/qa/iam-profile-default-candidate-localhost-20260710-1544/output/qa/iam-profile-default-candidate-live-20260710-1547/output/playwright/iam-profile-default-candidate-browser-20260710-1548/output/qa/iam-profile-default-candidate-rollback-20260710-1548/
Each artifact records the same Gateway-normalized route-table hash and defaultRouteTableModified=false. The slice remains local, non-default, and read-only for IAM public routing; it does not satisfy the production-like populated-data, human-review, or promotion gates.
Clean Compose IAM/Profile Runtime
The isolated build-mode clean Compose smoke also passed on 2026-07-10 under output/qa/iam-profile-clean-compose-20260710-1555/. It rebuilt IAM, Profile, and migrator images, recorded every service migration, verified IAM/Profile health and readiness plus IAM JWKS, then removed the temporary project, network, and volume. This validates clean migration ordering and service startup, but it does not replace populated-target reconciliation or route-promotion evidence.
Remaining Cutover Limits
The readiness proof confirms orchestration consistency, not production promotion. Known blockers remain:
- IAM/Profile default route promotion still requires production-like populated target validation with the required migrator run report.
- Profile base/teacher update routes have non-default live/browser proof, but still need candidate default diffs and rollback-after-candidate evidence before promotion.
- IAM session lifecycle routes now have non-default browser proof for register, login, authenticated
/api/auth/me, refresh rotation, logout, and rejected refresh reuse underoutput/playwright/auth-route-session-browser-smoke-20260709-100744/, but default promotion still waits for the IAM/Profile cutover handoff gates. - KYC, admin routes, and broader learning/monetization public routes remain legacy by default until their own route-specific live/browser/rollback evidence is attached.