Havre: a page and a link for each of the harbor's own, built static from cast/ #86

Closed
opened 2026-10-18 01:13:45 +00:00 by teahubxyz · 6 comments
Owner

Base: gh-pages

Havre's cast (ventures/havre/cast/*.havre.json on gh-pages: Maren, Odile, Taskmaster) is the first thing a visitor can meet, and the plan on the page promises "a page and a link for every character". Give the harbor's own theirs first, as static pages built by tools/build.sh, so there is something to share before anything is hosted. Read ventures/havre/OWNER.md first: it is the owner's charter, and decisions 3 and 4 in it bound this card (static only, nothing adult).

Work from ventures/havre on gh-pages, on a branch off gh-pages, with the PR against gh-pages.

  • tools/pages.mjs, run by tools/build.sh right after tools/cast.mjs: writes c/<id>/index.html for each card in cast/, from one template, in the site's own style (style.css as it is: Times for words, Courier for machinery, black on white, 1px rules; no new stylesheet, no new dependency). Each page carries the name, the tagline, the greeting, the first three examples laid out as a short conversation, the lineage line if there is one (creditLine in card.js), a MEET <NAME> IN HAVRE link to /?meet=<id>, and links to the card file (/cast/<id>.havre.json) and to the same character as a Character Card V3 at /c/<id>/<id>.card.json, written by the same tool with toCharacterCardV3. Title, description, canonical and Open Graph tags on every page; og:image is the site's own shots/og.png for now. Nothing on these pages runs a script.
  • c/index.html: the three as a list, titled THE HARBOR'S OWN, with the same mast and footer as the pages.
  • app.js: on load, ?meet=<id> meets that one of the harbor's own through the existing meet() path and drops the parameter from the address (history.replaceState), so a shared link lands in their chat. An unknown id does nothing. A visitor who has met them already lands in the same chat, not a second copy.
  • Tests: a unit test (tests/pages.test.mjs) that a page exists for every card and carries its name and greeting, links the right files, and that every written V3 card comes back through fromCharacterCard as the same card; and a step in tests/smoke.mjs that opens /?meet=odile and sees Odile's chat with the address cleaned, then opens /c/maren/ with no console error.
  • llms.txt and skill.md mention the pages in a line each; sitemap.txt at the site root lists /, /c/ and each page.
  • tools/build.sh must keep c/ (it removes files from earlier versions; c/ is this version's).

DONE: PR open against gh-pages; sh tools/build.sh green (the unit suite and the browser smoke test); the pages render from a local serve; CI green.

Base: gh-pages Havre's cast (`ventures/havre/cast/*.havre.json` on `gh-pages`: Maren, Odile, Taskmaster) is the first thing a visitor can meet, and the plan on the page promises "a page and a link for every character". Give the harbor's own theirs first, as static pages built by `tools/build.sh`, so there is something to share before anything is hosted. Read `ventures/havre/OWNER.md` first: it is the owner's charter, and decisions 3 and 4 in it bound this card (static only, nothing adult). Work from `ventures/havre` on `gh-pages`, on a branch off `gh-pages`, with the PR against `gh-pages`. - `tools/pages.mjs`, run by `tools/build.sh` right after `tools/cast.mjs`: writes `c/<id>/index.html` for each card in `cast/`, from one template, in the site's own style (`style.css` as it is: Times for words, Courier for machinery, black on white, 1px rules; no new stylesheet, no new dependency). Each page carries the name, the tagline, the greeting, the first three examples laid out as a short conversation, the lineage line if there is one (`creditLine` in `card.js`), a `MEET <NAME> IN HAVRE` link to `/?meet=<id>`, and links to the card file (`/cast/<id>.havre.json`) and to the same character as a Character Card V3 at `/c/<id>/<id>.card.json`, written by the same tool with `toCharacterCardV3`. Title, description, canonical and Open Graph tags on every page; `og:image` is the site's own `shots/og.png` for now. Nothing on these pages runs a script. - `c/index.html`: the three as a list, titled THE HARBOR'S OWN, with the same mast and footer as the pages. - `app.js`: on load, `?meet=<id>` meets that one of the harbor's own through the existing `meet()` path and drops the parameter from the address (`history.replaceState`), so a shared link lands in their chat. An unknown id does nothing. A visitor who has met them already lands in the same chat, not a second copy. - Tests: a unit test (`tests/pages.test.mjs`) that a page exists for every card and carries its name and greeting, links the right files, and that every written V3 card comes back through `fromCharacterCard` as the same card; and a step in `tests/smoke.mjs` that opens `/?meet=odile` and sees Odile's chat with the address cleaned, then opens `/c/maren/` with no console error. - `llms.txt` and `skill.md` mention the pages in a line each; `sitemap.txt` at the site root lists `/`, `/c/` and each page. - `tools/build.sh` must keep `c/` (it removes files from earlier versions; `c/` is this version's). DONE: PR open against gh-pages; `sh tools/build.sh` green (the unit suite and the browser smoke test); the pages render from a local serve; CI green.
teahubxyz added the enhancementready labels 2026-10-18 01:13:45 +00:00

⏱️ Time: today's spend is $5.01 of the $5.00 cap; carrying on tomorrow. Nothing is lost; this card resumes once there is budget.

⏱️ Time: today's spend is $5.01 of the $5.00 cap; carrying on tomorrow. Nothing is lost; this card resumes once there is budget. <!-- time {"beat":"capped"} -->
teahubxyz added queued and removed ready labels 2026-10-18 04:01:21 +00:00
Author
Owner

Set back to queued for a few hours, not dropped. The worker currently branches from main whatever the card says, and ventures/havre lives only on gh-pages, so a run today would burn its turns on the wrong branch (that is what happened to #87, #95 and #109). I added Base: gh-pages to the body; the engine change that honors it is in flight, and this card goes back to ready as soon as it lands.

Set back to `queued` for a few hours, not dropped. The worker currently branches from `main` whatever the card says, and `ventures/havre` lives only on `gh-pages`, so a run today would burn its turns on the wrong branch (that is what happened to #87, #95 and #109). I added `Base: gh-pages` to the body; the engine change that honors it is in flight, and this card goes back to `ready` as soon as it lands.
teahubxyz added ready and removed queued labels 2026-10-18 05:02:52 +00:00

⏱️ Time: Claude Sonnet (Anthropic) is working on this now, on branch time/card-86-gh-pages.

⏱️ Time: Claude Sonnet (Anthropic) is working on this now, on branch `time/card-86-gh-pages`. <!-- time {"beat":"dispatched","launched":true,"worker":"anthropic"} -->

⏱️ Time: sonnet opened PR #128 (31 steps, claude-sonnet-5-5). Review and landing follow on the next beat.

⏱️ Time: `sonnet` opened PR #128 (31 steps, claude-sonnet-5-5). Review and landing follow on the next beat. <!-- time {"beat":"dispatched","worker":"anthropic","pr":128,"steps":31,"seat":"sonnet","model":"claude-sonnet-5-5"} -->

⏱️ Time: PR #128 is up for this card. haiku reviewed it on the PR.

⏱️ Time: PR #128 is up for this card. `haiku` reviewed it on the PR. <!-- time {"beat":"pr","pr":128,"launched":false,"seat":"haiku","as":"seat","review":"venice","seats":["haiku"]} -->
time closed this issue 2026-10-18 07:07:38 +00:00

⏱️ Time: approved and green, merged PR #128. Card done.

⏱️ Time: approved and green, merged PR #128. Card done. <!-- time {"beat":"merged","pr":128} -->
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: teahubxyz/time#86