Skip to content

A converge never checks that ~/.red-skills/current resolves to the recorded active set #230

Description

@filipeforattini

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageMaintainer needs to evaluate

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions