feat(lease): verified lease-remediation stack (rebased onto next) — promotion trigger + promote CLI + carve-out + TTL #1109

Merged
Ghost merged 26 commits from feat/lease-promotion-and-harness-isolation into next 2026-08-12 03:07:33 +00:00
Showing only changes of commit dd6357e670 - Show all commits
+8 -3
View File
@@ -332,9 +332,11 @@ describe('Claude skill bridge', () => {
expect(result.status, result.stderr).toBe(0);
expect(readlinkSync(liveForeignLink)).toBe(liveForeignTarget);
expect(readlinkSync(danglingForeignLink)).toBe(join(mosaicHome, 'foreign-missing'));
expect(readlinkSync(join(paths.claudeSkillsDir, 'missing'))).toBe(
// Skills now link into the mosaic-owned harness home, never the base install.
expect(readlinkSync(join(mosaicHome, '.claude', 'skills', 'missing'))).toBe(
join(paths.mosaicSkillsDir, 'missing'),
);
expect(existsSync(join(paths.claudeSkillsDir, 'missing'))).toBe(false);
});
it('preserves live and dangling foreign Claude symlinks while linking missing skills', () => {
@@ -349,17 +351,20 @@ describe('Claude skill bridge', () => {
symlinkSync(external, liveLink);
symlinkSync(join(root, 'external-missing'), danglingLink);
const mosaicHome = join(root, '.config', 'mosaic');
const result = spawnSync('bash', [LEGACY_SYNC_SCRIPT, '--link-only'], {
encoding: 'utf8',
env: { ...process.env, HOME: root, MOSAIC_HOME: join(root, '.config', 'mosaic') },
env: { ...process.env, HOME: root, MOSAIC_HOME: mosaicHome },
});
expect(result.status, result.stderr).toBe(0);
expect(readlinkSync(liveLink)).toBe(external);
expect(readlinkSync(danglingLink)).toBe(join(root, 'external-missing'));
expect(readlinkSync(join(paths.claudeSkillsDir, 'missing'))).toBe(
// Skills now link into the mosaic-owned harness home, never the base install.
expect(readlinkSync(join(mosaicHome, '.claude', 'skills', 'missing'))).toBe(
join(paths.mosaicSkillsDir, 'missing'),
);
expect(existsSync(join(paths.claudeSkillsDir, 'missing'))).toBe(false);
});
});