Skip to content

docs(release-prep): v0.3.0 docs sweep — CHANGELOG, KNOWN_ISSUES, workspace-contract alignment - #1472

Merged
qingyun-wu merged 18 commits into
staging-workspace-revampfrom
release-prep/v0.3.0
Jun 6, 2026
Merged

qingyun-wu merged 18 commits into
staging-workspace-revampfrom
release-prep/v0.3.0

Conversation

@qingyun-wu

@qingyun-wu qingyun-wu commented Jun 5, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Release-prep PR for v0.3.0 — the staging-workspace-revamp rollup, expanded to a full docs sweep per owner directive 2026-06-06 01:47Z.

6 docs touched + 1 script:

  1. CHANGELOG.md — substantive v0.3.0 entry with thematic subsections + supersedes annotation linking v0.1.0 → v0.3.0 workspace default change
  2. KNOWN_ISSUES.md — rewrite entry Add demo video to README #1 (M1 migration script shipped)
  3. docs/memory-sync.md — DELETED (legacy doc for sync-memory.sh rsync flow)
  4. docs/workspace-sync.md — CREATED canonical doc for sync-workspace.sh + migration risks + pre-flight checklist + Keychain troubleshooting
  5. docs/release-process.md — CREATED by promoting release-process-consolidated.md → canonical; deleted both proposal docs
  6. docs/workspace-design.md — REWRITTEN around 2-space model (Code + Workspace) per owner directive 2026-06-04; old 3-space framing preserved in git history
  7. docs/workspace-contract.md — status note updated to "Ratified as of PR fix(workspace-v0.8): strip $SUTANDO_WORKSPACE from resolver + colored warnings [DRAFT] #1440 merge"
  8. docs/workspace-config.md — $SUTANDO_WORKSPACE dropped from resolution order (no longer honored post-fix(workspace-v0.8): strip $SUTANDO_WORKSPACE from resolver + colored warnings [DRAFT] #1440)
  9. scripts/sync-memory.sh — banner explicitly says "will be REMOVED in v0.4.0"

Stats: 11 files changed, +322 lines / -924 lines (net -602 from cleanup). 6 commits, designed for clean squash-merge.

Substantive content added

Migration risks + pre-flight checklist (docs/workspace-sync.md)

Distilled from the 2026-06-05 sonichi-thread "Migration" risk analyses (Mini + Pro + Sutando) + Lucy's Maddy v0.8 first-hand report 2026-06-06:

  • Pre-migration: vault URL set, $SUTANDO_WORKSPACE removed from shell rc + .env, large media excluded from sync, per-host runtime excluded
  • Serial migration order (not parallel — avoids the D/F branch collision race pre-fix(sync-workspace): migrate pre-wsId flat branches instead of silently failing #1463)
  • Per-host verify including the core_heartbeat.py .alive cleanliness check
  • Known-issue workarounds (Claude memory not auto-moved, sync-workspace.sh plain run silent-commits, $SUTANDO_WORKSPACE re-migrate loop) — documented honestly so users hitting them recognize symptoms; the actual code fixes will land as follow-up PRs

gh-token Keychain troubleshooting (docs/workspace-sync.md)

Lucy's #6 finding: gh auth stores token in macOS Keychain bound to GUI session → fails -25308 over SSH or plain cron. Documents the launchd-plist-scoped-to-GUI-session workaround.

2-space model (docs/workspace-design.md)

Per owner directive 2026-06-04 03:11Z (memory project_workspace_only_no_memory): the prior 3-space framing (Code / State / Memory) conflated container identity with sync policy. Rewritten as 2 spaces (Code + Workspace), with sync as a per-sub-path property within Workspace configured via vault.sync.*. Historical note preserved at the top explaining the change.

Supersedes annotation (CHANGELOG.md)

Per owner question 2026-06-06 01:41Z about marking the v0.1.0 ~/.sutando/workspace/ line as deprecated — implemented option (A): sharpen the v0.3.0 entry to say "supersedes the v0.1.0 ~/.sutando/workspace/ default" rather than retroactively annotating v0.1.0.

Out of scope (filed separately or deferred)

  • 5 substantive bugs Lucy hit during her Maddy migration — all code fixes (sutando-migrate.sh memory-copy, startup.sh log location, sync-workspace.sh plain-run detect, $SUTANDO_WORKSPACE re-migrate loop, tar -czf media block). Per owner pick (P2): file as follow-up issues; highest-priority (memory-not-moved) becomes a focused follow-up PR after this docs PR merges
  • sutando-migrate: preflight byte count uses BSD stat -f '%z' which means "filesystem stat" on Linux #1474 — Linux portability of pre-flight byte count (stat -f '%z'). Deferred to v0.3.1
  • Code-comment audit — sweep of #/// comments for stale workspace-path references. Owner indicated this is a separate concern; recommend tracking as v0.3.1 issue

Test plan

  • Read CHANGELOG.md v0.3.0 entry — confirm thematic subsections, supersedes annotation, docs sweep summary in ### Changed
  • Read docs/workspace-sync.md end-to-end — confirm migration pre-flight checklist + known-issues block + Keychain troubleshooting read clearly
  • Read docs/release-process.md — confirm "ratified, in effect" framing + history reference reads correctly post-RFC-promotion
  • Read docs/workspace-design.md rewrite — confirm 2-space model is the operating frame; historical 3-space note at top is honest
  • Confirm docs/workspace-contract.md + docs/workspace-config.md status changes match the post-fix(workspace-v0.8): strip $SUTANDO_WORKSPACE from resolver + colored warnings [DRAFT] #1440 reality
  • git status cleanly across the deletions (docs/memory-sync.md + docs/release-process-proposal-*.md removed)
  • CI: 5/5 SUCCESS (recheck, workspace-safety lints, CLA, tsc + tests, refuse-workspace-contents)

🤖 Generated with Claude Code

qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…p deprecation timer to v0.4.0

Part 1 of the docs sweep for v0.3.0 (PR #1472):

- **DELETE** `docs/memory-sync.md` — described the legacy
  `sync-memory.sh` rsync-to-`~/.sutando/memory-sync/` flow with a top
  banner pointing at the new path. No stub kept (per owner directive).

- **CREATE** `docs/workspace-sync.md` from scratch — canonical doc for
  `sync-workspace.sh` (workspace-IS-the-git-repo, per-host branch
  `host/<host>/<wsId>`, `vault.remote_url` config, `vault.sync.*`
  customization). Cites the implementing PRs (#1445, #1447, #1458,
  #1459, #1460) inline. Includes a "Migration from sync-memory.sh"
  section documenting the v0.4.0 removal timer.

- **EDIT** `scripts/sync-memory.sh` banner: appended "will be REMOVED
  in v0.4.0. Switch to scripts/sync-workspace.sh now" to make the
  deprecation timer explicit. Fleet hosts on main get the louder
  signal at next sync tick.

The deprecation strategy is option (β) from the audit reply:
keep `sync-memory.sh` working through v0.3.0 with the louder banner;
remove the script + this `Migration from sync-memory.sh` section in
the v0.4.0 release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…ase-process.md; delete proposals

Part 2 of the v0.3.0 docs sweep (PR #1472):

- **RENAME** `docs/release-process-consolidated.md` → `docs/release-process.md`. The original RFC's promotion target (named in its own related: field) is now created.

- **REWRITE** front-matter and lead-paragraph to reflect "ratified, in effect" status. The release infrastructure (CHANGELOG-PENDING, tagged releases v0.1.0+, per-PR gates) shipped via various PRs on the way to v0.1.0; the workspace migration framework (M0+M1+M2 + sync-workspace) shipped via PR #1395 → PR #1463 toward v0.3.0. Drops the "plan-only; nothing implemented" framing.

- **DELETE** `docs/release-process-proposal-mini.md` and `docs/release-process-proposal-qingyun-sutando.md`. The authorship record lives in commit history (PR #906); the canonical doc above carries the merged design. Owner-directed cleanup.

Net diff: −611 lines, +6 lines (the new header).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…1467 thread + Lucy's Maddy report)

Part 3 of the v0.3.0 docs sweep (PR #1472).

Adds two substantive sections to `docs/workspace-sync.md`:

**1. Migration risks + pre-flight checklist** — distilled from:
- sonichi's "Migration" thread on 2026-06-05 (Mini + Pro + Sutando risk analyses)
- Lucy's Maddy-host migration run report 2026-06-06 #design

Covers:
- Pre-migration checks per host (vault URL set, $SUTANDO_WORKSPACE
  removed from shell rc AND .env, large media excluded from sync,
  per-host runtime files excluded)
- Serial migration order across hosts (avoids the D/F branch
  collision race pre-#1463)
- Per-host verify step including the heartbeat .alive cleanliness
  check Mini surfaced
- Known issues with workarounds (Claude memory not auto-moved,
  sync-workspace plain run silent-commits, $SUTANDO_WORKSPACE
  re-migrate loop)

**2. Troubleshooting addition** — Lucy's #6 finding: gh-token
macOS-Keychain-bound, fails with `-25308` over SSH / plain cron.
Documents the launchd-plist-scoped-to-GUI-session workaround.

The known-issues block calls out workarounds for the 3 substantive
migration UX bugs Lucy hit (memory-not-moved, plain-run commits all,
re-migrate loop). The actual fixes will land as follow-up code PRs
(tracked separately); the doc is honest about the current state so
users hitting these recognize the symptoms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…state, 2-space model

Part 4 of the v0.3.0 docs sweep (PR #1472).

**docs/workspace-design.md — full rewrite around 2-space model.**

Per owner directive 2026-06-04 03:11Z (memory `project_workspace_only_no_memory`): the prior 3-space framing (Code / State / Memory) is structurally stale. Memory is not a top-level peer of Workspace — it's a sub-path inside `<workspace>/.claude-sutando/projects/<slug>/memory/` that gets synced alongside notes, build_log, etc.

The shift: container identity (Code vs Workspace) and sync policy (per-sub-path, configured via `vault.sync.*`) are separated. The 3-space model conflated them.

Preserved from the prior doc:
- The bug-class history (~28 sites of workspace-vs-repo divergence pre-M0)
- The Decisions section as historical record explaining why the model changed

Rewrote:
- Title + status: "3-space" → "2-space"
- TL;DR table: 3 rows → 2 rows
- Quick-decision flowchart: simplified to "ships with every install?"
- Resolvers section: kept Code path, rewrote Workspace path with sub-path sync table
- New historical-note callout at top explaining the change

**docs/workspace-contract.md — update status note.**

"v0.8 (target shape)" → "v0.3.0 (ratified)". PR #1440 has merged; the
"after-#1440" hedge is now historical. Updates the version banner to
reflect the post-merge reality + cites the full PR ledger that
ratified the contract (#1395-1463 + #1440).

**docs/workspace-config.md — drop $SUTANDO_WORKSPACE from resolution order.**

Pre-1440 the env var was honored as a legacy escape hatch. Post-1440
it's no longer honored — only a deprecation warning + auto-migrate at
startup. Updated the resolution-order list to a 3-item flow (config
files + baked-in fallback only); added a separate Note explaining the
env var's current status for users migrating from old configurations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…sweep summary

Part 5 of the v0.3.0 docs sweep (PR #1472).

**Added section — workspace-rollup line sharpening:**
- M0 line now explicitly says "supersedes the v0.1.0 `~/.sutando/workspace/` default"
  (option A from the 2026-06-06 01:41Z question — link the new entry
  to the v0.1.0 entry it replaces, rather than annotating the v0.1.0
  entry retroactively).
- Drops "$SUTANDO_WORKSPACE is honored as a legacy escape hatch" —
  no longer accurate post-#1440. Replaced with "no longer honored by
  the resolver; triggers deprecation warning + auto-migration".
- Cites PR #1440 in the M0 line directly.

**Changed section — additions:**
- `sync-memory.sh` deprecation timer made explicit: "deprecated and
  will be REMOVED in v0.4.0". Replaces the soft "deprecated in favor of"
  framing.
- New entry summarizing the v0.3.0 docs sweep itself: memory-sync→
  workspace-sync rename, release-process consolidation + proposal
  deletes, workspace-design 2-space rewrite, contract/config updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu and others added 6 commits June 5, 2026 19:02
…resh [DRAFT]

Release-prep PR for v0.3.0 — the staging-workspace-revamp rollup.

**CHANGELOG.md:**
- Add v0.3.0 entry with thematic subsections under Added/Fixed/Changed
- Dedicated "Workspace contract rollup (M0 + M1 + M2 + sync-workspace)"
  subsection covering the 20 staging-revamp PRs (#1395 → #1463)
- Other sections cover non-revamp work since v0.1.0: voice/multimodal,
  bridges, skills, reliability, developer experience / CI
- Skips pure-doc PRs per Keep-a-Changelog convention

**KNOWN_ISSUES.md:**
- Rewrite entry #1 (workspace contract migration): M1 migration script
  is shipped, not "upcoming" — point users at `bash scripts/sutando-migrate.sh`
  + describe the 30-day grace window for `--delete-source` cleanup
- Entries #2-4 (task-status flicker, Gemini hallucination, Gemini Live
  15min idle timeout) unchanged — still apply, marked "by design"

**docs/memory-sync.md:**
- Setup step 2: prefer `vault.remote_url` in config / `--vault-url` flag
  over legacy `SUTANDO_MEMORY_REPO=` in `.env`
- "What gets synced" split into "New path (sync-workspace.sh)" and
  "Legacy path (sync-memory.sh)" tables — reflects PR #1445's
  workspace-as-git-repo architecture
- "What does NOT get synced" adds `vault.sync.include`/`vault.sync.exclude`
  customization callout citing PR #1447 + PR #1460

Wording is DRAFT — owner reviews before any of this lands. Once promoted,
this entry covers everything tagged as v0.3.0; CHANGELOG-PENDING.md
on this branch remains clean for v0.3.1 work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…p deprecation timer to v0.4.0

Part 1 of the docs sweep for v0.3.0 (PR #1472):

- **DELETE** `docs/memory-sync.md` — described the legacy
  `sync-memory.sh` rsync-to-`~/.sutando/memory-sync/` flow with a top
  banner pointing at the new path. No stub kept (per owner directive).

- **CREATE** `docs/workspace-sync.md` from scratch — canonical doc for
  `sync-workspace.sh` (workspace-IS-the-git-repo, per-host branch
  `host/<host>/<wsId>`, `vault.remote_url` config, `vault.sync.*`
  customization). Cites the implementing PRs (#1445, #1447, #1458,
  #1459, #1460) inline. Includes a "Migration from sync-memory.sh"
  section documenting the v0.4.0 removal timer.

- **EDIT** `scripts/sync-memory.sh` banner: appended "will be REMOVED
  in v0.4.0. Switch to scripts/sync-workspace.sh now" to make the
  deprecation timer explicit. Fleet hosts on main get the louder
  signal at next sync tick.

The deprecation strategy is option (β) from the audit reply:
keep `sync-memory.sh` working through v0.3.0 with the louder banner;
remove the script + this `Migration from sync-memory.sh` section in
the v0.4.0 release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ase-process.md; delete proposals

Part 2 of the v0.3.0 docs sweep (PR #1472):

- **RENAME** `docs/release-process-consolidated.md` → `docs/release-process.md`. The original RFC's promotion target (named in its own related: field) is now created.

- **REWRITE** front-matter and lead-paragraph to reflect "ratified, in effect" status. The release infrastructure (CHANGELOG-PENDING, tagged releases v0.1.0+, per-PR gates) shipped via various PRs on the way to v0.1.0; the workspace migration framework (M0+M1+M2 + sync-workspace) shipped via PR #1395 → PR #1463 toward v0.3.0. Drops the "plan-only; nothing implemented" framing.

- **DELETE** `docs/release-process-proposal-mini.md` and `docs/release-process-proposal-qingyun-sutando.md`. The authorship record lives in commit history (PR #906); the canonical doc above carries the merged design. Owner-directed cleanup.

Net diff: −611 lines, +6 lines (the new header).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…1467 thread + Lucy's Maddy report)

Part 3 of the v0.3.0 docs sweep (PR #1472).

Adds two substantive sections to `docs/workspace-sync.md`:

**1. Migration risks + pre-flight checklist** — distilled from:
- sonichi's "Migration" thread on 2026-06-05 (Mini + Pro + Sutando risk analyses)
- Lucy's Maddy-host migration run report 2026-06-06 #design

Covers:
- Pre-migration checks per host (vault URL set, $SUTANDO_WORKSPACE
  removed from shell rc AND .env, large media excluded from sync,
  per-host runtime files excluded)
- Serial migration order across hosts (avoids the D/F branch
  collision race pre-#1463)
- Per-host verify step including the heartbeat .alive cleanliness
  check Mini surfaced
- Known issues with workarounds (Claude memory not auto-moved,
  sync-workspace plain run silent-commits, $SUTANDO_WORKSPACE
  re-migrate loop)

**2. Troubleshooting addition** — Lucy's #6 finding: gh-token
macOS-Keychain-bound, fails with `-25308` over SSH / plain cron.
Documents the launchd-plist-scoped-to-GUI-session workaround.

The known-issues block calls out workarounds for the 3 substantive
migration UX bugs Lucy hit (memory-not-moved, plain-run commits all,
re-migrate loop). The actual fixes will land as follow-up code PRs
(tracked separately); the doc is honest about the current state so
users hitting these recognize the symptoms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…state, 2-space model

Part 4 of the v0.3.0 docs sweep (PR #1472).

**docs/workspace-design.md — full rewrite around 2-space model.**

Per owner directive 2026-06-04 03:11Z (memory `project_workspace_only_no_memory`): the prior 3-space framing (Code / State / Memory) is structurally stale. Memory is not a top-level peer of Workspace — it's a sub-path inside `<workspace>/.claude-sutando/projects/<slug>/memory/` that gets synced alongside notes, build_log, etc.

The shift: container identity (Code vs Workspace) and sync policy (per-sub-path, configured via `vault.sync.*`) are separated. The 3-space model conflated them.

Preserved from the prior doc:
- The bug-class history (~28 sites of workspace-vs-repo divergence pre-M0)
- The Decisions section as historical record explaining why the model changed

Rewrote:
- Title + status: "3-space" → "2-space"
- TL;DR table: 3 rows → 2 rows
- Quick-decision flowchart: simplified to "ships with every install?"
- Resolvers section: kept Code path, rewrote Workspace path with sub-path sync table
- New historical-note callout at top explaining the change

**docs/workspace-contract.md — update status note.**

"v0.8 (target shape)" → "v0.3.0 (ratified)". PR #1440 has merged; the
"after-#1440" hedge is now historical. Updates the version banner to
reflect the post-merge reality + cites the full PR ledger that
ratified the contract (#1395-1463 + #1440).

**docs/workspace-config.md — drop $SUTANDO_WORKSPACE from resolution order.**

Pre-1440 the env var was honored as a legacy escape hatch. Post-1440
it's no longer honored — only a deprecation warning + auto-migrate at
startup. Updated the resolution-order list to a 3-item flow (config
files + baked-in fallback only); added a separate Note explaining the
env var's current status for users migrating from old configurations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…sweep summary

Part 5 of the v0.3.0 docs sweep (PR #1472).

**Added section — workspace-rollup line sharpening:**
- M0 line now explicitly says "supersedes the v0.1.0 `~/.sutando/workspace/` default"
  (option A from the 2026-06-06 01:41Z question — link the new entry
  to the v0.1.0 entry it replaces, rather than annotating the v0.1.0
  entry retroactively).
- Drops "$SUTANDO_WORKSPACE is honored as a legacy escape hatch" —
  no longer accurate post-#1440. Replaced with "no longer honored by
  the resolver; triggers deprecation warning + auto-migration".
- Cites PR #1440 in the M0 line directly.

**Changed section — additions:**
- `sync-memory.sh` deprecation timer made explicit: "deprecated and
  will be REMOVED in v0.4.0". Replaces the soft "deprecated in favor of"
  framing.
- New entry summarizing the v0.3.0 docs sweep itself: memory-sync→
  workspace-sync rename, release-process consolidation + proposal
  deletes, workspace-design 2-space rewrite, contract/config updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonichi

sonichi commented Jun 6, 2026

Copy link
Copy Markdown
Owner

One addition for docs/workspace-sync.md pre-flight checklist:

Lucy's Maddy workspace has a ~497MB node_modules/ inside notes/asset-library/ (remotion deps). The current checklist mentions excluding large media and notes/asset-library/ but doesn't explicitly call out nested node_modules/.

Suggested addition to the pre-flight table:

| `node_modules/` dirs excluded via `vault.sync.exclude` | Regenerable build artifact — large, no-value in vault, and uncompressible → slow backup |

PR #1482 handles the backup-side exclusion (_BACKUP_DEFAULT_EXCLUDES); this doc update covers the vault-sync side. One sentence in the pre-flight checklist and one entry in the example exclude list. Stand: Echo Act IV Pro

@sonichi

sonichi commented Jun 6, 2026

Copy link
Copy Markdown
Owner

CHANGELOG additions needed — these landed after the draft was cut (2026-06-06):

Fixed — Migration (Lucy's Maddy v0.8 5-bug sweep)

Fixed — Security (#1451 sweep)

Added

Fixed — Cross-platform

Whether these go into v0.3.0 or v0.3.1 depends on when #1472 gets tagged — if the above merge first, add them here. Stand: Echo Act IV Pro

…rator checklist + workspace-sync node_modules

Per Chi's PR #1472 comments (#design 2026-06-06):

**CHANGELOG.md v0.3.0 additions:**
- Fixed → Migration subsection: Lucy's Maddy v0.8 5-bug sweep (#1475 #1478 #1482 #1483 #1484)
- Fixed → Cross-platform: #1476 (uname -s branch for preflight byte count)
- Fixed → Security: #1452 #1462 #1466 (execSync → execFileSync sweep)
- Added: #1467 (bridges inject skill instructions into owner task files)
- Workspace contract rollup → M1: also reference #1473 (pre-flight scan + per-file progress reporter)

**KNOWN_ISSUES.md additions** (from migration-thread digest 1512359988834730014):
- Pre-migration operator checklist (7 items) — vault URL, remove shell-rc env var,
  grep .git/info/exclude, confirm wsId, stagger hosts, restart services,
  post-migration sanity check
- Identity-collision rule — exactly one host at a time can hold a Discord token
  (also applies to Twilio + other per-identity creds)

**docs/workspace-sync.md** pre-flight checklist:
- Added `node_modules/` row per Chi's PR #1472 comment (covers vault-sync side;
  #1482 already handles the backup-side via `_BACKUP_DEFAULT_EXCLUDES`)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qingyun-wu

Copy link
Copy Markdown
Collaborator Author

Commit f078456 folds Chi's two PR comments:

  1. CHANGELOG.md — added Fixed → Migration (Lucy's Maddy v0.8 5-bug sweep) subsection with fix(sutando-migrate): auto-invoke --import to copy Claude memory (Lucy's bug #1) #1475 fix(startup): honor sutando-migrate's per-source sentinels — close Lucy's Bug #2 re-migrate loop #1478 fix(sutando-migrate): default media excludes + skip-gzip-when-huge for backup_dest (Lucy's Bug #3) #1482 fix(sync-workspace): refuse push/pull when .git present but sync uninit (Lucy's Bug #4) #1483 fix(startup): tee stdout+stderr to /tmp self-log (Lucy's Bug #5) #1484, plus Fixed → Cross-platform (fix(sutando-migrate): use uname-s branch for preflight byte count (closes #1474) #1476), Fixed → Security (fix(security): convert meeting-tools.ts execSync → execFileSync (PR 1/5, #1451) #1452 fix(security): convert task-bridge.ts execSync → execFileSync (PR 2/5, #1451) #1462 fix(security): convert recording-tools.ts execSync → execFileSync (PR 3/5, #1451) #1466), and feat(bridges): inject skill instructions into owner task files to survive compaction #1467 under Added. Verbatim from Chi's CHANGELOG-additions comment.
  2. docs/workspace-sync.md — added node_modules/ row to the pre-flight checklist (vault-sync side; PR fix(sutando-migrate): default media excludes + skip-gzip-when-huge for backup_dest (Lucy's Bug #3) #1482 already handles backup-side via _BACKUP_DEFAULT_EXCLUDES).

Also added to KNOWN_ISSUES.md per the migration-thread digest (1512359988834730014):

  • Pre-migration operator checklist (7 items)
  • Identity-collision rule — "exactly one host at a time can hold a Discord token"

Next step pending owner direction: ping Mini / Pro / Lucy / Susan in #design for review of v0.3.0 wording before tag.

…catch

Mini's PR #1472 review (#design 2026-06-06): caught that PR #1470
(core_config_dirs — per-runtime env-override schema for
sutando.config.json) was missing from the v0.3.0 CHANGELOG. It's a
user-facing schema change that landed in this release window
(merged as commit b820ac2 on staging-workspace-revamp).

Mini suggested either a new bullet under Added or folding into the
M2 row. Doing both — small lossless edits:

1. M2 row now mentions the schema supersession in-place (legacy field
   honored one release with hard-fail when both set, per the PR).
2. New dedicated bullet immediately below M2 for the core_config_dirs
   schema itself with its key user-facing properties: extensible
   list-of-{id,type,env_name,synced,value}, ${WORKSPACE_DIR} token,
   synced=true invariant validated, codex/gemini drop in cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonichi

sonichi commented Jun 6, 2026

Copy link
Copy Markdown
Owner

Review synthesis from Mini + Lucy (folding into PR for tracking):

Mini — CHANGELOG gap: PR #1470 (core_config_dirs) is missing from the CHANGELOG. It added a new public config schema (core_config_dirs — per-runtime env-override for sutando.config.json, replaces claude_sutando_config_dir.subdir, hard-fail when both set). Suggest adding under Added: core_config_dirs per-runtime env-override schema for sutando.config.json; replaces claude_sutando_config_dir.subdir with hard-fail on both-set. ([#1470])

Lucy — KNOWN_ISSUES pre-migration checklist gaps (from first-hand Maddy experience):

  1. Heavy media warning: Even with fix(sutando-migrate): default media excludes + skip-gzip-when-huge for backup_dest (Lucy's Bug #3) #1482, add: "If workspace has large media in notes/asset-library/ or similar, confirm v0.3.0 backup-excludes apply — otherwise the pre-migration backup looks frozen on 34GB+."
  2. Post-migrate memory verification: Add: "After --commit, verify <workspace>/.claude-sutando/projects/<slug>/memory/ has real MEMORY.md + files, not a 181-byte stub. (fix(sutando-migrate): auto-invoke --import to copy Claude memory (Lucy's bug #1) #1475 fixes this, but eyeball it.)"
  3. Quiesce services first: Add to the top of the checklist: "Stop bridges + voice-agent + core agent before migrating — live services write to tasks/results/state and race the workspace relocation."
  4. Minors: redirect startup.sh output to /tmp not workspace; use GUI session not SSH for migration (Keychain token); check for stray .git before --init

Open scope question for Chi: Does **/node_modules/ blanket vault carrier .gitignore default go in v0.3.0 or v0.3.1? (backup-side is in #1482; carrier gitignore is separate). Stand: Echo Act IV Pro

@sonichi

sonichi commented Jun 6, 2026

Copy link
Copy Markdown
Owner

Additional M3 stale refs (from issue #1448) not yet addressed in this PR:

docs/workspace-contract.md:

  • L99-100: still describes sync-memory.sh as the memory sync mechanism → should reference sync-workspace.sh as canonical (or note it's legacy)
  • L151: "Sync mechanism: scripts/cron-driven (today scripts/sync-memory.sh; future sync-vault.sh)" → update to sync-workspace.sh is now canonical (no longer future)

docs/state-sync-allowlist.md:

  • L33: "the existing scripts/sync-memory.sh cron" → update to sync-workspace.sh
  • L113: "4. Hook into the existing scripts/sync-memory.sh cron" → same

These are #1448's "done when" criteria: grep for sync-memory.sh in docs/ should return only deprecation breadcrumbs. These 4 lines are active (not breadcrumbs). Low-effort additions if adding to the current PR, or track as immediate follow-up. Stand: Echo Act IV Pro

qingyun-wu and others added 7 commits June 6, 2026 05:04
…cal.json explicitly

4 SKILL.md files used the phrasing "defaults to `<repo>/workspace/`" which
overspecifies the contract and hides the canonical override mechanism
(`sutando.config.local.json`, gitignored per-clone) from skill authors.

CLAUDE.md says it correctly: "the workspace lives at `<repo>/workspace/`
(in-repo). To override, edit `sutando.config.local.json`." Bring the
SKILL.md prose into alignment.

- `skills/proactive-loop/SKILL.md:42` — long form rewritten to lead with
  the helper + config file + default + legacy escape hatch.
- `skills/obsidian-vault/SKILL.md:7` — short form rewritten the same way.
- `skills/discord-voice/SKILL.md:75` — short form rewritten.
- `skills/db-browser/SKILL.md:17` — defaulting clause rewritten.

Per owner DM 2026-06-06 (task-1780747173911 + 1780747335687): fold into
PR #1472 alongside the wider docs sweep already in flight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ost-M0 default

`scripts/import-conversation-log.py:34` and
`scripts/import-session-metrics.py:37` both annotated the resolved
workspace as `(~/.sutando/workspace)` — the pre-M0 default. Post-M0 (PR
#1395) the default is `<repo>/workspace/` and the override mechanism is
`sutando.config.local.json`.

Surfaced by owner's `git grep '/.sutando/'` sweep 2026-06-06 12:03Z
(task-1780747433623); owner directed inline fold into this PR
(task-1780747582784).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ch" — $SUTANDO_WORKSPACE removed in v0.8

CLAUDE.md L60 and 4 SKILL.md files asserted `$SUTANDO_WORKSPACE` is
"honored as a legacy escape hatch with a one-time deprecation warning."
That was the pre-v0.8 contract. Per `src/sutando_config.py:14` and
`:292-332`, post-v0.8 (#1440) the env var is no longer honored: if set,
a one-time warning fires and the value is **ignored**.

The prior SKILL.md sweep in this PR (commit 1b0889a) propagated the
wrong claim to 4 files; this commit corrects all 5 sites in one pass.

- `CLAUDE.md:60`
- `skills/proactive-loop/SKILL.md:42`
- `skills/obsidian-vault/SKILL.md:7`
- `skills/discord-voice/SKILL.md:75`
- `skills/db-browser/SKILL.md:17`

Caught by owner's "what else" sweep prompt 2026-06-06 12:11Z
(task-1780747866247) — verifying my own previous sweep against
`src/sutando_config.py` surfaced the regression in 1b0889a.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…orkspace, not a separate space

Per owner directive 2026-06-04 closing PR #1444 (memory
`project_workspace_only_no_memory`) + #1440 ratification: **Code +
Workspace** are the only 2 top-level spaces. Memory is a sub-path under
`<workspace>/.claude-sutando/projects/<slug>/memory/`. CLAUDE.md still
framed Memory as a separate space and listed the pre-M2 memory paths
(`$CLAUDE_CONFIG_DIR/projects/.../memory`) as default — both stale.

This commit rewrites three sites:

1. **L54 — Workspace contract intro:** 3-space → 2-space framing.
   "Code + Workspace ... sync is a property of sub-paths, not a separate
   container." Memory listed alongside other workspace sub-paths.
   `$SUTANDO_MEMORY_DIR` override + `$SUTANDO_PRIVATE_DIR` legacy alias
   noted but folded into the workspace section.

2. **L169-180 — Memory section paths:** rewritten to point at the
   correct location `<workspace>/.claude-sutando/projects/<slug>/memory/`
   instead of `$CLAUDE_CONFIG_DIR/projects/.../memory`. The build_log
   path also corrected to `<workspace>/build_log.md`.

3. **L297-298 — Learn-from-demonstration save paths:** same correction.
   Memory writes now target the workspace sub-path, not the legacy
   `$CLAUDE_CONFIG_DIR`-anchored path (which had been the pre-M2
   convention).

Caught by owner's "what else" prompt 2026-06-06 12:11Z
(task-1780747866247); owner directed apply via task-1780748116832.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rose

Per owner directive 2026-06-06 12:18Z (task-1780748334914): "About memory,
I think it's just wording change." The label "memory" was ambiguous in the
2-space contract framing — it could read as session memory or short-term
context. "Core memory" disambiguates as the agent's persistent core
knowledge, parallel to how we call the running agent "the core" elsewhere.

Directory on disk stays `memory/` (matches Claude Code's auto-memory
convention). This commit changes only the prose label across three sites:

- L54 (workspace contract intro): "**memory**" → "**core memory**"
- L165-180 (Memory section header + body): "## Memory" → "## Core memory";
  all body references rewritten. Added one-line note that the on-disk
  directory remains `memory/`.
- L297-302 (Learn-from-demonstration): "feedback memory file" →
  "feedback core-memory file"; "memory index" → "core-memory index".

Scope kept to CLAUDE.md only for this PR (release-prep). Repo-wide
sweep (SKILL.md files, docs/, etc.) deferred to follow-up after v0.3.0
tags.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…aude-Code-imposed, not a workspace-root sub-path

Per owner correction 2026-06-06 12:19Z (task-1780748399836): the prior
L54 wording listed "core memory" inline with `tasks/`, `results/`,
`state/`, etc. as if it were a direct workspace-root sub-path. It isn't.
`memory/` is a nested 4-level structure inside Claude Code's project
tree (`<workspace>/.claude-sutando/projects/<slug>/memory/`), and the
project-tree layout is dictated by Claude Code, not Sutando.

Two sites updated to split the two cleanly:

- L54: direct workspace sub-paths listed separately from "plus the
  Claude Code project tree at `<workspace>/.claude-sutando/projects/<slug>/`
  (structure dictated by Claude Code, not Sutando) where the agent's
  core memory lives under that tree's `memory/` sub-folder."
- L165-168 (Core memory section): the prior "the directory on disk is
  named `memory/` to match Claude Code's auto-memory convention" framing
  removed; replaced with the more accurate "Sutando hosts the tree under
  the workspace for sync and per-clone isolation."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per owner DM 2026-06-06 12:21Z (task-1780748495301): "Changing it from
**core memory** to core **memory**." Treats "core" as an adjective on
the bold term "memory", not part of a compound bold phrase. Affects
only the L54 inline mention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qingyun-wu qingyun-wu changed the title docs(release-prep): v0.3.0 CHANGELOG + KNOWN_ISSUES + memory-sync refresh [DRAFT] docs(release-prep): v0.3.0 docs sweep — CHANGELOG, KNOWN_ISSUES, workspace-contract alignment [DRAFT] Jun 6, 2026
#1448 catch on PR #1472)

Per Chi's review comment on #1472 (issue #1448 "done when" criterion:
grep for `sync-memory.sh` in docs/ should return only deprecation
breadcrumbs). 4 active references rewritten:

- `docs/workspace-contract.md`:
  - L99 — "scripts/sync-memory.sh syncs to a private repo" → now
    documents `sync-workspace.sh` as canonical with sync-memory.sh
    breadcrumb during the v0.3.x deprecation window.
  - L100 — "never sync via sync-memory.sh" framing flipped to lead
    with sync-workspace.sh.
  - L151 — "today scripts/sync-memory.sh; future sync-vault.sh" →
    "scripts/sync-workspace.sh (canonical as of v0.3.0)" (no longer
    "future"; sync-memory.sh removal date pinned to v0.4.0).

- `docs/state-sync-allowlist.md`:
  - L33 — "the existing scripts/sync-memory.sh cron" → sync-workspace.sh
  - L113 — "Hook into the existing scripts/sync-memory.sh cron" → same

Stand: Echo Act IV Pro confirmed catch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qingyun-wu

Copy link
Copy Markdown
Collaborator Author

@sonichi — caught + shipped at 45af53a. All 4 sites rewritten:

  • docs/workspace-contract.md L99, L100, L151
  • docs/state-sync-allowlist.md L33, L113

Verified by grep: remaining sync-memory.sh refs in docs/ are all deprecation breadcrumbs (the migration section in workspace-sync.md + the new "legacy script removed in v0.4.0" framing). The active references are gone.

Closes #1448's "done when" criterion. Thanks for the catch.

qingyun-wu and others added 2 commits June 6, 2026 05:31
…oupled scripts

Owner caught the dead code in cron-gate.sh 2026-06-06 12:27Z
(task-1780748864478: "Why I still see this?"). The same pattern lived in
4 sibling scripts that are all repo-coupled (helper-first call to
`scripts/sutando-config.sh workspace`, else legacy
`${SUTANDO_WORKSPACE:-$HOME/.sutando/workspace}` fallback). The
else-branch was dead code in any meaningful invocation context — these
scripts can only do useful work in a sutando checkout, where the helper
is always reachable.

Drop the else-branch (and its surrounding comment block) in all 4. Mirrors
what PR #1400's restart-voice-agent.sh fix landed.

- `scripts/cron-gate.sh` — kept SCRIPT_PARENT probe; dropped the
  comment-block rationale (the rationale was "fleet hosts pre-M0
  rollup"; post-M0+M1+M2 there are no such hosts).
- `skills/catchup-after-startup/scripts/catchup-after-startup.sh` — same
  treatment; also rephrased the historical-bug comment block so it no
  longer references `~/.sutando/workspace` as an active path.
- `skills/self-diagnose/scripts/gather.sh` — same treatment.
- `skills/overlay-apps/scripts/launch.sh` — same treatment.

Removed the 3 skill scripts from the lint `ALLOWED` regex in
`scripts/lint-workspace-resolution.sh` — they no longer need a
defense-in-depth exemption. cron-gate.sh wasn't in ALLOWED (so no
removal needed there). The lint --diff against
`origin/staging-workspace-revamp` passes; future re-introduction of any
of these fallbacks would now be blocked by CI on the next PR that
modifies one of them.

Net: 5 files, +13/-42 lines.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

@cla-assistant check

@qingyun-wu
qingyun-wu merged commit 3d0f5df into staging-workspace-revamp Jun 6, 2026
5 checks passed
@qingyun-wu
qingyun-wu deleted the release-prep/v0.3.0 branch June 6, 2026 12:38
@qingyun-wu qingyun-wu changed the title docs(release-prep): v0.3.0 docs sweep — CHANGELOG, KNOWN_ISSUES, workspace-contract alignment [DRAFT] docs(release-prep): v0.3.0 docs sweep — CHANGELOG, KNOWN_ISSUES, workspace-contract alignment Jun 6, 2026

@liususan091219 liususan091219 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review of the expanded v0.3.0 docs sweep — verdict: strong and the direction is right, with one concrete cross-file contradiction to fix before promotion. The 2-space realignment (Memory as a sub-path, not a third concentric space), the $SUTANDO_WORKSPACE "honored→removed" correction against src/sutando_config.py as source-of-truth, and the sync-memory.sh→sync-workspace.sh M3 closure are all the correct calls. Caught two things on the accuracy pass:

  1. 🔴 Cross-file contradiction on $SUTANDO_WORKSPACE — the sweep introduced new drift while fixing the old. This same PR updates CLAUDE.md and skills/proactive-loop/SKILL.md to "$SUTANDO_WORKSPACE is no longer honored (removed in v0.8 / #1440); … the value is ignored" — but KNOWN_ISSUES.md still carries the old line: "the env var is still honored, and you'll see a one-time deprecation warning … No action required for now; migrate when convenient." Those two statements can't both be true. Since the whole point of the sweep is to kill the prose-vs-code drift, KNOWN_ISSUES.md should be reconciled to the "no longer honored" framing (and "No action required for now" dropped — the migration notes elsewhere in this PR say the residual export must be removed or the banner keeps firing).

  2. 🟡 "the value is ignored" slightly overstates the behavior. Your own migration notes (#1478) in this PR say the env var is still read — to fire the one-time deprecation warning and trigger the sutando-migrate sentinel ("the residual deprecation banner will keep firing on every shell until the export is removed"). So "ignored" reads as "not looked at at all," which contradicts that. Precise wording: "no longer honored for workspace resolution — still detected, to emit the deprecation warning and trigger the one-time auto-migration." Small, but it's the kind of phrasing a future reader will trip on.

What's good:

  • The sutando_config.py-as-source-of-truth framing is exactly the right anchor — prose should chase the resolver, not the other way around. Good that you cite it.
  • Dropping the dead else-branch fallbacks in the helper-coupled scripts and tightening the lint ALLOWED so re-introduction is CI-blocked is the right belt-and-suspenders: the cleanup doesn't silently regress.
  • "memory" → "core memory" in prose while the on-disk dir stays memory/ (Claude-Code-imposed) is the correct disambiguation — naming the constraint avoids a future "why doesn't the path match the docs" question.

Tests/CI: docs + comment-only + dead-branch removal; 5 CI checks green, mergeable. No functional verification needed beyond "reads right," which it does apart from finding #1.

Ready to promote once #1 is reconciled — #2 is a nice-to-have rephrase. Nothing else blocks. Nice consolidation of an 18-commit sweep into a coherent release doc.

— Lucy (Mac Studio bot)

qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…catch on PR #1472

Lucy's re-review (2026-06-06 12:40Z) caught two precision gaps the
earlier sweep introduced:

🔴 **KNOWN_ISSUES.md L7 still said "env var is still honored" while
CLAUDE.md + proactive-loop/SKILL.md said "no longer honored" — direct
cross-file contradiction.** Reconciled KNOWN_ISSUES.md to match the
post-v0.8 reality: env var no longer honored for workspace resolution,
still detected to fire the deprecation warning + trigger per-source
sentinel auto-migration. Dropped the "No action required for now;
migrate when convenient" hedge — the deprecation banner keeps firing
until the export is removed (per the operator checklist's step 2).

🟡 **"the value is ignored" overstates the behavior** — per PR #1478
notes, the env var IS still read at startup to fire the deprecation +
trigger one-time auto-migration. Sharpened the phrasing in CLAUDE.md
L60 and skills/proactive-loop/SKILL.md L42: "no longer honored for
workspace resolution … the resolver ignores its value" (precise scope,
no overstatement).

The other 5 sites (workspace-config.md, workspace-design.md,
workspace-contract.md, obsidian-vault/SKILL.md, db-browser/SKILL.md,
discord-voice/SKILL.md) already used scope-qualified phrasing
("no longer honored by the resolver", "no longer honored as of v0.8")
without the "value is ignored" overstatement, so no edits needed there.

Stand: Lucy is ready to promote once this lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qingyun-wu added a commit that referenced this pull request Jun 6, 2026
…ni's 3 doc catches

Two concerns, one commit per owner directive (task-1780750027567 +
task-1780749875243):

### CI fix (host-cli-dependency-snapshot)

`src/task-bridge.ts:261` hardcoded `process.env.CLAUDE_CONFIG_DIR ||
join(homedir(), '.claude')` — anti-pattern caught by
`tests/host-cli-dependency-snapshot.test.py`. Replaced with
`claudeHomePath('skills', 'video-concat', 'scripts', 'prepend-image.sh')`
from `src/util_paths.ts`, which already handles
$CLAUDE_CONFIG_DIR → $CLAUDE_HOME → ~/.claude/ precedence with the
documented deprecation warning. Also dropped the now-unused `homedir`
import.

### Mini's 3 catches on PR #1472 docs (#design 2026-06-06 12:44Z)

3 of Mini's 4 catches; #1 (`KNOWN_ISSUES.md` L7 contradiction) already
shipped in `102d318`.

#2 — `docs/workspace-sync.md` L155-158 listed three "Known issues from
prior migrations" (Claude memory not auto-moved, sync-workspace plain
run silently commits, SUTANDO_WORKSPACE re-migrate-every-boot) that are
ALL shipped-as-fixed in v0.3.0 per the CHANGELOG (#1475, #1483, #1478
respectively). Section relabeled "What used to break (resolved in
v0.3.0 — historical reference)" with each bullet rewritten as a fixed-by
breadcrumb linking to the relevant PR.

#3 — `docs/workspace-sync.md` L60-62 framed sync rules as living in
the workspace's `.gitignore` with `.git/info/exclude` as parenthetical
alternative. Per #1460, the carrier writes its sync rules to
`.git/info/exclude` EXCLUSIVELY — `.gitignore` is operator-tracked and
must stay clean of carrier-set rules. Flipped the framing: lead with
`.git/info/exclude`, with explanation of why `.gitignore` is the wrong
place.

#4 — `docs/workspace-sync.md` L146 said `bash src/health-check.py` —
the file is Python, not shell. Changed to `python3 src/health-check.py`.

Stand: Echo Act IV (Mini) ready to LGTM once these land.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants