Skip to main content

Demo packs

crewship seed populates a fresh workspace with three packs. A pack is one real use case, run by one crew, that reads a real public source and can be run again tomorrow — and checked. Each follows the same shape, which is the shape most repeated work has once you look at it: a cheap probe that costs nothing, an expensive judgement only when there is something to judge, a human decision before anything irreversible. Every pack ships four things to its crew: the scripts (under /crew/shared/scripts, with their own unit tests that go test runs), the routines, a Page the report routine writes, and the issues that walk a person through it. One crew per pack, deliberately: /crew/shared is a per-crew volume, so a hand-off through files only works inside a crew.

Nightly CI watch

Scheduled workflows fail differently from PR checks: nothing blocks, nobody is paged, and the red sits there. Worse is the failure that is not red at all — a cron dropped in a YAML refactor, a workflow GitHub disabled after sixty idle days. No green appears and no red either. ci-probe is agentless. It reads the Actions API, classifies every scheduled workflow as RED, STALE (no run for 48 hours), RUNNING or OK, and returns wake. Scheduled as the wake gate of ci-nightly-triage, it costs nothing on a green night:
When it wakes, Morgan downloads the failed jobs’ logs, classifies each red run as REGRESSION / FLAKY / INFRA / UNCLEAR by the ci-triage and known-flaky skills, finds the concrete cause of each stale workflow, and posts one inbox notification whose last line is COUNTS: regressions=… flaky=… infra=… stale=… unclear=…. Those numbers must agree with the probe’s, and crewship seed verify checks that they do. The Page ci-watch shows the probe’s verdict per failure class and the coverage line; the full triage with links is the notification.

Docs drift

docs_drift.py compares the YAML/JSON tags of Go structs with the identifiers in backticks and YAML blocks of a documentation page, in both directions: a phantom is a key the page describes and the code does not have; a gap is a field the code has and the page never mentions. The pairs are curated in config/docs_map.json on the quality crew’s shared volume — keep them narrow, a whole package against one page is unreadable. Candidates are not findings. Jordan reads the real files from the checkout under /crew/shared/work, confirms or rejects every candidate with a path and a line, admits any truncation, and ends with COUNTS: candidates=… confirmed=… rejected=… truncated=…. verify reconciles the candidate count with the scan and, given a local checkout, checks that every cited path exists at the scanned commit. Casey’s issue carries the human boundary: a confirmed finding that is a security claim — an allowlist or validation the docs promise and the code does not enforce — is escalated as a DECISION, not worded alone.

Site replica

Say “copy seznam.cz” to Alex, or start the lead issue. Alex delegates inside the crew, one hand-off at a time: Taylor inventories the live page into content-map.json (its sections array is the contract), Sam extracts the structured data.json with a small tested script, Robin builds a self-contained index.html — no scripts, no external assets, one h1, a viewport tag — and Jamie runs the acceptance check and reports PASS, FAIL or NOT BUILT. Alex writes GO or NO-GO. replica_check.py is the mechanical bar: it exists, it is a document, it is self-contained, it covers at least 70 % of the inventoried sections. Whether it looks right stays with the person who opens the file from the crew’s files. site-replica-audit publishes the verdict to the Page and the inbox; until somebody builds the replica it reports NOT BUILT, and verify counts that as skipped rather than green.

Credentials

The packs that read GitHub need a token. Put a read-only one (actions:read and repository read; the packs never write) in .env.local next to the Anthropic key:
The seed then creates the workspace GH_TOKEN every agent already knew, and additionally a crew-scoped CLI_TOKEN on each pack crew, bound to that crew’s GH_TOKEN slot. Crew scope is not decoration: a routine’s {{ secrets.CLI_TOKEN }} is resolved by type, preferring the author crew’s own credential and otherwise the newest — and the demo vault’s inert GitHub accounts are created after the real one. Without the crew scope the newest inert token would win and every GitHub call would fail quietly. Without SEED_GITHUB_TOKEN the packs are still seeded — crew, scripts, routines, Page, issues — and reported as skipped by verify, never as green. A re-seed over an existing workspace refreshes the stored value from the variable, so a rotated token lands on the next crewship seed rather than leaving last month’s token in place under the same name.

Verifying

See crewship seed for the row-by-row contract. In short: scripts byte-identical to the seed, the probe against an independent read of the source, the agent’s counts against the probe, no secret in the report, the notification in the inbox, the panels written by that run.

Where the packs came from

The three packs are the demo-sized versions of the templates kept in the private crewship-manifests catalogue, whose market research found the same two shapes of pain in every segment it looked at: clocks nobody watches (a deadline running from a moment nobody recorded) and meters nobody watches (something stops, and silence looks like calm). A wake gate is not an optimisation there; it is the condition under which anybody lets an agent run at all.