From 823c2bb58c34094de48a30a0e2129738fa2e53ad Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 13:20:49 -0400 Subject: [PATCH 01/18] =?UTF-8?q?docs(plan):=20add=20phase=206=20=E2=80=94?= =?UTF-8?q?=20release=20and=20site=20reinvention?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- development/v2/PLAN.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/development/v2/PLAN.md b/development/v2/PLAN.md index 63daedd..88c3807 100644 --- a/development/v2/PLAN.md +++ b/development/v2/PLAN.md @@ -100,6 +100,15 @@ Estado: frontmatter en cada ticket (`status`, `commit`, `verified`). `/plan` es --- +## Fase 6 — Lanzamiento *(agregada 2026-07-02, post-merge PR #20)* + +- [ ] Release `v0.2.0` — tag pusheado; GoReleaser publica binarios; verificar install scripts contra el release. +- [ ] **Reinvención del sitio** (rama `feat/web-v2`): la página actual es un índice de documentos sin personalidad. Nueva dirección: identidad "Daedalus el arquitecto" (estética blueprint/plano técnico, logo meandro griego, linework), landing digerible con: hero + terminal animada, la línea de pensamiento (el problema → los 5 principios como paradigma), diagrama del ciclo de vida, walkthroughs concretos (proyecto nuevo / bug fix), prueba del benchmark, instalación por OS, página del Método. Docs completas quedan secundarias (nav "Manual"). Nada de dump de documentación. +- [ ] Golden tickets desde centavo → `kit/eval/` (cierre pendiente de Fase 4). +- [ ] Publicar el Método como página propia del sitio (el estándar adoptable). + +**Done cuando:** release descargable funcionando + sitio nuevo desplegado en Pages + un tercero puede entender e instalar el tool en <5 minutos sin leer el repo. + ## Reglas de trabajo entre sesiones 1. Al terminar cada sesión de construcción se actualizan los checkboxes de este archivo y se anota en `## Bitácora` qué se decidió y qué sigue. From 4c07f2523a7757aed5c5853a590ba8da8f8b6714 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 13:45:20 -0400 Subject: [PATCH 02/18] feat(web): blueprint design system, bundled fonts, and labyrinth mark Recast the site's identity as a technical drawing: deep blueprint navy canvas with a fine cyan grid, cyan linework as the primary accent, and a single amber reserved for calls to action. Redefine the color tokens accordingly and drop the warm forge palette. - Bundle Space Grotesk and IBM Plex Mono via @fontsource (no CDN links) - Redraw the mark as a single-stroke squared meander (labyrinth) in cyan with an amber core; regenerate the favicon to match - Replace the icon set with bespoke linework icons in one stroke family - Update the document title and meta to the new positioning --- web/index.html | 19 ++- web/package-lock.json | 20 ++++ web/package.json | 2 + web/public/favicon.svg | 17 +-- web/src/components/Icon.tsx | 78 +++++++----- web/src/components/Labyrinth.tsx | 73 ++++-------- web/src/index.css | 196 ++++++++++++++++--------------- web/src/main.tsx | 6 + 8 files changed, 222 insertions(+), 189 deletions(-) diff --git a/web/index.html b/web/index.html index c38686c..6c47b7b 100644 --- a/web/index.html +++ b/web/index.html @@ -4,24 +4,21 @@ - - Daedalus — Build your AI scaffolding once. Compile it anywhere. + + Daedalus — An AI engineering method, installed in one command - - - - + ` comment showing how teams that + prefer auto-commit-per-ticket can replace that one line. If your `CLAUDE.md` + diverges from the current template, update just *reports* it for manual review. +- **Your own new files.** Update only rewrites files that ship in the kit; it + walks the embedded kit, not your directory. A **new** skill, agent, or template + you add under `.claude/` is left untouched — add project-specific agents + alongside the kit's. +- **`settings.json` keys other than `hooks`.** Update refreshes only the `hooks` + block; every other key you add is preserved exactly. +- **The whole backlog.** `development/{briefs,specs,decisions,lessons,epics}/`, + plus `development/STATE.md`, are never written by update. + +### Reverted — do not edit in place + +- **Kit-shipped files** under `.claude/skills/`, `.claude/agents/`, + `.claude/templates/`, `.claude/hooks/`, and `development/METHOD.md`. Editing one + of these in place works until the next `update`, which restores the kit's + version (after copying yours to `.claude/.backup-/`). Treat these + as upstream-owned. + +The method's stance: teams customize by **overriding in their repo, not by forking +the method** — and the durable override surfaces are the constitution and your own +added files. If a change to a kit skill or agent proves generally useful, it +belongs upstream in the kit rather than as a local edit that every `update` fights. + +## What `update` never touches — at a glance + +| Path | Update behavior | +| --- | --- | +| `CLAUDE.md` | Never written; divergence reported for manual review. | +| `development/STATE.md` | Never written. | +| `development/{briefs,specs,decisions,lessons,epics}/` | Never written. | +| `.claude/settings.json` (non-`hooks` keys) | Preserved; only `hooks` refreshed. | +| Files you added that aren't in the kit | Never written or deleted. | +| `.claude/{skills,agents,templates,hooks}`, `development/METHOD.md` (kit files) | Rewritten to match the kit; old copy backed up. | + +## See also + +- [`daedalus update`](commands/update.md) — the mechanics of managed vs preserved files. +- [`daedalus init`](commands/init.md) — where these variables are first set. +- [`kit/README.md`](../kit/README.md) — the kit layout and rules for editing it upstream. diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..3b76e69 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,206 @@ +# Quickstart + +This is the whole loop end to end: an empty repo, `daedalus init`, then your first +`/brief` and `/ticket` inside Claude Code. Follow it top to bottom and you will +have shipped one small change the Daedalus way. + +**Prerequisites:** the `daedalus` binary on your `PATH` (see +[Installation](getting-started/installation.md)) and +[Claude Code](https://claude.com/claude-code) installed. Daedalus does not run +agents — it installs the kit Claude Code runs. + +## 1. Start from an empty repo + +```console +$ mkdir printquote && cd printquote +$ git init +Initialized empty Git repository in /home/you/printquote/.git/ +``` + +## 2. Install the kit — flags mode + +If you know your project's basics, pass them as flags and init runs without +prompting: + +```console +$ daedalus init --yes \ + --name printquote \ + --description "Instant 3D-print quotes from an uploaded STL" \ + --stack "Go 1.23 + Charm" \ + --build-cmd "make build" \ + --test-cmd "make test" \ + --lint-cmd "make lint" \ + --chat-language English \ + --attribution none +Initialized Daedalus kit 0.1.0-dev into /home/you/printquote + 31 written, 0 skipped (already present) +``` + +### …or interactive mode + +Prefer to be prompted? Run `daedalus init` with the required values missing and a +form collects them — same result, no flags to remember: + +```console +$ daedalus init +``` + +``` + Project name printquote + One-line description Instant 3D-print quotes from an uploaded STL + Stack Go 1.23 + Charm + + Build command make build + Test command make test + Lint command make lint + + Chat language English + Commit attribution ▸ Keep the tooling's default attribution + No AI attribution (only the git account owner) +``` + +Either way, init writes the constitution, the method, the empty backlog, and the +`.claude/` kit. Confirm it landed cleanly: + +```console +$ daedalus doctor --plain +Daedalus doctor /home/you/printquote + +ok marker present and parses (kit 0.1.0-dev) +ok kit version matches binary (0.1.0-dev) +ok CLAUDE.md present +… +ok ticket specs valid (no ticket specs found) + +Summary: 11 ok, 0 warning(s), 0 failure(s) +``` + +And the map is empty, as expected for a fresh repo: + +```console +$ daedalus status --plain +EPIC PROGRESS STATE + (no epics yet) + +WAITING ON YOU + none +… +NEXT STEP (from STATE.md) + none set +``` + +## 3. Open Claude Code in the repo + +```console +$ claude +``` + +Claude Code loads `CLAUDE.md` (your constitution) and discovers the skills under +`.claude/skills/` — `/brief`, `/spec`, `/council`, `/plan`, `/ticket`, `/epic`, +`/status`. From here the workflow lives inside Claude Code; the shell commands +(`status`, `doctor`, `update`) are for checking in from outside. + +## 4. Your first `/brief` + +`/brief` turns a raw idea or bug report into a structured artifact. It picks a +mode automatically: **quick** for a small, self-evident task (which emits a +ready-to-run ticket straight into `epic-00-inbox`), or **full** for a feature +(which produces a brief you then take through `/spec` and `/plan`). For a first +run, a small task keeps the loop short: + +```text +you › /brief the STL upload endpoint should reject files over 50 MB with a clear + error instead of a 500 + +brief › This is a small, well-scoped change to existing behavior, so I'll run + quick mode. A few questions before I write the ticket: + + 1. How do you reproduce the current 500 today? + 2. What exact response should an over-limit upload get — status code and + message? + 3. Is 50 MB a hard limit, or should it be configurable? + 4. Anything out of scope — e.g. should other endpoints get the same guard? + +you › 1. POST a 60 MB .stl to /upload. 2. 413 with {"error":"file exceeds 50 MB + limit"}. 3. Hard-coded 50 MB is fine for now. 4. Only /upload. + +brief › Ticket ready at + development/epics/epic-00-inbox/tickets/ticket-00-01-upload-size-limit/ + + type: bug · risk: low + AC-1: a test reproducing the 500 on a >50 MB upload exists and passes + AC-2: an over-limit upload returns 413 with {"error":"file exceeds 50 MB limit"} + Out of scope: other endpoints; making the limit configurable + + Next: /ticket ticket-00-01-upload-size-limit to execute it. +``` + +Notice what happened: `/brief` interviewed you until the ambiguity was gone, +wrote a **bug** ticket (so acceptance criterion 1 is automatically "a test +reproducing the defect exists and passes"), and stopped — it does not start the +next phase on its own. The ticket is now real files on disk: + +```console +$ daedalus status --plain +EPIC PROGRESS STATE +epic-00-inbox 0/1 ● active + ○ 00-01 upload-size-limit pending + +WAITING ON YOU + none +… +``` + +## 5. Your first `/ticket` + +`/ticket` runs the execution loop: implement → verify with fresh eyes → fix until +approved → close. You are the orchestrator; the actual code is written by a +sub-agent in a fresh context, and (for a bug) the reproduction test comes first. + +```text +you › /ticket ticket-00-01-upload-size-limit + +ticket › Loaded the ticket (type: bug, risk: low). Marked it in-progress. + + Because risk is low, this runs the lite implementer with hooks + a + mandatory self-check — no separate verifier pass. + + → implementer: wrote a failing test posting a 60 MB payload (reproduces + the 500), then added the size guard returning 413. Tests + lint green. + + Done. Acceptance criteria: + AC-1 ✓ TestUpload_RejectsOverLimit reproduces the old 500, now passes + AC-2 ✓ over-limit upload returns 413 {"error":"file exceeds 50 MB limit"} + + verified: self · one commit staged referencing the ticket. Review the + diff, then confirm and I'll commit. +``` + +The constitution's commit rule holds the workflow at the gate: Claude Code waits +for your explicit go-ahead before `git commit`, and — because you chose +`--attribution none` at init — the commit carries no AI trailers. Confirm, and +the ticket closes: its frontmatter flips to `status: done` with the commit hash, +and `STATE.md` records the completion. + +```console +$ daedalus status --plain +EPIC PROGRESS STATE +epic-00-inbox 1/1 ✔ done + +NEXT STEP (from STATE.md) + none set +``` + +## Where to go from here + +You just ran the method's short path — a bug that skipped spec and planning. The +full path is for features and new products: + +- **[Workflow](workflow.md)** — `/brief` (full mode) → `/spec` → `/council` → + `/plan` → `/ticket` / `/epic`, day to day inside Claude Code. +- **[Backlog](backlog.md)** — the `development/` layout, the ticket folder + contract, and every frontmatter field. +- **[Commands](commands/init.md)** — the full reference for `init`, `status`, + `doctor`, and `update`. +- **[Customization](customization.md)** — template variables, per-repo overrides, + and the attribution option. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..829d3ef --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,199 @@ +# Troubleshooting + +Most problems surface through [`daedalus doctor`](commands/doctor.md), so start +there. This chapter maps its exit codes and the common failures to fixes, and +explains how re-`init` and `update` behave when you need to recover. + +## Doctor exit codes + +`doctor` maps the **worst** check to its exit code — the contract for scripting it +in CI: + +| Exit | Meaning | What to do | +| --- | --- | --- | +| `0` | Every check passed. | Nothing. | +| `1` | Worst result is a **warning** (kit-version drift). | Run `daedalus update`. | +| `2` | At least one check **failed**, or a usage error. | Read the failing line(s) below. | + +A gate for CI: + +```sh +daedalus doctor --plain || echo "kit needs attention (exit $?)" +``` + +## "No kit installed" / not a Daedalus kit + +**Symptom.** Commands complain the directory isn't a kit: + +```console +$ daedalus status +status: no Daedalus kit found in /home/you/project + expected development/STATE.md — run `daedalus init` first. + +$ daedalus update +update: /home/you/project is not a Daedalus kit (no .claude/daedalus-kit.yaml). Run `daedalus init` first. +``` + +`doctor` shows the same story as a cascade of `fail` lines starting with `marker +present and parses (.claude/daedalus-kit.yaml not found …)`. + +**Cause.** You're in the wrong directory, or the repo was never initialized. + +**Fix.** `cd` to the repo root (the one that should hold `.claude/` and +`development/`), or run `daedalus init` to create the kit. Both `status` (exit 1) +and `update`/`doctor` (exit 2) are telling you the marker is missing — the marker, +`.claude/daedalus-kit.yaml`, is what makes a directory a Daedalus kit. + +## Corrupted or invalid ticket frontmatter + +**Symptom.** `doctor`'s last check fails: + +```console +fail ticket specs valid (7 checked, 1 issue(s): ticket-02-03-pricing: invalid status "in progress") +``` + +Other forms of the same failure: + +- `ticket-…: no YAML frontmatter` — the spec lost its leading `---` block. +- `ticket-…: missing status` (or `type`/`risk`/`gate`) — a required enum field is + blank or absent. +- `ticket-…: invalid gate "manual pending"` — a value outside the allowed set + (usually a space where a hyphen belongs). + +**Cause.** A hand-edit that broke the frontmatter — a typo in an enum, a deleted +`---`, or a value with the wrong separator. + +**Fix.** Open the named `spec.md` and restore valid frontmatter. The allowed +values (see [Backlog](backlog.md)): + +```yaml +--- +id: ticket-02-03-pricing +status: pending # pending | in-progress | done | blocked +type: feature # feature | bug | chore +risk: normal # low | normal | high +commit: null +verified: null +gate: none # none | manual-pending | manual-approved +--- +``` + +Re-run `daedalus doctor` — the check should turn green. `status` tolerates +malformed frontmatter more quietly (it defaults an unreadable `status` to +`pending`), so `doctor` is the tool that actually pins the problem down. + +## `STATE.md` out of sync with the backlog + +**Symptom.** `status` prints an `INCONSISTENCIES` section: + +``` +INCONSISTENCIES + ⚠ ticket-02-02-parsing is done but has no commit + ⚠ STATE's active ticket ticket-02-05-quote-ui is already done +``` + +**Cause.** A manual edit moved a ticket's state without updating `STATE.md`, or +vice versa. + +**Fix.** These are **reported, never auto-fixed**. Reconcile by hand — set the +missing `commit`, or point `STATE.md`'s active ticket at the real next one — or +ask Claude Code's `/status` to correct `STATE.md` after you confirm. Nothing here +blocks work; it's a nudge to keep disk truthful. + +## Version drift + +**Symptom.** `doctor` warns (exit 1): + +```console +warn kit version matches binary (kit 0.0.9-dev, binary 0.1.0-dev — run `daedalus update`) +``` + +**Cause.** You upgraded the `daedalus` binary; the installed kit still records the +older version. + +**Fix.** Preview, then apply: + +```console +$ daedalus update --dry-run +Dry run for Daedalus kit 0.0.9-dev -> 0.1.0-dev in /home/you/printquote + 0 file(s) would change, 28 unchanged + +$ daedalus update +Updated Daedalus kit 0.0.9-dev -> 0.1.0-dev in /home/you/printquote + 0 updated, 28 unchanged +``` + +`0 would change` here means the kit content is identical between versions — only +the marker stamp is refreshed. When files do differ, update lists each `would +update:` / `updated:` and writes a backup (next section). + +## Missing kit files after an update, or wanting to undo one + +**Symptom.** After `update`, a managed file you had edited looks different, or a +file is reported `updated:`. + +**Cause.** `update` overwrites managed kit files whose content differs from the kit +— including your local edits to them. It backs up what it replaced first: + +```console +$ daedalus update +Updated Daedalus kit 0.0.9-dev -> 0.1.0-dev in /home/you/printquote + 1 updated, 27 unchanged + updated: .claude/skills/status/SKILL.md + backup: .claude/.backup-0.0.9-dev/ +``` + +**Fix / recover.** Your previous copy is under +`.claude/.backup-/`, at the same relative path: + +``` +.claude/.backup-0.0.9-dev/.claude/skills/status/SKILL.md +.claude/.backup-0.0.9-dev/.claude/daedalus-kit.yaml +``` + +Copy it back if you need it. To keep such changes permanently, move them to a +durable surface — the constitution or your own added files — as described in +[Customization](customization.md); editing kit-shipped files loses to every +`update`. + +## How re-`init` behaves (it won't clobber anything) + +Re-running `init` on an existing kit is safe by construction: it only **adds** +missing files and **skips** everything present. + +```console +$ daedalus init --yes --name printquote --description "…" --stack "…" \ + --build-cmd "make build" --test-cmd "make test" --lint-cmd "make lint" +Initialized Daedalus kit 0.1.0-dev into /home/you/printquote + 0 written, 31 skipped (already present) + skipped: .claude/agents/analyst.md + … +``` + +Use this to **restore accidentally deleted kit files** — delete a file, re-run +`init`, and only that file is rewritten. Note the flip side: because `init` never +overwrites, it will **not** refresh a stale file to a newer version. Deliberately +delete the stale file first and re-`init`, or (for a version bump across the whole +kit) use `update`. + +## The constitution changed upstream + +**Symptom.** `update` appends: + +``` + constitution template changed upstream — review manually +``` + +**Cause.** Your `CLAUDE.md` no longer matches what the current template renders — +either you edited it (expected) or the template changed in a newer kit. + +**Fix.** Update never rewrites `CLAUDE.md`. Diff yours against +`kit/constitution/CLAUDE.md.tmpl` (with your marker's variables applied) and merge +by hand whatever upstream change you want. Your edits are safe; this is only a +heads-up. + +## See also + +- [`daedalus doctor`](commands/doctor.md) — the full check list and outputs. +- [Backlog](backlog.md) — valid frontmatter values. +- [Customization](customization.md) — durable overrides vs. what update reverts. diff --git a/docs/workflow.md b/docs/workflow.md new file mode 100644 index 0000000..7f72f37 --- /dev/null +++ b/docs/workflow.md @@ -0,0 +1,224 @@ +# Workflow + +This is the day-to-day loop inside Claude Code. The `daedalus` binary set up the +repo; from here you drive everything with the seven skills the kit installed. The +lifecycle is: + +``` +IDEA ──► SPEC ──► DESIGN ──► PLAN ──► EXECUTE (per ticket) ──► SHIP +/brief /spec /council /plan /ticket · /epic +``` + +**The method scales down.** A bug or a small task skips SPEC, DESIGN, and PLAN +entirely: `/brief` in quick mode emits a ticket straight into `epic-00-inbox`, and +`/ticket` runs it. The full chain below is for new features and products — never a +tax on small work. `/status` works at any point. + +Two rules hold throughout: **artifacts on disk are the only source of truth** +(any session can be killed and the next resumes from `development/`), and **humans +decide, agents inform** — design choices, manual gates, and commits are yours. + +## `/brief` — idea to structured artifact + +`/brief` interviews you until the ambiguity is gone, then writes an artifact. It +never proposes solutions during the interview and never invents facts you didn't +state. It picks a mode: + +- **Full mode** (new feature/product) → a brief at `development/briefs/NN-.md`. + It asks in batches of ≤4 questions covering intent, desired behavior, + constraints, non-goals, and success — and explicitly probes for non-goals, + which users rarely volunteer. Anything still open after ~3 rounds lands in the + brief's *Open questions* rather than a guess. +- **Quick mode** (bug / small task) → a ready-to-run ticket in `epic-00-inbox`. + For a bug, acceptance criterion 1 is always "a test reproducing the defect + exists and passes." + +```text +you › /brief we need per-customer volume discounts on quotes + +brief › New feature — running full mode. First batch: + 1. Who sets the discount tiers — an admin UI, config, or hard-coded? + 2. Is a discount a % off, a fixed amount, or a price-per-unit override? + 3. Does it stack with any existing promo, or is it exclusive? + 4. What is explicitly NOT in scope for this first cut? + … + Brief ready at development/briefs/01-volume-discounts.md. + Next: /spec to derive verifiable requirements. +``` + +`/brief` stops there — it does not start `/spec` for you. + +## `/spec` — brief to verifiable requirements + +`/spec` turns an approved brief into a spec where **every requirement carries at +least one verifiable acceptance criterion** — a runnable command, an observable +behavior, or a measurable value. Drafting is delegated to the analyst agent; you +only see its summary and any new open questions, which you resolve before the spec +is final. + +The spec is the contract for everything downstream: what is not in the spec does +not get built. `/spec` also surfaces a *Decisions needed* list — every +expensive-to-reverse choice (architecture, stack, public API shape, data model) +it refuses to silently resolve inside a requirement. + +```text +you › /spec + +spec › Drafted from 01-volume-discounts.md via the analyst. 6 requirements, all + with acceptance criteria. Two open questions came back — answer these and + I'll finalize: + · Do discounts apply before or after tax? + · Is the tier table per-customer or shared across a customer group? + +you › Before tax. Per-customer for now. + +spec › Spec written to development/specs/01-volume-discounts.md. + Decisions needed: [pricing-engine placement]. + Run /council on that before /plan — planning against an unmade decision + produces rework. +``` + +## `/council` — de-bias an expensive decision + +A council runs 3–5 perspectives **in parallel and blind to each other** +(pragmatist, maintainer, adversary, user — plus a domain lens when warranted), +then a synthesizer merges them into an ADR-style `DECISION-NN.md` that +**preserves the disagreements**. You decide; the council only prepares the +decision. + +### When NOT to use it + +This is the part people get wrong. A council is the method's only sanctioned +parallel burst, and it is expensive. Use it **only** for choices that would cost +days of rework or a migration to reverse: architecture, stack selection, +API/schema design, data models, security posture. + +Do **not** convene a council for: + +- **implementation-level questions** — that quality is owned by the `/ticket` + verifier loop, not a council; +- naming, internal structure, or any choice a single ticket can absorb and change + later; +- a question already constrained by a recorded `DECISION` — surface the conflict + instead. + +A typical project runs a council **2–3 times in its whole lifetime**. If you are +reaching for it weekly, ceremony has leaked into routine work. `/council` itself +gates the invocation and will tell you when it is overkill: + +```text +you › /council should the discount field be a float or a decimal type? + +council › That's an implementation choice a single ticket can make and revise — + a council is overkill here. Use a decimal for money to avoid float + rounding, note it in the ticket, and move on. Save councils for + decisions that are expensive to reverse. +``` + +## `/plan` — spec to executable backlog + +`/plan` decomposes an approved spec into epics and tickets via the planner agent. +It is **strictly additive** over the existing backlog — it never renumbers or +rewrites existing epics, and never touches `done` tickets. If the spec still lists +unresolved *Decisions needed* (or references a `DECISION` still `proposed`), +`/plan` stops and points you at `/council` first. + +You review the plan as markdown on disk and can edit, reorder, or delete tickets +by hand before executing. + +```text +you › /plan + +plan › Planned via the planner. 1 epic, 5 tickets: + + epic-03-volume-discounts — apply per-customer volume discounts to quotes + 03-01 discount-tier-model R-1, R-2 + 03-02 discount-engine R-3 + 03-03 apply-to-quote R-3, R-4 + 03-04 admin-tier-editor R-5 · manual gate + 03-05 e2e-discount-flow R-6 · manual gate + + Dependency order is 01→05. Manual gates on 04 and 05. + This is markdown under development/epics/ — edit or reorder before running. + Next: /epic epic-03-volume-discounts (or /ticket ticket-03-01-…). +``` + +## `/ticket` — the execution loop + +`/ticket` runs one ticket end to end. You are the **orchestrator**: you sequence +the loop and keep state true, but you do not write product code — the implementer +does, in a fresh context. The loop is verification-proportional to the ticket's +`risk` frontmatter: + +1. **Load** the ticket; refuse to start if it is already `done`, gated, or has + malformed frontmatter. Mark it `in-progress`. +2. **Research** (only if it touches unfamiliar code or an external library). +3. **Implement** — `implementer-lite` for `risk: low`, the full `implementer` + otherwise. For a **bug**, a failing reproduction test comes first: no + reproduction, no fix. +4. **Verify** — `risk: low` skips the verifier (hooks + the implementer's + self-check suffice, recorded as `verified: self`); `normal`/`high` spawn a + **verifier** in fresh context that tries to *refute* completion. +5. **Fix loop** — on REJECTED, findings go to `observations.md` and the + implementer fixes from that document only. If the same finding fails twice, it + escalates to you rather than looping. +6. **Close** — commit (after your confirmation), flip frontmatter to `done` with + the commit hash, update `STATE.md`, record any durable lesson. +7. **Gate** — if the ticket has a `manual-validation.md`, set `gate: + manual-pending` and **stop** until you approve. + +```text +you › /ticket ticket-03-02-discount-engine + +ticket › Loaded (feature, risk: normal). in-progress. + → implementer: added the discount engine per R-3. Tests + lint green. + → verifier (fresh context): executed validation.md, all checks pass. + APPROVED in 1 round. + AC-1 ✓ … AC-2 ✓ … AC-3 ✓ + Commit staged referencing the ticket — confirm to commit. +``` + +## `/epic` — run an epic in order + +`/epic` runs an epic's tickets in `MM` order through the same `/ticket` loop, +re-reading `STATE.md` between tickets as its re-anchor. It skips `done` tickets +silently (so it is resumable), and **hard-stops** at a manual gate, a blocked +ticket, an escalation, or your interrupt. One ticket = one commit; documentation +batches into a single documenter pass at epic close. + +```text +you › /epic epic-03-volume-discounts + +epic › 5 tickets, 03-01 pending first, manual gates on 03-04 and 03-05. + 03-01 discount-tier-model … done (a1b2c3d) + 03-02 discount-engine … done (d4e5f6a) + 03-03 apply-to-quote … done (b7c8d9e) + 03-04 admin-tier-editor … done — MANUAL GATE reached. + + Stopping. Test the tier editor per its manual-validation.md, then say + "approved" and I'll continue with 03-05. +``` + +## `/status` — the map, any time + +`/status` renders the work map from disk — epics, ticket states, pending gates, +blockers, next step — with zero sub-agents and zero writes. It is the same view +as the shell's [`daedalus status`](commands/status.md); use whichever is at hand. +Its one permitted write is correcting a drifted `STATE.md`, and only after you +confirm. + +## The shape of a session + +- **Start every session by reading `STATE.md`** (the constitution makes Claude + Code do this) — disk is the truth, not conversation memory. +- **Manual gates block the whole chain** until you approve — no exceptions. +- **Commits wait for your explicit confirmation** and never carry AI attribution + when you chose `--attribution none`. +- A degraded, over-long session is worse than a clean handoff: `STATE.md` + + frontmatter make resuming in a fresh session lossless. + +## See also + +- [Backlog](backlog.md) — the artifacts these skills read and write. +- [`kit/METHOD.md`](../kit/METHOD.md) — the full normative standard behind every + skill above. From fb1369be9408ffb1e2eb2b9e33a3297be453b72d Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:00:56 -0400 Subject: [PATCH 09/18] docs: rewrite manual index and wire new chapters into web nav --- docs/README.md | 78 ++++++++++++++++++++++++++++++++------------- web/src/lib/docs.ts | 19 +++++++++++ 2 files changed, 74 insertions(+), 23 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3d97981..800ea1c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,61 @@ # Daedalus manual -Welcome to the Daedalus user manual. Daedalus is an **opinionated Claude Code -harness**: the kit (a constitution, skills, agents, hooks, and templates) is the -product, and the `daedalus` CLI/TUI installs, checks, and updates it. Claude Code -is the runtime; Daedalus does not execute agents itself. - -New here? Start with the **[Overview](getting-started/overview.md)** — the Daedalus -Method and the four commands (`init`, `status`, `doctor`, `update`) on one page — -then [install the binary](getting-started/installation.md). - -## Start here (v2) - -1. **[Overview](getting-started/overview.md)** — the method and the four commands. -2. **[Install](getting-started/installation.md)** — run the one-line install - script (or download a prebuilt binary / build from source); verify with - `daedalus --version`. -3. **[`kit/METHOD.md`](../kit/METHOD.md)** — the full normative standard: lifecycle, - roles and models, the document contract, councils, manual gates, token economy. -4. **[`kit/README.md`](../kit/README.md)** — the kit layout and the rules for - editing it. +Daedalus is an opinionated harness for [Claude Code](https://claude.com/claude-code). +The **kit** — a constitution, skills, agents, hooks, and templates — is the +product; the `daedalus` CLI/TUI installs it into your repo, checks it, and keeps +it up to date. Claude Code is the runtime; Daedalus does not execute agents +itself. + +New here? Read the [Quickstart](quickstart.md) — an empty repo to a shipped change +in one pass — then keep the [command reference](commands/init.md) and +[Workflow](workflow.md) nearby. + +## Getting started + +- **[Overview](getting-started/overview.md)** — the Daedalus Method and the four + commands on one page. +- **[Installation](getting-started/installation.md)** — install the binary; verify + with `daedalus --version`. +- **[Quickstart](quickstart.md)** — empty repo → `init` → first `/brief` → first + `/ticket`, as one continuous story. + +## Commands + +The `daedalus` binary has four commands. Each takes an optional target directory +(default: the current directory). + +- **[`init`](commands/init.md)** — instantiate the kit into a repo (interactive or + flags mode; non-destructive). +- **[`status`](commands/status.md)** — read-only work map from the backlog and + `STATE.md`. +- **[`doctor`](commands/doctor.md)** — read-only integrity check, with meaningful + exit codes. +- **[`update`](commands/update.md)** — bring an installed kit up to the binary's + version, backing up what it replaces. + +## Using Daedalus + +- **[Workflow](workflow.md)** — day-to-day inside Claude Code: `/brief`, `/spec`, + `/council` (and when *not* to use it), `/plan`, `/ticket`, `/epic`, `/status`. +- **[Backlog](backlog.md)** — the `development/` layout, the ticket folder + contract, and every frontmatter field. +- **[Customization](customization.md)** — template variables, the attribution + option, per-repo overrides, and what `update` never touches. +- **[Troubleshooting](troubleshooting.md)** — doctor exit codes, common failures, + and how re-`init`/`update` recover. + +## The method itself + +- **[`kit/METHOD.md`](../kit/METHOD.md)** — the full normative standard: lifecycle, + roles and models, the document contract, councils, manual gates, token economy. +- **[`kit/README.md`](../kit/README.md)** — the kit layout and the rules for + editing it. ## Contributing -For working **on** Daedalus itself (building, tooling, CI) — separate from using -the product. +For working **on** Daedalus itself — separate from using the product: -- [Development environment](contributing/development-environment.md) — Make targets, Docker, and Compose. -- [Continuous integration](contributing/continuous-integration.md) — what CI runs and how to reproduce it. +- [Development environment](contributing/development-environment.md) — Make targets, + Docker, and Compose. +- [Continuous integration](contributing/continuous-integration.md) — what CI runs + and how to reproduce it. diff --git a/web/src/lib/docs.ts b/web/src/lib/docs.ts index b9b121f..03f9bb2 100644 --- a/web/src/lib/docs.ts +++ b/web/src/lib/docs.ts @@ -52,6 +52,25 @@ export const nav: NavSection[] = [ items: [ { label: "Overview", slug: "getting-started/overview" }, { label: "Installation", slug: "getting-started/installation" }, + { label: "Quickstart", slug: "quickstart" }, + ], + }, + { + title: "Commands", + items: [ + { label: "init", slug: "commands/init" }, + { label: "status", slug: "commands/status" }, + { label: "doctor", slug: "commands/doctor" }, + { label: "update", slug: "commands/update" }, + ], + }, + { + title: "Using Daedalus", + items: [ + { label: "Workflow", slug: "workflow" }, + { label: "Backlog", slug: "backlog" }, + { label: "Customization", slug: "customization" }, + { label: "Troubleshooting", slug: "troubleshooting" }, ], }, { From cca53b9ec99de2b51b6b4566bb92b63bd373dad9 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:11:03 -0400 Subject: [PATCH 10/18] docs(contributing): document the Pages SPA workflow, not the removed mkdocs one --- docs/contributing/continuous-integration.md | 34 ++++++++++++--------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/docs/contributing/continuous-integration.md b/docs/contributing/continuous-integration.md index b3677f8..c7a7c15 100644 --- a/docs/contributing/continuous-integration.md +++ b/docs/contributing/continuous-integration.md @@ -3,8 +3,8 @@ [← Back to the manual index](../README.md) Daedalus uses three GitHub Actions workflows: one keeps the repository building, -tested, and clean on every change; one publishes the documentation site; and one -publishes release binaries. +tested, and clean on every change; one publishes the site (marketing pages plus +this manual); and one publishes release binaries. ## The CI workflow @@ -32,26 +32,32 @@ make lint If all three succeed locally, the CI gate will pass. See [Development environment](development-environment.md) for the Make targets. -## The docs workflow +## The site workflow -The docs workflow (`.github/workflows/docs.yml`) builds the documentation site -from `docs/` with **MkDocs Material** and deploys it to **GitHub Pages**. It runs -when `docs/` or `mkdocs.yml` changes on `main`. The build is run with -`mkdocs build --strict`, so a broken internal link or an orphaned page **fails** -the build — keeping the published manual consistent. +The site workflow (`.github/workflows/pages.yml`) builds the marketing + +documentation single-page app in `web/` and deploys it to **GitHub Pages**. The +SPA renders the manual authored in `docs/`, so it runs when either `web/` or +`docs/` changes on `main` (and on manual dispatch). The job installs with +`npm ci` and builds with `npm run build`, setting `VITE_BASE: /Daedalus/` so the +emitted asset paths match the project Pages URL +(`https://.github.io/Daedalus/`). The built `web/dist` is uploaded and +deployed by a second job. This supersedes the old MkDocs pipeline. ### Preview the site locally -Install the pinned tooling (`docs-requirements.txt` pins -`mkdocs-material==9.5.39`) and serve or build the site: +Build the SPA exactly as CI does — from the `web/` directory, with `VITE_BASE` +set so links and assets resolve under the Pages path: ```sh -pip install -r docs-requirements.txt -mkdocs serve # live preview at http://127.0.0.1:8000 -mkdocs build --strict # exactly what CI runs +cd web +npm ci +npm run dev # live preview at http://localhost:5173 +VITE_BASE=/Daedalus/ npm run build # exactly what CI runs; output in web/dist ``` -If `mkdocs build --strict` succeeds locally, the docs gate will pass. +On Windows PowerShell, set the env var separately (a leading-slash value gets +mangled if inlined): `$env:VITE_BASE="/Daedalus/"; npm run build`. If +`npm run build` succeeds, the site gate will pass. ## The release workflow From 0860d02b07c51e555989670abb1878103c18910a Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:11:03 -0400 Subject: [PATCH 11/18] docs: link kit METHOD/README to GitHub so they resolve in the deployed manual --- docs/README.md | 4 ++-- docs/customization.md | 2 +- docs/getting-started/installation.md | 2 +- docs/getting-started/overview.md | 6 +++--- docs/workflow.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 800ea1c..129bf58 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,9 +46,9 @@ The `daedalus` binary has four commands. Each takes an optional target directory ## The method itself -- **[`kit/METHOD.md`](../kit/METHOD.md)** — the full normative standard: lifecycle, +- **[`kit/METHOD.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/METHOD.md)** — the full normative standard: lifecycle, roles and models, the document contract, councils, manual gates, token economy. -- **[`kit/README.md`](../kit/README.md)** — the kit layout and the rules for +- **[`kit/README.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/README.md)** — the kit layout and the rules for editing it. ## Contributing diff --git a/docs/customization.md b/docs/customization.md index d57c721..f8e0917 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -107,4 +107,4 @@ belongs upstream in the kit rather than as a local edit that every `update` figh - [`daedalus update`](commands/update.md) — the mechanics of managed vs preserved files. - [`daedalus init`](commands/init.md) — where these variables are first set. -- [`kit/README.md`](../kit/README.md) — the kit layout and rules for editing it upstream. +- [`kit/README.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/README.md) — the kit layout and rules for editing it upstream. diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 64a44ef..90d8aec 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -133,4 +133,4 @@ installed correctly. (`init`, `status`, `doctor`, `update`) on one page. - Run `daedalus init` in a repo, then drive the workflow inside Claude Code with the `/brief`, `/spec`, `/plan`, `/ticket`, and `/epic` skills. -- Read [`kit/METHOD.md`](../../kit/METHOD.md) for the full normative standard. +- Read [`kit/METHOD.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/METHOD.md) for the full normative standard. diff --git a/docs/getting-started/overview.md b/docs/getting-started/overview.md index bb6984e..120ec20 100644 --- a/docs/getting-started/overview.md +++ b/docs/getting-started/overview.md @@ -37,7 +37,7 @@ IDEA ──► SPEC ──► DESIGN ──► PLAN ──► EXECUTE (per ticke The full normative standard — roles and models, the document contract, councils, manual gates, and the token economy — lives in -[`kit/METHOD.md`](../../kit/METHOD.md). +[`kit/METHOD.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/METHOD.md). ## The four commands @@ -75,5 +75,5 @@ progress from your shell with `daedalus status`. ## Where to go next - [Installation](installation.md) — install the `daedalus` binary. -- [`kit/METHOD.md`](../../kit/METHOD.md) — the full method. -- [`kit/README.md`](../../kit/README.md) — the kit layout and how to edit it. +- [`kit/METHOD.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/METHOD.md) — the full method. +- [`kit/README.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/README.md) — the kit layout and how to edit it. diff --git a/docs/workflow.md b/docs/workflow.md index 7f72f37..feb5891 100644 --- a/docs/workflow.md +++ b/docs/workflow.md @@ -220,5 +220,5 @@ confirm. ## See also - [Backlog](backlog.md) — the artifacts these skills read and write. -- [`kit/METHOD.md`](../kit/METHOD.md) — the full normative standard behind every +- [`kit/METHOD.md`](https://github.com/Codigo-de-Altura/Daedalus/blob/main/kit/METHOD.md) — the full normative standard behind every skill above. From 2ae38ca947aa8d9456c69a032cac3144c567d53e Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:18:18 -0400 Subject: [PATCH 12/18] docs(kit): complete illustrative frontmatter block in METHOD.md --- kit/METHOD.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kit/METHOD.md b/kit/METHOD.md index 3a2865f..3630c50 100644 --- a/kit/METHOD.md +++ b/kit/METHOD.md @@ -79,10 +79,12 @@ Workspace layout installed by the kit: ```yaml --- +id: ticket-NN-MM- status: pending | in-progress | done | blocked type: feature | bug | chore +risk: low | normal | high commit: -verified: +verified: gate: none | manual-pending | manual-approved --- ``` From 49d5e8627c18eab88648b3aa0b01ec3e6cbd8812 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:35:59 -0400 Subject: [PATCH 13/18] feat(web): retheme core to Ink & Terracotta light palette Swap the site's central theme tokens from the dark blueprint (navy/cyan/ amber) to the light inventor's-notebook palette: technical-paper background, dark-ink text, and a single terracotta accent. Re-derive the ink ramp for light mode (paper surfaces to dark-ink text, all body text AA on paper), turn the cyan linework and amber CTA scales into AA-safe terracotta, and add a dedicated dark 'term' family for the pasted terminal snippets. Retune the grid to faint ink lines, glows to a warm wash, hairlines/shadows/selection/ focus to ink-on-paper, and the favicon/theme-color/color-scheme to light. --- web/index.html | 6 +-- web/public/favicon.svg | 6 +-- web/src/index.css | 118 +++++++++++++++++++++++------------------ 3 files changed, 73 insertions(+), 57 deletions(-) diff --git a/web/index.html b/web/index.html index 6c47b7b..fd51a4d 100644 --- a/web/index.html +++ b/web/index.html @@ -1,10 +1,10 @@ - + - - + + Daedalus — An AI engineering method, installed in one command - + - + diff --git a/web/src/index.css b/web/src/index.css index 2541672..eb00d6a 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1,38 +1,53 @@ @import "tailwindcss"; /* ------------------------------------------------------------------ * - * Daedalus — the architect. - * A blueprint. Deep technical-drawing navy, fine grid, cyan linework, - * paper-white text, and a single warm amber reserved for actions. + * Daedalus — the inventor's notebook. + * A page of technical paper: warm ink-on-paper linework, a single warm + * terracotta accent, and dark terminal snippets pasted onto the sheet. + * Light mode. Ink & Terracotta. * ------------------------------------------------------------------ */ @theme { - /* Blueprint navy → paper-white (backgrounds to text) */ - --color-ink-950: #081724; - --color-ink-900: #0b1d2e; - --color-ink-850: #0d2137; - --color-ink-800: #122a41; - --color-ink-700: #1b3a54; - --color-ink-600: #274b66; - --color-ink-500: #3c6178; - --color-ink-400: #6e8aa0; - --color-ink-300: #9db4c6; - --color-ink-200: #c6d5e0; - --color-ink-100: #e4eaf0; - --color-ink-50: #f2f0e9; - - /* Cyan linework — the drawing's ink. Primary accent. */ - --color-line-200: #d4f0f9; - --color-line-300: #b9e4f2; - --color-line-400: #8fd6ec; - --color-line-500: #63bdd9; - --color-line-600: #3e9dbc; - --color-line-700: #2c7c98; - - /* Amber — the one warm accent, reserved for calls to action. */ - --color-amber-300: #f2be6b; - --color-amber-400: #edb050; - --color-amber-500: #e8a33d; - --color-amber-600: #ce8a28; + /* Paper → ink. Low numbers are luminous paper surfaces; high numbers + are the dark ink used for text (headings darkest). */ + --color-ink-950: #ffffff; /* brightest surface · accent-fill label */ + --color-ink-900: #fefcf7; /* raised cards */ + --color-ink-850: #f5f2ea; /* PAGE — technical paper */ + --color-ink-800: #ebe5d5; /* recessed chips / tiles / tabs */ + --color-ink-700: #dcd4c0; /* borders · hover surfaces */ + --color-ink-600: #7c8894; /* faint decorative numerals · rules */ + --color-ink-500: #566472; /* dim ink text (AA) */ + --color-ink-400: #4c5c6a; /* muted ink text (AA) */ + --color-ink-300: #33424f; /* body text (AA) */ + --color-ink-200: #26323e; /* strong body / nav (AA) */ + --color-ink-100: #1e2833; /* strong text — dark ink (AA) */ + --color-ink-50: #16202b; /* headings — deepest ink (AA) */ + + /* Terracotta — the single warm accent. Darker steps are AA-safe for + small text on paper; the base is for large headings, rules, icons. */ + --color-line-200: #d98a63; /* light terracotta (on-ink washes) */ + --color-line-300: #8e3e27; /* deep — hover / strong accent text (AA) */ + --color-line-400: #a84b30; /* darkened — small accent text & links (AA) */ + --color-line-500: #c05b3c; /* base terracotta — rules, dots, large icons */ + --color-line-600: #9a4227; /* deeper */ + --color-line-700: #7c3620; /* deepest */ + + /* Terracotta reserved for filled calls to action (AA label on paper). */ + --color-amber-300: #e6a976; /* warm highlight (on dark code) */ + --color-amber-400: #944027; /* CTA hover (darker) · warm accent text */ + --color-amber-500: #a84b30; /* CTA fill · terracotta core */ + --color-amber-600: #7c3620; /* deep */ + + /* Dark terminal snippets — deep ink surfaces with paper-toned text. + The signature dark-on-light move. */ + --color-term-bg: #16202b; /* terminal / code-block surface */ + --color-term-raise: #1e2833; /* window chrome bar */ + --color-term-line: #33424f; /* hairline on ink */ + --color-term-fg: #cfc8b8; /* default transcript text (AA) */ + --color-term-bright: #f2ecde; /* commands / bright text (AA) */ + --color-term-dim: #8b94a0; /* narration / titles (AA) */ + --color-term-accent: #e0916f; /* prompt · slash — terracotta on ink (AA) */ + --color-term-gate: #e6a976; /* manual gate lines (AA) */ + --color-term-ok: #93bd9c; /* verified / approved lines (AA) */ /* Typography */ --font-display: "Space Grotesk Variable", "Space Grotesk", ui-sans-serif, @@ -48,10 +63,10 @@ /* Motion */ --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); - /* Elevation */ - --shadow-cta: 0 10px 34px -12px rgba(232, 163, 61, 0.5); - --shadow-card: 0 1px 0 0 rgba(212, 240, 249, 0.04) inset, - 0 24px 60px -30px rgba(0, 0, 0, 0.75); + /* Elevation — soft ink shadows on paper. */ + --shadow-cta: 0 10px 30px -12px rgba(168, 75, 48, 0.45); + --shadow-card: 0 1px 0 0 rgba(255, 255, 255, 0.6) inset, + 0 20px 45px -28px rgba(30, 40, 51, 0.3); } /* ------------------------------------------------------------------ * @@ -59,7 +74,7 @@ * ------------------------------------------------------------------ */ @layer base { :root { - color-scheme: dark; + color-scheme: light; scroll-behavior: smooth; } @@ -85,7 +100,7 @@ body { margin: 0; background-color: var(--color-ink-850); - color: var(--color-ink-200); + color: var(--color-ink-300); font-family: var(--font-sans); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; @@ -102,7 +117,7 @@ } ::selection { - background-color: rgba(143, 214, 236, 0.28); + background-color: rgba(192, 91, 60, 0.22); color: var(--color-ink-50); } @@ -119,19 +134,19 @@ } /* ------------------------------------------------------------------ * - * Blueprint motifs — technical grid, glow, drawn linework + * Notebook motifs — faint ink grid on paper, warm light, drawn linework * ------------------------------------------------------------------ */ @layer utilities { - /* Fine technical grid — a minor rule over a major rule, like drafting paper. */ + /* Faint drafting grid — a minor rule over a major rule, ink on paper. */ .bg-grid { background-image: linear-gradient( to right, - rgba(143, 214, 236, 0.05) 1px, + rgba(43, 58, 74, 0.045) 1px, transparent 1px ), - linear-gradient(to bottom, rgba(143, 214, 236, 0.05) 1px, transparent 1px), - linear-gradient(to right, rgba(143, 214, 236, 0.09) 1px, transparent 1px), - linear-gradient(to bottom, rgba(143, 214, 236, 0.09) 1px, transparent 1px); + linear-gradient(to bottom, rgba(43, 58, 74, 0.045) 1px, transparent 1px), + linear-gradient(to right, rgba(43, 58, 74, 0.08) 1px, transparent 1px), + linear-gradient(to bottom, rgba(43, 58, 74, 0.08) 1px, transparent 1px); background-size: 28px 28px, 28px 28px, @@ -152,12 +167,12 @@ ); } - /* Cool light spilling off the top of the sheet. */ + /* A warm wash of light spilling off the top of the sheet. */ .glow-line { background: radial-gradient( 60% 50% at 50% 0%, - rgba(143, 214, 236, 0.14) 0%, - rgba(99, 189, 217, 0.05) 38%, + rgba(192, 91, 60, 0.08) 0%, + rgba(192, 91, 60, 0.03) 40%, transparent 72% ); } @@ -174,18 +189,19 @@ } .ring-hairline { - box-shadow: inset 0 0 0 1px rgba(143, 214, 236, 0.14); + box-shadow: inset 0 0 0 1px rgba(43, 58, 74, 0.12); } .ring-hairline-strong { - box-shadow: inset 0 0 0 1px rgba(143, 214, 236, 0.28); + box-shadow: inset 0 0 0 1px rgba(43, 58, 74, 0.22); } + /* Elevated paper card — a lifted sheet with a soft ink shadow. */ .surface { background: linear-gradient( 180deg, - rgba(27, 58, 84, 0.42), - rgba(11, 29, 46, 0.55) + rgba(255, 255, 255, 0.7), + rgba(254, 252, 247, 0.4) ); box-shadow: var(--shadow-card); } @@ -211,7 +227,7 @@ height: 1.05em; margin-left: 1px; translate: 0 0.16em; - background: var(--color-line-400); + background: var(--color-term-accent); animation: blink 1.05s steps(1) infinite; } } From 959c9790611e21d2feeea76a8451b54c6108b804 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:36:07 -0400 Subject: [PATCH 14/18] feat(web): keep terminal snippets dark on the light page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point the window chrome, command pill, and transcript renderers at the new dark 'term' tokens so the animated hero terminal, walkthrough transcripts, and copyable commands stay as deep-ink blocks with paper-toned text — the signature dark-on-light contrast — instead of inverting to light. --- web/src/components/CodeWindow.tsx | 40 ++++++++++++++-------------- web/src/components/TypedTerminal.tsx | 16 +++++------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/web/src/components/CodeWindow.tsx b/web/src/components/CodeWindow.tsx index 7fdbd32..a055dc4 100644 --- a/web/src/components/CodeWindow.tsx +++ b/web/src/components/CodeWindow.tsx @@ -18,17 +18,17 @@ export function Window({ return (
-
- - - +
+ + + {title && ( - {title} + {title} )}
{children} @@ -55,8 +55,8 @@ export function CopyButton({ }); }} className={cn( - "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-ink-400 transition-colors hover:bg-ink-700/60 hover:text-line-300", - copied && "text-line-300", + "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-term-dim transition-colors hover:bg-term-line/50 hover:text-term-accent", + copied && "text-term-accent", className, )} > @@ -76,12 +76,12 @@ export function CommandPill({ return (
- $ - + $ + {command} @@ -94,39 +94,39 @@ export function renderLine(line: TLine, key: number) { switch (line.k) { case "cmd": return ( - - $ + + $ {line.t} ); case "slash": return ( - - > + + > {line.t} ); case "ok": return ( - + {line.t} ); case "gate": return ( - + {line.t} ); case "dim": return ( - + {line.t} ); default: return ( - + {line.t} ); diff --git a/web/src/components/TypedTerminal.tsx b/web/src/components/TypedTerminal.tsx index 82a5058..d62ab03 100644 --- a/web/src/components/TypedTerminal.tsx +++ b/web/src/components/TypedTerminal.tsx @@ -4,17 +4,17 @@ import { cn } from "../lib/cn"; import type { TLine } from "../lib/site"; const KIND_CLASS: Record = { - cmd: "text-ink-50", - slash: "font-medium text-line-300", - out: "text-ink-300", - ok: "text-emerald-300/90", - gate: "text-amber-300", - dim: "text-ink-500", + cmd: "text-term-bright", + slash: "font-medium text-term-accent", + out: "text-term-fg", + ok: "text-term-ok", + gate: "text-term-gate", + dim: "text-term-dim", }; function Prefix({ k }: { k: TLine["k"] }) { - if (k === "cmd") return $ ; - if (k === "slash") return > ; + if (k === "cmd") return $ ; + if (k === "slash") return > ; return null; } From f221512847f2a4235874a1db9a211df70d792aae Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:36:15 -0400 Subject: [PATCH 15/18] feat(web): retheme manual prose and syntax for light mode Ink-on-paper prose with terracotta links, a paper-toned surface for inline code, and dark pasted code blocks whose highlight.js theme is retuned to light syntax on ink (paper-toned identifiers, warm keywords, sage strings). --- web/src/docs.css | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/web/src/docs.css b/web/src/docs.css index d1d686a..8fe23b5 100644 --- a/web/src/docs.css +++ b/web/src/docs.css @@ -1,8 +1,9 @@ /* Prose + syntax styles for the documentation, scoped to .markdown. - Hand-tuned to the Daedalus blueprint palette (navy ink + cyan linework). */ + Hand-tuned to the Daedalus notebook palette (ink on paper, terracotta + accent, dark pasted code blocks). */ .markdown { - color: var(--color-ink-200); + color: var(--color-ink-300); font-size: 1rem; line-height: 1.75; max-width: 46rem; @@ -104,24 +105,24 @@ margin: 0.4rem 0; } -/* Inline code */ +/* Inline code — a paper-toned chip with dark ink text. */ .markdown :not(pre) > code { font-family: var(--font-mono); font-size: 0.85em; - background: color-mix(in oklab, var(--color-ink-800) 80%, transparent); - color: var(--color-line-300); + background: #ebe6d9; + color: var(--color-ink-100); padding: 0.15em 0.4em; border-radius: 6px; - box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--color-ink-200) 8%, transparent); + box-shadow: inset 0 0 0 1px rgba(43, 58, 74, 0.12); } -/* Code blocks */ +/* Code blocks — dark terminal snippets pasted onto the sheet. */ .markdown pre { margin: 1.5rem 0; padding: 1.1rem 1.25rem; border-radius: 14px; - background: var(--color-ink-900); - box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--color-ink-200) 8%, transparent); + background: var(--color-term-bg); + box-shadow: inset 0 0 0 1px var(--color-term-line); overflow-x: auto; font-size: 0.85rem; line-height: 1.7; @@ -130,7 +131,7 @@ font-family: var(--font-mono); background: none; padding: 0; - color: var(--color-ink-200); + color: var(--color-term-fg); } .markdown blockquote { @@ -182,10 +183,10 @@ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--color-ink-200) 8%, transparent); } -/* ---- highlight.js theme (blueprint) ---- */ +/* ---- highlight.js theme (notebook — light syntax on dark code) ---- */ .markdown .hljs-comment, .markdown .hljs-quote { - color: var(--color-ink-500); + color: var(--color-term-dim); font-style: italic; } .markdown .hljs-keyword, @@ -198,26 +199,26 @@ .markdown .hljs-string, .markdown .hljs-attr, .markdown .hljs-meta-string { - color: #8fd6a0; + color: var(--color-term-ok); } .markdown .hljs-number, .markdown .hljs-symbol, .markdown .hljs-bullet { - color: var(--color-line-400); + color: var(--color-term-accent); } .markdown .hljs-title, .markdown .hljs-name, .markdown .hljs-type, .markdown .hljs-built_in { - color: var(--color-line-300); + color: var(--color-term-bright); } .markdown .hljs-attribute, .markdown .hljs-variable, .markdown .hljs-template-variable { - color: #9fc8f0; + color: #cbb28f; } .markdown .hljs-meta { - color: var(--color-ink-400); + color: var(--color-term-dim); } .markdown .hljs-emphasis { font-style: italic; From 472404c849b9e5fef074715d4801b6867bf1cca6 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:36:23 -0400 Subject: [PATCH 16/18] feat(web): ink logo strokes and accurate legend keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Draw the labyrinth mark in ink so its terracotta core reads (the wrappers no longer tint the stroke), and key the walkthrough legend's verified/gate dots to their transcript colors — a paper-readable sage for green, terracotta for the gate — so the two dots stay distinct and match the copy. --- web/src/components/Footer.tsx | 2 +- web/src/components/Labyrinth.tsx | 2 +- web/src/components/Navbar.tsx | 2 +- web/src/components/landing/Hero.tsx | 2 +- web/src/components/landing/Walkthroughs.tsx | 2 +- web/src/pages/NotFound.tsx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/src/components/Footer.tsx b/web/src/components/Footer.tsx index 681a359..d2461c5 100644 --- a/web/src/components/Footer.tsx +++ b/web/src/components/Footer.tsx @@ -15,7 +15,7 @@ export default function Footer() { className="flex items-center gap-2.5" aria-label="Daedalus home" > - + diff --git a/web/src/components/Labyrinth.tsx b/web/src/components/Labyrinth.tsx index a72dec9..62f68e8 100644 --- a/web/src/components/Labyrinth.tsx +++ b/web/src/components/Labyrinth.tsx @@ -4,7 +4,7 @@ import { cn } from "../lib/cn"; /** * The Daedalus mark — a single-stroke squared meander (a Greek-key labyrinth) * that spirals to a single point at its centre: the human decision at the heart - * of the maze. One continuous line, drawn in cyan like ink on a blueprint. + * of the maze. One continuous line, drawn in ink on paper with a terracotta core. * Reads as a glyph at 16px and as a signature at hero size. */ const SPIRAL = "M6 6 H34 V34 H12 V12 H28 V28 H18 V18 H24"; diff --git a/web/src/components/Navbar.tsx b/web/src/components/Navbar.tsx index 71867b7..587269a 100644 --- a/web/src/components/Navbar.tsx +++ b/web/src/components/Navbar.tsx @@ -14,7 +14,7 @@ function Wordmark() { className="group flex items-center gap-2.5" aria-label="Daedalus home" > - + diff --git a/web/src/components/landing/Hero.tsx b/web/src/components/landing/Hero.tsx index bf5f2f0..1c96cdb 100644 --- a/web/src/components/landing/Hero.tsx +++ b/web/src/components/landing/Hero.tsx @@ -32,7 +32,7 @@ export default function Hero() {
- + diff --git a/web/src/components/landing/Walkthroughs.tsx b/web/src/components/landing/Walkthroughs.tsx index 34f25a8..17177a6 100644 --- a/web/src/components/landing/Walkthroughs.tsx +++ b/web/src/components/landing/Walkthroughs.tsx @@ -92,7 +92,7 @@ export default function Walkthroughs() {

  • - + Green lines are verified, evidence-cited passes — not the model's say-so.
  • diff --git a/web/src/pages/NotFound.tsx b/web/src/pages/NotFound.tsx index cd2d849..95ba651 100644 --- a/web/src/pages/NotFound.tsx +++ b/web/src/pages/NotFound.tsx @@ -8,7 +8,7 @@ export default function NotFound() { }, []); return ( - +

    From 823bf81b8554892fa7796e42150bb047747cefe5 Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:50:35 -0400 Subject: [PATCH 17/18] docs(readme): add release, downloads, ci, stars and website badges --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index d69e6d9..777d9f9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,14 @@ # Daedalus +

    + Latest release + Downloads + CI status + GitHub stars + Go version + Website +

    + Daedalus is an **opinionated Claude Code harness** that makes a capable-but-drifting model work with the discipline of a senior engineer: no guessing, research before implementing, verification with fresh eyes, state on disk, and short sessions that From 85953487ffaeb119c5cb886ed56886ceefe9785a Mon Sep 17 00:00:00 2001 From: andyguz17 Date: Thu, 2 Jul 2026 15:53:00 -0400 Subject: [PATCH 18/18] chore: adopt MIT license with badge and README section --- LICENSE | 21 +++++++++++++++++++++ README.md | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dd1fcc5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Codigo de Altura + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 777d9f9..e0b1762 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ CI status GitHub stars Go version + License: MIT Website

    @@ -124,4 +125,4 @@ development/ Method planning artifacts (v2 plan, benchmark) — not shi ## License -See repository for license details. +[MIT](LICENSE) — use it, adapt it, ship it. If the Method serves your team, that's the point.