|
| 1 | +--- |
| 2 | +title: "Pickup notes — 2026-07-13: deploy hardening, doc audits, credential hygiene" |
| 3 | +lede: "Steps 1–10 of the humain-vc unlock flow are done and confirmed live at augment.didi.sh. This session closed out a string of production-only bugs and stale docs found by actually using the deployed app, and scoped what Step 11 (corpus backup) needs before it can start." |
| 4 | +date_created: 2026-07-13 |
| 5 | +date_modified: 2026-07-13 |
| 6 | +authors: |
| 7 | + - Michael Staton |
| 8 | +augmented_with: |
| 9 | + - Claude Code on Claude Sonnet 5 |
| 10 | +semantic_version: 0.0.1.0 |
| 11 | +status: Active |
| 12 | +tags: |
| 13 | + - Augment-It |
| 14 | + - Pickup |
| 15 | + - humain-vc |
| 16 | + - Build-Order |
| 17 | + - Deployment |
| 18 | + - Railway |
| 19 | + - Credential-Hygiene |
| 20 | + - 2026-07-13 |
| 21 | +--- |
| 22 | + |
| 23 | +# Pickup notes — 2026-07-13 |
| 24 | + |
| 25 | +## TL;DR |
| 26 | + |
| 27 | +1. **Steps 1–10 of [[../Build-Order-Humain-VC-Unlock-Flow]] are DONE** and |
| 28 | + the user has confirmed the deployed instance works end-to-end at |
| 29 | + `https://augment.didi.sh` (Railway, custom `*.didi.sh` domains). No |
| 30 | + prior pickup doc exists for this arc — the last one in |
| 31 | + `context-v/reminders/` is `Pickup-2026-06-03`, over a month before any |
| 32 | + of the Railway deploy work happened. |
| 33 | +2. **This session was entirely bug-fixing + doc/credential hygiene, no |
| 34 | + new features.** Four real fixes, all found by using the live app or |
| 35 | + by re-reading docs against the actual filesystem, not by anyone |
| 36 | + requesting new work. |
| 37 | +3. **Only Steps 11 and 12 remain open** on the build-order plan. Step 11 |
| 38 | + (corpus backup to R2) needs one decision before it can be scoped: |
| 39 | + shared `lossless-core` bucket vs. a dedicated augment-it bucket — see |
| 40 | + "Open decisions" below. |
| 41 | +4. **No changelog entry has been written for any of this session's |
| 42 | + work.** Last changelog is `2026-07-09_01_...`. Per `git-conventions`, |
| 43 | + this is worth doing before the next unrelated commit lands. |
| 44 | +5. **Working tree is clean** on `rebuild/turbo-rsbuild`, pushed through |
| 45 | + `fe6a203`. Only dirty paths are submodule pointer bumps |
| 46 | + (`clients/humain-vc`, `clients/reach-edu`) that are deliberately left |
| 47 | + alone — per standing convention, the user tidies parent gitlinks |
| 48 | + manually after committing inside a child submodule, not the agent. |
| 49 | + |
| 50 | +## What shipped this session (chronological) |
| 51 | + |
| 52 | +1. **README app-structure audit** (`f8e4ab1`). The "App structure" ASCII |
| 53 | + tree was missing 6 apps (`affiliation-rating-resolver`, |
| 54 | + `person-db-resolver`, `person-enrichment`, `record-db-resolver`, |
| 55 | + `records-surface`, `strategy-curator`) and 2 services |
| 56 | + (`record-surrealdb-resolver`, `decile-mcp`), and several listed ports |
| 57 | + were stale from before a port renumbering (`record-collector` was |
| 58 | + documented `:3001`, actually `:3002`; `shell` was documented `:3000`, |
| 59 | + actually `:3100`). Pulled every port fresh from each app's |
| 60 | + `rsbuild.config.ts` rather than trusting the old doc. Also added |
| 61 | + narrative coverage for SurrealDB Cloud, didi.sh identity, the Flows |
| 62 | + registry (replacing the old single `ROTATION`), live multi-operator |
| 63 | + sync, and actor attribution. |
| 64 | +2. **GitHub Pages deploy was silently broken since 2026-07-08** |
| 65 | + (`9ef8244`). Root cause: that day's "pin pnpm version" commit added |
| 66 | + `packageManager: pnpm@10.15.0` to root `package.json` (for Railway's |
| 67 | + Docker builds), which collided with `.github/workflows/pages.yml`'s |
| 68 | + hardcoded `pnpm/action-setup@v4` `version: 9` — "Multiple versions of |
| 69 | + pnpm specified." Six pushes in a row never actually redeployed the |
| 70 | + splash; GitHub Pages was quietly serving a 2026-07-08 build the whole |
| 71 | + time. Fixed by dropping the hardcoded version so `action-setup` reads |
| 72 | + `packageManager` instead. Verified live: workflow ran green, |
| 73 | + `https://lossless-group.github.io/augment-it/` is serving current |
| 74 | + content. Also resynced `splash/pnpm-lock.yaml` to what |
| 75 | + `splash/package.json` already declared (it had drifted to old |
| 76 | + `astro 6.3.1`/`astro-pagefind 1.8.6`). Also added a new |
| 77 | + feature-highlight card, "Build the corpus together, live" — the one |
| 78 | + shipped capability (NATS multi-operator sync) with no marketing |
| 79 | + coverage yet. |
| 80 | +3. **`JINA_API_KEY` / `JINA_AI_API_KEY` naming mismatch fixed** |
| 81 | + (`7891b15`). `docker-compose.yml` and |
| 82 | + `services/content-ingest/src/jina.ts` have always read |
| 83 | + `JINA_API_KEY`; `.env.example` (and every local `.env` copied from |
| 84 | + it) defined `JINA_AI_API_KEY`. Degraded gracefully to Jina's |
| 85 | + free/no-auth tier, so nothing looked broken, but `content-ingest` |
| 86 | + — including the deployed humain-vc instance — has been running on |
| 87 | + free-tier rate limits since day one. `scripts/jina-fetch-urls.mjs` |
| 88 | + already had a comment documenting this exact mismatch as a |
| 89 | + deliberate workaround; standardized on `JINA_API_KEY` everywhere |
| 90 | + instead of routing around it. **User set `JINA_API_KEY` on Railway's |
| 91 | + `content-ingest` service directly**; it auto-redeployed to `SUCCESS`. |
| 92 | +4. **R2/JuiceFS credentials documented in `.env.example`** (`fe6a203`). |
| 93 | + Discovered `R2_ACCESS_KEY_ID`, `R2_SECRET_ACCESS_KEY`, |
| 94 | + `CLOUDFLARE_R2_API_ENDPOINT`, `CLOUDFLARE_ACCOUNT_ID`, and |
| 95 | + `JUICEFS_LOSSLESS_TOKEN` already sitting in local `.env`, undocumented |
| 96 | + in `.env.example` — leftover from |
| 97 | + [[../../explorations/JuiceFS-Pinned-Path-Off-Local-Substrate]] (a |
| 98 | + 2026-06-18 exploration that ended **deferred**, never adopted into |
| 99 | + any live flow). That exploration's own text says to remove the |
| 100 | + `.env` copy and keep `~/.secrets` as the only canonical location — |
| 101 | + that cleanup never happened. User's call: keep the redundancy |
| 102 | + deliberately (a solo dev's `~/.secrets` convention isn't discoverable |
| 103 | + to a future contributor working inside `augment-it/`, and agent |
| 104 | + harnesses like Claude Code only get automatic filesystem access |
| 105 | + within a project's own working tree, not a laptop-wide dotfile |
| 106 | + outside it). Added a comment block in both `.env` and `.env.example` |
| 107 | + documenting the redundancy and flagging the rotation-drift risk |
| 108 | + explicitly (same failure shape as item 3 above — two copies of a |
| 109 | + secret silently diverge when one gets rotated and the other doesn't). |
| 110 | +5. **Two stale task-list entries corrected.** Tasks #9 ("Domains: shell + |
| 111 | + workspace-service on `*.didi.sh`...") and #10 ("Deploy all services |
| 112 | + and verify end-to-end") were still showing `pending`/`in_progress` |
| 113 | + despite being done and user-confirmed working — marked `completed`. |
| 114 | + |
| 115 | +## Build-order plan status |
| 116 | + |
| 117 | +| Step | What | Status | |
| 118 | +|---|---|---| |
| 119 | +| 1–8 | Real email, org/membership seeding, membership gate, actor attribution, thesis vocabulary, curator liveness, sign-in wall, didi chat v0 | ✅ DONE (2026-07-06 – 2026-07-08) | |
| 120 | +| 9 | Deploy augment-it, single-tenant | ✅ DONE 2026-07-09 (Railway, not DigitalOcean — see plan for the pivot rationale) | |
| 121 | +| 10 | DNS + cookie day | ✅ DONE 2026-07-09 (`*.didi.sh` custom domains on Railway) | |
| 122 | +| 11 | Corpus sync / backup | ⚑ **NEEDS REVISITING** — see "Open decisions" below | |
| 123 | +| 12 | Dress rehearsal (acceptance run) | ⏳ Not started — needs Aneil + Linea, two laptops/browsers, real sign-ins | |
| 124 | + |
| 125 | +Full detail, gotchas, and the DO→Railway pivot story: [[../Build-Order-Humain-VC-Unlock-Flow]]. |
| 126 | + |
| 127 | +## Open decisions (need a human call before proceeding) |
| 128 | + |
| 129 | +1. **Step 11 bucket scoping.** Corpus backup mechanism needs to be |
| 130 | + rclone (or similar S3-capable tool) syncing the Railway Volume to |
| 131 | + R2 — Syncthing was considered and ruled out for the backup leg |
| 132 | + specifically (it only syncs between two Syncthing daemons, no |
| 133 | + native S3/R2 support). Still open: does the backup destination reuse |
| 134 | + the existing tree-wide `lossless-core` bucket (simplest, but |
| 135 | + re-opens the per-client-isolation question that |
| 136 | + [[../../explorations/JuiceFS-Pinned-Path-Off-Local-Substrate]] |
| 137 | + deliberately left unresolved), or does augment-it get its own |
| 138 | + dedicated bucket + scoped API token? This blocks writing the actual |
| 139 | + rclone job. |
| 140 | +2. **Syncthing for laptop↔hosted live sync** (separate from the R2 |
| 141 | + backup leg) — still an open "do we actually want this" question. |
| 142 | + Current single-writer policy is "sync deliberately, never |
| 143 | + concurrently," which fits a one-shot pull/push better than a |
| 144 | + continuous P2P daemon. Running Syncthing on Railway would also |
| 145 | + require it as a second process inside the `content-ingest` |
| 146 | + container itself, since Railway volumes are single-service-only — |
| 147 | + a separate Syncthing service can't mount the same volume. |
| 148 | +3. **DigitalOcean droplet (167.172.42.247) decommission** — unused |
| 149 | + since the Railway migration, not yet decided. |
| 150 | +4. **Changelog entry for this session** — not yet written, not yet |
| 151 | + explicitly requested by the user. |
| 152 | + |
| 153 | +## What to start with next session |
| 154 | + |
| 155 | +Ranked by what unblocks the most: |
| 156 | + |
| 157 | +1. **Resolve the Step 11 bucket-scoping decision** (open decision #1 |
| 158 | + above) — a 2-minute conversation that unblocks writing the actual |
| 159 | + rclone-to-R2 job. |
| 160 | +2. **Step 12 dress rehearsal** — needs Aneil's membership seeded on prod |
| 161 | + (this may already be done; verify), then two people signed in |
| 162 | + simultaneously on `augment.didi.sh` running real email sign-in, |
| 163 | + thesis creation, cross-screen liveness check, didi triage, and an |
| 164 | + attribution spot-check (frontmatter shows who did what). This is the |
| 165 | + actual acceptance test for the whole build-order arc. |
| 166 | +3. **Write the missing changelog entry** for this session's four fixes |
| 167 | + — quick, and keeps the splash's "Recent" section (which reads |
| 168 | + straight from `changelog/`) from going stale. |
| 169 | + |
| 170 | +## Branch + git state |
| 171 | + |
| 172 | +- **Current branch:** `rebuild/turbo-rsbuild` |
| 173 | +- **Last pushed commit:** `fe6a203` (`doc(.env.example): document |
| 174 | + R2/JuiceFS creds + why they're duplicated on purpose`) |
| 175 | +- **Working tree:** clean except submodule pointer bumps in |
| 176 | + `clients/humain-vc` and `clients/reach-edu` — leave those alone, the |
| 177 | + user tidies parent gitlinks deliberately. |
| 178 | +- **Origin:** in sync through `fe6a203`. |
| 179 | + |
| 180 | +## Critical files / where things live |
| 181 | + |
| 182 | +- **Active plan:** `context-v/plans/Build-Order-Humain-VC-Unlock-Flow.md` |
| 183 | + — Steps 1–10 marked done in place, Step 11 flagged `NEEDS REVISITING`. |
| 184 | +- **Deployment reference:** `DEPLOYMENT.md` (repo root) — live URLs, |
| 185 | + 8-service Railway table, env vars, redeploy commands, gotchas, "Known |
| 186 | + gaps" (now just corpus sync — the Jina entry was removed this |
| 187 | + session). |
| 188 | +- **JuiceFS/R2 background:** |
| 189 | + `context-v/explorations/JuiceFS-Pinned-Path-Off-Local-Substrate.md` — |
| 190 | + read before touching Step 11's bucket question. |
| 191 | +- **Splash deploy workflow:** `.github/workflows/pages.yml`. |
| 192 | +- **Feature cards (splash marketing):** |
| 193 | + `splash/src/content/feature-highlights/*.md` — hand-curated, not |
| 194 | + auto-generated from anything. |
| 195 | +- **Credential files:** `.env` (local, untracked, has the R2/JuiceFS |
| 196 | + redundancy comment now) and `.env.example` (tracked, same comment, |
| 197 | + placeholder values). |
| 198 | + |
| 199 | +## Verify state on next session |
| 200 | + |
| 201 | +```bash |
| 202 | +git fetch --all --prune |
| 203 | +git status # should be clean except clients/* submodule pointers |
| 204 | +git log --oneline -5 # HEAD should be fe6a203 |
| 205 | +railway status --json | head -5 # confirm still linked to the right Railway project |
| 206 | +curl -s https://augment.didi.sh/ # confirm the humain-vc instance is still live |
| 207 | +gh run list --workflow=pages.yml --limit 1 # confirm splash deploy is still green |
| 208 | +``` |
| 209 | + |
| 210 | +## Related |
| 211 | + |
| 212 | +- [[../Build-Order-Humain-VC-Unlock-Flow]] — the active plan this |
| 213 | + pickup reports against |
| 214 | +- [[../../explorations/JuiceFS-Pinned-Path-Off-Local-Substrate]] — |
| 215 | + background for Step 11's bucket-scoping decision |
| 216 | +- `DEPLOYMENT.md` (repo root) — the deployment reference this session |
| 217 | + kept current |
| 218 | +- [[../../reminders/Pickup-2026-06-03]] — the last pickup doc before |
| 219 | + this one (over a month prior; predates the entire Railway deploy arc) |
0 commit comments