Skip to content

docs: LAUNCH_CHECKLIST.md for going public - #15

Merged
spxrogers merged 1 commit into
mainfrom
claude/launch-checklist
May 7, 2026
Merged

docs: LAUNCH_CHECKLIST.md for going public#15
spxrogers merged 1 commit into
mainfrom
claude/launch-checklist

Conversation

@spxrogers

Copy link
Copy Markdown
Owner

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

  • §1 OSS hygiene — LICENSE, CONTRIBUTING, SECURITY, CHANGELOG, issue/PR
    templates, repo metadata
  • §2 Repo visibility flip — sequencing note (do AFTER §1, BEFORE §3)
  • §3 Distribution plumbing — tag + Homebrew tap + Scoop bucket + Chocolatey
    • AUR + apt/yum hosting
  • §4 Adapter coverage gaps — OpenCode hooks/LSP, frontmatter munge skips,
    Codex/Cursor NoopAdapter; review-before-public, not necessarily fix
  • §5 One real correctness gap to verify — plugin component projection stub
    in internal/marketplace/projection.go:93–103. The only item that could
    meaningfully surprise a public user
  • §6 Comment preservation — documented v1.x deferral; both TOML and JSONC
    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

@spxrogers
spxrogers changed the base branch from claude/robust-test-suite-nbkly to main May 7, 2026 02:52
…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
spxrogers force-pushed the claude/launch-checklist branch from 8f293c4 to b5c1922 Compare May 7, 2026 02:56
@spxrogers
spxrogers merged commit d8f3138 into main May 7, 2026
6 checks passed
@spxrogers
spxrogers deleted the claude/launch-checklist branch May 7, 2026 02:56
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
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.

1 participant