merge: origin/main v1.1.1.0 into garrytan/fix-checkpoints

Main shipped the /ship VERSION/package.json drift-detection fix as
v1.1.1.0 — exact collision with our branch's existing version. Bumped
ours to 1.1.2.0.

Resolved conflicts:
- VERSION: 1.1.1.0 → 1.1.2.0
- package.json: 1.1.1.0 → 1.1.2.0
- CHANGELOG.md: moved our /checkpoint → /context-save entry up one
  header level to [1.1.2.0] and kept main's /ship drift-fix entry
  at [1.1.1.0]. Sequence now: 1.1.2.0 → 1.1.1.0 → 1.1.0.0 → 1.0.0.0.
- Migration renamed v1.1.1.0.sh → v1.1.2.0.sh (version string inside
  and test path reference both updated).

Also bumped the /context-save + /context-restore CHANGELOG entry to
credit the adversarial-review hardening wave (HOME guard, realpath
fallback, title sanitize, collision-safe filenames, context-restore
head cap, autoplan test regex tightening) as contributor-facing notes
— previous entry didn't reflect the security work that landed after
the initial ship.

No overlap between main's /ship Step 12 logic and this branch's work.
SKILL.md files regenerated via bun run gen:skill-docs --host all.
Golden fixtures updated.

bun test: 0 failures across 80+ targeted tests and the full suite.
Migration ownership guard: 7/7 pass (~85ms).
This commit is contained in:
Garry Tan
2026-04-19 00:02:07 +08:00
12 changed files with 749 additions and 53 deletions

View File

@@ -5,7 +5,7 @@ import * as path from 'path';
import * as os from 'os';
const ROOT = path.resolve(import.meta.dir, '..');
const MIGRATION = path.join(ROOT, 'gstack-upgrade', 'migrations', 'v1.1.1.0.sh');
const MIGRATION = path.join(ROOT, 'gstack-upgrade', 'migrations', 'v1.1.2.0.sh');
function runMigration(tmpHome: string): { exitCode: number; stdout: string; stderr: string } {
const result = spawnSync('bash', [MIGRATION], {
@@ -28,7 +28,7 @@ function setupFakeGstackRoot(tmpHome: string): string {
return gstackDir;
}
describe('migration v1.1.1.0 — checkpoint ownership guard', () => {
describe('migration v1.1.2.0 — checkpoint ownership guard', () => {
let tmpHome: string;
beforeEach(() => {