fix(cutover): import Meerkat compose and gate stateful auto-apply #296

Merged
pdurlej merged 1 commit from codex/269/canonical-compose-import-meerkat into main 2026-05-16 11:20:45 +02:00
Collaborator

Canary status: missing - Forgejo checks plus operator merge gate required before merge

Canary Context Pack

Product story

RS2000 canonical compose should describe the services the deploy lane is allowed to reason about. np-meerkat-frontend and matrix-well-known were live/orphaned containers with module manifests, but absent from the canonical compose tree, so auto-apply could only fail late or stay blocked by data gaps.

What changed

  • Imports matrix-well-known, np-meerkat-backend, and np-meerkat-frontend into compose/apps/compose.yaml from sanitized live/legacy evidence.
  • Blocks auto-apply v1 for non-stateless modules so the imported Meerkat backend remains visible to compose but cannot enter the F2 no-op lane.
  • Adds compose/** to release-root promotion so canonical compose changes reach /opt/pdurlej-platform/current before later apply commands depend on them.

Why it changed

PR #295 correctly blocked modules missing from canonical compose. This PR fixes the data gap without weakening the safety boundary: stateless frontend/matrix can become F2 candidates; stateful backend stays F3-gated.

Files touched

  • .forgejo/workflows/release-root-promote.yml
  • compose/apps/compose.yaml
  • control-plane/platformctl/ci/auto_apply_scope.py
  • control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py
  • docs/ci/runner-contract.md
  • runbooks/forgejo-actions-runner.md
  • tests/test_release_root_promote.py

Relevant context

  • #269: Meerkat canonical compose data gap
  • #142: RS2000 cutover lane
  • #279/#293/#294: release-root promotion lane
  • ADR-0018: agentic-first root-cause fixes

Runtime evidence

Read-only evidence gathered before the PR:

  • live containers exist: home-platform-matrix-well-known-1, home-platform-np-meerkat-backend-1, home-platform-np-meerkat-frontend-1
  • Meerkat env evidence used variable names only, not values: MEERKAT_BACKEND_IMAGE, MEERKAT_FRONTEND_IMAGE, MEERKAT_HOSTNAME, MEERKAT_JWT_SECRET_KEY
  • remote read-only compose config from this branch passed on RS2000 using /opt/pdurlej-platform/runtime/compose.env
  • composed services include matrix-well-known, np-meerkat-backend, np-meerkat-frontend

Known existing warning during config check: MiroTalk Admin variables are not set in runtime env. That warning predates this PR and does not block compose validation.

Known constraints

  • This PR does not run docker compose up, platformctl apply, or restart production containers.
  • np-meerkat-backend is stateful and must not be smoked in F2.
  • np-meerkat-frontend depends on the backend, so future smoke should remain no-op first and stop on red.

Explicit out-of-scope

  • No Meerkat backend F3 smoke.
  • No orphan container cleanup.
  • No route/auth redesign for Meerkat or Matrix.
  • No secret migration.

Requested decision

Approve merge if checks are green. After merge, release-root should promote because this PR changes the release-root workflow path set and compose/**.

Merge blockers

  • Compose config does not validate with production env.
  • Auto-apply allows a stateful module.
  • Release-root promotion path does not include compose/**.

Spec sources read

  • compose/apps/compose.yaml - canonical apps compose target
  • modules/np-meerkat-frontend/module.yaml - stateless frontend manifest
  • modules/np-meerkat-backend/module.yaml - stateful backend manifest
  • modules/matrix-well-known/module.yaml - stateless Matrix manifest
  • control-plane/platformctl/ci/auto_apply_scope.py - auto-apply scope guard
  • .forgejo/workflows/release-root-promote.yml - release-root promotion trigger
  • docs/ci/runner-contract.md and runbooks/forgejo-actions-runner.md - deploy/release-root contract docs

Verification

  • pytest -q control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py tests/test_release_root_promote.py tests/test_deploy_runner_watchdog.py tests/test_deploy_runner_scope_doctor.py -> 40 passed
  • python control-plane/platformctl/ci/lint_workflows.py --workflows .forgejo/workflows -> 0 findings
  • auto_apply_scope.py --module matrix-well-known -> eligible
  • auto_apply_scope.py --module np-meerkat-frontend -> eligible
  • auto_apply_scope.py --module np-meerkat-backend --fail-on-blocked -> blocked, rc=4, statefulness gate
  • RS2000 read-only docker compose --env-file /opt/pdurlej-platform/runtime/compose.env -f <branch>/compose/apps/compose.yaml config --quiet -> passed

Closes #269

Canary status: missing - Forgejo checks plus operator merge gate required before merge ## Canary Context Pack ### Product story RS2000 canonical compose should describe the services the deploy lane is allowed to reason about. `np-meerkat-frontend` and `matrix-well-known` were live/orphaned containers with module manifests, but absent from the canonical compose tree, so auto-apply could only fail late or stay blocked by data gaps. ### What changed - Imports `matrix-well-known`, `np-meerkat-backend`, and `np-meerkat-frontend` into `compose/apps/compose.yaml` from sanitized live/legacy evidence. - Blocks auto-apply v1 for non-`stateless` modules so the imported Meerkat backend remains visible to compose but cannot enter the F2 no-op lane. - Adds `compose/**` to release-root promotion so canonical compose changes reach `/opt/pdurlej-platform/current` before later apply commands depend on them. ### Why it changed PR #295 correctly blocked modules missing from canonical compose. This PR fixes the data gap without weakening the safety boundary: stateless frontend/matrix can become F2 candidates; stateful backend stays F3-gated. ### Files touched - `.forgejo/workflows/release-root-promote.yml` - `compose/apps/compose.yaml` - `control-plane/platformctl/ci/auto_apply_scope.py` - `control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py` - `docs/ci/runner-contract.md` - `runbooks/forgejo-actions-runner.md` - `tests/test_release_root_promote.py` ### Relevant context - #269: Meerkat canonical compose data gap - #142: RS2000 cutover lane - #279/#293/#294: release-root promotion lane - ADR-0018: agentic-first root-cause fixes ### Runtime evidence Read-only evidence gathered before the PR: - live containers exist: `home-platform-matrix-well-known-1`, `home-platform-np-meerkat-backend-1`, `home-platform-np-meerkat-frontend-1` - Meerkat env evidence used variable names only, not values: `MEERKAT_BACKEND_IMAGE`, `MEERKAT_FRONTEND_IMAGE`, `MEERKAT_HOSTNAME`, `MEERKAT_JWT_SECRET_KEY` - remote read-only compose config from this branch passed on RS2000 using `/opt/pdurlej-platform/runtime/compose.env` - composed services include `matrix-well-known`, `np-meerkat-backend`, `np-meerkat-frontend` Known existing warning during config check: MiroTalk Admin variables are not set in runtime env. That warning predates this PR and does not block compose validation. ### Known constraints - This PR does not run `docker compose up`, `platformctl apply`, or restart production containers. - `np-meerkat-backend` is stateful and must not be smoked in F2. - `np-meerkat-frontend` depends on the backend, so future smoke should remain no-op first and stop on red. ### Explicit out-of-scope - No Meerkat backend F3 smoke. - No orphan container cleanup. - No route/auth redesign for Meerkat or Matrix. - No secret migration. ### Requested decision Approve merge if checks are green. After merge, release-root should promote because this PR changes the release-root workflow path set and `compose/**`. ### Merge blockers - Compose config does not validate with production env. - Auto-apply allows a stateful module. - Release-root promotion path does not include `compose/**`. ## Spec sources read - `compose/apps/compose.yaml` - canonical apps compose target - `modules/np-meerkat-frontend/module.yaml` - stateless frontend manifest - `modules/np-meerkat-backend/module.yaml` - stateful backend manifest - `modules/matrix-well-known/module.yaml` - stateless Matrix manifest - `control-plane/platformctl/ci/auto_apply_scope.py` - auto-apply scope guard - `.forgejo/workflows/release-root-promote.yml` - release-root promotion trigger - `docs/ci/runner-contract.md` and `runbooks/forgejo-actions-runner.md` - deploy/release-root contract docs ## Verification - `pytest -q control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py tests/test_release_root_promote.py tests/test_deploy_runner_watchdog.py tests/test_deploy_runner_scope_doctor.py` -> 40 passed - `python control-plane/platformctl/ci/lint_workflows.py --workflows .forgejo/workflows` -> 0 findings - `auto_apply_scope.py --module matrix-well-known` -> eligible - `auto_apply_scope.py --module np-meerkat-frontend` -> eligible - `auto_apply_scope.py --module np-meerkat-backend --fail-on-blocked` -> blocked, rc=4, statefulness gate - RS2000 read-only `docker compose --env-file /opt/pdurlej-platform/runtime/compose.env -f <branch>/compose/apps/compose.yaml config --quiet` -> passed Closes #269
fix(cutover): import Meerkat compose and gate stateful auto-apply
All checks were successful
infra-docs-drift / docs-drift (pull_request) Successful in 4s
canary-required / collect-diff (pull_request) Successful in 4s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 4s
platformctl plan / auto-apply scope (pull_request) Successful in 19s
pyfallow / Pyfallow gate (control-plane) (pull_request) Successful in 17s
python-ci / Python 3.11 (pull_request) Successful in 36s
python-ci / Python 3.12 (pull_request) Successful in 36s
python-ci / Python 3.13 (pull_request) Successful in 36s
workflow-lint / lint (pull_request) Successful in 4s
canary-required / canary (pull_request) Successful in 13s
patchwarden-pr-sanity / sanity (pull_request) Successful in 19s
base-is-main / guard (pull_request) Successful in 1s
ca8c4d971e
Sign in to join this conversation.
No reviewers
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform!296
No description provided.