Skip to content

Commit 8104a88

Browse files
authored
Reconcile v0.27.2 release state (#140)
* Preserve packaging migration precedence Capture the requested packaging migration seed so the next packaging milestone surfaces the .packaging reconciliation work with the feat/package-management-pipeline branch precedence rules intact. Constraint: .planning is ignored in this checkout, so the seed file is force-added explicitly Constraint: Worktree already contains an unrelated unmerged .planning/phases/24-scoop-bucket-pipeline/24-01-SUMMARY.md state Rejected: Asking for trigger and scope fields | user expects gsd-capture seed invocations to infer those fields from the command text Confidence: high Scope-risk: narrow Directive: Preserve the collision rule: prefer the more complete package-manager implementation, and if both are complete prefer feat/package-management-pipeline Tested: Read seed file; git diff --check on seed file Not-tested: No runtime package-manager validation; this is a seed capture only * Restore Scoop phase summary for packaging resume The packaging milestone needs the Phase 24 execution summary to resume cleanly. The unresolved index state was deleted-by-us/updated-by-them, and the updated side preserves the completed Scoop evidence plus self-check results. Constraint: .planning is ignored, so the tracked planning file required git add -f Rejected: Leave the summary deleted | would remove Phase 24 completion evidence needed for packaging milestone recovery Confidence: high Scope-risk: narrow Directive: Keep this summary with the packaging milestone artifacts unless Phase 24 is intentionally archived Tested: git ls-files -u showed only this unmerged path; git diff --check on staged summary; read summary content before commit Not-tested: No package manager runtime checks; this resolves planning state only * Resume packaging milestone from the complete pipeline state The package-management branch had the working release pipeline while main still carried the older .packaging tree. This reconciles the two by making packages/ the source of truth, preserving extra package managers, and completing the Nix flake publish job so the milestone resumes from Phase 26 instead of backtracking. Constraint: Existing .packaging managers without branch equivalents had to be preserved Constraint: GitHub release-created workflows require RELEASE_TOKEN, not GITHUB_TOKEN Rejected: Leave .packaging as a duplicate source of truth | it would preserve stale hardcoded templates beside the pipeline templates Confidence: medium Scope-risk: moderate Directive: Do not remove Chocolatey, Debian, Flatpak, or Snap templates unless a future plan explicitly drops those managers Tested: Static workflow/template validation; deno fmt --check targeted package/docs files; git diff --check; deno task test:fast; deno task check-doc-drift; deno task test Not-tested: deno lint remains blocked by existing repo-wide lint backlog; local nix flake check because nix is not installed; live package-manager publication and secret-backed CI jobs * Restore the packaging milestone control surface The implementation work was present, but the active GSD files that autonomous mode reads were missing from this checkout. This restores the v1.6 roadmap, requirements, state, and audit artifacts from the package-management worktree, then updates them to reflect the reconciled packages/ source of truth and the remaining human-runtime UAT boundary. Constraint: .planning is ignored in this repo, so these control files were force-added intentionally Constraint: Package-manager publication cannot be proven locally without GitHub secrets, external repos, package-manager runtimes, and a published release tag Rejected: Mark v1.6 ready to complete | Phase verifications still contain human_needed runtime boundaries Confidence: medium Scope-risk: narrow Directive: Do not run milestone completion until the v1.6 audit gaps are passed or explicitly accepted as deferred Tested: gsd-sdk query init.milestone-op; gsd-sdk query roadmap.analyze; gsd-sdk query validate.consistency; gsd-sdk query state.validate; deno task check-doc-drift; deno task test:fast Not-tested: deno fmt --check on GSD control markdown because Deno reflows roadmap/state fields; live AUR/Homebrew/Scoop/Winget/Nix runtime UAT * Record implemented status for packaging reconciliation seed The v1.6 package reconciliation already consumed this seed by migrating package-manager sources into packages/, applying the pipeline branch placeholder/checksum patterns where appropriate, and preserving auxiliary manager templates without adding live publication jobs for them. Keeping the seed dormant caused the milestone close audit to report already-consumed planning context as open work. Constraint: .planning is ignored, so the GSD commit helper could not add the tracked seed path directly Rejected: Leave SEED-001 dormant | it would keep audit-open blocked despite Phase 20 evidence Confidence: high Scope-risk: narrow Directive: Do not reopen this seed unless future packaging work changes the migration precedence rule Tested: gsd-sdk query audit-open --json shows seeds count 0 Not-tested: Live package-manager publication UAT * Archive the package-manager milestone with external UAT deferred v1.6 delivered the package-manager pipeline implementation and documentation, while the remaining package-registry proof depends on external repos, secrets, operating-system runtimes, and live release workflows. The closeout archives the milestone roadmap, requirements, audit, and phase history, collapses the active roadmap, removes the live REQUIREMENTS.md for the next cycle, and records the accepted external UAT deferrals in STATE.md. Constraint: Homebrew and Scoop target repos returned 404, package-manager secrets were absent from gh secret list, and local nix/brew/winget runtimes are unavailable here Rejected: Mark runtime UAT as passed | live distribution proof has not run Rejected: Leave v1.6 open | user explicitly accepted external UAT as deferred Confidence: high Scope-risk: moderate Directive: Before announcing package-manager availability, complete the deferred external UAT in STATE.md and the archived phase HUMAN-UAT files Tested: gsd-sdk query audit-open --json Tested: gsd-sdk query init.milestone-op Tested: deno task check-doc-drift Tested: git diff --cached --check Not-tested: Live AUR/Homebrew/Scoop/Winget/Nix publication UAT * Preserve release config while rebasing package docs The local release-procedure commit landed on top of the merged package-manager PR with one docs conflict. The resolution keeps main's public package-manager documentation, reapplies the VitePress-safe GitHub Actions expression escaping, and keeps the .nsite release configuration changes from the original commit. Constraint: Resolve the user's in-progress rebase onto origin/main without touching the unrelated .nsite/config.json.backup file Rejected: Abort and restart the rebase | the remaining conflict was isolated to docs/RELEASING.md Confidence: high Scope-risk: narrow Tested: deno fmt --check docs/RELEASING.md .nsite/config.json .nsite/named.json Tested: deno task docs:build Not-tested: full deno test suite, because this resolved docs/config rebase fallout only * Prepare patch release above existing remote tags The remote tag set already contains v0.27.1 while main still carried deno.json at 0.27.0, so this release advances the source-of-truth version to the next patch version before tagging. Constraint: RELEASE.md defines deno.json as the version source of truth Constraint: User requested the next semver from current changes with no major bump Rejected: Minor bump to 0.28.0 | current release-candidate changes are docs/site release configuration and planning artifacts, not CLI runtime behavior Confidence: high Scope-risk: narrow Directive: Do not tag a version lower than the highest existing remote semver tag Tested: deno fmt --check deno.json Tested: deno check src/cli.ts Tested: deno task check-doc-drift Tested: deno task test Tested: deno task compile Not-tested: Repo-wide deno fmt --check and deno lint are still failing on pre-existing broad formatting/lint debt outside this version bump * Let package publishing find release assets without checkout The setup job does not check out the repository, so gh release view cannot infer owner/repo. Passing github.repository explicitly keeps the asset poll working for release and manual dispatch events. Constraint: v0.27.2 package publishing timed out despite all release assets being uploaded Rejected: Add actions/checkout to setup | the job only needs release metadata, not the repository tree Confidence: high Scope-risk: narrow Directive: Keep gh release commands repo-explicit in jobs without checkout Tested: deno fmt --check .github/workflows/publish-packages.yml Tested: Local asset poll against v0.27.2 found all expected standard assets * Carry the v0.27.2 Nix flake update through PR flow The package workflow generated the correct flake.nix changes for v0.27.2 but could not push directly to main because repository rules require pull requests. This preserves the same version and SRI hashes on the reconciliation branch. Constraint: main rejects direct pushes under GH013 repository rules Rejected: Rerun the same Nix job unchanged | it will regenerate the same commit and hit the same protected-branch rejection Confidence: high Scope-risk: narrow Directive: Nix release updates need a PR path while main is protected Tested: SHA256-to-SRI checks for Linux, macOS x64, and macOS arm64 release assets matched flake.nix Not-tested: nix eval; nix is not installed in this environment --------- Co-authored-by: sandwich <dskvr@users.noreply.github.com>
1 parent c2284ba commit 8104a88

73 files changed

Lines changed: 12655 additions & 170 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/publish-packages.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,19 @@ jobs:
6464
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6565
TAG: ${{ steps.extract.outputs.tag }}
6666
VERSION: ${{ steps.extract.outputs.version }}
67+
REPO: ${{ github.repository }}
6768
run: |
6869
TAG="${TAG}"
6970
VERSION="${VERSION}"
71+
REPO="${REPO}"
7072
EXPECTED="nsyte-linux-${VERSION} nsyte-macos-arm64-${VERSION} nsyte-macos-x64-${VERSION} nsyte-windows-${VERSION}.exe"
7173
TIMEOUT=300
7274
INTERVAL=15
7375
ELAPSED=0
7476
ALL_PRESENT=false
7577
7678
while [ "$ELAPSED" -lt "$TIMEOUT" ]; do
77-
NAMES=$(gh release view "$TAG" --json assets --jq '.assets[].name' 2>/dev/null || echo "")
79+
NAMES=$(gh release view "$TAG" -R "$REPO" --json assets --jq '.assets[].name' 2>/dev/null || echo "")
7880
ALL_PRESENT=true
7981
for expected in $EXPECTED; do
8082
if ! echo "$NAMES" | grep -qF "$expected"; then

.nsite/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"bunkerPubkey": "9c08bc9679ca77197f3e6a28876b77c5cc4b7a9dd268d9a3cffd7f1eab667cfb",
2+
"bunkerPubkey": "e771af0b05c8e95fcdf6feb3500544d2fb1ccd384788e9f490bb3ee28e8ed66f",
33
"fallback": "/index.html",
44
"relays": [
55
"wss://relay.nsite.lol",

.nsite/named.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
{
2-
"bunkerPubkey": "9c08bc9679ca77197f3e6a28876b77c5cc4b7a9dd268d9a3cffd7f1eab667cfb",
2+
"bunkerPubkey": "e771af0b05c8e95fcdf6feb3500544d2fb1ccd384788e9f490bb3ee28e8ed66f",
33
"relays": [
44
"wss://nsite.run",
55
"wss://nos.lol",
6-
"wss://relay.damus.io"
6+
"wss://relay.damus.io",
7+
"wss://relay.nosto.re"
78
],
89
"servers": [
910
"https://blssm.us",
10-
"https://cdn.hzrd149.com"
11+
"https://cdn.hzrd149.com",
12+
"https://nsite.run",
13+
"https://nosto.re"
1114
],
12-
"id": "namednsyte",
13-
"title": "nsyte (testing)",
15+
"id": "nsyte",
16+
"title": "nsyte.run",
1417
"description": "nsyte, but testing nsyte deploy to named site"
1518
}

.planning/MILESTONES.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Milestones
2+
3+
## v1.6 OS Package Manager/Distributors (Shipped: 2026-05-07)
4+
5+
**Phases completed:** 7 phases, 12 plans, 8 tasks
6+
7+
**Key accomplishments:**
8+
9+
- Migrated package-manager sources into `packages/`, using placeholder-driven release asset templates for AUR, Homebrew, Scoop, Winget, and Nix while preserving Chocolatey, Debian, Flatpak, and Snap templates for future live-publication work.
10+
- Swapped release creation to `RELEASE_TOKEN` so GitHub `release: published` events can trigger downstream package publication workflows.
11+
- Shipped `publish-packages.yml` with asset readiness polling, centralized checksum computation, independent manager jobs, and manual per-manager `workflow_dispatch` reruns.
12+
- Implemented AUR, Homebrew, Scoop, Winget, and Nix publication/update jobs with fail-fast placeholder checks, idempotency guards, and runbook-backed verification.
13+
- Documented setup and troubleshooting for release tokens, AUR SSH, Homebrew tap PAT, Scoop bucket PAT, Winget bootstrap/update flow, and Nix flake hash updates in `docs/RELEASING.md`.
14+
15+
**Known deferred items at close:** 6 external runtime UAT gates accepted as deferred (see `STATE.md` Deferred Items).
16+
17+
---
18+
19+
## Completed
20+
21+
### v1.4: Documentation Pass
22+
23+
**Shipped:** 2026-05-03
24+
**Phases:** 12-15 (12 plans, 26 tasks)
25+
**Goal:** Eliminate documentation drift methodically. Re-align all docs with the actual CLI surface (commands, flags, arguments, behavior). Remove "optimistic" claims for features that no longer exist or never did. Build a drift gate so this never silently regresses.
26+
27+
**Key accomplishments:**
28+
29+
- Rebuilt nsyte 0.26.0, captured `--help` for all 21 top-level commands + 7 bunker subcommands (29 files), and produced AUDIT-MATRIX.md joining 21 source commands × 17 doc pages × 28 help captures with severity-ordered drift classification
30+
- Created 5 missing command pages (get, put, scan, snapshot, status), rewrote upload.md as alias stub for deploy, re-anchored ls.md on canonical `list`, created _global-options.md as canonical globals reference
31+
- Aligned 7 command pages (announce, bunker, debug, download, init, serve, validate) flag-by-flag with source `.option(...)` declarations; updated commands.md index; ZERO drift across all 21 commands
32+
- Reconciled 8 guide pages: replaced phantom `appHandler.enabled` with `publishAppHandler`, removed phantom env vars (`NSYTE_BUNKER_KEY`, `NSYTE_LOG_LEVEL`), fixed Linux/Windows storage-path drift, deleted 227-line commented Package Managers block, updated stale `@0.10.1` pin
33+
- Updated 5 cross-reference pages (docs/index, README, mkdocs.yml, docs/usage/index, docs/usage/configuration); mkdocs strict build clean
34+
- Shipped `scripts/check-doc-drift.ts` (3 checks: coverage, flag alignment, env-var) and `.github/workflows/doc-drift.yml` CI gate
35+
- `v1.4-PHANTOM-LOG.md` accumulates 34 entries documenting every removed/rewritten claim with verbatim quotes — backlog for future feature work
36+
37+
### v1.3: Redesign Homepage
38+
39+
**Shipped:** 2026-05-03
40+
**Phases:** 10-11 (6 plans, 18 tasks)
41+
**Goal:** Compress the marketing page into a tight, above-the-fold landing with darker chrome and the existing green accent, while keeping deeper docs reachable via links.
42+
43+
**Key accomplishments:**
44+
45+
- Locked near-black palette (`--cyber-bg #06070d`) and tightened density scale (15px body / 1.5 line-height / 2rem section padding / ~15% reduced heading clamps) on `website/src/index.html`
46+
- Removed four below-the-fold sections (features, what's-nsite, CI/CD, demo walkthrough), animated grid, animated gradient, and asciinema demo player — file shrank from 1,775 → 653 lines (-63%)
47+
- Built top-link nav (Docs · GitHub · Install · Releases) and rebuilt hero around wordmark + tagline + particles only
48+
- Compact install component with underlined tabs (script default), single canonical command per tab, copy-to-clipboard + 1.5s feedback, "More install options →" link to docs
49+
- Folded all Phase 10 UI-audit color findings into Phase 11 rebuild (no purple/blue gradients on UI surfaces; legacy neon green replaced; Phase 11 audit scored 24/24)
50+
- User-approved cycle-2 layout: content flex-centered both axes (`min-height: 100vh` restored), nav moved to last child of `.hero-content`, `history.pushState` keeps URL hash in sync on `#install` clicks
51+
- A11y: `:focus-visible` rings, `prefers-reduced-motion` block, full ARIA tablist semantics
52+
53+
### v1.2: Custom Event Timestamps
54+
55+
**Shipped:** 2026-04-14
56+
**Phases:** 7-9
57+
**Goal:** Add CLI argument to override `created_at` timestamp on nostr events, with tests across all code paths.
58+
59+
### v1.1: Address Open Issues
60+
61+
**Shipped:** 2026-04-04
62+
**Phases:** 3-6
63+
**Goal:** Fix manifest title/description bug, add dry-run mode, config schema hosting, and secrets scanner (#100-#103).
64+
65+
### v1.0: Test Coverage Low-Hanging Fruit
66+
67+
**Shipped:** 2026-03-27
68+
**Phases:** 1-2
69+
**Goal:** Increase line coverage from 35.3% by testing pure-function and utility modules.

.planning/PROJECT.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# nsyte
2+
3+
## What This Is
4+
5+
A CLI tool for publishing static sites to nostr relays and blossom servers. Users can deploy, manage, and serve websites using the nostr protocol, with support for multiple named sites, snapshots, NIP-89 app handlers, and bunker-based signing. The marketing site at `nsyte.run` introduces the project with a compact above-the-fold landing that links to the full documentation site.
6+
7+
## Core Value
8+
9+
Reliable site deployment to the nostr + blossom ecosystem with a simple CLI workflow.
10+
11+
## Current State
12+
13+
**Shipped:** v1.6 OS Package Manager/Distributors on 2026-05-07.
14+
15+
**Current package-management state:** Package templates live under `packages/`, release-triggered package jobs are wired in `.github/workflows/publish-packages.yml`, and maintainer runbooks live in `docs/RELEASING.md`. Live package-manager publication UAT remains deferred until external repos, secrets, package-manager runtimes, and release runs are available.
16+
17+
## Requirements
18+
19+
### Validated
20+
21+
<!-- Shipped and confirmed valuable. -->
22+
23+
- Site deployment to blossom servers and nostr relays (deploy, undeploy) — v1.0
24+
- Named site management (sites command) — v1.0
25+
- File operations (put, get, delete, list, download) — v1.0
26+
- Manifest snapshots for versioning — v1.0
27+
- Configuration management with bunker-based signing — v1.0
28+
- NIP-89 app handler announcements — v1.0
29+
- CI/CD integration mode — v1.0
30+
- Debug and validation tooling — v1.0
31+
- Manifest title/description event metadata fix — v1.1
32+
- Dry-run mode for deploy — v1.1
33+
- Config schema hosting — v1.1
34+
- Secrets scanning pre-deploy check — v1.1
35+
- Custom `--created-at` global CLI option for overriding event timestamps — v1.2
36+
- Above-the-fold homepage layout (heading, links, compact install box) — v1.3
37+
- Darker dark-theme palette (`#06070d` base) preserving the green accent — v1.3
38+
- Tighter typography, spacing, and component density on the homepage — v1.3
39+
- Persistent links from homepage to the existing docs site — v1.3
40+
- Documentation aligned 1:1 with the actual CLI surface (commands, flags, behavior) — v1.4
41+
- Drift gate (`scripts/check-doc-drift.ts` + GitHub Actions workflow) catches future drift in CI — v1.4
42+
- VitePress docs/site migration with homepage-matched theme and local search — v1.5
43+
- Package source-of-truth under `packages/` with AUR, Homebrew, Scoop, Winget, and Nix templates — v1.6
44+
- Release-triggered package publication workflow with independent manager jobs and shared asset/checksum setup — v1.6
45+
- Package-manager maintainer runbooks for tokens, repo bootstrap, local verification, and troubleshooting — v1.6
46+
47+
### Active
48+
49+
<!-- Current scope. Building toward these. -->
50+
51+
Next milestone not selected yet. Start with `$gsd-new-milestone`.
52+
53+
Backlog still standing from v1.4 phantom log: env-var override support, `nsyte config show`/`set` subcommands, `validate` redundant `-f` flag fix, `deploy` duplicate `-c` short-flag fix.
54+
55+
### Out of Scope
56+
57+
<!-- Explicit boundaries. Includes reasoning to prevent re-adding. -->
58+
59+
- Light theme — dark-only by design (cypherpunk aesthetic)
60+
- Mobile-first homepage redesign — desktop above-the-fold fit is the priority; mobile gets graceful degradation only
61+
- Asciinema/demo content on the homepage — demo lives in docs
62+
- Marketing content on homepage (features, CI/CD, "what's nsite") — migrated to docs to enforce no-scroll constraint
63+
- CLI source changes during the v1.4 docs pass — if a doc audit reveals a real source bug or missing feature, it's flagged for a future milestone, not fixed in this one
64+
- CLI source changes during v1.5 — same rule: docs migration only; phantom-log backlog stays deferred
65+
- Live Chocolatey, Debian, Flatpak, and Snap publication — templates are preserved under `packages/`, but v1.6 intentionally did not add live jobs for those managers
66+
67+
## Context
68+
69+
- **Runtime:** Deno (TypeScript)
70+
- **Nostr libraries:** applesauce-core, applesauce-signers, applesauce-relay
71+
- **CLI framework:** Cliffy (Command, Prompt, Ansi)
72+
- **Event signing:** ISigner interface from applesauce-signers (supports bunker, nsec)
73+
- **Event timestamps:** `--created-at` global option overrides timestamp on most event kinds; delete (kind 5) and blossom auth (kind 24242) events always use current time
74+
- **Commands:** init, deploy, list, status, snapshot, sites, browse, download, get, ci, put, run, serve, delete, undeploy, validate, debug, announce, config, bunker, scan
75+
- **Marketing site:** Single-page HTML at `website/src/index.html` (~653 lines after v1.3 redesign, down from ~1890). Cypherpunk theme, `--cyber-bg #06070d`, `--cyber-accent #34d399`. Single `<section class="hero">` with flex-centered content (wordmark + tagline + compact install component + top-link nav). UI-audit score 24/24 at v1.3 close.
76+
- **Docs site:** VitePress build under `docs/`, with palette/typography matched to the homepage. Homepage links to preserve: `/docs/installation/`, `/docs/`.
77+
- **Package managers:** `packages/` is the package source-of-truth. AUR, Homebrew, Scoop, Winget, and Nix have v1.6 publication/update automation; Chocolatey, Debian, Flatpak, and Snap templates are preserved without live jobs.
78+
79+
## Constraints
80+
81+
- **Deno:** Must compile to single binary for Linux, macOS, Windows
82+
- **Nostr protocol:** Events must conform to NIP specifications
83+
- **Blossom protocol:** Auth events (kind 24242) have expiration requirements
84+
- **Brand color:** Existing green accent (`--cyber-accent #34d399`) is fixed — only darks deepen
85+
- **Marketing site:** Single-file inline CSS+HTML+JS (`website/src/index.html`); no build step
86+
87+
## Key Decisions
88+
89+
| Decision | Rationale | Outcome |
90+
|----------|-----------|---------|
91+
| Use applesauce libraries | Modern nostr library ecosystem with good Deno support | -- Pending |
92+
| Cliffy for CLI | Mature Deno CLI framework | -- Pending |
93+
| `--created-at` excluded from delete & blossom auth events | Deletion timestamp must reflect actual time; blossom expiration math depends on current time | ✓ Good (v1.2) |
94+
| Homepage flex-centered + `min-height: 100vh` (v1.3 cycle-2) | First attempt dropped 100vh and left content top-anchored — user feedback restored centering as the more pleasant layout | ✓ Good (v1.3) |
95+
| Nav placed AT END of `.hero-content` (v1.3 cycle-2) | User checkpoint feedback: links sit better below the wordmark/tagline/install | ✓ Good (v1.3) |
96+
| Underlined text tabs over button-pill style (v1.3) | Denser, fits the "tighter" mandate; cleaner with the compact install card | ✓ Good (v1.3) |
97+
| Phase 10 audit findings folded into Phase 11 rebuild | The flagged surfaces (install/code/copy components) were already being rebuilt; one-pass fix preferred over separate cleanup phase | ✓ Good (v1.3) — clean 24/24 audit |
98+
| `history.pushState` on in-page anchor click (v1.3) | Plan must_haves required `window.location.hash === '#install'`; default `e.preventDefault()` + `scrollIntoView` doesn't update the URL | ✓ Good (v1.3) |
99+
100+
## Evolution
101+
102+
This document evolves at phase transitions and milestone boundaries.
103+
104+
**After each phase transition** (via `/gsd:transition`):
105+
1. Requirements invalidated? -> Move to Out of Scope with reason
106+
2. Requirements validated? -> Move to Validated with phase reference
107+
3. New requirements emerged? -> Add to Active
108+
4. Decisions to log? -> Add to Key Decisions
109+
5. "What This Is" still accurate? -> Update if drifted
110+
111+
**After each milestone** (via `/gsd:complete-milestone`):
112+
1. Full review of all sections
113+
2. Core Value check -- still the right priority?
114+
3. Audit Out of Scope -- reasons still valid?
115+
4. Update Context with current state
116+
117+
## Key Decisions
118+
119+
(continuing from above table)
120+
121+
| Decision | Rationale | Outcome |
122+
|----------|-----------|---------|
123+
| Phantom log as living artifact | Records every removed doc claim with verbatim quotes — future feature backlog source | ✓ Good (v1.4) — 34 entries surface concrete source-side work |
124+
| `upload.md` kept as alias stub (not deleted) | UX: a user searching "upload" should find a doc that points them to deploy | ✓ Good (v1.4) |
125+
| `ls.md` filename retained, content re-anchored on `list` | Avoid breaking external links to `/docs/usage/commands/ls/` | ✓ Good (v1.4) |
126+
| `_global-options.md` canonical reference | Don't duplicate `--config`/`--created-at` across 22 pages | ✓ Good (v1.4) |
127+
| Drift gate: 3 checks (coverage, flag, env-var) | Maps directly to the top-3 phantom patterns from the audit | ✓ Good (v1.4) |
128+
| Phase 14 audit folded color findings from Phase 11 audit (UI carry-over) — n/a in v1.4 (docs-only) |||
129+
| `packages/` as package source-of-truth | Keeps manager templates versioned with the release workflow and avoids hidden `.packaging` drift | ✓ Good (v1.6) |
130+
| Independent package manager jobs instead of a matrix | One package-manager failure should not cancel unrelated publication targets | ✓ Good (v1.6) |
131+
| External package UAT deferred at close | Live pushes require repos, secrets, package-manager runtimes, and package index workflows outside local static verification | ⚠ Revisit before public package announcement |
132+
133+
---
134+
*Last updated: 2026-05-07 — after v1.6 milestone close*

.planning/RETROSPECTIVE.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Project Retrospective
2+
3+
*A living document updated after each milestone. Lessons feed forward into future planning.*
4+
5+
## Milestone: v1.6 - OS Package Manager/Distributors
6+
7+
**Shipped:** 2026-05-07
8+
**Phases:** 7 | **Plans:** 12
9+
10+
### What Was Built
11+
12+
- Package-manager source templates moved into `packages/` for AUR, Homebrew, Scoop, Winget, Nix, Chocolatey, Debian, Flatpak, and Snap.
13+
- `publish-packages.yml` wires release-triggered package publication with shared asset polling/checksum setup and independent manager jobs.
14+
- AUR, Homebrew, Scoop, Winget, and Nix publication/update paths now have CI implementations and `docs/RELEASING.md` runbooks.
15+
16+
### What Worked
17+
18+
- Preserving `.packaging` analogs before applying the pipeline branch patterns avoided losing Chocolatey, Debian, Flatpak, and Snap coverage.
19+
- Independent package-manager jobs matched the failure-isolation goal and kept each manager's validation readable.
20+
- The final open-artifact audit caught stale debug sessions and an already-consumed seed before archive.
21+
22+
### What Was Inefficient
23+
24+
- External package-manager UAT could not close locally because the required GitHub repos, secrets, package-manager runtimes, and live release workflows were not available.
25+
- Some generated milestone accomplishments needed manual cleanup before they were useful as a durable summary.
26+
27+
### Patterns Established
28+
29+
- `packages/` is the package source-of-truth.
30+
- Placeholder replacement must be named, fail-fast, and idempotent for package templates.
31+
- Runtime distribution proof should be split from static pipeline proof when external registries and secrets are the real gate.
32+
33+
### Key Lessons
34+
35+
1. Check external repo and secret existence early in package-manager milestones; missing infrastructure should be recorded as a live-UAT boundary before close.
36+
2. Treat dormant seeds as close blockers only if their trigger remains unimplemented; otherwise mark them implemented with phase evidence.
37+
3. Archive package-manager milestones with explicit external-UAT deferrals so future release work has a precise checklist rather than a vague "human needed" state.
38+
39+
### Cost Observations
40+
41+
- Sessions: multiple interrupted/resumed GSD passes.
42+
- Notable: targeted Deno gates plus `audit-open` were more useful than repo-wide lint for closeout confidence.
43+
44+
---
45+
46+
## Cross-Milestone Trends
47+
48+
### Process Evolution
49+
50+
| Milestone | Phases | Key Change |
51+
|-----------|--------|------------|
52+
| v1.6 | 7 | Package-manager work needs static implementation gates plus separate external runtime gates. |
53+
54+
### Top Lessons
55+
56+
1. Keep durable planning artifacts, but close or archive stale open-state records before milestone completion.
57+
2. Prefer repo-local validation for implementation proof and make external live-UAT prerequisites concrete.

0 commit comments

Comments
 (0)