diff --git a/apps/website/src/pages/index.astro b/apps/website/src/pages/index.astro index fbaada8..122d71d 100644 --- a/apps/website/src/pages/index.astro +++ b/apps/website/src/pages/index.astro @@ -14,14 +14,19 @@ import { LATEST, PACKAGE_VERSION } from '../data/latest.ts'; const shortDate = (iso: string) => new Date(iso + 'T00:00:00Z').toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC' }); -// The six-item directory (copy spec §5). Described, not sold. +// §5 is an ORDERED PATH, not a flat list (Huayin's first-read ruling): the same six items sequenced +// as the ladder a convinced reader actually climbs. The position is rung one and carries the same +// "start here" mark as the entrance block above, so the two agree. This is also what fixes +// /the-argument's reachability STRUCTURALLY — it is rung four, reached by readers who have already +// been convinced, which is who it was written for. const DIRECTORY = [ - { title: 'Run it', href: '/install', blurb: 'install, and a clarify, a refuse, and a disclose print on your machine as wire JSON.' }, + { title: 'Never Let the Model Touch the Database', href: '/positions/never-let-the-model-touch-the-database', mark: 'start here', + blurb: 'the position: why the model should never hold your database credentials, and what to put between them.' }, + { title: 'Run the demo', href: '/install', blurb: 'install, and a clarify, a refuse, and a disclose print on your machine as wire JSON.' }, { title: 'Read the case', href: '/case', blurb: 'a complete worked example: a realistic warehouse, the Manifold that serves it, and recorded agent transcripts.' }, { title: 'Learn the framework', href: '/learn', blurb: 'what Columna, FrameQL, and a Manifold are; the three manuals; the live Explorer.' }, { title: 'Read the argument', href: '/the-argument', blurb: 'the eight-minute case for why this exists, with two live exhibits.' }, - { title: 'Positions', href: '/positions', blurb: 'stances we hold, stated plainly and linked to their evidence.' }, - { title: 'Research', href: '/atlas', blurb: 'six papers, the Silent Failure Atlas, and the public benchmark kit with its frozen answer key.' }, + { title: 'Positions and research', href: '/positions', blurb: 'every stance we hold with its evidence; six papers, the Silent Failure Atlas, and the public benchmark kit.' }, ]; --- @@ -36,6 +41,15 @@ const DIRECTORY = [ pip install columna quickstart, two minutes →

+ + {/* THE DESIGNATED ENTRANCE (Huayin's first-read ruling). The lobby needs ONE way in, and it + is the blast-wall position. A quiet block, NOT a banner: hairline rules above and below, + no card, no fill, no accent — the lobby points, it does not argue. */} +
+

start here

+ Never Let the Model Touch the Database +

Why the model should never hold your database credentials — and what to put between them. Three minutes.

+
@@ -90,14 +104,22 @@ const DIRECTORY = [ {/* 5 · Where to go — the directory. Six doors, described not sold. */}

Where to go

-
    - {DIRECTORY.map((d) => ( -
  • - {d.title} - {d.blurb} +

    In the order a reader usually wants them.

    +
      + {DIRECTORY.map((d, i) => ( +
    1. + {/* The ENTRANCE is deliberately UNNUMBERED (Huayin's numbering ruling (b)): it carries only + "start here", so it reads as distinct from the path it opens — and the five rungs that + follow number 1–5, which puts the argument at rung 4 exactly as the ruling says. */} + {d.mark ? '' : i} +
      + {d.title} + {d.mark && {d.mark}} + {d.blurb} +
    2. ))} -
+

@@ -146,6 +168,18 @@ const DIRECTORY = [ .chip { font-family: var(--font-mono); font-size: 0.9rem; background: var(--paper-raised); border: 1px solid var(--rule-strong); border-radius: 6px; padding: 0.4rem 0.7rem; color: var(--ink); } .mast-quick { color: var(--ink-soft); } + /* THE DESIGNATED ENTRANCE — hairline rules above and below, no card, no fill, no accent. + Quiet enough to be furniture, present enough to be the one way in. */ + .start-here { margin-top: 1.8rem; padding: 1rem 0; border-top: 1px solid var(--rule); + border-bottom: 1px solid var(--rule); max-width: 34rem; } + .start-label { font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.1em; + color: var(--ink-faint); margin: 0 0 0.4rem; } + .start-title { font-family: var(--font-sans); font-size: 1.02rem; font-weight: 600; color: var(--ink); + text-decoration: underline; text-decoration-color: var(--rule-strong); display: inline-block; } + .start-title:hover { text-decoration-color: var(--ink-faint); } + .start-line { font-family: var(--font-sans); font-size: 0.88rem; color: var(--ink-soft); + line-height: 1.5; margin: 0.35rem 0 0; } + .mast-hero { display: flex; flex-direction: column; gap: 0.7rem; } .hero-cap { font-size: 0.72rem; color: var(--ink-faint); margin: 0; } @@ -184,9 +218,19 @@ const DIRECTORY = [ /* ── 5 · Directory ───────────────────────────────────────────── */ .directory .section-h { margin-bottom: 1.4rem; } + .dir-lede { font-family: var(--font-sans); font-size: 0.92rem; color: var(--ink-soft); + margin: 0 0 1.4rem; } + /* an ORDERED path: the rung number carries the sequence, hairline separators carry the rhythm. + No cards, no fills — the ladder is legible from the numbers and the order alone. */ .dir-list { list-style: none; padding: 0; width: min(100% - 3rem, 46rem); margin: 0 auto; - display: grid; gap: 1.3rem; } - .dir-item { display: grid; gap: 0.2rem; } + display: grid; gap: 0; counter-reset: rung; } + .dir-item { display: grid; grid-template-columns: 1.9rem 1fr; gap: 0 0.5rem; + padding: 1rem 0; border-top: 1px solid var(--rule); } + .dir-item:last-child { border-bottom: 1px solid var(--rule); } + .dir-rung { font-size: 0.78rem; color: var(--ink-faint); padding-top: 0.15rem; } + .dir-body { display: grid; gap: 0.2rem; } + .dir-mark { font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.1em; + color: var(--ink-faint); } .dir-title { font-family: var(--font-sans); font-size: 1.02rem; font-weight: 600; color: var(--ink); text-decoration: underline; text-decoration-color: var(--rule-strong); width: fit-content; } .dir-title:hover { text-decoration-color: var(--ink-faint); } diff --git a/apps/website/src/pages/learn.astro b/apps/website/src/pages/learn.astro index 58e3f8a..b7620b8 100644 --- a/apps/website/src/pages/learn.astro +++ b/apps/website/src/pages/learn.astro @@ -43,6 +43,10 @@ const groups = [ { heading: 'Around the corpus', items: [ + // /the-argument is reachable from the LINK LISTS rather than the nav (Huayin's first-read + // ruling: nav stays at eight items). It is rung four on the homepage path — for readers already + // convinced, which is who it was written for. + { href: '/the-argument', title: 'the argument', blurb: 'The eight-minute case for why Columna exists, with two live exhibits.' }, { href: '/how-these-documents-relate', title: 'How these documents relate', blurb: 'The corpus map — how the thesis, the essays, the papers, and the manuals fit together.' }, { href: RELEASE_URL, title: 'Release 0.11.0', blurb: 'The GitHub Release — the many-to-many crossing executes — what shipped, on PyPI.', external: true }, ], diff --git a/apps/website/src/pages/thesis.astro b/apps/website/src/pages/thesis.astro index 8fdc58d..dd60f19 100644 --- a/apps/website/src/pages/thesis.astro +++ b/apps/website/src/pages/thesis.astro @@ -10,6 +10,7 @@ import TermChipStrip from '../components/TermChipStrip.astro';

This is a thesis, not a petition. Dispute it, extend it, or bring evidence — in the open. + Shorter, with two live exhibits: the argument.