From 1bbd20bf78540e91e527a91446564859ac1c4a05 Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Wed, 29 Apr 2026 14:49:05 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20correct=20gsd-2=20self-heal=20port=20?= =?UTF-8?q?=E2=80=94=20substance=20applies=20after=20path=20translation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Earlier I (and sf parroting BUILD_PLAN.md) dismissed gsd-2's symlinked .gsd self-heal fix (9340f1e9b / #4423) as 'doesn't apply because we use .sf instead'. That was a superficial read. The fix is about detecting and recovering from a broken/redirected staging-dir symlink to prevent silent data loss. The .gsd/ vs .sf/ is a one-line path translation, not a design difference. The symlink-resilience logic is exactly what we need for our staging. Path-translate .gsd/ → .sf/ in the port. The substance ports. Co-Authored-By: Claude Sonnet 4.6 --- BUILD_PLAN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD_PLAN.md b/BUILD_PLAN.md index 8b592c622..9e04d5495 100644 --- a/BUILD_PLAN.md +++ b/BUILD_PLAN.md @@ -55,7 +55,7 @@ Process for each: | 1 | **`fix(safety): persist bash evidence at tool_call` (close mid-unit re-dispatch race)** | Real race condition; bash tool calls can lose evidence between dispatch and re-dispatch | `da7dd56e7` (PR #5056 → #5058) | | 2 | **`fix(security): harden project-controlled surfaces`** | We have a partial cherry-pick at `66ff949c1`; supersede with the full fix | `65ca5aa2e` | | 3 | **`fix(search): narrow native web_search injection`** | Only inject web_search context when the provider accepts it | `4370bedf3` | -| 4 | **`fix(gsd): self-heal symlinked .gsd staging`** | Data-loss prevention — symlinked staging dir was being treated as the wrong scope | `9340f1e9b` (#4423) | +| 4 | **`fix(gsd): self-heal symlinked .sf staging`** (path-translated) | Data-loss prevention — when the staging dir is a symlink that's broken or points outside expected scope, detect and self-heal instead of silently writing to wrong location. Path-translate `.gsd/` → `.sf/` in the port; the substance is symlink-resilience, not the path string. | `9340f1e9b` (#4423) | | 5 | **`fix(knowledge): scope + budget milestone KNOWLEDGE injection`** | Prevents milestone-scope knowledge from blowing the context budget | `58d3d4d6c` (#4721) | | 6 | **`fix(mcp-server): prevent defaultExecFn stdout-buffer deadlock`** | Real deadlock — large-output MCP tools could hang the agent | `bb747ec57` | | 7 | **`fix(agent-session): guard synthetic agent_end transitions`** | Session-transition race when agent_end was synthesised | `71114fccf` |