Observed on red-dev 1.0.50. Companion to #229, which is how the divergence gets created; this one is why it survives every converge afterwards.
What happens
~/.red-skills/package-set.json records the active revision. Nothing verifies that current actually resolves to it.
State on this machine, hours after the divergence appeared:
|
|
package-set.json active |
3.19.5+bc45c2f863eb |
readlink ~/.red-skills/current |
~/.red-skills/versions/v3.22.0 |
~/.red-skills/sets/ |
contains only 3.19.5+bc45c2f863eb |
red-dev install core ran to completion against that state — 46 items, 14 changed, 31 already present, 1 deferred — and reported the builtin:red-skills item as applied. It never noticed that its own state file and its own pointer disagree.
Why it matters
This is the failure mode a converge exists to prevent. The machine is drifted in exactly the dimension red-dev owns, red-dev runs, and red-dev says ok. red-dev doctor does not name it either — it reports RedSkills as ok red-skills — registered from ~/.red-skills/current, which is true and useless, because registration is checked and the target is not.
Recovering needed reading a converge transcript and comparing a symlink against a JSON field by hand. The user-facing evidence pointed everywhere except here: a plugin that would not update, an MCP that closed every connection, and a queue that would not start.
Expected
- The converge resolves
current, compares it against the recorded active revision, and repairs the pointer when they disagree — that is the whole point of an idempotent converge.
red-dev doctor reports the divergence as drift, with the fix line it prints for every other finding.
- If
current names something outside sets/, that is either reconciled or named as a finding; it is never silently accepted.
Related
Observed on red-dev 1.0.50. Companion to #229, which is how the divergence gets created; this one is why it survives every converge afterwards.
What happens
~/.red-skills/package-set.jsonrecords the active revision. Nothing verifies thatcurrentactually resolves to it.State on this machine, hours after the divergence appeared:
package-set.jsonactive3.19.5+bc45c2f863ebreadlink ~/.red-skills/current~/.red-skills/versions/v3.22.0~/.red-skills/sets/3.19.5+bc45c2f863ebred-dev install coreran to completion against that state — 46 items, 14 changed, 31 already present, 1 deferred — and reported thebuiltin:red-skillsitem as applied. It never noticed that its own state file and its own pointer disagree.Why it matters
This is the failure mode a converge exists to prevent. The machine is drifted in exactly the dimension red-dev owns, red-dev runs, and red-dev says
ok.red-dev doctordoes not name it either — it reports RedSkills asok red-skills — registered from ~/.red-skills/current, which is true and useless, because registration is checked and the target is not.Recovering needed reading a converge transcript and comparing a symlink against a JSON field by hand. The user-facing evidence pointed everywhere except here: a plugin that would not update, an MCP that closed every connection, and a queue that would not start.
Expected
current, compares it against the recorded active revision, and repairs the pointer when they disagree — that is the whole point of an idempotent converge.red-dev doctorreports the divergence as drift, with the fix line it prints for every other finding.currentnames something outsidesets/, that is either reconciled or named as a finding; it is never silently accepted.Related