feat(platformctl): generate module index and close catalog audits #836
No reviewers
Labels
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
pdurlej/platform!836
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "codex/issues-760-763-764-765-batch"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Canary status: missing — fire canary via
python -m platformctl.tools.run_reviewbefore mergeSummary
Implements
platformctl index generate, records the catalog inventory evidence for #760/#765, and closes #764 as already satisfied by the current smoke contract on main. The generatedmodules/INDEX.yamloutput removes the stale hand-maintainedmetablock whosetotalstill said 84 while the repo has 88 module manifests.Changes
control-plane/platformctl/module_index.pywith deterministic module index generation frommodules/*/module.yaml.platformctl index generate [--json]to writemodules/INDEX.yamlatomically when generated content differs.modules/INDEX.yamlfrom manifests; all module entries are preserved, stalemetais removed.state/reports/platform-catalog-inventory-2026-06-26.mdwith runbook, smoke, healthcheck, and index evidence.Verification
PYTHONPATH=control-plane control-plane/.venv/bin/python -m pytest control-plane/platformctl/tests/test_module_index.py tests/test_smoke_contract.py control-plane/platformctl/tests/test_cross_refs.pyPYTHONPATH=control-plane control-plane/.venv/bin/python -m pytest control-plane/platformctl/tests— 790 passedPYTHONPATH=control-plane control-plane/.venv/bin/python -m pytest control-plane/platformctl/tests/test_module_index.py tests/test_kan_runtime_contract.py tests/test_smoke_contract.pyPYTHONPATH=control-plane control-plane/.venv/bin/python -m platformctl.cli index generate --json—module_count=88,changed=falseafter generationPYTHONPATH=control-plane control-plane/.venv/bin/python -m platformctl.cli lint --cross-refs --json— exit 0, 0 errors, 5 known ADR sequence warningsbash -n tests/smoke.shgit diff --checkTest plan
decision_packet.mdis saved before merge.platformctl index generate --jsonto confirmchanged=falseon main.Canary Context Pack
Product story
The module catalog should be reproducible by agents instead of hand-maintained. Agents should also be able to see whether the ready inventory issues produced real gaps without re-scanning the repo from scratch.
What changed
The PR adds the missing index generator, generates the current index, records inventory evidence, and creates a single healthcheck follow-up issue instead of many noisy tickets.
Why it changed
#763 said the repo already advertised
platformctl index generate, but the command did not exist. #760/#765 were ready inventory issues. #764 was still open even though currenttests/smoke.shalready contains the requested rewrite fixes and contract tests.Files touched
control-plane/platformctl/module_index.pycontrol-plane/platformctl/cli.pycontrol-plane/platformctl/manifest.pycontrol-plane/platformctl/tests/test_module_index.pycontrol-plane/platformctl.egg-info/SOURCES.txtmodules/INDEX.yamlstate/reports/platform-catalog-inventory-2026-06-26.mdRelevant context
platformctl index generatecontexts/module-catalog/MAP.mdcontexts/observability/MAP.mdRuntime evidence
No runtime mutation and no live host access. Evidence is repo-local only.
Known constraints
The #763 issue mentioned
control-plane/platformctl/validate.py, but that file does not exist on current main. The current manifest-loading helper iscontrol-plane/platformctl/manifest.py, so this PR uses that instead.Explicit out-of-scope
Requested decision
Approve after canary if reviewers agree the generated index structure should now be
modules:only and the stalemetablock should stay removed.Merge blockers
platformctl index generate --jsonnot idempotent after this PR.Spec sources read
docs/forgejo-agent-operations.md— Forgejo write/identity protocol.contexts/module-catalog/MAP.md— module catalog boundaries.contexts/observability/MAP.md— smoke/health evidence boundaries.modules/INDEX.yaml— index structure and generated output.schema/module.schema.json— module fields and health schema.control-plane/platformctl/cli.py— CLI wiring.control-plane/platformctl/manifest.py— current manifest loader; used because issue-listedvalidate.pyis absent.tests/smoke.shandtests/test_smoke_contract.py— #764 evidence.control-plane/platformctl/tests/test_cross_refs.py— existing runbook/index lint behavior.control-plane/platformctl/tests/test_validate.py— manifest fixture shape.modules/n8n-worker/module.yaml,modules/honcho-api/module.yaml,modules/traefik/module.yaml.modules/*/module.yamlhealth sections for #765 inventory only.Closes #760
Closes #763
Closes #764
Closes #765
Patchwarden PR sanity
Verdict: PASS WITH DEGRADED REVIEWER HEALTH - deterministic checks are clean, but this is not an approval signal.
Next step: Rerun PR sanity or inspect the degraded reviewer lane before unattended merge.
836103484bca9a4577f84a5d00323cd4392ec69ca71eligible_sanity_cleandegradedmissingglm-5.2:cloud,deepseek-v4-pro:cloud,kimi-k2.7:cloudWhat I checked
7clean3Approval Handoff
not_ready_degraded_reviewer_healthRequired Fixes
No deterministic blockers.
Reviewer Details
Model reviewer lanes
global-glm/glm-5.2:cloudStatus:
okVerdict:
OKlowManifest.area property can KeyError on manifests missing spec.classification.areacontrol-plane/platformctl/manifest.py:areaproperty added asreturn self.data["spec"]["classification"]["area"]with no .get() fallback, mirroring the existingcriticalityproperty. build_module_index in module_index.py calls manifesglobal-deepseek/deepseek-v4-pro:cloudokOKredteam/kimi-k2.7:clouderror-Policy notes