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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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