docs: LAUNCH_CHECKLIST.md for going public - #15
Merged
Conversation
…ferrals Captures the gating items between "v1.0 done in private" and "agentsync publicly installable on macOS / Windows / Linux." Sections: §1 OSS hygiene (LICENSE, CONTRIBUTING, SECURITY, CHANGELOG, templates) §2 Repo visibility flip §3 Distribution plumbing (tag + Homebrew tap + Scoop + Chocolatey + AUR) §4 Adapter coverage gaps (deliberate v1.0 cuts to review) §5 One real correctness gap to verify (plugin component projection stub) §6 Comment preservation (documented v1.x deferral, with fuzz suite) Lifts the checklist out of issue #13 and the head of whoever shipped v1.0 so future-self has a self-contained doc to work through. Nothing blocking required; this is a "do without forgetting" artifact. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
spxrogers
force-pushed
the
claude/launch-checklist
branch
from
May 7, 2026 02:56
8f293c4 to
b5c1922
Compare
This was referenced Jun 28, 2026
spxrogers
pushed a commit
that referenced
this pull request
Sep 2, 2026
Closes round-6 review findings on PR #240. All four lenses reported: two CLEAN, two holding on the same item. 1. The chmod pin was VACUOUS in CI. Three lenses caught it. At the ambient umask 0022, os.WriteFile(_, _, 0o644) already yields 0644, so deleting restoreDest's chmod left the assertion green — and my own break-verification had "passed" only because I ran it under `umask 0077` in a subshell. I verified my shell, not the test. The fixture now captures 0o666, which masks down to 0644 on create, so only the chmod can produce it; break-verified at the DEFAULT umask, no process-global umask manipulation needed. 2. A base-parity regression I introduced in round 5. The stat-error arm moved hashFile's answer for an unstattable destination (parent ENOTDIR/ELOOP/ EACCES) from "not-a-regular-file" to "", which drift.Classify reads as absent — turning ForeignCollision into New when nothing was applied, and New is SafeForAutoApply. The naive fix breaks a different case: hashFile cannot tell a stat failure from a read failure by errno alone, and EACCES on the FILE answered "" at base. So the gate now has TWO sentinels. errDestNotRegular means the shape is wrong; errDestUnstattable wraps a real stat errno. reconcile keys on the first alone, so its "remove or replace the non-regular file" line stays truthful for a permission problem, while hashFile — whose sentinels are opaque tokens compared only for equality — maps both alike and regains exact base parity. Pinned by a new unstattable row; the fix had been UNPINNED, which is the same defect it was fixing. 3. Inverting the stat order fixed two findings at once. render.IsRegularOrAbsent is asked FIRST, so the ordinary read costs one stat and only the refusal path pays a second to tell shape from stat failure. That makes the comment's cost claim true rather than merely reworded — three lenses flagged it as false, since the stat had been unconditional. 4. Prose #15: my round-5 CORRECTION was over-broad. The guard test said render.isRegularOrAbsent's `apply --dry-run` claim "is false"; it is true of the orphan-delete read that predicate guards (writer.go:346, reached via OrphanDeleteWillProceed) and false only of Writer.Write's convergence read. Scoped. 5. doctor is a measured hang, not merely "exposed": mkfifo ~/.claude/settings.json then `doctor` wedges at rc=124 after printing "Plugins", via claude.IngestPlugins. My two earlier failures to reproduce were fixture bugs — .claude did not exist, so mkfifo itself failed and I measured a run with no FIFO in it. Stated as measured, and added to CHANGELOG's not-fixed list. No e2e row: neither existing destination shape is settings.json, so a row would pass vacuously. Also: restoreDest no longer leaves its temp file behind on a failure path (the contamination it exists to prevent); `explain` joins the CHANGELOG's fixed list (it reads destinations through readDestFile too); hashFile's doc describes what it now returns; and reconcile.go is back to the base count of over-long lines. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M4VNyoCuGXx7pYxNfLVbFG
spxrogers
pushed a commit
that referenced
this pull request
Sep 2, 2026
…path Closes round-7 review findings on PR #240. Two lenses returned CLEAN; the one real finding is that a fix I reported as done was not in the tree. 1. `43f4464`'s message said prose #15 was "Scoped." It was not. That commit does not touch destread_guard_internal_test.go at all — my script applied three replacements to dest_fifo_e2e_unix_test.go, but the third pattern lives in the guard test, and str.replace() silently no-ops on a missing pattern. Every other edit in that script asserted count==1; that one did not, so a silent miss became a claim of work done. Caught only by `git show --name-only`. Now actually applied: render.isRegularOrAbsent's `apply --dry-run` claim is TRUE of the orphan-delete read it guards and false only of Writer.Write's convergence read. Every edit in this commit went through an assertion, and a post-hoc audit greps the tree for each one. 2. The second sentinel violated the first's stated principle. errDestNotRegular is deliberately pathless because callers wrap it with the path; but errDestUnstattable wrapped a *fs.PathError, so reconcile printed "read dest X: cannot stat destination: stat X: not a directory". It now unwraps to the bare errno via pathlessStatErr, mirroring secrets.pathlessErr, and errors.Is still matches both the sentinel and the underlying syscall error. Pinned by counting path occurrences rather than matching a literal, so a reworded message will not break it; break-verified. 3. `internal/render/writer.go`'s doc claimed the predicate is what stops `apply --dry-run` hanging on a FIFO — flagged by two lenses and disproved by this PR's own skipped rows. It is true of the pre-delete read it guards and false of the convergence read; the sentence now says exactly that rather than being left for #241 to correct later. Also: "Two deliberate limits:" headed three bullets (the second was added in round 6 without bumping the count, and is a design statement rather than a limit); a reflow had orphaned "// whose" on its own line; and docs/components.md's not-fixed list omitted `doctor`, which the CHANGELOG and destread.go already named. Correctness validated base parity empirically rather than by reading: a verbatim copy of f6aa686's hashFile compared against head across 13 input classes, run as root AND as an unprivileged uid so the EACCES rows genuinely denied. All 13 identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M4VNyoCuGXx7pYxNfLVbFG
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stacks a self-contained launch checklist on top of #14, capturing what needs to
happen between "v1.0 done in private" and "agentsync repo public, install
commands work for users on macOS / Windows / Linux."
This lifts the items out of issue #13 and out of session context so future-self
has a single doc to work through. Nothing actionable required right now —
v1.0 is functional and the test suite already proves it. This is just a
"do without forgetting" artifact.
Sections
templates, repo metadata
Codex/Cursor NoopAdapter; review-before-public, not necessarily fix
in
internal/marketplace/projection.go:93–103. The only item that couldmeaningfully surprise a public user
paths strip comments today, plus the fuzz suite the spec calls for
Test plan
Stacked on #14 (test suite + container). No code changes; doc-only.
🤖 Generated with Claude Code