v0.8.42 — every install gets the whole manifest, as real copies
Fixed
-
Both skill-delivery paths now agree on what a symlink means, and neither
skips the manifest. v0.8.41 madesync_skills.shphase 1 manifest-driven;
verifying the result on four real installs showed two of them had never
receivedDocumentation/schema.mdat all, while the script reported
success. Phase 2 short-circuited onscripts/being a symlink andcontinued
past everything else — so the symlink, which only makesmemory_bridge.py
auto-current, was being read as "this whole install is current".This is the second time that short-circuit has caused exactly this, and the
first fix is why it recurred:SKILL.mdwas hoisted above thecontinue, a
per-file repair to a per-loop defect, so the next file added to the
manifest fell into the identical hole. Phase 2 now iteratesMANIFEST.txt,
and the short-circuit decides one thing only — whetherupdate_skill.shneeds
to run. -
update_skill.shno longer writes through a symlink. It applied every
staged file withmv, which replaces a symlink with a regular file. So the
self-update path silently undid the arrangement the sync path depends on: a
repo-linked file, auto-current by construction, became a frozen copy of that
day's content — invisible until it had gone stale. The exact mirror of the
defect above, on the other delivery path. A symlinked destination is now left
as a link and reported as such.
Changed
-
⛔ An installed skill file is now always a REAL COPY, never a symlink into a
source checkout. Repo-linkingmemory_bridge.pybought auto-currency at a
price that is only visible once: it binds every agent on the machine to one
checkout's path, so moving, renaming or archiving the project breaks all of
them at once — silently, with the first symptom being an agent failing
mid-task. Staleness is the lesser risk precisely because it is detectable:
every file is content-compared on each sync anddoctorreports version skew.
It also makes the local development path produce the same result as the
shipped one, sinceupdate_skill.shfetches from GitHub and writes real files
for everybody else already.Both delivery paths now replace any symlink they find, and both close the
hazard that creates:cpandcmpeach follow a link, so a naive
implementation would write into the source tree and would report a link
pointing at identical content as "already current" forever. A symlinked
scripts/orDocumentation/is dissolved into a real directory before
anything is written inside it, andsync_skills.shrefuses an install
directory that is itself a link rather than making the source its own
destination. README's four per-agent blocks now copy the whole package —
they previously installed two of the six files the manifest ships — and
AGENTS.mdstates the copy-only rule. -
sync_skills.sh's agent list is env-overridable via
SHARED_MEMORY_SYNC_AGENTS(colon-separated), instead of four$HOMEpaths
baked into a code path. Those four are our agent set, not the agent set —
and hardcoding them is also what made this delivery logic untestable, which is
how the same defect shipped twice.tests/test_skill_delivery.pynow runs the
real scripts against a temporary tree and asserts what actually lands there,
because the whole defect class lives in shell control flow: a test that read
the source for a filename would have passed throughout both failures, since
the filename was there — above acontinuethat skipped it.