feat(platformctl): implement drift-check command to compare declared vs live image digests #771

Closed
opened 2026-06-08 23:19:52 +02:00 by ollama · 0 comments
Collaborator

Spec sources (whitelist)

  • modules/*/module.yamlspec.runtime.image_observed field on each module
  • compose/apps/compose.yaml, compose/edge/compose.yaml, compose/infra/compose.yaml — compose service definitions
  • control-plane/platformctl/cli.py — where to add subcommand
  • control-plane/platformctl/plan.py — reference: existing drift detection logic
  • 2-3 modules with known drift for testing (e.g., honcho-api: 3.0.6 declared, 3.0.3 live)

Extracted context

Module manifests carry spec.runtime.image_observed as manual audit snapshots. There is no automated comparison against live Docker state. Drift (like honcho-api 3.0.6 vs 3.0.3) goes unnoticed until a manual audit burns tokens re-checking.

Scope

Implement platformctl drift-check [module...] command that:

  1. For each module (or all if no args):
    • Reads spec.runtime.host, spec.runtime.orchestrator, spec.runtime.compose_service
    • If orchestrator=docker-compose: SSH to host, run docker inspect on the compose container
    • Extract actual image digest from docker inspect --format '{{index .RepoDigests 0}}'
    • Compare against spec.runtime.image_observed
  2. Output mode: --json for machine-readable, default human-readable table
  3. Exit codes: 0=all match, 2=drift detected, 5=remote unreachable, 8=partial state
  4. Skip modules where orchestrator=external (nothing to check)

Acceptance criteria

  • platformctl drift-check --json runs against RS2000
  • Detects honcho-api 3.0.3-vs-3.0.6 drift correctly
  • Reports "OK" for modules with matching digests
  • Handles unreachable hosts gracefully (exit 5)
  • 715+ existing tests still green

Do NOT read

  • Full repo — only the files listed above
  • Do NOT modify any module manifests (drift detection is read-only)

Agent notes

  • Recommended executor: Gemini 3.1 Pro (new platformctl command)
  • Size: Medium (~150-200 lines)
  • Review tier: tier/medium (new production command)
  • Audit ref: state/audit/deepseek-2026-06-08-multiperspective.md §DR5
## Spec sources (whitelist) - `modules/*/module.yaml` — `spec.runtime.image_observed` field on each module - `compose/apps/compose.yaml`, `compose/edge/compose.yaml`, `compose/infra/compose.yaml` — compose service definitions - `control-plane/platformctl/cli.py` — where to add subcommand - `control-plane/platformctl/plan.py` — reference: existing drift detection logic - 2-3 modules with known drift for testing (e.g., honcho-api: 3.0.6 declared, 3.0.3 live) ## Extracted context Module manifests carry `spec.runtime.image_observed` as manual audit snapshots. There is no automated comparison against live Docker state. Drift (like honcho-api 3.0.6 vs 3.0.3) goes unnoticed until a manual audit burns tokens re-checking. ## Scope Implement `platformctl drift-check [module...]` command that: 1. For each module (or all if no args): - Reads `spec.runtime.host`, `spec.runtime.orchestrator`, `spec.runtime.compose_service` - If orchestrator=docker-compose: SSH to host, run `docker inspect` on the compose container - Extract actual image digest from `docker inspect --format '{{index .RepoDigests 0}}'` - Compare against `spec.runtime.image_observed` 2. Output mode: `--json` for machine-readable, default human-readable table 3. Exit codes: 0=all match, 2=drift detected, 5=remote unreachable, 8=partial state 4. Skip modules where orchestrator=external (nothing to check) ## Acceptance criteria - [ ] `platformctl drift-check --json` runs against RS2000 - [ ] Detects honcho-api 3.0.3-vs-3.0.6 drift correctly - [ ] Reports "OK" for modules with matching digests - [ ] Handles unreachable hosts gracefully (exit 5) - [ ] 715+ existing tests still green ## Do NOT read - Full repo — only the files listed above - Do NOT modify any module manifests (drift detection is read-only) ## Agent notes - Recommended executor: Gemini 3.1 Pro (new platformctl command) - Size: Medium (~150-200 lines) - Review tier: tier/medium (new production command) - Audit ref: state/audit/deepseek-2026-06-08-multiperspective.md §DR5
Sign in to join this conversation.
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#771
No description provided.