Repository navigation
Conversation
The projection now keeps, of a Pod's status, only state.running.startedAt for the container's own status list, so a later step can say whether a change to the object followed the container's start. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
core/config_changes.py keeps each object's last resource-version sighting and its latest change, bounded by the old sighting's send time and the new one's arrival, and orders a change against a container start only outside a one-minute skew allowance. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
explain_propagation now takes a send time before its reads and reports the object's resourceVersion with it and the read's arrival, so a later run can bound a change between two sightings. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The controller keeps a ChangeLog keyed by the run's context epoch, session generation and the object's observed incarnation, so reopening the view after the object's resource version moved shows the change between the two runs. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When the view knows a change to the ConfigMap or Secret from this session, an Object change column says, for each environment and subPath row, whether the change followed the container's start, preceded it, or is not established, and a note bounds the change. Without one, a note says how a change is seen. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Describe the Object change column, its limits and the P2 plan. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
A backwards system-clock adjustment can trigger an uncaught ValueError in explain_propagation, preventing the consumers view from opening despite successful reads.
1 open issue
What changed in this PR
Adds session-observed change ordering to the :consumers view, extending ConfigMap and Secret propagation diagnostics with comparisons against each consumer’s current container start.
Changes:
- Projects running-container start times and tracks bounded, UID- and session-scoped resource-version changes.
- Shows before/after/unknown ordering for environment and
subPathconsumers, with a one-minute clock-skew allowance. - Adds core and UI coverage and documents the limits of session-only, metadata-based evidence.
| File | Description |
|---|---|
tests/ui/test_config_propagation_workflow.py |
Tests change ordering after reopening the view. |
tests/ui/test_config_propagation_screen.py |
Tests ordering cells, conditional columns, and explanatory notes. |
tests/ui/test_config_propagation_controller.py |
Tests sightings across runs and scope changes. |
tests/test_optional_extras.py |
Checks the new module imports without optional extras. |
tests/core/test_config_propagation.py |
Tests sighting creation and unavailable resource versions. |
tests/core/test_config_consumers.py |
Tests start-time projection and status-field isolation. |
tests/core/test_config_changes.py |
Tests change bounds, ordering, isolation, and eviction. |
src/korvid/ui/widgets/config_propagation_screen.py |
Displays object-change ordering and evidence limits. |
src/korvid/ui/config_propagation_controller.py |
Retains sightings and supplies changes to the view. |
src/korvid/core/config_propagation.py |
Adds timed resource-version sightings to reports. |
src/korvid/core/config_consumers.py |
Projects each running container’s current start time. |
src/korvid/core/config_changes.py |
Implements bounded change tracking and skew-aware ordering. |
docs/tui.md |
Explains the new column and its limitations. |
docs/superpowers/plans/2026-10-31-config-change-order.md |
Records the implementation plan and verification approach. |
docs/release-notes/unreleased.md |
Announces session-observed change ordering. |
Review effort: Balanced
Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- explain_propagation reports no sighting when the clock stepped back between the send and the arrival, instead of raising. - ChangeLog counts another version only from a read sent after the last sighting arrived: overlapping reads cannot say which version the server served first. The same version never moves the bound back. - The controller records a sighting only when it shows the run. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- The note no longer says an earlier change is not known: one may have been seen. It describes the latest change seen this session. - The projection's docstring names status name as read, to match a status to its container. - The dropped-run test checks for a stray screen before reopening. Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Part of #513 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Closes #513
Summary
Slice P2 of #410. The
:consumersview now says whether a change to the selected ConfigMap or Secret, seen this session, followed each environment-variable orsubPathconsumer's container start. It follows the design's "P2: when a change is known to follow a start" section.core/config_consumers.py):Consumer.started_atholds onlystate.running.startedAt, read from the container's own status list (containerStatuses,initContainerStatusesorephemeralContainerStatuses) and matched by name. A container that is waiting, terminated or has no status has no start.lastStateandterminated.startedAtare never read, and no other status field reaches the result.core/config_changes.py, pure):sent_old >= started_at + 1m), and as before only when it ends at least one minute before (arrived_new <= started_at - 1m). Anything else is "not established".ChangeLogis keyed by context epoch, session generation, kind, namespace, name and observed UID. It holds at most 256 objects and ignores a sighting sent before the last one.core/config_propagation.py): each run takes a send time before its reads and reportsPropagationReport.sightingfrom the metadata GET'sresourceVersionand the observation's arrival. The design didn't say which reads make sightings; the plan's "Where the sightings come from" section explains the choice. As a result, a change is seen only when the view was opened both before and after it.ChangeLogacross runs and passes the latest change to the view.subPathrows, and is empty on volume rows.docs/tui.md, the unreleased notes, and the plandocs/superpowers/plans/2026-10-31-config-change-order.md.No version-matrix scenario is added: a matrix cluster's Pods are not guaranteed to be running, and P2 doesn't depend on the API version.
Verification
tests/core/test_config_changes.py: straddling, a delayed old response, the skew boundaries, another scope or UID, out-of-order and same-moment sightings, eviction, input checks.tests/core/test_config_consumers.py: each status list, waiting/terminated/missing, a restart, a naive timestamp, the repr-leak check.tests/core/test_config_propagation.py: the report's sighting.tests/ui/test_config_propagation_controller.py: changes across runs, a denied run, a new UID, epoch or session.tests/ui/test_config_propagation_screen.py: cells, notes, the column only with a change.tests/ui/test_config_propagation_workflow.py: reopening end to end.scripts/check_source_size.py,ruff check src tests,ruff format --check src tests,mypy src(272 files),tach check: all passed.pytest -n 8: 14951 passed, 40 skipped, 2 failed.test_device_login_prefixes::test_the_measured_release_is_the_installed_oneis the known local-only failure: the local venv has litellm 1.100.3 and can't re-sync behind the mirror. CI has 1.100.4.tests/performance/test_replay.py::test_replay_forbidden_aborts_with_an_explicit_terminal_errorfailed under-n 8load; the file passes on its own (21 passed), and this branch doesn't touchk8s/or the store.Checklist
make checkpasses locally.and a fail-closed audit entry, and sensitive reads are still masked.