From b89fe46184cef437ac897bf47963feed774df48f Mon Sep 17 00:00:00 2001 From: CMLKevin <74870576+CMLKevin@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:24:55 +0800 Subject: [PATCH 1/5] v0.1 thesis redesign: ladder, evolution axes, R7 ablation, hero rewrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reshape the site so reading top-to-bottom delivers the lab's thesis — not just the protocol. New content: - Hero hook rewritten around the model/scaffold horizon gap (METR cadence ~4 months in 2026). - Manifesto expanded into a compact whitepaper (hiring problem → the lab's actual bet → why this filter has this shape). - New section 02 \"The Ladder\": OOM visualization 10^6 → 10^12 for token horizon per single coherent task, positioning the 3 gates as the admission ramp. - New section 03 \"Three Axes of Self-Evolution\": behavior / knowledge / scaffold, with scaffold-level evolution explicitly weighted highest. Protocol changes: - R1 tightened to require a long-horizon task and a scaffold that extends horizon. - R7 added: ablation is required. Same model, minimal scaffold. The delta is the evidence. Form changes: - 5 fields → 7 fields. - New: evolution.axes (multi-select checkboxes; axis 03 weighted). - New: ablation.baseline (URL + optional log). - Validation covers axis count and baseline URL. Bug fixes inherited from v0: - canvas.clientWidth/clientHeight no longer assigned (getter-only in strict mode). - localStorage access wrapped in a safe store for sandboxed contexts. README updated to match. Bilingual EN/ZH throughout. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 62 ++++++-- assets/app.js | 394 +++++++++++++++++++++++++++++++++++----------- assets/styles.css | 182 +++++++++++++++++++++ index.html | 116 +++++++++++--- 4 files changed, 631 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index f6998d4..d071810 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Token-Ignition -> The task is the interview. Pass it, and you join the research. +> Model horizons double every four months. The scaffolds around them do not. That gap is the work. Token-Ignition is a **selection gate for AI-native researchers**. -We don't hire on résumés, pitches, or intro calls. We invert the interview: you define a task, you build a system, and if that system can evolve itself and clear an AI-audited gate, you're invited into the research group. +We don't hire on résumés, pitches, or intro calls. We invert the interview: you define a long-horizon task, you build a scaffold that evolves itself, and if that scaffold clears an AI-audited gate, you're invited into the research group. Tokens are how we make that possible — not why we do it. @@ -15,20 +15,54 @@ Tokens are how we make that possible — not why we do it. This repository hosts the **v0.1 protocol test** of Token-Ignition: - static frontend (`index.html` + `assets/`) — live at the Token-Ignition submission site -- meta-rules, protocol spec, and submission schema (see `/spec`) +- meta-rules, protocol spec, and submission schema (in-page + this README) - public ledger of submission hashes — AI audit results appended by bot (to be wired) No backend is wired yet. Submissions in v0.1 are captured client-side and hashed into a local ledger for visual/UX testing; the real submission pipeline (GitHub issue / serverless endpoint → AI audit workflow → ledger append) will land in v0.2. --- +## The thesis + +Model capability doubles roughly every four months — METR's measured cadence has only accelerated since their original paper. The engineering around it — memory, tools, planning loops, self-correction, long-horizon coherence — moves at a human pace, and caps out several orders of magnitude earlier than the models themselves could support. + +This lab exists to close that gap. We are climbing a ladder of **token horizons per single coherent task**, from 10⁶ to 10¹². Each rung unlocked becomes a product. + +``` + 10¹² ──────────── ? the research frontier + 10¹¹ ─────────── autonomous long-horizon research + 10¹⁰ ────────── multi-month project execution + 10⁹ ───────── self-evolving codebases + 10⁸ ──────── gate.3 — ignition + 10⁷ ─────── gate.2 — verified + 10⁶ ────── gate.1 — admission +``` + +The first three rungs are the admission ramp. What happens above them is the lab. + +--- + +## Three axes of self-evolution + +A self-evolving scaffold must move along at least one of these axes between runs — without a human editing prompts, weights, or code in between. The third is rare. We weight it highest. + +| axis | what it means | +|------|---------------| +| **01 // behavior** | The scaffold changes *how* it acts across runs — its policies, decision rules, strategy. | +| **02 // knowledge** | The scaffold accumulates, distills, or restructures *what it knows* across runs. | +| **03 // scaffold** | The scaffold modifies *itself* across runs — its tools, control loop, evaluation criteria, its successor. | + +A system that only rewrites its prompt is not, by itself, a self-evolving scaffold. + +--- + ## The three gates | gate | budget | unlock condition | | --- | --- | --- | | `gate.1` — admission | 1M tokens | any well-formed submission is admitted | -| `gate.2` — verified | 10M tokens | AI auditor confirms reproducible self-evolution on gate.1 artifact | -| `gate.3` — research | 100M tokens | emergent behavior verified by consensus of ≥3 independent models; standing invitation to join the research group | +| `gate.2` — verified | 10M tokens | AI auditor confirms reproducible self-evolution on the gate.1 artifact, with a real delta against ablation | +| `gate.3` — research | 100M tokens | scaffold-level evolution — not merely behavioral drift — verified by consensus of ≥3 independent models; standing invitation to join the research group | Clearing `gate.3` is how you get in. Tokens are the side-effect that lets you keep going. @@ -36,21 +70,23 @@ Clearing `gate.3` is how you get in. Tokens are the side-effect that lets you ke ## Meta-rules -- **R1** — you define the task; it must require a system that evolves itself. +- **R1** — you define the task; it must be long-horizon, and must require a scaffold that evolves itself to push the achievable horizon further. - **R2** — you define the evaluation criterion; it must be reproducible and machine-verifiable. -- **R3** — you build the system; the system, not you, produces the final output. +- **R3** — you build the scaffold; the scaffold, not you, produces the final output. - **R4** — all submissions are AI-judged; human audit is random and post-hoc. - **R5** — identity is irrelevant; submissions are accepted under pseudonym. - **R6** — selection is gated; pass a gate, unlock more resources; pass the final gate, join the research. +- **R7** — ablation is required; you must submit a baseline run on the same model with the minimal scaffold. The delta is the evidence. A scaffold that cannot beat its own ablation is not evolving — it is merely present. --- ## What counts as a valid submission -1. **Self-evolution, not prompt-engineering.** The system must modify its own behavior across iterations without human edits to prompts, weights, or code between runs. +1. **Self-evolution, not prompt-engineering.** The scaffold must modify its own behavior, knowledge, or structure across iterations — without human edits between runs. 2. **Machine-verifiable output.** The evaluation criterion must be checkable by an AI auditor with no proprietary access — public endpoint, public artifact. 3. **Live, AI-readable endpoint.** You must provide a URL an AI can crawl. HTML is fine; JSON / OpenAPI / plain text are better. Logins, captchas, GUIs are not accepted. -4. **Reproducibility micro-run.** Attach at least one log of a full run: inputs, intermediate state, final artifact hash. Our auditor re-runs a randomly sampled slice. +4. **Ablation baseline.** A second endpoint or log: same model, minimal scaffold, same task. Your scaffold's contribution is the delta between this and your main endpoint. +5. **Reproducibility micro-run.** Attach at least one log of a full run: inputs, intermediate state, final artifact hash. Our auditor re-runs a randomly sampled slice. If the AI auditor cannot independently verify your artifact, the submission is rejected. We do not email you for clarifications. **The endpoint is the application.** @@ -70,10 +106,10 @@ The frontend is vanilla HTML/CSS/JS — no build step. Copy / translate strings ## Roadmap -- [x] v0.1 — static protocol test site, hybrid terminal + form UX, bilingual EN/ZH -- [ ] v0.2 — GitHub-repo-as-backend: submissions become issues/PRs, AI audit runs as GitHub Action, ledger appends as commit -- [ ] v0.3 — multi-model consensus judge for `gate.3` (3+ independent models), random human audit sampler -- [ ] v0.4 — public API spec for submission endpoint requirements (`/benchmark`, artifact hash conventions) +- [x] v0.1 — static protocol test site: thesis-layer (ladder, axes, manifesto), R7 ablation rule, bilingual EN/ZH, 7-field submission form with axis declaration + ablation baseline +- [ ] v0.2 — GitHub-repo-as-backend: submissions become issues/PRs, AI audit runs as GitHub Action (multi-model consensus for gate.3), ledger appends as commit, axis-tagged scoring +- [ ] v0.3 — multi-model consensus judge formalized, random human audit sampler, post-hoc reproducibility replays +- [ ] v0.4 — public API spec for submission endpoint requirements (`/benchmark`, `/baseline`, artifact hash conventions) --- diff --git a/assets/app.js b/assets/app.js index 1b18928..a26967f 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,5 +1,5 @@ /* ============================================================ - TOKEN-IGNITION — front-end v2 + TOKEN-IGNITION — front-end v0.1 (thesis redesign) - scrollable academic layout - hybrid terminal aesthetic + real form inputs - bilingual EN / ZH @@ -19,30 +19,78 @@ brand: "TOKEN-IGNITION // RESEARCH SELECTION", heroSubtitle: "A selection gate for AI-native researchers", - heroHook: "The task is the interview. Pass it, and you join the research.", + heroHook: + "Model horizons double every four months. The scaffolds around them do not. That gap is the work.", heroTagline: - "You define the task. You build the system. The system must evolve itself. If it clears the AI-audited gate, you're invited into the research group. Tokens are how we make that possible — not why we do it.", + "You define a long-horizon task. You build a scaffold that evolves itself. If the scaffold clears the AI audit, you are invited into the research group. Tokens are how we make that possible — not why.", heroCTA: "↓ enter the gate", scrollHint: "scroll to read how selection works", manifestoLabel: "manifesto", - manifestoTitle: "HOW WE SELECT", + manifestoTitle: "WHY THIS EXISTS", manifestoBody: ` -

Hiring in frontier AI is broken. The legible names get the interviews, the compute, the role. The people who would actually have moved the field rarely pass the filters.

-

CVs measure legibility, not ability. Pitch decks measure articulation, not craft. Interviews measure composure under pressure. None of these measure whether you can build a system that evolves itself.

-

So we inverted the interview. Give us a task you defined, and a system you built. If the system can clear the AI-audited gate by evolving itself, you're in the research group.

-

No CVs. No pitch decks. No intro calls. The artifact is the application. Passing is the offer.

+

Hiring in frontier AI is broken. The legible names get the interviews, the compute, the role. The people who would actually have moved the field rarely pass the filters.

+

CVs measure legibility, not ability. Pitches measure articulation, not craft. Interviews measure composure under pressure. None of these measure whether you can build a system that evolves itself.

+

Our bet is smaller and sharper than "find genius." Model capability doubles roughly every four months now — METR's measured cadence has only accelerated since the original paper. The engineering around it — memory, tools, planning loops, self-correction, coherence across long horizons — moves at a human pace, and caps out several orders of magnitude earlier than the models themselves could support. This lab exists to close that gap. We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². Each rung we unlock becomes a product.

+

We do not care about founders. We care about people whose systems can climb the next rung without them.

+

So we inverted the interview. You give us a task you defined and a scaffold you built. If the scaffold can clear the AI audit by evolving itself, you are in the research group. No CVs. No pitch decks. No intro calls. The artifact is the application. Passing is the offer.

`, + ladderLabel: "orders of magnitude", + ladderTitle: "THE LADDER", + ladderIntro: ` +

We measure our own progress by the token horizon of a single coherent task — the amount of compute a scaffold can meaningfully apply to one objective before it loses coherence, deviates, or stalls. Today's practical ceiling sits around 10⁶–10⁷. We are climbing to 10¹². Each order of magnitude earns engineering productization — a system spun out, resourced, shipped.

+ `, + ladderAscii: +` 10¹² ──────────── ? the research frontier + 10¹¹ ─────────── autonomous long-horizon research + 10¹⁰ ────────── multi-month project execution + 10⁹ ───────── self-evolving codebases + 10⁸ ──────── gate.3 — ignition + 10⁷ ─────── gate.2 — verified + 10⁶ ────── gate.1 — admission`, + ladderClose: ` +

The first three rungs are the admission ramp. What happens above them is the lab.

+ `, + + axesLabel: "what evolves", + axesTitle: "THREE AXES OF SELF-EVOLUTION", + axesIntro: ` +

A self-evolving scaffold must move along at least one of these axes between runs — without a human editing prompts, weights, or code in between. The third is rare. We weight it highest.

+ `, + axesItems: [ + { + tag: "01", + name: "behavior", + body: "The scaffold changes how it acts across runs — its policies, its decision rules, its strategy — without a human editing its prompt or code between runs.", + }, + { + tag: "02", + name: "knowledge", + body: "The scaffold accumulates, distills, or restructures what it knows across runs — its memory, its representations, its internal references.", + }, + { + tag: "03", + name: "scaffold", + body: "The scaffold modifies itself across runs — its tools, its control loop, its evaluation criteria, its successor. This is the rare axis. This is the one we are looking for.", + weighted: true, + weightNote: "highest weight", + }, + ], + axesCalloutHead: "// SELECTION NOTE", + axesCalloutBody: + "A submission may target one axis or several. The evaluation rewards demonstrations along axis 03. A system that only rewrites its prompt is not, by itself, a self-evolving scaffold.", + protocolLabel: "protocol", protocolTitle: "META-RULES", protocolItems: [ - ["R1", "You define the task. The task must require a system that evolves itself."], + ["R1", "You define the task. The task must be long-horizon, and must require a scaffold that evolves itself to extend the achievable horizon further."], ["R2", "You define the evaluation criterion. It must be reproducible and machine-verifiable."], - ["R3", "You build the system. The system — not you — produces the final output."], + ["R3", "You build the scaffold. The scaffold — not you — produces the final output."], ["R4", "All submissions are AI-judged. Human audit is random and post-hoc."], ["R5", "Identity is irrelevant. Submissions are accepted under pseudonym."], ["R6", "Selection is gated. Pass a gate, unlock more resources. Pass the final gate, join the research."], + ["R7", "Ablation is required. You must submit a baseline run on the same model with the minimal scaffold. The delta is the evidence. A scaffold that cannot beat its own ablation is not evolving — it is merely present."], ], rulesLabel: "submission requirements", @@ -51,8 +99,8 @@ { head: "01 // Self-evolution, not prompt-engineering.", body: [ - "The system must modify its own behavior across iterations", - "without human edits to prompts, weights, or code between runs.", + "The scaffold must modify its own behavior, knowledge, or structure", + "across iterations — without human edits between runs.", ], }, { @@ -70,7 +118,14 @@ ], }, { - head: "04 // Reproducibility micro-run.", + head: "04 // Ablation baseline.", + body: [ + "A second endpoint or log: same model, minimal scaffold, same task.", + "Your scaffold's contribution is the delta between this and the main endpoint.", + ], + }, + { + head: "05 // Reproducibility micro-run.", body: [ "Attach at least one log of a full run: inputs, intermediate state,", "final artifact hash. Our auditor re-runs a randomly sampled slice.", @@ -86,42 +141,62 @@ allocation1Note: "Admission tier. Any well-formed submission receives a 1M token budget to run and prove its system.", allocation2Note: - "Verified tier. Unlocked when the AI auditor confirms reproducible self-evolution on your gate.1 artifact.", + "Verified tier. Unlocked when the AI auditor confirms reproducible self-evolution on your gate.1 artifact — and when the delta against your ablation is real.", allocation3Note: - "Research tier. Unlocked when emergent behavior — absent in the initial system — is verified by consensus of ≥3 independent models. Gate.3 clearance is a standing invitation to join the research group.", + "Research tier. Unlocked when scaffold-level evolution — not merely behavioral drift — is verified by consensus of ≥3 independent models. Gate.3 clearance is a standing invitation to join the research group.", submitLabel: "submission", submitTitle: "APPLY BY SUBMITTING", submitIntro: - "Five fields. No account. Your entry is hashed and appended to a public ledger. AI audit starts within 24h. Clear the final gate and we reach out to talk about joining the research.", + "Seven fields. No account. Your entry is hashed and appended to a public ledger. AI audit starts within 24h. Clear the final gate and we reach out to talk about joining the research.", + field1Label: "task.definition", field1Hint: - "What does the system have to do? One paragraph. Must be testable.", + "What long-horizon task does the scaffold have to do? One paragraph. Must be testable. Must require a horizon the naked model cannot reach.", field1Ph: - "e.g. Given a stream of unlabeled numerical sequences, the system must autonomously discover a compression scheme and reconstruct the originals within tolerance ε.", + "e.g. Given an open bug in a large Python codebase, the scaffold must autonomously produce a reproducing test, locate the root cause, patch it, and converge to all-green CI — across runs that span >10⁶ tokens of reading, editing, and verification.", + field2Label: "verification.criterion", field2Hint: "How will an AI auditor know you passed? Give the exact check.", field2Ph: - "e.g. Auditor fetches /benchmark → receives JSON { inputs[], outputs[] }. Passes if L2 error < 0.01 on all held-out inputs and compression ratio > 8x.", - field3Label: "execution.plan", + "e.g. Auditor fetches /benchmark → receives JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }. Passes if status == 'green' on all held-out bugs AND task_token_count ≥ 10⁶ AND scaffold_delta_vs_baseline ≥ +40% on pass rate.", + + field3Label: "evolution.axes", field3Hint: - "How does the system evolve itself? What loop, what signal, what memory?", - field3Ph: - "Describe the self-modification loop — what the system observes, how it updates itself, how it decides to stop. Write as you would write it to a peer reviewer, not to a VC.", - field4Label: "live.endpoint", + "Which axis does your scaffold evolve along? Select one or more. Axis 03 (scaffold) weighs highest.", + field3OptBehavior: "behavior", + field3OptKnowledge: "knowledge", + field3OptScaffold: "scaffold", + field3OptWeight: "highest weight", + + field4Label: "execution.plan", field4Hint: + "How does the scaffold evolve itself? What loop, what signal, what memory, what modifies what?", + field4Ph: + "Describe the self-modification loop — what the scaffold observes, how it updates itself, how it decides to stop. Write as you would write it to a peer reviewer, not to a VC.", + + field5Label: "live.endpoint", + field5Hint: "A URL an AI can hit right now and get a machine-readable result.", - field4Ph: "https://…", - field4Artifact: + field5Ph: "https://…", + field5Artifact: "attach run log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", - field5Label: "contact.handle", - field5Hint: + + field6Label: "ablation.baseline", + field6Hint: + "A second URL: same model, minimal scaffold, same task. The delta between this and your main endpoint is your scaffold's contribution.", + field6Ph: "https://…/baseline", + field6Artifact: + "attach baseline log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", + + field7Label: "contact.handle", + field7Hint: "A pseudonym is fine. We only use it to notify you when a gate opens.", - field5Ph: "e.g. @handle on X, discord username, or email", + field7Ph: "e.g. @handle on X, discord username, or email", consent: - "I confirm my submission is my own work, the endpoint is live, and I accept AI-judged, non-negotiable evaluation.", + "I confirm my submission is my own work, both endpoints are live, and I accept AI-judged, non-negotiable evaluation.", submitButton: "submit", footLeft: "TOKEN-IGNITION // RESEARCH SELECTION // v0.1", @@ -136,6 +211,10 @@ missing: "[reject] missing required fields. check highlighted items.", badUrl: "[reject] live.endpoint must be a valid URL — our auditor has to crawl it.", + badBaseline: + "[reject] ablation.baseline must be a valid URL — we audit the delta, not the artifact alone.", + noAxis: + "[reject] evolution.axes must have at least one selected — we need to know what is evolving.", ok: (hash) => `[accept] entry ${hash} queued.\nAI audit window: 24h.\nYou will not receive a confirmation email. Watch the ledger.`, }, @@ -145,30 +224,78 @@ brand: "TOKEN-IGNITION // 研究员筛选", heroSubtitle: "面向 AI 原生研究员的筛选入口", - heroHook: "任务本身就是申请书。通过了,就进研究组。", + heroHook: + "模型能力每四个月翻一倍。包在模型外面的脚手架不会。这中间的落差,就是我们要做的事。", heroTagline: - "你定义任务。你构建系统。系统必须自我进化。通过 AI 审计的门槛后,你会被邀请进入研究组。token 只是我们让这件事成为可能的方式,不是它的目的。", + "你定义一个长跨度的任务。你构建一个会自我进化的脚手架。如果脚手架通过 AI 审计,你将被邀请进入研究组。token 是让这件事成立的方式,不是我们做这件事的理由。", heroCTA: "↓ 进入申请", scrollHint: "向下滚动,了解筛选机制", manifestoLabel: "宣言", - manifestoTitle: "我们怎么选人", + manifestoTitle: "为什么做这件事", manifestoBody: ` -

前沿 AI 领域的招聘机制是坏的。能被看见的名字拿到面试、拿到算力、拿到位置。真正可能推动这个行业的人,往往过不了筛子。

+

前沿 AI 领域的招聘机制是坏的。能被看见的名字拿到面试、拿到算力、拿到位置。真正可能推动这个行业的人,往往过不了筛子。

简历衡量的是可读性,不是能力。Pitch 衡量的是表达,不是手艺。面试衡量的是临场镇定。没有一项,真正衡量你能不能造出一个会自我进化的系统。

-

所以我们把面试反过来。你给我们一个你自己定义的任务,和一个你自己造的系统。如果这个系统能靠自我进化通过 AI 审计,你就进入研究组。

-

不看简历。不看 pitch。不做 intro call。作品本身就是申请。通过,就是 offer。

+

我们的赌注比"寻找天才"更窄、更锋利。模型能力现在每约四个月就翻一倍——METR 测到的节奏自那篇原文之后只在加速。围绕在模型外面的工程——记忆、工具、规划循环、自我纠错、长跨度的一致性——以人的速度前进,并且常常在模型尚有余力时,就已经到顶了几个数量级。这个 lab 存在的意义,是弥合这个落差。我们正在沿着一条阶梯往上爬:单个连贯任务可持续的 token 跨度,从 10⁶ 到 10¹²。每解锁一个数量级,对应的能力就被直接工程化为产品。

+

我们不在乎创始人。我们在乎的是:一个人造出的系统,能不能在没有他的情况下继续往上爬。

+

所以我们把面试反过来。你交给我们:一个你定义的任务,一个你构造的脚手架。如果脚手架能通过 AI 审计——靠它自己的进化——你就进入研究组。不看简历。不看 pitch。不做 intro call。作品本身就是申请。通过,就是 offer。

+ `, + + ladderLabel: "数量级", + ladderTitle: "阶梯", + ladderIntro: ` +

我们用一个指标衡量自己的进展:单个连贯任务的 token 跨度——一个脚手架能把多少计算持续投入到同一个目标上,在它失去一致性、偏题、或停滞之前。今天实际的天花板在 10⁶–10⁷ 这一档。我们想爬到 10¹²。每解锁一个数量级,对应的能力就直接做成产品——独立出来、分配资源、端到端交付。

+ `, + ladderAscii: +` 10¹² ──────────── ? 研究前沿 + 10¹¹ ─────────── 自主长跨度科研 + 10¹⁰ ────────── 多月级项目执行 + 10⁹ ───────── 会自我进化的代码库 + 10⁸ ──────── gate.3 — 点火 + 10⁷ ─────── gate.2 — 验证 + 10⁶ ────── gate.1 — 入围`, + ladderClose: ` +

前三级只是入围的坡道。真正的 lab,在它们之上。

+ `, + + axesLabel: "何谓进化", + axesTitle: "自我进化的三条轴", + axesIntro: ` +

一个会自我进化的脚手架,在两次运行之间,必须在以下三条轴上至少有一条发生变化——并且期间没有人为编辑 prompt、权重或代码。第三条最稀有。我们也给它最高权重。

`, + axesItems: [ + { + tag: "01", + name: "行为", + body: "脚手架在多次运行之间,改变自己怎么行动——策略、决策规则、方法——期间没有人动它的 prompt 或代码。", + }, + { + tag: "02", + name: "知识", + body: "脚手架在多次运行之间,积累、蒸馏、或重构自己所知的内容——记忆、表征、内部参照。", + }, + { + tag: "03", + name: "脚手架", + body: "脚手架跨运行修改自己——自己的工具、控制循环、评判标准,乃至后继者。这条轴最少见。也正是我们要找的那条。", + weighted: true, + weightNote: "最高权重", + }, + ], + axesCalloutHead: "// 评估说明", + axesCalloutBody: + "一份提交可以只在一条轴上发力,也可以多轴并行。评估对第 03 条轴上的展示给予更高权重。只会改写自己 prompt 的系统,不构成一个自我进化的脚手架。", protocolLabel: "协议", protocolTitle: "元规则", protocolItems: [ - ["R1", "你定义任务。该任务必须要求一个会自我进化的系统来完成。"], + ["R1", "你定义任务。任务必须是长跨度的,并且要求一个能自我进化的脚手架去继续推动可达跨度。"], ["R2", "你定义评估标准。标准必须可复现、可被机器验证。"], - ["R3", "你构建系统。最终产出来自系统,不是来自你。"], + ["R3", "你构建脚手架。最终产出来自脚手架,不来自你。"], ["R4", "所有提交由 AI 评判。人工审计是随机抽查,事后进行。"], ["R5", "身份无关。允许使用化名提交。"], ["R6", "筛选分档。通过一档,解锁更多资源;通过最终档,进入研究组。"], + ["R7", "必须提供消融对照。同一个模型、最小脚手架、同一任务,再跑一遍基线。差值就是证据。打不过自己消融基线的脚手架不在进化——它只是在场。"], ], rulesLabel: "提交要求", @@ -177,8 +304,8 @@ { head: "01 // 必须是自我进化,而不是 prompt 工程。", body: [ - "系统在多轮迭代间必须自行修改自身行为,", - "而非由人手动改 prompt、改权重或改代码。", + "脚手架在多轮迭代之间必须改变自己的行为、知识、或结构,", + "而不是由人手动改 prompt、改权重或改代码。", ], }, { @@ -196,7 +323,14 @@ ], }, { - head: "04 // 可复现的最小运行记录。", + head: "04 // 消融基线。", + body: [ + "第二个端点或日志:同模型、最小脚手架、同任务。", + "你脚手架的贡献,就是它和主端点之间的差值。", + ], + }, + { + head: "05 // 可复现的最小运行记录。", body: [ "至少附一段完整运行日志:输入、中间状态、最终产物哈希。", "我们的审计器会随机抽一小段重跑。", @@ -212,37 +346,59 @@ allocation1Note: "入围档。任何合规提交即获得 1M token 预算,用于让系统跑起来、自证能力。", allocation2Note: - "验证档。当 AI 审计确认 gate.1 的产物具备可复现的自我进化,解锁。", + "验证档。当 AI 审计确认 gate.1 的产物具备可复现的自我进化、且相对消融基线存在真实差值,解锁。", allocation3Note: - "研究档。当产物出现初始系统所不具备的涌现行为,并由 ≥3 个独立模型共识验证,解锁。通过 gate.3,就是进入研究组的长期邀请。", + "研究档。当产物出现脚手架层级的进化——不止于行为漂移——并由 ≥3 个独立模型共识验证,解锁。通过 gate.3,就是进入研究组的长期邀请。", submitLabel: "申请", submitTitle: "提交即申请", submitIntro: - "五个字段。不用注册账号。提交会被哈希后写入公开账本,AI 审计将在 24 小时内开始。通过最终门槛,我们会主动联系你,谈加入研究组的事。", + "七个字段。不用注册账号。提交会被哈希后写入公开账本,AI 审计将在 24 小时内开始。通过最终门槛,我们会主动联系你,谈加入研究组的事。", + field1Label: "task.definition", - field1Hint: "系统要做什么?一段话。必须可测试。", + field1Hint: + "脚手架要完成怎样一个长跨度任务?一段话。必须可测试。必须要求一个裸模型够不到的跨度。", field1Ph: - "例:给定一串无标注的数值序列,系统需自主发现一种压缩方案,并在误差 ε 内重建原序列。", + "例:给定一个大型 Python 代码库里的开放缺陷,脚手架需自主复现该缺陷的测试、定位根因、打补丁,并在超过 10⁶ 个 token 的阅读、编辑与验证之后,让 CI 全绿。", + field2Label: "verification.criterion", field2Hint: "AI 审计怎么判断你通过了?给出确切的校验方式。", field2Ph: - "例:审计器访问 /benchmark → 返回 JSON { inputs[], outputs[] }。若在全部留出输入上 L2 误差 < 0.01 且压缩比 > 8x,即为通过。", - field3Label: "execution.plan", - field3Hint: "系统如何自我进化?哪条循环、哪个信号、哪块记忆?", - field3Ph: - "描述自我修改的循环——系统观察什么,如何更新自身,如何判断停止。写给同行,不是写给投资人。", - field4Label: "live.endpoint", - field4Hint: "一个现在就能被 AI 访问、拿到机器可读结果的 URL。", - field4Ph: "https://…", - field4Artifact: + "例:审计器访问 /benchmark → 返回 JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }。若全部留出缺陷的 status == 'green',且 task_token_count ≥ 10⁶,且脚手架相对基线的 pass 率差值 ≥ +40%,即为通过。", + + field3Label: "evolution.axes", + field3Hint: + "你的脚手架在哪条轴上进化?可多选。第 03 条(脚手架本身)权重最高。", + field3OptBehavior: "行为", + field3OptKnowledge: "知识", + field3OptScaffold: "脚手架", + field3OptWeight: "最高权重", + + field4Label: "execution.plan", + field4Hint: + "脚手架如何自我进化?哪条循环、哪个信号、哪块记忆、哪一部分在改哪一部分?", + field4Ph: + "描述自我修改的循环——脚手架观察什么、如何更新自身、如何判断停止。写给同行,不是写给投资人。", + + field5Label: "live.endpoint", + field5Hint: "一个现在就能被 AI 访问、拿到机器可读结果的 URL。", + field5Ph: "https://…", + field5Artifact: "附运行日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", - field5Label: "contact.handle", - field5Hint: "化名也可以。仅用于在门槛解锁时通知你。", - field5Ph: "例:X 上的 @handle、Discord 用户名或邮箱", + + field6Label: "ablation.baseline", + field6Hint: + "第二个 URL:同模型、最小脚手架、同任务。它和主端点之间的差值,就是你脚手架的贡献。", + field6Ph: "https://…/baseline", + field6Artifact: + "附基线日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", + + field7Label: "contact.handle", + field7Hint: "化名也可以。仅用于在门槛解锁时通知你。", + field7Ph: "例:X 上的 @handle、Discord 用户名或邮箱", consent: - "我确认这是我本人的作品,端点当前可访问,并接受由 AI 评判、不可申诉的评估结果。", + "我确认这是我本人的作品,两个端点当前均可访问,并接受由 AI 评判、不可申诉的评估结果。", submitButton: "提交", footLeft: "TOKEN-IGNITION // 研究员筛选 // v0.1", @@ -255,13 +411,34 @@ feedback: { missing: "[reject] 必填字段缺失。请检查标红项。", badUrl: "[reject] live.endpoint 必须是有效 URL——审计器需要抓取它。", + badBaseline: + "[reject] ablation.baseline 必须是有效 URL——我们评估的是差值,不是单个产物。", + noAxis: + "[reject] evolution.axes 至少要选一项——我们需要知道究竟是什么在进化。", ok: (hash) => `[accept] 条目 ${hash} 已入队。\nAI 审计窗口:24 小时。\n我们不会发确认邮件,请关注账本。`, }, }, }; - let LANG = localStorage.getItem("ti.lang") || "en"; + const SAFE_STORE = { + get(k) { + try { + return localStorage.getItem(k); + } catch { + return null; + } + }, + set(k, v) { + try { + localStorage.setItem(k, v); + } catch { + /* ignore storage errors (private-mode, sandboxed contexts) */ + } + }, + }; + + let LANG = SAFE_STORE.get("ti.lang") || "en"; /* -------------------------------------------------------------- i18n renderer @@ -271,18 +448,19 @@ const t = I18N[LANG]; document.documentElement.lang = LANG === "zh" ? "zh-CN" : "en"; - // text content + // text / html content document.querySelectorAll("[data-i18n]").forEach((el) => { const key = el.getAttribute("data-i18n"); - if (t[key] !== undefined) { - const val = t[key]; - if (typeof val === "string") { - if (val.trim().startsWith("<")) { - el.innerHTML = val; - } else { - el.textContent = val; - } - } + if (t[key] === undefined) return; + const val = t[key]; + if (typeof val !== "string") return; + //
 elements always get textContent to preserve whitespace
+      if (el.tagName === "PRE") {
+        el.textContent = val;
+      } else if (val.trim().startsWith("<")) {
+        el.innerHTML = val;
+      } else {
+        el.textContent = val;
       }
     });
 
@@ -319,6 +497,23 @@
         .join("");
     }
 
+    // axes grid
+    const aGrid = document.getElementById("axes-grid");
+    if (aGrid) {
+      aGrid.innerHTML = t.axesItems
+        .map(
+          (a) => `
+            
+
${escapeHtml(a.tag)}
+
${escapeHtml(a.name)}
+
${escapeHtml(a.body)}
+ ${a.weighted ? `
${escapeHtml(a.weightNote)}
` : ""} +
+ ` + ) + .join(""); + } + // lang buttons aria-current document.querySelectorAll(".lang-btn").forEach((b) => { b.setAttribute( @@ -348,17 +543,13 @@ const cols = window.innerWidth < 700 ? 56 : 88; const rows = 22; const chars = " ...::--==++**#@".split(""); - // We'll animate a slow t over time. let t = 0; function cell(x, y, t) { - // Normalize to [-1, 1] centered const nx = (x / cols) * 2 - 1; const ny = (y / rows) * 2 - 1; - // Radial falloff (sphere-ish intensity) const r = Math.sqrt(nx * nx + ny * ny * 2.2); const radial = Math.max(0, 1 - r * 1.05); - // Pseudo-noise via multi-frequency sin const n = Math.sin(x * 0.22 + y * 0.17 + t * 0.6) * 0.5 + Math.sin(x * 0.09 - y * 0.28 + t * 0.4) * 0.3 + @@ -380,18 +571,16 @@ } frame(); - // slow animate setInterval(() => { t += 0.06; frame(); }, 220); - // redraw on resize let resizeTimer; window.addEventListener("resize", () => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { - location.reload(); // simplest: re-layout cols + location.reload(); }, 300); }); } @@ -413,8 +602,10 @@ function resize() { dpr = Math.min(window.devicePixelRatio || 1, 2); - w = canvas.clientWidth = window.innerWidth; - h = canvas.clientHeight = window.innerHeight; + w = window.innerWidth; + h = window.innerHeight; + canvas.style.width = w + "px"; + canvas.style.height = h + "px"; canvas.width = w * dpr; canvas.height = h * dpr; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); @@ -485,8 +676,7 @@ function renderLedger() { const el = document.getElementById("ledger-table"); if (!el) return; - const stored = JSON.parse(localStorage.getItem("ti.ledger") || "[]"); - // seed with some placeholders if empty, for visual context + const stored = JSON.parse(SAFE_STORE.get("ti.ledger") || "[]"); const seed = stored.length ? stored : [ @@ -512,7 +702,6 @@ -------------------------------------------------------------- */ function hashString(s) { - // quick, non-crypto hash just for a local visual receipt let h = 2166136261 >>> 0; for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); @@ -522,6 +711,15 @@ (h >>> 0).toString(16).padStart(8, "0").slice(4, 8); } + function isValidHttpUrl(s) { + try { + const u = new URL(s); + return /^https?:$/.test(u.protocol); + } catch { + return false; + } + } + function wireForm() { const form = document.getElementById("submit-form"); if (!form) return; @@ -535,38 +733,52 @@ const criterion = form.criterion.value.trim(); const plan = form.plan.value.trim(); const endpoint = form.endpoint.value.trim(); + const baseline = form.baseline.value.trim(); const contact = form.contact.value.trim(); const consent = document.getElementById("f-consent").checked; + const axes = Array.from( + form.querySelectorAll('input[name="axis"]:checked') + ).map((el) => el.value); - if (!task || !criterion || !plan || !endpoint || !contact || !consent) { + if (!task || !criterion || !plan || !endpoint || !baseline || !contact || !consent) { fb.className = "submit-feedback visible error"; fb.textContent = t.feedback.missing; return; } - try { - const u = new URL(endpoint); - if (!/^https?:$/.test(u.protocol)) throw new Error("bad"); - } catch { + if (axes.length === 0) { + fb.className = "submit-feedback visible error"; + fb.textContent = t.feedback.noAxis; + return; + } + + if (!isValidHttpUrl(endpoint)) { fb.className = "submit-feedback visible error"; fb.textContent = t.feedback.badUrl; return; } + if (!isValidHttpUrl(baseline)) { + fb.className = "submit-feedback visible error"; + fb.textContent = t.feedback.badBaseline; + return; + } + const payload = JSON.stringify({ task, criterion, + axes, plan, endpoint, + baseline, contact, ts: Date.now(), }); const h = hashString(payload); - // store locally so ledger visibly updates - const ledger = JSON.parse(localStorage.getItem("ti.ledger") || "[]"); + const ledger = JSON.parse(SAFE_STORE.get("ti.ledger") || "[]"); ledger.unshift({ hash: h, time: "T-0h", status: "pending" }); - localStorage.setItem("ti.ledger", JSON.stringify(ledger.slice(0, 8))); + SAFE_STORE.set("ti.ledger", JSON.stringify(ledger.slice(0, 8))); renderLedger(); fb.className = "submit-feedback visible"; @@ -584,7 +796,7 @@ document.querySelectorAll(".lang-btn").forEach((b) => { b.addEventListener("click", () => { LANG = b.getAttribute("data-lang"); - localStorage.setItem("ti.lang", LANG); + SAFE_STORE.set("ti.lang", LANG); applyI18n(); }); }); diff --git a/assets/styles.css b/assets/styles.css index a43d9d7..9e6b14a 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -332,6 +332,116 @@ main { font-size: 13px; } +/* ---------------------------------------------------------------- ladder */ + +.ladder-intro { + margin-bottom: 28px; +} + +.ladder-intro p, +.ladder-close p { + margin: 0 0 16px; + color: var(--fg); +} + +.ladder-close { + margin-top: 28px; +} + +.ladder-ascii { + margin: 0; + padding: 22px 22px; + border: 1px solid var(--border); + background: rgba(255, 255, 255, 0.01); + color: var(--fg-mid); + font-size: 13px; + line-height: 1.7; + letter-spacing: 0; + white-space: pre; + font-variant-ligatures: none; + overflow-x: auto; + text-shadow: 0 0 12px rgba(255, 255, 255, 0.03); +} + +@media (max-width: 640px) { + .ladder-ascii { + font-size: 11px; + padding: 16px; + } +} + +/* ---------------------------------------------------------------- axes */ + +.axes-intro { + margin-bottom: 28px; +} + +.axes-intro p { + margin: 0 0 16px; + color: var(--fg); +} + +.axes-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 14px; + margin-bottom: 20px; +} + +.axis-cell { + border: 1px solid var(--border); + padding: 22px 20px; + background: rgba(255, 255, 255, 0.01); + display: flex; + flex-direction: column; + gap: 10px; + position: relative; +} + +.axis-cell-weighted { + border-color: var(--border-bright); + background: rgba(255, 255, 255, 0.025); +} + +.axis-tag { + color: var(--fg-dim); + font-size: 11px; + letter-spacing: 0.22em; +} + +.axis-name { + color: var(--fg); + font-size: 16px; + letter-spacing: 0.14em; + text-transform: lowercase; +} + +.axis-cell-weighted .axis-name { + color: var(--fg); +} + +.axis-body { + color: var(--fg-mid); + font-size: 13px; + line-height: 1.7; +} + +.axis-weight { + margin-top: auto; + color: var(--fg); + font-size: 10px; + letter-spacing: 0.26em; + padding-top: 14px; + border-top: 1px solid var(--border); + text-transform: uppercase; +} + +@media (max-width: 800px) { + .axes-grid { + grid-template-columns: 1fr; + } +} + /* ---------------------------------------------------------------- allocation */ .allocation-grid { @@ -435,6 +545,78 @@ main { color: var(--fg-faint); } +.field-checkbox-group { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-top: 4px; +} + +.axis-check { + display: flex; + align-items: center; + gap: 10px; + padding: 14px 14px; + border: 1px solid var(--border); + background: var(--field-bg); + cursor: pointer; + transition: border-color 0.15s ease, background 0.15s ease; + position: relative; +} + +.axis-check:hover { + border-color: var(--border-bright); + background: var(--field-bg-focus); +} + +.axis-check input[type="checkbox"] { + accent-color: var(--fg); + margin: 0; + flex-shrink: 0; +} + +.axis-check-tag { + color: var(--fg-dim); + font-size: 10px; + letter-spacing: 0.22em; +} + +.axis-check-name { + color: var(--fg); + font-size: 13px; + letter-spacing: 0.08em; +} + +.axis-check-weighted { + border-color: var(--border-bright); + background: rgba(255, 255, 255, 0.025); +} + +.axis-check-weighted .axis-check-name { + color: var(--fg); +} + +.axis-check-weight { + position: absolute; + top: 6px; + right: 10px; + color: var(--fg-dim); + font-size: 9px; + letter-spacing: 0.2em; + text-transform: uppercase; +} + +@media (max-width: 640px) { + .field-checkbox-group { + grid-template-columns: 1fr; + } + + .axis-check-weight { + position: static; + margin-left: auto; + } +} + .field-sub { margin-top: 12px; display: flex; diff --git a/index.html b/index.html index 79b2f9b..4330519 100644 --- a/index.html +++ b/index.html @@ -61,10 +61,37 @@

+ +
+ +

+
+ +
+
+ + +
+ +

+
+
+
+
+
+
+
+

@@ -74,7 +101,7 @@

@@ -89,7 +116,7 @@

@@ -115,7 +142,7 @@

@@ -124,7 +151,7 @@

@@ -140,7 +167,7 @@

@@ -155,37 +182,63 @@

-
+ +
+ +
-
+
- +
+
+ +
+ +
+ + +
+
+
-
+
@@ -233,7 +311,7 @@

From f75fbb50577919a5f6f7c5c3beeb78c6ee508613 Mon Sep 17 00:00:00 2001 From: CMLKevin <74870576+CMLKevin@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:42:59 +0800 Subject: [PATCH 2/5] v0.1 halftone elevation: whitepaper chrome, SVG vizzes, Bayer-dither ground MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reworks the visual language from cookie-cutter charts into halftone-rendered scientific diagrams — a 1965 Bell Labs paper about 2028 AI. Typography: - Display: Fraunces (section titles, hero hook, pull-quotes) — editorial gravitas, tight negative letter-spacing. - Body: Newsreader — humanist, optimized for long-form reading. - Mono: IBM Plex Mono — Bell Labs-designed, carries the technical/machine voice. Whitepaper chrome (new): - Classification strip at the top: OPEN PROTOCOL · v0.1 · COHORT №1 · JOULE RESEARCH. - Incipit above the masthead: an italic dedication line. - Abstract block under the hero title, typewrites in on load, with a blinking amber caret. - Folio marks on each section: Arabic + Roman numerals (01 / I, etc.). - Section epigraphs — italic pull-quote before each section title. - Colophon in the footer: typography credits, provenance, a mark. - Corner registration crosses (+) at the hero corners. - CTA cascade: "submit your scaffold · no cv · no pitch · no interview". - Mid-page ticker — slow horizontal whisper of thesis fragments. - Hero live status strip — gate.1 open gauge, ignition count, window. Visualizations (rebuilt): - Gap viz: SVG with exponential model curve + flat scaffold line; the zone between filled with halftone dots; 'the gap / (the lab)' label set inside the zone. - Ladder viz: SVG vertical ladder with pipe rail + halftone-textured rungs. Gates get dense amber halftone; the 10^9+ lab rungs get sparser patterns; the 10^12 frontier dissolves into vapor stippling. Ignition line (dashed) separates the admission ramp from the lab. Amber 'you are here' pulse dot orbits gate.1. - Axes cards: each card now has a dense mono viz showing the concept in motion — run.N trajectory table (behavior), memory-fill density bars (knowledge), or stacked panels of an evolving scaffold with new ops introduced each tick (scaffold, weighted). - Gates: nested vault chambers. gate.1 sharp, pulsing amber; gate.2 at normal opacity; gate.3 slightly blurred into halftone fog. - R7: halftone-density bars (dotted fills) with dramatic amber Δ arrow cutting across the middle. Ground layers: - Replaced Conway GOL with Bayer-dither canvas: 4x4 Bayer threshold against a low-freq sine noise field, repainted at ~2.4 fps. Amber specks appear ~2.5% of the time for warmth. - Added stardust: fixed halftone dot pattern (28px + 13px) drifting slowly. - Added grain: inline SVG fractal noise, overlay blend, 32% opacity. - Scroll reveal: paragraphs now 'develop' (blur+contrast → crisp) instead of plain fade. - Cursor halftone trail (throttled). Bilingual EN/ZH parity throughout including new epigraphs, abstract, classification, ticker, colophon. Respects prefers-reduced-motion for dither, stardust, grain, trail, and all transitions. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore.local | 1 + .vercel/project.json | 4 + assets/app.js | 1367 +++++++++++++++++++++---------- assets/styles.css | 1830 ++++++++++++++++++++++++++++++------------ index.html | 486 ++++++----- 5 files changed, 2530 insertions(+), 1158 deletions(-) create mode 100644 .gitignore.local create mode 100644 .vercel/project.json diff --git a/.gitignore.local b/.gitignore.local new file mode 100644 index 0000000..e985853 --- /dev/null +++ b/.gitignore.local @@ -0,0 +1 @@ +.vercel diff --git a/.vercel/project.json b/.vercel/project.json new file mode 100644 index 0000000..5a2b0b5 --- /dev/null +++ b/.vercel/project.json @@ -0,0 +1,4 @@ +{ + "projectId": "prj_CVa869W7Hd7C9C1wQZiqbEdhLxd3", + "orgId": "team_4xTQIqEY3SqKsWwyO8RqeEEp" +} diff --git a/assets/app.js b/assets/app.js index a26967f..4ab44b9 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,88 +1,176 @@ /* ============================================================ - TOKEN-IGNITION — front-end v0.1 (thesis redesign) - - scrollable academic layout - - hybrid terminal aesthetic + real form inputs - - bilingual EN / ZH - - procedural ASCII hero art - - background node topology + TOKEN-IGNITION — v0.1 · Selection Protocol ============================================================ */ (() => { "use strict"; + /* -------------------------------------------------------------- + storage shim + -------------------------------------------------------------- */ + + const SAFE_STORE = { + get(k) { try { return localStorage.getItem(k); } catch { return null; } }, + set(k, v) { try { localStorage.setItem(k, v); } catch {} }, + }; + /* -------------------------------------------------------------- i18n -------------------------------------------------------------- */ const I18N = { en: { - brand: "TOKEN-IGNITION // RESEARCH SELECTION", + brand: "TOKEN-IGNITION · SELECTION PROTOCOL", - heroSubtitle: "A selection gate for AI-native researchers", + classVersion: "SELECTION PROTOCOL v0.1", + classCohort: "COHORT №1", + classHost: "JOULE RESEARCH", + + heroIncipit: "for anyone who can build a scaffold that climbs the next rung without them.", + heroMasthead: "A SELECTION PROTOCOL", + heroSubtitle: "FOR AI-NATIVE RESEARCHERS · APR 2026", + heroAbstract: + "We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². The only question we ask is whether the scaffold you build can climb the next rung without you.", heroHook: - "Model horizons double every four months. The scaffolds around them do not. That gap is the work.", + "Model horizons double every four months. The scaffolds around them do not. That gap is the work.", heroTagline: "You define a long-horizon task. You build a scaffold that evolves itself. If the scaffold clears the AI audit, you are invited into the research group. Tokens are how we make that possible — not why.", - heroCTA: "↓ enter the gate", + heroCTA: "↓ submit your scaffold", + heroCTASub1: "no cv", + heroCTASub2: "no pitch", + heroCTASub3: "no interview", + heroStatGates: "gate.1", + heroStatGate1: "open · accepting", + heroStatIgnitions: "ignitions · v0.1", + heroStatIgnitionsVal: "0 / ∞", + heroStatWindow: "window", + heroStatWindowVal: "continuous", scrollHint: "scroll to read how selection works", + // Section epigraphs + manifestoEpigraph: "The scaffold is the bottleneck. This lab exists because the models are moving; the harnesses are not.", + ladderEpigraph: "Each order of magnitude unlocked becomes a product. The rest becomes research.", + axesEpigraph: "Evolution travels along three axes. Two are common. One is what we are looking for.", + protocolEpigraph: "Seven rules. The seventh is the one most submissions fail.", + rulesEpigraph: "If the AI auditor cannot verify it, it does not exist.", + allocationEpigraph: "Selection is a scaffold around the scaffold. Each gate awards more compute; each gate raises the bar.", + submitEpigraph: "Seven fields. The artifact is the application. Passing is the offer.", + + // Manifesto manifestoLabel: "manifesto", - manifestoTitle: "WHY THIS EXISTS", + manifestoTitle: "Why this exists", manifestoBody: ` -

Hiring in frontier AI is broken. The legible names get the interviews, the compute, the role. The people who would actually have moved the field rarely pass the filters.

+

Hiring in frontier AI is broken. The legible names get the interviews, the compute, the role. The people who would actually have moved the field rarely pass the filters.

CVs measure legibility, not ability. Pitches measure articulation, not craft. Interviews measure composure under pressure. None of these measure whether you can build a system that evolves itself.

-

Our bet is smaller and sharper than "find genius." Model capability doubles roughly every four months now — METR's measured cadence has only accelerated since the original paper. The engineering around it — memory, tools, planning loops, self-correction, coherence across long horizons — moves at a human pace, and caps out several orders of magnitude earlier than the models themselves could support. This lab exists to close that gap. We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². Each rung we unlock becomes a product.

-

We do not care about founders. We care about people whose systems can climb the next rung without them.

-

So we inverted the interview. You give us a task you defined and a scaffold you built. If the scaffold can clear the AI audit by evolving itself, you are in the research group. No CVs. No pitch decks. No intro calls. The artifact is the application. Passing is the offer.

+

Our bet is smaller and sharper than "find genius." Model capability doubles roughly every four months — METR's measured cadence has only accelerated since their original paper. The engineering around it — memory, tools, planning loops, self-correction, long-horizon coherence — moves at a human pace, and caps out several orders of magnitude earlier than the models themselves could support.

+

This lab exists to close that gap. We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². Each rung we unlock becomes a product. We do not care about founders. We care about people whose systems can climb the next rung without them.

+

So we inverted the interview. You give us a task you defined and a scaffold you built. If the scaffold can clear the AI audit by evolving itself, you are in the research group. The artifact is the application. Passing is the offer.

`, + // Gap viz + gapVizHead: "CAPABILITY · HORIZON PER TASK · LOG SCALE · 2024–2030", + gapModelLabel: "model", + gapScaffoldLabel: "scaffold", + gapModelAnnot: "×2 / 4mo", + gapScaffoldAnnot: "≈ flat", + gapZoneLabel: "the gap", + gapZoneSub: "( the lab )", + gapLegendTag: "the gap", + gapLegendNote: "widening every quarter.\nthis is the lab.", + + // Ladder ladderLabel: "orders of magnitude", - ladderTitle: "THE LADDER", + ladderTitle: "The ladder", ladderIntro: ` -

We measure our own progress by the token horizon of a single coherent task — the amount of compute a scaffold can meaningfully apply to one objective before it loses coherence, deviates, or stalls. Today's practical ceiling sits around 10⁶–10⁷. We are climbing to 10¹². Each order of magnitude earns engineering productization — a system spun out, resourced, shipped.

- `, - ladderAscii: -` 10¹² ──────────── ? the research frontier - 10¹¹ ─────────── autonomous long-horizon research - 10¹⁰ ────────── multi-month project execution - 10⁹ ───────── self-evolving codebases - 10⁸ ──────── gate.3 — ignition - 10⁷ ─────── gate.2 — verified - 10⁶ ────── gate.1 — admission`, - ladderClose: ` -

The first three rungs are the admission ramp. What happens above them is the lab.

+

We measure our own progress by the token horizon of a single coherent task — the amount of compute a scaffold can meaningfully apply to one objective before it loses coherence, deviates, or stalls.

+

Today's practical ceiling sits around 10⁶–10⁷. We are climbing to 10¹². Each order of magnitude earns engineering productization — a system spun out, resourced, shipped.

`, + ladderClose: "The first three rungs are the admission ramp. What happens above them is the lab.", + ladderVizHead: "TOKEN HORIZON · SINGLE COHERENT TASK", + ladderRungs: [ + { oom: "10⁶", name: "gate.1 — admission", kind: "gate", current: true }, + { oom: "10⁷", name: "gate.2 — verified", kind: "gate" }, + { oom: "10⁸", name: "gate.3 — ignition", kind: "gate" }, + { oom: "10⁹", name: "self-evolving codebases", kind: "lab" }, + { oom: "10¹⁰", name: "multi-month project execution", kind: "lab" }, + { oom: "10¹¹", name: "autonomous long-horizon research", kind: "lab" }, + { oom: "10¹²", name: "? the research frontier", kind: "frontier" }, + ], + ladderIgnitionLine: "— IGNITION LINE —", + ladderZoneLab: "· THE LAB ·", + ladderZoneRamp: "· ADMISSION RAMP ·", + ladderYouAreHere: "◀ here", + // Axes axesLabel: "what evolves", - axesTitle: "THREE AXES OF SELF-EVOLUTION", + axesTitle: "Three axes of self-evolution", axesIntro: `

A self-evolving scaffold must move along at least one of these axes between runs — without a human editing prompts, weights, or code in between. The third is rare. We weight it highest.

`, - axesItems: [ + axesCards: [ { tag: "01", name: "behavior", body: "The scaffold changes how it acts across runs — its policies, its decision rules, its strategy — without a human editing its prompt or code between runs.", + viz: `run.1 x ─→ A ─→ y +run.2 x ─→ A ─→ y′ +run.3 x ─→ B ─→ y″ +run.4 x ─→ B ─→ y‴ + +░░░░░░░░░░░░░░░░░░░░░░░░ +same input · diverging +path · no human edit.`, + cardClass: "card-01", }, { tag: "02", name: "knowledge", body: "The scaffold accumulates, distills, or restructures what it knows across runs — its memory, its representations, its internal references.", + viz: `run.1 ░░░░░░░░░░ 8 kb +run.2 ▒░░░░░░░░░ 23 kb +run.3 ▒▒░░░░░░░░ 56 kb +run.4 ▓▒░░░░░░░░ 120 kb +run.5 ▓▓▒▒░░░░░░ 240 kb +run.6 ▓▓▓▒▒░░░░░ 480 kb + +░░░░░░░░░░░░░░░░░░░░░░░░ +memory accrues, distills, +restructures.`, + cardClass: "card-02", }, { tag: "03", name: "scaffold", body: "The scaffold modifies itself across runs — its tools, its control loop, its evaluation criteria, its successor. This is the rare axis. This is the one we are looking for.", + viz: `t = 0 + [ run() ] + [ eval() ] + [ ↺ self ] +t = 1 + [ run() ] + [ eval() ] + [ rewrite()] ←new + [ ↺ self ] +t = 2 + [ run() ] + [ eval() ] + [ rewrite()] + [ fork() ] ←new + [ ↺ self′ ] + +the scaffold is the output.`, weighted: true, - weightNote: "highest weight", + weight: "highest weight", + cardClass: "card-03", }, ], axesCalloutHead: "// SELECTION NOTE", axesCalloutBody: "A submission may target one axis or several. The evaluation rewards demonstrations along axis 03. A system that only rewrites its prompt is not, by itself, a self-evolving scaffold.", + // Protocol protocolLabel: "protocol", - protocolTitle: "META-RULES", + protocolTitle: "Meta-rules", protocolItems: [ ["R1", "You define the task. The task must be long-horizon, and must require a scaffold that evolves itself to extend the achievable horizon further."], ["R2", "You define the evaluation criterion. It must be reproducible and machine-verifiable."], @@ -90,196 +178,280 @@ ["R4", "All submissions are AI-judged. Human audit is random and post-hoc."], ["R5", "Identity is irrelevant. Submissions are accepted under pseudonym."], ["R6", "Selection is gated. Pass a gate, unlock more resources. Pass the final gate, join the research."], - ["R7", "Ablation is required. You must submit a baseline run on the same model with the minimal scaffold. The delta is the evidence. A scaffold that cannot beat its own ablation is not evolving — it is merely present."], + ["R7", "Ablation is required. You must submit a baseline run on the same model with the minimal scaffold. The delta is the evidence. A scaffold that cannot beat its own ablation is not evolving — it is merely present.", true], ], + r7Head: "R7 · THE ABLATION PROOF", + r7Sub: "pass-rate on held-out tasks", + r7ScaffoldLabel: "your scaffold", + r7BaselineLabel: "your ablation · minimal scaffold", + r7DeltaTag: "SCAFFOLD", + r7EvidenceTag: "ABLATION", + r7DeltaNote: + "the delta is the evidence. a scaffold that cannot beat its own ablation is not evolving — it is merely present. without the delta, a scaffold is riding on model capability, not earning its claim.", + + // Rules rulesLabel: "submission requirements", - rulesTitle: "WHAT COUNTS AS A VALID SUBMISSION", + rulesTitle: "What counts as a valid submission", rulesItems: [ - { - head: "01 // Self-evolution, not prompt-engineering.", - body: [ - "The scaffold must modify its own behavior, knowledge, or structure", - "across iterations — without human edits between runs.", - ], - }, - { - head: "02 // Machine-verifiable output.", - body: [ - "The evaluation criterion must be checkable by an AI auditor", - "with no proprietary access — public endpoint, public artifact.", - ], - }, - { - head: "03 // Live, AI-readable endpoint.", - body: [ - "You must provide a URL an AI can crawl. HTML is fine.", - "JSON / OpenAPI / plain text are better. Logins, captchas, GUIs are not accepted.", - ], - }, - { - head: "04 // Ablation baseline.", - body: [ - "A second endpoint or log: same model, minimal scaffold, same task.", - "Your scaffold's contribution is the delta between this and the main endpoint.", - ], - }, - { - head: "05 // Reproducibility micro-run.", - body: [ - "Attach at least one log of a full run: inputs, intermediate state,", - "final artifact hash. Our auditor re-runs a randomly sampled slice.", - ], - }, + { head: "01 // Self-evolution, not prompt-engineering.", body: ["The scaffold must modify its own behavior, knowledge, or structure", "across iterations — without human edits between runs."] }, + { head: "02 // Machine-verifiable output.", body: ["The evaluation criterion must be checkable by an AI auditor", "with no proprietary access — public endpoint, public artifact."] }, + { head: "03 // Live, AI-readable endpoint.", body: ["You must provide a URL an AI can crawl. HTML is fine.", "JSON / OpenAPI / plain text are better. Logins, captchas, GUIs are not accepted."] }, + { head: "04 // Ablation baseline.", body: ["A second endpoint or log: same model, minimal scaffold, same task.", "Your scaffold's contribution is the delta between this and the main endpoint."] }, + { head: "05 // Reproducibility micro-run.", body: ["Attach at least one log of a full run: inputs, intermediate state,", "final artifact hash. Our auditor re-runs a randomly sampled slice."] }, ], rulesCalloutHead: "// AUDIT NOTE", rulesCalloutBody: "If the AI auditor cannot independently verify your artifact, the submission is rejected. We do not email you for clarifications. The endpoint is the application.", + // Gates allocationLabel: "the three gates", - allocationTitle: "HOW SELECTION WORKS", - allocation1Note: - "Admission tier. Any well-formed submission receives a 1M token budget to run and prove its system.", - allocation2Note: - "Verified tier. Unlocked when the AI auditor confirms reproducible self-evolution on your gate.1 artifact — and when the delta against your ablation is real.", - allocation3Note: - "Research tier. Unlocked when scaffold-level evolution — not merely behavioral drift — is verified by consensus of ≥3 independent models. Gate.3 clearance is a standing invitation to join the research group.", - + allocationTitle: "How selection works", + allocationIntro: ` +

Selection is gated. Each gate awards more compute; each gate raises the bar. The gates are not a funnel — they are a scaffold around the scaffold, pulling capable work through as it proves itself.

+

Admission is cheap. Ignition is earned. The last gate is a standing invitation into the research group, not a round of interviews.

+ `, + allocationQuote: "Clearing gate.3 is how you get in. Tokens are the side-effect that lets you keep going.", + gpCmd: "gate.status --watch", + gpLabel1: "admission", + gpLabel2: "verified", + gpLabel3: "ignition", + gpState1: "● OPEN", + gpState2: "○ SEALED", + gpState3: "○ SEALED", + gpUnlocksWhen: "unlocks when", + gpGrants: "grants", + gpCond1a: "any well-formed submission", + gpCond2a: "reproducible self-evolution", + gpCond2b: "delta > 0 against ablation baseline", + gpCond3a: "scaffold-level evolution (not behavioral drift)", + gpCond3b: "verified by consensus of ≥ 3 independent models", + gpGrants3: "standing invitation into the research group", + gpLive1: "now accepting", + + // Submit submitLabel: "submission", - submitTitle: "APPLY BY SUBMITTING", + submitTitle: "Apply by submitting", submitIntro: "Seven fields. No account. Your entry is hashed and appended to a public ledger. AI audit starts within 24h. Clear the final gate and we reach out to talk about joining the research.", field1Label: "task.definition", - field1Hint: - "What long-horizon task does the scaffold have to do? One paragraph. Must be testable. Must require a horizon the naked model cannot reach.", - field1Ph: - "e.g. Given an open bug in a large Python codebase, the scaffold must autonomously produce a reproducing test, locate the root cause, patch it, and converge to all-green CI — across runs that span >10⁶ tokens of reading, editing, and verification.", + field1Hint: "What long-horizon task does the scaffold have to do? One paragraph. Must be testable. Must require a horizon the naked model cannot reach.", + field1Ph: "e.g. Given an open bug in a large Python codebase, the scaffold must autonomously produce a reproducing test, locate the root cause, patch it, and converge to all-green CI — across runs that span >10⁶ tokens of reading, editing, and verification.", field2Label: "verification.criterion", - field2Hint: - "How will an AI auditor know you passed? Give the exact check.", - field2Ph: - "e.g. Auditor fetches /benchmark → receives JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }. Passes if status == 'green' on all held-out bugs AND task_token_count ≥ 10⁶ AND scaffold_delta_vs_baseline ≥ +40% on pass rate.", + field2Hint: "How will an AI auditor know you passed? Give the exact check.", + field2Ph: "e.g. Auditor fetches /benchmark → receives JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }. Passes if status == 'green' on all held-out bugs AND task_token_count ≥ 10⁶ AND scaffold_delta_vs_baseline ≥ +40% on pass rate.", field3Label: "evolution.axes", - field3Hint: - "Which axis does your scaffold evolve along? Select one or more. Axis 03 (scaffold) weighs highest.", + field3Hint: "Which axis does your scaffold evolve along? Select one or more. Axis 03 (scaffold) weighs highest.", field3OptBehavior: "behavior", field3OptKnowledge: "knowledge", field3OptScaffold: "scaffold", field3OptWeight: "highest weight", field4Label: "execution.plan", - field4Hint: - "How does the scaffold evolve itself? What loop, what signal, what memory, what modifies what?", - field4Ph: - "Describe the self-modification loop — what the scaffold observes, how it updates itself, how it decides to stop. Write as you would write it to a peer reviewer, not to a VC.", + field4Hint: "How does the scaffold evolve itself? What loop, what signal, what memory, what modifies what?", + field4Ph: "Describe the self-modification loop — what the scaffold observes, how it updates itself, how it decides to stop. Write as you would write it to a peer reviewer, not to a VC.", field5Label: "live.endpoint", - field5Hint: - "A URL an AI can hit right now and get a machine-readable result.", + field5Hint: "A URL an AI can hit right now and get a machine-readable result.", field5Ph: "https://…", - field5Artifact: - "attach run log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", + field5Artifact: "attach run log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", field6Label: "ablation.baseline", - field6Hint: - "A second URL: same model, minimal scaffold, same task. The delta between this and your main endpoint is your scaffold's contribution.", + field6Hint: "A second URL: same model, minimal scaffold, same task. The delta between this and your main endpoint is your scaffold's contribution.", field6Ph: "https://…/baseline", - field6Artifact: - "attach baseline log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", + field6Artifact: "attach baseline log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", field7Label: "contact.handle", - field7Hint: - "A pseudonym is fine. We only use it to notify you when a gate opens.", + field7Hint: "A pseudonym is fine. We only use it to notify you when a gate opens.", field7Ph: "e.g. @handle on X, discord username, or email", - consent: - "I confirm my submission is my own work, both endpoints are live, and I accept AI-judged, non-negotiable evaluation.", + consent: "I confirm my submission is my own work, both endpoints are live, and I accept AI-judged, non-negotiable evaluation.", submitButton: "submit", - footLeft: "TOKEN-IGNITION // RESEARCH SELECTION // v0.1", - footRight: "RESEARCH HOST: JOULE RESEARCH", - + // Ledger ledgerLabel: "ledger", - ledgerTitle: "RECENT APPLICATIONS", - ledgerIntro: - "Every application is stored as a hash on a public repository. No personal data is published.", + ledgerTitle: "Recent applications", + ledgerIntro: "Every application is stored as a hash on a public repository. No personal data is published.", + + // Ticker phrases + ticker: [ + "the endpoint is the application", + "passing is the offer", + "scaffold-level evolution is the rare axis", + "a scaffold that cannot beat its own ablation is merely present", + "we do not hire on cvs", + "the task is the interview", + "tokens are how — not why", + "this lab exists to close the gap", + "no cv · no pitch · no interview", + "the artifact is the application", + ], + + // Colophon + colTypoTitle: "TYPOGRAPHY", + colTypo1: "Display · Fraunces, by Undercase Type", + colTypo2: "Body · Newsreader, by Production Type", + colTypo3: "Technical · IBM Plex Mono, by Mike Abbink", + colProvTitle: "PROVENANCE", + colProv1: "Drafted in the open.", + colProv2: "Joule Research · April 2026", + colProv3: "Selection Protocol v0.1 · living document", + colMarkTitle: "MARK", + colMark1: "“The scaffold is the output.”", + colMark2: "amendments commit to ledger. watch the ledger.", + + footLeft: "TOKEN-IGNITION · SELECTION PROTOCOL · v0.1", + footRight: "RESEARCH HOST: JOULE RESEARCH", feedback: { missing: "[reject] missing required fields. check highlighted items.", - badUrl: - "[reject] live.endpoint must be a valid URL — our auditor has to crawl it.", - badBaseline: - "[reject] ablation.baseline must be a valid URL — we audit the delta, not the artifact alone.", - noAxis: - "[reject] evolution.axes must have at least one selected — we need to know what is evolving.", - ok: (hash) => - `[accept] entry ${hash} queued.\nAI audit window: 24h.\nYou will not receive a confirmation email. Watch the ledger.`, + badUrl: "[reject] live.endpoint must be a valid URL — our auditor has to crawl it.", + badBaseline: "[reject] ablation.baseline must be a valid URL — we audit the delta, not the artifact alone.", + noAxis: "[reject] evolution.axes must have at least one selected — we need to know what is evolving.", + ok: (hash) => `[accept] entry ${hash} queued.\nAI audit window: 24h.\nyou will not receive a confirmation email. watch the ledger.`, }, }, zh: { - brand: "TOKEN-IGNITION // 研究员筛选", + brand: "TOKEN-IGNITION · 研究员筛选协议", - heroSubtitle: "面向 AI 原生研究员的筛选入口", + classVersion: "筛选协议 v0.1", + classCohort: "COHORT №1", + classHost: "JOULE RESEARCH", + + heroIncipit: "献给能造出一个不依赖自己就能爬上下一级阶梯的脚手架的人。", + heroMasthead: "一 份 筛 选 协 议", + heroSubtitle: "面向 AI 原生研究员 · 2026 年 4 月", + heroAbstract: + "我们正沿着 token 跨度的阶梯往上爬:从 10⁶ 到 10¹²,衡量的是单个连贯任务上的算力投入。我们只问一个问题:你构造的脚手架,能不能在没有你的情况下,爬上下一级。", heroHook: - "模型能力每四个月翻一倍。包在模型外面的脚手架不会。这中间的落差,就是我们要做的事。", + "模型能力每四个月翻一倍。包在模型外面的脚手架不会。这中间的落差,就是我们要做的事。", heroTagline: "你定义一个长跨度的任务。你构建一个会自我进化的脚手架。如果脚手架通过 AI 审计,你将被邀请进入研究组。token 是让这件事成立的方式,不是我们做这件事的理由。", - heroCTA: "↓ 进入申请", + heroCTA: "↓ 提交你的脚手架", + heroCTASub1: "不看简历", + heroCTASub2: "不看 pitch", + heroCTASub3: "不做 intro call", + heroStatGates: "gate.1", + heroStatGate1: "开放 · 接受申请", + heroStatIgnitions: "点火数 · v0.1", + heroStatIgnitionsVal: "0 / ∞", + heroStatWindow: "窗口", + heroStatWindowVal: "持续开放", scrollHint: "向下滚动,了解筛选机制", + manifestoEpigraph: "脚手架是瓶颈。这个 lab 之所以存在,是因为模型在跑,而包裹它们的工程没有跟上。", + ladderEpigraph: "每解锁一个数量级,就变成一个产品。其余的,就是研究。", + axesEpigraph: "进化沿三条轴发生。两条常见,一条才是我们要找的。", + protocolEpigraph: "七条规则。多数提交败在第七条。", + rulesEpigraph: "AI 审计若不能验证,它就不存在。", + allocationEpigraph: "筛选本身就是脚手架外面的脚手架。每道门奖更多算力;每道门也把门槛抬得更高。", + submitEpigraph: "七个字段。作品本身就是申请。通过,就是 offer。", + manifestoLabel: "宣言", manifestoTitle: "为什么做这件事", manifestoBody: ` -

前沿 AI 领域的招聘机制是坏的。能被看见的名字拿到面试、拿到算力、拿到位置。真正可能推动这个行业的人,往往过不了筛子。

+

前沿 AI 领域的招聘机制是坏的。能被看见的名字拿到面试、拿到算力、拿到位置。真正可能推动这个行业的人,往往过不了筛子。

简历衡量的是可读性,不是能力。Pitch 衡量的是表达,不是手艺。面试衡量的是临场镇定。没有一项,真正衡量你能不能造出一个会自我进化的系统。

-

我们的赌注比"寻找天才"更窄、更锋利。模型能力现在每约四个月就翻一倍——METR 测到的节奏自那篇原文之后只在加速。围绕在模型外面的工程——记忆、工具、规划循环、自我纠错、长跨度的一致性——以人的速度前进,并且常常在模型尚有余力时,就已经到顶了几个数量级。这个 lab 存在的意义,是弥合这个落差。我们正在沿着一条阶梯往上爬:单个连贯任务可持续的 token 跨度,从 10⁶ 到 10¹²。每解锁一个数量级,对应的能力就被直接工程化为产品。

-

我们不在乎创始人。我们在乎的是:一个人造出的系统,能不能在没有他的情况下继续往上爬。

-

所以我们把面试反过来。你交给我们:一个你定义的任务,一个你构造的脚手架。如果脚手架能通过 AI 审计——靠它自己的进化——你就进入研究组。不看简历。不看 pitch。不做 intro call。作品本身就是申请。通过,就是 offer。

+

我们的赌注比"寻找天才"更窄、更锋利。模型能力现在每约四个月就翻一倍——METR 测到的节奏自那篇原文之后只在加速。围绕在模型外面的工程——记忆、工具、规划循环、自我纠错、长跨度的一致性——以人的速度前进,并且常常在模型尚有余力时,就已经到顶了几个数量级。

+

这个 lab 存在的意义,是弥合这个落差。我们正在沿着一条阶梯往上爬:单个连贯任务可持续的 token 跨度,从 10⁶ 到 10¹²。每解锁一个数量级,对应的能力就直接做成产品。我们不在乎创始人。我们在乎的是:一个人造出的系统,能不能在没有他的情况下继续往上爬。

+

所以我们把面试反过来。你交给我们:一个你定义的任务,一个你构造的脚手架。如果脚手架能通过 AI 审计——靠它自己的进化——你就进入研究组。作品本身就是申请。通过,就是 offer。

`, + gapVizHead: "能力 · 单任务跨度 · 对数坐标 · 2024–2030", + gapModelLabel: "模型", + gapScaffoldLabel: "脚手架", + gapModelAnnot: "×2 / 4月", + gapScaffoldAnnot: "≈ 几乎不变", + gapZoneLabel: "落差", + gapZoneSub: "( 这就是 lab )", + gapLegendTag: "落差", + gapLegendNote: "每个季度都在变大。\n这就是 lab。", + ladderLabel: "数量级", ladderTitle: "阶梯", ladderIntro: ` -

我们用一个指标衡量自己的进展:单个连贯任务的 token 跨度——一个脚手架能把多少计算持续投入到同一个目标上,在它失去一致性、偏题、或停滞之前。今天实际的天花板在 10⁶–10⁷ 这一档。我们想爬到 10¹²。每解锁一个数量级,对应的能力就直接做成产品——独立出来、分配资源、端到端交付。

- `, - ladderAscii: -` 10¹² ──────────── ? 研究前沿 - 10¹¹ ─────────── 自主长跨度科研 - 10¹⁰ ────────── 多月级项目执行 - 10⁹ ───────── 会自我进化的代码库 - 10⁸ ──────── gate.3 — 点火 - 10⁷ ─────── gate.2 — 验证 - 10⁶ ────── gate.1 — 入围`, - ladderClose: ` -

前三级只是入围的坡道。真正的 lab,在它们之上。

+

我们用一个指标衡量自己的进展:单个连贯任务的 token 跨度——一个脚手架能把多少计算持续投入到同一个目标上,在它失去一致性、偏题、或停滞之前。

+

今天实际的天花板在 10⁶–10⁷ 这一档。我们想爬到 10¹²。每解锁一个数量级,对应的能力就直接做成产品——独立出来、分配资源、端到端交付。

`, + ladderClose: "前三级只是入围的坡道。真正的 lab,在它们之上。", + ladderVizHead: "TOKEN 跨度 · 单个连贯任务", + ladderRungs: [ + { oom: "10⁶", name: "gate.1 — 入围", kind: "gate", current: true }, + { oom: "10⁷", name: "gate.2 — 验证", kind: "gate" }, + { oom: "10⁸", name: "gate.3 — 点火", kind: "gate" }, + { oom: "10⁹", name: "会自我进化的代码库", kind: "lab" }, + { oom: "10¹⁰", name: "多月级项目执行", kind: "lab" }, + { oom: "10¹¹", name: "自主长跨度科研", kind: "lab" }, + { oom: "10¹²", name: "? 研究前沿", kind: "frontier" }, + ], + ladderIgnitionLine: "— 点火线 —", + ladderZoneLab: "· 真正的 lab ·", + ladderZoneRamp: "· 入围坡道 ·", + ladderYouAreHere: "◀ 此处", axesLabel: "何谓进化", axesTitle: "自我进化的三条轴", axesIntro: `

一个会自我进化的脚手架,在两次运行之间,必须在以下三条轴上至少有一条发生变化——并且期间没有人为编辑 prompt、权重或代码。第三条最稀有。我们也给它最高权重。

`, - axesItems: [ + axesCards: [ { tag: "01", name: "行为", body: "脚手架在多次运行之间,改变自己怎么行动——策略、决策规则、方法——期间没有人动它的 prompt 或代码。", + viz: `run.1 x ─→ A ─→ y +run.2 x ─→ A ─→ y′ +run.3 x ─→ B ─→ y″ +run.4 x ─→ B ─→ y‴ + +░░░░░░░░░░░░░░░░░░░░░░░░ +同输入 · 路径发散 +期间无人工编辑。`, + cardClass: "card-01", }, { tag: "02", name: "知识", body: "脚手架在多次运行之间,积累、蒸馏、或重构自己所知的内容——记忆、表征、内部参照。", + viz: `run.1 ░░░░░░░░░░ 8 kb +run.2 ▒░░░░░░░░░ 23 kb +run.3 ▒▒░░░░░░░░ 56 kb +run.4 ▓▒░░░░░░░░ 120 kb +run.5 ▓▓▒▒░░░░░░ 240 kb +run.6 ▓▓▓▒▒░░░░░ 480 kb + +░░░░░░░░░░░░░░░░░░░░░░░░ +记忆累积 · 蒸馏 · 重构。`, + cardClass: "card-02", }, { tag: "03", name: "脚手架", body: "脚手架跨运行修改自己——自己的工具、控制循环、评判标准,乃至后继者。这条轴最少见。也正是我们要找的那条。", + viz: `t = 0 + [ run() ] + [ eval() ] + [ ↺ self ] +t = 1 + [ run() ] + [ eval() ] + [ rewrite()] ←新 + [ ↺ self ] +t = 2 + [ run() ] + [ eval() ] + [ rewrite()] + [ fork() ] ←新 + [ ↺ self′ ] + +脚手架就是产出。`, weighted: true, - weightNote: "最高权重", + weight: "最高权重", + cardClass: "card-03", }, ], axesCalloutHead: "// 评估说明", @@ -295,47 +467,26 @@ ["R4", "所有提交由 AI 评判。人工审计是随机抽查,事后进行。"], ["R5", "身份无关。允许使用化名提交。"], ["R6", "筛选分档。通过一档,解锁更多资源;通过最终档,进入研究组。"], - ["R7", "必须提供消融对照。同一个模型、最小脚手架、同一任务,再跑一遍基线。差值就是证据。打不过自己消融基线的脚手架不在进化——它只是在场。"], + ["R7", "必须提供消融对照。同一个模型、最小脚手架、同一任务,再跑一遍基线。差值就是证据。打不过自己消融基线的脚手架不在进化——它只是在场。", true], ], + r7Head: "R7 · 消融证据", + r7Sub: "留出任务上的通过率", + r7ScaffoldLabel: "你的脚手架", + r7BaselineLabel: "你的消融基线 · 最小脚手架", + r7DeltaTag: "脚手架", + r7EvidenceTag: "消融", + r7DeltaNote: + "差值即证据。打不过自己消融基线的脚手架不在进化,只是在场。若没有差值,你的脚手架只是在骑模型能力的红利,而不是凭自己挣。", + rulesLabel: "提交要求", rulesTitle: "怎样才算一个有效提交", rulesItems: [ - { - head: "01 // 必须是自我进化,而不是 prompt 工程。", - body: [ - "脚手架在多轮迭代之间必须改变自己的行为、知识、或结构,", - "而不是由人手动改 prompt、改权重或改代码。", - ], - }, - { - head: "02 // 机器可验证的输出。", - body: [ - "评估标准必须允许 AI 审计在无专有接口的情况下独立核对——", - "公开端点,公开产物。", - ], - }, - { - head: "03 // 活的、AI 可读的端点。", - body: [ - "你必须提供一个 AI 能直接访问的 URL。HTML 也可以,", - "JSON / OpenAPI / 纯文本更好。登录、验证码、纯图形界面不接受。", - ], - }, - { - head: "04 // 消融基线。", - body: [ - "第二个端点或日志:同模型、最小脚手架、同任务。", - "你脚手架的贡献,就是它和主端点之间的差值。", - ], - }, - { - head: "05 // 可复现的最小运行记录。", - body: [ - "至少附一段完整运行日志:输入、中间状态、最终产物哈希。", - "我们的审计器会随机抽一小段重跑。", - ], - }, + { head: "01 // 必须是自我进化,而不是 prompt 工程。", body: ["脚手架在多轮迭代之间必须改变自己的行为、知识、或结构,", "而不是由人手动改 prompt、改权重或改代码。"] }, + { head: "02 // 机器可验证的输出。", body: ["评估标准必须允许 AI 审计在无专有接口的情况下独立核对——", "公开端点,公开产物。"] }, + { head: "03 // 活的、AI 可读的端点。", body: ["你必须提供一个 AI 能直接访问的 URL。HTML 也可以,", "JSON / OpenAPI / 纯文本更好。登录、验证码、纯图形界面不接受。"] }, + { head: "04 // 消融基线。", body: ["第二个端点或日志:同模型、最小脚手架、同任务。", "你脚手架的贡献,就是它和主端点之间的差值。"] }, + { head: "05 // 可复现的最小运行记录。", body: ["至少附一段完整运行日志:输入、中间状态、最终产物哈希。", "我们的审计器会随机抽一小段重跑。"] }, ], rulesCalloutHead: "// 审计说明", rulesCalloutBody: @@ -343,12 +494,27 @@ allocationLabel: "三道门", allocationTitle: "筛选机制", - allocation1Note: - "入围档。任何合规提交即获得 1M token 预算,用于让系统跑起来、自证能力。", - allocation2Note: - "验证档。当 AI 审计确认 gate.1 的产物具备可复现的自我进化、且相对消融基线存在真实差值,解锁。", - allocation3Note: - "研究档。当产物出现脚手架层级的进化——不止于行为漂移——并由 ≥3 个独立模型共识验证,解锁。通过 gate.3,就是进入研究组的长期邀请。", + allocationIntro: ` +

筛选分档。每道门给更多算力;每道门也把评判抬得更高。这些门不是漏斗——它们是脚手架外面的脚手架,让足以自证的作品被不断拉上来。

+

入围便宜。点火靠挣。最后那道门不是一轮面试,而是一份进入研究组的长期邀请。

+ `, + allocationQuote: "通过 gate.3 就是入选。token 只是让你继续走下去的副产物。", + gpCmd: "gate.status --watch", + gpLabel1: "入围", + gpLabel2: "验证", + gpLabel3: "点火", + gpState1: "● 开放", + gpState2: "○ 锁定", + gpState3: "○ 锁定", + gpUnlocksWhen: "解锁条件", + gpGrants: "获得", + gpCond1a: "任何合规的提交", + gpCond2a: "可复现的自我进化", + gpCond2b: "相对消融基线的差值 > 0", + gpCond3a: "脚手架层级的进化,非行为漂移", + gpCond3b: "由 ≥ 3 个独立模型共识验证", + gpGrants3: "进入研究组的长期邀请", + gpLive1: "正在接收", submitLabel: "申请", submitTitle: "提交即申请", @@ -356,90 +522,93 @@ "七个字段。不用注册账号。提交会被哈希后写入公开账本,AI 审计将在 24 小时内开始。通过最终门槛,我们会主动联系你,谈加入研究组的事。", field1Label: "task.definition", - field1Hint: - "脚手架要完成怎样一个长跨度任务?一段话。必须可测试。必须要求一个裸模型够不到的跨度。", - field1Ph: - "例:给定一个大型 Python 代码库里的开放缺陷,脚手架需自主复现该缺陷的测试、定位根因、打补丁,并在超过 10⁶ 个 token 的阅读、编辑与验证之后,让 CI 全绿。", + field1Hint: "脚手架要完成怎样一个长跨度任务?一段话。必须可测试。必须要求一个裸模型够不到的跨度。", + field1Ph: "例:给定一个大型 Python 代码库里的开放缺陷,脚手架需自主复现该缺陷的测试、定位根因、打补丁,并在超过 10⁶ 个 token 的阅读、编辑与验证之后,让 CI 全绿。", field2Label: "verification.criterion", field2Hint: "AI 审计怎么判断你通过了?给出确切的校验方式。", - field2Ph: - "例:审计器访问 /benchmark → 返回 JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }。若全部留出缺陷的 status == 'green',且 task_token_count ≥ 10⁶,且脚手架相对基线的 pass 率差值 ≥ +40%,即为通过。", + field2Ph: "例:审计器访问 /benchmark → 返回 JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }。若全部留出缺陷的 status == 'green',且 task_token_count ≥ 10⁶,且脚手架相对基线的 pass 率差值 ≥ +40%,即为通过。", field3Label: "evolution.axes", - field3Hint: - "你的脚手架在哪条轴上进化?可多选。第 03 条(脚手架本身)权重最高。", + field3Hint: "你的脚手架在哪条轴上进化?可多选。第 03 条(脚手架本身)权重最高。", field3OptBehavior: "行为", field3OptKnowledge: "知识", field3OptScaffold: "脚手架", field3OptWeight: "最高权重", field4Label: "execution.plan", - field4Hint: - "脚手架如何自我进化?哪条循环、哪个信号、哪块记忆、哪一部分在改哪一部分?", - field4Ph: - "描述自我修改的循环——脚手架观察什么、如何更新自身、如何判断停止。写给同行,不是写给投资人。", + field4Hint: "脚手架如何自我进化?哪条循环、哪个信号、哪块记忆、哪一部分在改哪一部分?", + field4Ph: "描述自我修改的循环——脚手架观察什么、如何更新自身、如何判断停止。写给同行,不是写给投资人。", field5Label: "live.endpoint", field5Hint: "一个现在就能被 AI 访问、拿到机器可读结果的 URL。", field5Ph: "https://…", - field5Artifact: - "附运行日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", + field5Artifact: "附运行日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", field6Label: "ablation.baseline", - field6Hint: - "第二个 URL:同模型、最小脚手架、同任务。它和主端点之间的差值,就是你脚手架的贡献。", + field6Hint: "第二个 URL:同模型、最小脚手架、同任务。它和主端点之间的差值,就是你脚手架的贡献。", field6Ph: "https://…/baseline", - field6Artifact: - "附基线日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", + field6Artifact: "附基线日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", field7Label: "contact.handle", field7Hint: "化名也可以。仅用于在门槛解锁时通知你。", field7Ph: "例:X 上的 @handle、Discord 用户名或邮箱", - consent: - "我确认这是我本人的作品,两个端点当前均可访问,并接受由 AI 评判、不可申诉的评估结果。", + consent: "我确认这是我本人的作品,两个端点当前均可访问,并接受由 AI 评判、不可申诉的评估结果。", submitButton: "提交", - footLeft: "TOKEN-IGNITION // 研究员筛选 // v0.1", - footRight: "研究承载方:JOULE RESEARCH", - ledgerLabel: "账本", ledgerTitle: "近期申请", ledgerIntro: "每条申请以哈希形式写入公开仓库,不发布任何个人信息。", + ticker: [ + "端点本身就是申请书", + "通过,就是 offer", + "脚手架层级的进化是最稀有的轴", + "打不过自己消融基线的脚手架只是在场", + "我们不看简历", + "任务本身就是面试", + "token 是方式 —— 不是理由", + "这个 lab 存在是为了弥合落差", + "不看简历 · 不看 pitch · 不做 intro call", + "作品就是申请", + ], + + colTypoTitle: "TYPOGRAPHY", + colTypo1: "Display · Fraunces, Undercase Type", + colTypo2: "Body · Newsreader, Production Type", + colTypo3: "Technical · IBM Plex Mono, Mike Abbink", + colProvTitle: "PROVENANCE", + colProv1: "在开放中起草。", + colProv2: "Joule Research · 2026 年 4 月", + colProv3: "筛选协议 v0.1 · 活文档", + colMarkTitle: "MARK", + colMark1: "“脚手架就是产出。”", + colMark2: "修订提交至账本。关注账本。", + + footLeft: "TOKEN-IGNITION · 研究员筛选协议 · v0.1", + footRight: "研究承载方:JOULE RESEARCH", + feedback: { missing: "[reject] 必填字段缺失。请检查标红项。", badUrl: "[reject] live.endpoint 必须是有效 URL——审计器需要抓取它。", - badBaseline: - "[reject] ablation.baseline 必须是有效 URL——我们评估的是差值,不是单个产物。", - noAxis: - "[reject] evolution.axes 至少要选一项——我们需要知道究竟是什么在进化。", - ok: (hash) => - `[accept] 条目 ${hash} 已入队。\nAI 审计窗口:24 小时。\n我们不会发确认邮件,请关注账本。`, + badBaseline: "[reject] ablation.baseline 必须是有效 URL——我们评估的是差值,不是单个产物。", + noAxis: "[reject] evolution.axes 至少要选一项——我们需要知道究竟是什么在进化。", + ok: (hash) => `[accept] 条目 ${hash} 已入队。\nAI 审计窗口:24 小时。\n我们不会发确认邮件,请关注账本。`, }, }, }; - const SAFE_STORE = { - get(k) { - try { - return localStorage.getItem(k); - } catch { - return null; - } - }, - set(k, v) { - try { - localStorage.setItem(k, v); - } catch { - /* ignore storage errors (private-mode, sandboxed contexts) */ - } - }, - }; - let LANG = SAFE_STORE.get("ti.lang") || "en"; + function escapeHtml(s) { + return String(s) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); + } + /* -------------------------------------------------------------- i18n renderer -------------------------------------------------------------- */ @@ -448,257 +617,547 @@ const t = I18N[LANG]; document.documentElement.lang = LANG === "zh" ? "zh-CN" : "en"; - // text / html content document.querySelectorAll("[data-i18n]").forEach((el) => { const key = el.getAttribute("data-i18n"); if (t[key] === undefined) return; const val = t[key]; if (typeof val !== "string") return; - //
 elements always get textContent to preserve whitespace
-      if (el.tagName === "PRE") {
-        el.textContent = val;
-      } else if (val.trim().startsWith("<")) {
-        el.innerHTML = val;
-      } else {
-        el.textContent = val;
-      }
+      if (el.tagName === "PRE") el.textContent = val;
+      else if (val.includes("<")) el.innerHTML = val;
+      else el.textContent = val;
     });
 
-    // placeholders
     document.querySelectorAll("[data-i18n-ph]").forEach((el) => {
       const key = el.getAttribute("data-i18n-ph");
       if (t[key] !== undefined) el.setAttribute("placeholder", t[key]);
     });
 
-    // protocol list
-    const pList = document.getElementById("protocol-list");
-    if (pList) {
-      pList.innerHTML = t.protocolItems
-        .map(
-          ([k, v]) =>
-            `
  • ${k}${escapeHtml(v)}
  • ` - ) - .join(""); - } - - // rules list - const rList = document.getElementById("rules-list"); - if (rList) { - rList.innerHTML = t.rulesItems - .map( - (r) => - `
  • -
    ${escapeHtml(r.head)}
    -
    - ${r.body.map((line) => `
    ${escapeHtml(line)}
    `).join("")} -
    -
  • ` - ) - .join(""); + // abstract gets typewrite once per language switch + const abs = document.getElementById("hero-abstract"); + if (abs) { + const src = t.heroAbstract; + abs.innerHTML = ""; + typewriteHTML(abs, src + '', 12); } - // axes grid - const aGrid = document.getElementById("axes-grid"); - if (aGrid) { - aGrid.innerHTML = t.axesItems - .map( - (a) => ` -
    -
    ${escapeHtml(a.tag)}
    -
    ${escapeHtml(a.name)}
    -
    ${escapeHtml(a.body)}
    - ${a.weighted ? `
    ${escapeHtml(a.weightNote)}
    ` : ""} -
    - ` - ) - .join(""); - } + renderProtocol(); + renderRules(); + renderAxes(); + renderGapSVG(); + renderLadderSVG(); + renderTicker(); - // lang buttons aria-current document.querySelectorAll(".lang-btn").forEach((b) => { - b.setAttribute( - "aria-current", - b.getAttribute("data-lang") === LANG ? "true" : "false" - ); + b.setAttribute("aria-current", b.getAttribute("data-lang") === LANG ? "true" : "false"); }); } - function escapeHtml(s) { - return String(s) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """); + function typewriteHTML(el, html, msPerChar) { + // strip tags into a character list but remember where tags go + let i = 0; + const out = []; + const finalHtml = html; + let shown = 0; + const total = finalHtml.replace(/<[^>]+>/g, "").length; + const step = () => { + shown++; + // collect up to `shown` visible characters, preserving HTML tags inline + let visibleCount = 0; + let result = ""; + let k = 0; + while (k < finalHtml.length) { + if (finalHtml[k] === "<") { + const close = finalHtml.indexOf(">", k); + if (close === -1) break; + result += finalHtml.slice(k, close + 1); + k = close + 1; + continue; + } + if (visibleCount >= shown) break; + result += finalHtml[k]; + visibleCount++; + k++; + } + el.innerHTML = result; + if (shown < total) setTimeout(step, msPerChar); + }; + step(); } - /* -------------------------------------------------------------- - ascii hero art — procedural noise field - characters form a soft "emerging" pattern - -------------------------------------------------------------- */ + function renderProtocol() { + const t = I18N[LANG]; + const el = document.getElementById("protocol-list"); + if (!el) return; + el.innerHTML = t.protocolItems + .map(([k, v, r7]) => + `${escapeHtml(k)}${escapeHtml(v)}` + ) + .join(""); + } + + function renderRules() { + const t = I18N[LANG]; + const el = document.getElementById("rules-list"); + if (!el) return; + el.innerHTML = t.rulesItems + .map((r) => + `
  • +
    ${escapeHtml(r.head)}
    +
    + ${r.body.map((line) => `
    ${escapeHtml(line)}
    `).join("")} +
    +
  • ` + ) + .join(""); + } - function renderAsciiArt() { - const el = document.getElementById("ascii-art"); + function renderAxes() { + const t = I18N[LANG]; + const el = document.getElementById("axes-grid"); if (!el) return; + el.innerHTML = t.axesCards + .map( + (a) => ` +
    +
    + ${escapeHtml(a.tag)} + ${a.weighted ? '' : ""} +
    +
    ${escapeHtml(a.name)}
    +
    ${a.viz}
    +
    ${escapeHtml(a.body)}
    + ${a.weight ? `
    ${escapeHtml(a.weight)}
    ` : ""} +
    + ` + ) + .join(""); - const cols = window.innerWidth < 700 ? 56 : 88; - const rows = 22; - const chars = " ...::--==++**#@".split(""); - let t = 0; - - function cell(x, y, t) { - const nx = (x / cols) * 2 - 1; - const ny = (y / rows) * 2 - 1; - const r = Math.sqrt(nx * nx + ny * ny * 2.2); - const radial = Math.max(0, 1 - r * 1.05); - const n = - Math.sin(x * 0.22 + y * 0.17 + t * 0.6) * 0.5 + - Math.sin(x * 0.09 - y * 0.28 + t * 0.4) * 0.3 + - Math.sin((x + y) * 0.35 + t * 0.9) * 0.2; - const v = radial * 0.85 + n * 0.25; - const idx = Math.max(0, Math.min(chars.length - 1, Math.round(v * (chars.length - 1)))); - return chars[idx]; - } + // start per-card animations + startAxisAnimations(); + } - function frame() { - let out = ""; - for (let y = 0; y < rows; y++) { - for (let x = 0; x < cols; x++) { - out += cell(x, y, t); - } - out += "\n"; - } - el.textContent = out; - } + let __axisInterval = null; + function startAxisAnimations() { + if (__axisInterval) clearInterval(__axisInterval); + const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; + if (reduced) return; + + let idx = 0; + __axisInterval = setInterval(() => { + // cycle the .hot highlight through rows in card-01 + const card01Rows = document.querySelectorAll(".axis-card.card-01 .row"); + card01Rows.forEach((r, i) => r.classList.toggle("hot", i === idx % card01Rows.length)); + idx++; + }, 900); + } - frame(); - setInterval(() => { - t += 0.06; - frame(); - }, 220); + /* -------------------------------------------------------------- + Gap SVG — exponential vs flat · halftone-filled gap zone + -------------------------------------------------------------- */ - let resizeTimer; - window.addEventListener("resize", () => { - clearTimeout(resizeTimer); - resizeTimer = setTimeout(() => { - location.reload(); - }, 300); + function renderGapSVG() { + const t = I18N[LANG]; + const wrap = document.getElementById("gap-svg-wrap"); + if (!wrap) return; + + const W = 520, H = 300; + const svg = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + 10¹² + 10¹⁰ + 10⁸ + 10⁶ + + + + + 2024 + 2026 + 2028 + 2030 + + + + + + + + + + + + + + + + + + + + ${escapeHtml(t.gapModelLabel)} + + + ${escapeHtml(t.gapModelAnnot)} + + + ${escapeHtml(t.gapScaffoldLabel)} + + + ${escapeHtml(t.gapScaffoldAnnot)} + + + + + ${escapeHtml(t.gapZoneLabel)} + + + ${escapeHtml(t.gapZoneSub)} + + + + + + + + + +`; + wrap.innerHTML = svg; + } + + /* -------------------------------------------------------------- + Ladder SVG — vertical ladder with halftone rungs + -------------------------------------------------------------- */ + + function renderLadderSVG() { + const t = I18N[LANG]; + const wrap = document.getElementById("ladder-svg-wrap"); + if (!wrap) return; + + const W = 420, H = 460; + const rails = 88; + const rungs = t.ladderRungs; // bottom-up + const nRungs = rungs.length; + const topY = 48, bottomY = 410; + const step = (bottomY - topY) / (nRungs - 1); + + // halftone pattern: three densities + const defs = ` + + + + + + + + + + + + + + `; + + // ignition line: between last gate (idx 2) and first lab rung (idx 3) + const ignitionY = topY + step * (nRungs - 1 - 2.5); + + let rungsSvg = ""; + rungs.forEach((r, i) => { + const y = bottomY - i * step; + const len = 80 + i * 22; // rung gets longer as OOM increases + const pattern = + r.kind === "gate" ? "url(#ht-amber)" : + r.kind === "frontier" ? "url(#ht-vapor)" : + i >= 4 ? "url(#ht-sparse)" : "url(#ht-ink)"; + const oomColor = + r.kind === "gate" ? "#e0a364" : + r.kind === "frontier" ? "#e0a364" : + i >= 4 ? "#7f7d73" : "#b4b1a4"; + const nameColor = + r.kind === "gate" ? "#ebe7d8" : + r.kind === "frontier" ? "#e0a364" : + i >= 4 ? "#7f7d73" : "#b4b1a4"; + + const starred = r.kind === "gate" && r.oom === "10⁸"; // ignition gate.3 + const currentBadge = r.current + ? ` + + + ${escapeHtml(t.ladderYouAreHere)}` + : ""; + + rungsSvg += ` + + ${r.oom} + + ${escapeHtml(r.name)}${starred ? " ★" : ""} + ${currentBadge} + `; }); + + const svg = ` + + ${defs} + + + + + + + + ${escapeHtml(t.ladderIgnitionLine)} + + + + + ${escapeHtml(t.ladderZoneLab)} + ${escapeHtml(t.ladderZoneRamp)} + + + ${rungsSvg} + + + + ( naked model ceiling ) + +`; + wrap.innerHTML = svg; + } + + /* -------------------------------------------------------------- + Ticker — slow whisper + -------------------------------------------------------------- */ + + function renderTicker() { + const t = I18N[LANG]; + const track = document.getElementById("ticker-track"); + if (!track) return; + const phrases = t.ticker; + // duplicate for seamless loop + const content = phrases.concat(phrases).map((p) => + `${escapeHtml(p)}` + ).join(""); + track.innerHTML = content; } /* -------------------------------------------------------------- - background node topology (subtle) + Hero title — develop transition -------------------------------------------------------------- */ - function startTopology() { - const canvas = document.getElementById("topology"); + function initHeroTitle() { + const el = document.getElementById("hero-title"); + if (!el) return; + setTimeout(() => { + el.classList.remove("developing"); + el.classList.add("developed"); + }, 260); + } + + /* -------------------------------------------------------------- + Bayer-dither canvas — slow, quiet, paper-grain breathing + -------------------------------------------------------------- */ + + function initDither() { + const canvas = document.getElementById("dither"); if (!canvas) return; + const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; + if (reduced) return; const ctx = canvas.getContext("2d"); - let w = 0, - h = 0, - dpr = 1; + if (!ctx) return; + + // 4x4 Bayer threshold matrix + const bayer = [ + [ 0, 8, 2,10], + [12, 4,14, 6], + [ 3,11, 1, 9], + [15, 7,13, 5], + ]; - const nodes = []; - const N = 44; + const CELL = 3; + let t = 0, w = 0, h = 0; function resize() { - dpr = Math.min(window.devicePixelRatio || 1, 2); w = window.innerWidth; h = window.innerHeight; - canvas.style.width = w + "px"; - canvas.style.height = h + "px"; - canvas.width = w * dpr; - canvas.height = h * dpr; - ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + canvas.width = w; + canvas.height = h; } - function seed() { - nodes.length = 0; - for (let i = 0; i < N; i++) { - nodes.push({ - x: Math.random() * w, - y: Math.random() * h, - vx: (Math.random() - 0.5) * 0.12, - vy: (Math.random() - 0.5) * 0.12, - }); + function draw() { + ctx.clearRect(0, 0, w, h); + const offset = Math.sin(t * 0.08) * 80; + for (let y = 0; y < h; y += CELL) { + for (let x = 0; x < w; x += CELL) { + // low-freq noise — two sines + cursor influence + const fx = (x + offset) * 0.0042; + const fy = y * 0.0048 - t * 0.002; + const v = + Math.sin(fx + t * 0.12) * 0.5 + + Math.sin(fy * 1.4 + t * 0.08) * 0.35 + + Math.sin((x + y) * 0.003 - t * 0.06) * 0.2; + const n = (v + 1) / 2; // [0,1] + const thr = (bayer[(y / CELL) & 3][(x / CELL) & 3] + 1) / 17; + if (n > thr + 0.42) { + const useAmber = Math.random() < 0.025; + ctx.fillStyle = useAmber ? "rgba(224,163,100,0.28)" : "rgba(235,231,216,0.11)"; + ctx.fillRect(x, y, CELL - 1, CELL - 1); + } + } } } - function frame() { - ctx.clearRect(0, 0, w, h); + resize(); + draw(); + let resizeTimer; + window.addEventListener("resize", () => { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(() => { resize(); draw(); }, 200); + }); + setInterval(() => { t += 1; draw(); }, 420); + } - for (const n of nodes) { - n.x += n.vx; - n.y += n.vy; - if (n.x < 0 || n.x > w) n.vx *= -1; - if (n.y < 0 || n.y > h) n.vy *= -1; - } + /* -------------------------------------------------------------- + Cursor halftone trail + -------------------------------------------------------------- */ + + function initCursorTrail() { + const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; + if (reduced) return; + let last = 0; + document.addEventListener("pointermove", (e) => { + const now = Date.now(); + if (now - last < 32) return; + last = now; + const dot = document.createElement("div"); + dot.className = "trail-dot"; + dot.style.left = (e.clientX - 2.5) + "px"; + dot.style.top = (e.clientY - 2.5) + "px"; + document.body.appendChild(dot); + setTimeout(() => dot.remove(), 620); + }); + } - const maxDist = 180; - ctx.lineWidth = 1; - for (let i = 0; i < nodes.length; i++) { - for (let j = i + 1; j < nodes.length; j++) { - const dx = nodes[i].x - nodes[j].x; - const dy = nodes[i].y - nodes[j].y; - const d = Math.sqrt(dx * dx + dy * dy); - if (d < maxDist) { - const alpha = (1 - d / maxDist) * 0.22; - ctx.strokeStyle = `rgba(255,255,255,${alpha})`; - ctx.beginPath(); - ctx.moveTo(nodes[i].x, nodes[i].y); - ctx.lineTo(nodes[j].x, nodes[j].y); - ctx.stroke(); + /* -------------------------------------------------------------- + scroll reveal — "develop" transition + -------------------------------------------------------------- */ + + function initScrollReveal() { + const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; + const io = new IntersectionObserver( + (entries) => { + for (const e of entries) { + if (e.isIntersecting) { + e.target.classList.add("visible"); + if (e.target.id === "vault") e.target.classList.add("revealed"); + if (e.target.id === "r7-proof") e.target.classList.add("revealed"); + io.unobserve(e.target); } } - } + }, + { threshold: 0.15, rootMargin: "0px 0px -8% 0px" } + ); + + if (reduced) { + document.querySelectorAll(".reveal").forEach((el) => el.classList.add("visible")); + const v = document.getElementById("vault"); if (v) v.classList.add("revealed"); + const r7 = document.getElementById("r7-proof"); if (r7) r7.classList.add("revealed"); + return; + } + document.querySelectorAll(".reveal").forEach((el) => io.observe(el)); + } - ctx.fillStyle = "rgba(255,255,255,0.55)"; - for (const n of nodes) { - ctx.beginPath(); - ctx.arc(n.x, n.y, 1.2, 0, Math.PI * 2); - ctx.fill(); - } + /* -------------------------------------------------------------- + scroll progress bar + -------------------------------------------------------------- */ - requestAnimationFrame(frame); + function initScrollProgress() { + const el = document.getElementById("scroll-progress"); + if (!el) return; + let ticking = false; + function onScroll() { + if (!ticking) { + requestAnimationFrame(() => { + const h = document.documentElement.scrollHeight - window.innerHeight; + const p = h > 0 ? (window.scrollY / h) * 100 : 0; + el.style.width = p.toFixed(2) + "%"; + ticking = false; + }); + ticking = true; + } } - - window.addEventListener("resize", () => { - resize(); - }); - resize(); - seed(); - requestAnimationFrame(frame); + window.addEventListener("scroll", onScroll, { passive: true }); + onScroll(); } /* -------------------------------------------------------------- - mock ledger (local, for visual only until backend is wired) + Ledger — local hash receipt -------------------------------------------------------------- */ - function renderLedger() { + function renderLedger(freshHash) { const el = document.getElementById("ledger-table"); if (!el) return; const stored = JSON.parse(SAFE_STORE.get("ti.ledger") || "[]"); const seed = stored.length ? stored : [ - { hash: "0x9ac7…1fe3", time: "T-0h", status: "pending" }, - { hash: "0x4b21…a0cd", time: "T-2h", status: "advanced" }, + { hash: "0x9ac7…1fe3", time: "T-0h", status: "pending" }, + { hash: "0x4b21…a0cd", time: "T-2h", status: "advanced" }, { hash: "0xf3ab…77e1", time: "T-11h", status: "rejected" }, { hash: "0x0017…b4d2", time: "T-26h", status: "ignited" }, ]; el.innerHTML = seed - .map( - (r) => - `
    -
    ${escapeHtml(r.hash)}
    -
    ${escapeHtml(r.time)}
    -
    ${escapeHtml(r.status.toUpperCase())}
    -
    ` - ) + .map((r) => { + const fresh = freshHash && r.hash === freshHash ? " fresh" : ""; + return `
    +
    ${escapeHtml(r.hash)}
    +
    ${escapeHtml(r.time)}
    +
    ${escapeHtml(r.status.toUpperCase())}
    +
    `; + }) .join(""); } /* -------------------------------------------------------------- - submit form + Submit form -------------------------------------------------------------- */ function hashString(s) { @@ -707,23 +1166,55 @@ h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); } - return "0x" + (h >>> 0).toString(16).padStart(8, "0").slice(0, 4) + "…" + - (h >>> 0).toString(16).padStart(8, "0").slice(4, 8); + const hex = (h >>> 0).toString(16).padStart(8, "0"); + return "0x" + hex.slice(0, 4) + "…" + hex.slice(4, 8); } function isValidHttpUrl(s) { try { const u = new URL(s); return /^https?:$/.test(u.protocol); - } catch { - return false; - } + } catch { return false; } + } + + function shakeField(id) { + const field = document.getElementById(id)?.closest(".field"); + if (!field) return; + field.classList.remove("invalid"); + void field.offsetWidth; + field.classList.add("invalid"); + setTimeout(() => field.classList.remove("invalid"), 500); + } + + function typewriteFeedback(el, text) { + el.textContent = ""; + let i = 0; + const iv = setInterval(() => { + el.textContent = text.slice(0, i); + i++; + if (i > text.length) clearInterval(iv); + }, 14); } function wireForm() { const form = document.getElementById("submit-form"); if (!form) return; const fb = document.getElementById("submit-feedback"); + const btn = form.querySelector(".submit-btn"); + + if (btn) { + btn.addEventListener("click", (e) => { + const r = document.createElement("span"); + r.className = "ripple"; + const rect = btn.getBoundingClientRect(); + const size = Math.max(rect.width, rect.height); + r.style.width = r.style.height = size + "px"; + r.style.left = (e.clientX - rect.left - size / 2) + "px"; + r.style.top = (e.clientY - rect.top - size / 2) + "px"; + btn.appendChild(r); + setTimeout(() => r.remove(), 700); + }); + } form.addEventListener("submit", (e) => { e.preventDefault(); @@ -736,60 +1227,59 @@ const baseline = form.baseline.value.trim(); const contact = form.contact.value.trim(); const consent = document.getElementById("f-consent").checked; - const axes = Array.from( - form.querySelectorAll('input[name="axis"]:checked') - ).map((el) => el.value); + const axes = Array.from(form.querySelectorAll('input[name="axis"]:checked')).map((el) => el.value); - if (!task || !criterion || !plan || !endpoint || !baseline || !contact || !consent) { + let failed = false; + if (!task) { shakeField("f-task"); failed = true; } + if (!criterion) { shakeField("f-criterion"); failed = true; } + if (!plan) { shakeField("f-plan"); failed = true; } + if (!endpoint) { shakeField("f-endpoint"); failed = true; } + if (!baseline) { shakeField("f-baseline"); failed = true; } + if (!contact) { shakeField("f-contact"); failed = true; } + + if (failed || !consent) { fb.className = "submit-feedback visible error"; - fb.textContent = t.feedback.missing; + typewriteFeedback(fb, t.feedback.missing); return; } if (axes.length === 0) { fb.className = "submit-feedback visible error"; - fb.textContent = t.feedback.noAxis; + typewriteFeedback(fb, t.feedback.noAxis); return; } if (!isValidHttpUrl(endpoint)) { + shakeField("f-endpoint"); fb.className = "submit-feedback visible error"; - fb.textContent = t.feedback.badUrl; + typewriteFeedback(fb, t.feedback.badUrl); return; } if (!isValidHttpUrl(baseline)) { + shakeField("f-baseline"); fb.className = "submit-feedback visible error"; - fb.textContent = t.feedback.badBaseline; + typewriteFeedback(fb, t.feedback.badBaseline); return; } - const payload = JSON.stringify({ - task, - criterion, - axes, - plan, - endpoint, - baseline, - contact, - ts: Date.now(), - }); + const payload = JSON.stringify({ task, criterion, axes, plan, endpoint, baseline, contact, ts: Date.now() }); const h = hashString(payload); const ledger = JSON.parse(SAFE_STORE.get("ti.ledger") || "[]"); ledger.unshift({ hash: h, time: "T-0h", status: "pending" }); SAFE_STORE.set("ti.ledger", JSON.stringify(ledger.slice(0, 8))); - renderLedger(); + renderLedger(h); - fb.className = "submit-feedback visible"; - fb.textContent = t.feedback.ok(h); + fb.className = "submit-feedback visible ok"; + typewriteFeedback(fb, t.feedback.ok(h)); form.reset(); }); } /* -------------------------------------------------------------- - lang toggle + language toggle -------------------------------------------------------------- */ function wireLang() { @@ -809,8 +1299,11 @@ document.addEventListener("DOMContentLoaded", () => { applyI18n(); wireLang(); - renderAsciiArt(); - startTopology(); + initHeroTitle(); + initDither(); + initCursorTrail(); + initScrollReveal(); + initScrollProgress(); renderLedger(); wireForm(); }); diff --git a/assets/styles.css b/assets/styles.css index 9e6b14a..6cd5f0c 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -1,35 +1,49 @@ +/* ============================================================ + TOKEN-IGNITION — v0.1 thesis redesign (halftone elevation) + 1965 Bell Labs technical report · self-evolving scaffolds · 2028 + halftone + Bayer dither + paper grain · amber only on hot moments + ============================================================ */ + :root { - --bg: #0b0d11; - --bg-soft: #0f1116; - --fg: #e8ecef; - --fg-mid: #a6adb5; - --fg-dim: #6b7079; - --fg-faint: #383c44; + --bg: #0a0c12; + --bg-soft: #0e1117; + --bg-sunk: #06080d; + + --ink: #ebe7d8; + --ink-light: #b4b1a4; + --ink-mid: #7f7d73; + --ink-dim: #4d4c46; + --ink-faint: #2a2a28; + --border: #1b1e24; --border-bright: #2a2e36; - --accent: #ffffff; - --danger: #c0c0c0; + + --amber: #e0a364; + --amber-dim: #8a5f33; + --amber-glow: rgba(224, 163, 100, 0.55); + --amber-soft: rgba(224, 163, 100, 0.15); + + --cyan-ghost: rgba(110, 170, 200, 0.22); + --field-bg: #0f1218; --field-bg-focus: #141822; -} -* { - box-sizing: border-box; -} + --font-display: "Fraunces", "Cormorant Garamond", "EB Garamond", Georgia, serif; + --font-serif: "Newsreader", "Fraunces", "EB Garamond", Georgia, serif; + --font-mono: "IBM Plex Mono", "JetBrains Mono", ui-monospace, Menlo, monospace; -html { - scroll-behavior: smooth; + --col-read: 640px; + --col-mono: 820px; } -html, -body { - margin: 0; - padding: 0; +* { box-sizing: border-box; } +html { scroll-behavior: smooth; } + +html, body { + margin: 0; padding: 0; background: var(--bg); - color: var(--fg); - font-family: "JetBrains Mono", "Noto Sans Mono", ui-monospace, SFMono-Regular, - Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-weight: 400; + color: var(--ink); + font-family: var(--font-mono); font-size: 15px; line-height: 1.7; letter-spacing: 0.01em; @@ -38,75 +52,113 @@ body { body { min-height: 100vh; overflow-x: hidden; + position: relative; } -#topology { +/* ---------------------------------------------------------------- ground layers */ + +/* Bayer-dither canvas — background life */ +#dither { position: fixed; inset: 0; z-index: 0; pointer-events: none; - opacity: 0.35; + opacity: 0.58; + mix-blend-mode: screen; } -main { - position: relative; +/* Paper grain — SVG noise filter, multiplied */ +.grain { + position: fixed; + inset: 0; + z-index: 1; + pointer-events: none; + opacity: 0.32; + mix-blend-mode: overlay; + background-image: url("data:image/svg+xml;utf8,"); + background-size: 220px 220px; +} + +/* Halftone dot field, fixed. Subtle amber stardust. */ +.stardust { + position: fixed; + inset: 0; z-index: 1; + pointer-events: none; + opacity: 0.22; + background-image: + radial-gradient(circle at 1px 1px, rgba(224,163,100,0.35) 0.6px, transparent 1.2px), + radial-gradient(circle at 1px 1px, rgba(235,231,216,0.12) 0.5px, transparent 1px); + background-size: 28px 28px, 13px 13px; + background-position: 0 0, 6px 6px; + animation: stardust-drift 42s linear infinite; +} +@keyframes stardust-drift { + from { background-position: 0 0, 6px 6px; } + to { background-position: 28px 28px, 19px 19px; } +} + +/* scroll progress bar — halftone-edged amber */ +.scroll-progress { + position: fixed; + top: 0; left: 0; + height: 2px; + width: 0%; + background: linear-gradient(90deg, transparent, var(--amber) 30%, var(--amber) 80%, transparent); + box-shadow: 0 0 14px var(--amber-glow); + z-index: 100; + transition: width 0.08s linear; +} + +main { position: relative; z-index: 2; } + +/* cursor halftone trail */ +.trail-dot { + position: fixed; + width: 5px; height: 5px; + border-radius: 50%; + background: radial-gradient(circle, rgba(224,163,100,0.6), transparent 70%); + pointer-events: none; + z-index: 99; + animation: trail-fade 0.6s ease-out forwards; +} +@keyframes trail-fade { + from { opacity: 0.55; transform: scale(1); } + to { opacity: 0; transform: scale(2.2); } } /* ---------------------------------------------------------------- topbar */ .topbar { position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 10; + top: 0; left: 0; right: 0; + z-index: 20; display: flex; justify-content: space-between; align-items: center; - padding: 16px 28px; + padding: 18px 32px; + font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.22em; - color: var(--fg-dim); - background: linear-gradient( - 180deg, - rgba(11, 13, 17, 0.92) 0%, - rgba(11, 13, 17, 0.6) 70%, - rgba(11, 13, 17, 0) - ); + letter-spacing: 0.24em; + color: var(--ink-dim); + background: linear-gradient(180deg, rgba(10,12,18,0.92) 0%, rgba(10,12,18,0.6) 70%, rgba(10,12,18,0)); pointer-events: none; } - -.topbar-left, -.topbar-right { - pointer-events: auto; -} - +.topbar-left, .topbar-right { pointer-events: auto; } .lang-btn { - background: none; - border: none; - color: var(--fg-dim); - font: inherit; - letter-spacing: 0.22em; - padding: 4px 6px; - cursor: pointer; + background: none; border: none; + color: var(--ink-dim); + font: inherit; letter-spacing: 0.24em; + padding: 4px 6px; cursor: pointer; transition: color 0.2s ease; } - -.lang-btn:hover, -.lang-btn[aria-current="true"] { - color: var(--fg); -} - +.lang-btn:hover, .lang-btn[aria-current="true"] { color: var(--ink); } .lang-btn[aria-current="true"] { text-decoration: underline; text-underline-offset: 4px; + text-decoration-color: var(--amber); } - -.sep { - color: var(--fg-faint); - padding: 0 2px; -} +.sep { color: var(--ink-faint); padding: 0 2px; } /* ---------------------------------------------------------------- hero */ @@ -116,408 +168,881 @@ main { flex-direction: column; align-items: center; justify-content: center; - padding: 96px 28px 48px; + padding: 120px 32px 80px; text-align: center; position: relative; } -.ascii-art { - margin: 0 0 40px; +.hero-masthead { + font-family: var(--font-mono); font-size: 10px; - line-height: 1.1; - color: var(--fg-mid); - letter-spacing: 0; - white-space: pre; - font-variant-ligatures: none; - user-select: none; - pointer-events: none; - opacity: 0.85; - text-shadow: 0 0 12px rgba(255, 255, 255, 0.04); + letter-spacing: 0.48em; + color: var(--ink-dim); + margin-bottom: 32px; + display: flex; + align-items: center; + gap: 18px; } +.hero-masthead .rule { flex: 0 0 44px; height: 1px; background: linear-gradient(90deg, transparent, var(--ink-dim)); } +.hero-masthead .rule.right { background: linear-gradient(90deg, var(--ink-dim), transparent); } -@media (min-width: 900px) { - .ascii-art { - font-size: 11px; - } +.hero-title-wrap { + position: relative; + display: inline-block; } -.hero-text .title { - margin: 0 0 14px; - font-size: 38px; +.hero-title { + margin: 0 0 18px; + font-family: var(--font-mono); + font-size: clamp(42px, 7vw, 86px); font-weight: 500; letter-spacing: 0.28em; - color: var(--fg); + color: var(--ink); line-height: 1; + position: relative; + display: inline-block; } - -.hero-text .subtitle { - margin: 0 0 24px; - font-size: 13px; - letter-spacing: 0.32em; - color: var(--fg-mid); - text-transform: uppercase; +/* develop transition — title goes from halftone-mist to crisp */ +.hero-title.developing { + filter: blur(10px) contrast(0.4) brightness(1.8); + opacity: 0.35; +} +.hero-title.developed { + filter: blur(0) contrast(1) brightness(1); + opacity: 1; + transition: filter 1.4s cubic-bezier(0.2, 0.55, 0.2, 1), opacity 1.4s ease; } -.hero-text .hook { - margin: 0 auto 20px; - max-width: 720px; - font-size: 19px; - line-height: 1.55; - color: var(--fg); - font-weight: 400; - letter-spacing: 0.01em; +.hero-subtitle { + margin: 0 0 44px; + font-family: var(--font-mono); + font-size: 12px; + letter-spacing: 0.34em; + color: var(--ink-mid); + text-transform: uppercase; } -.hero-text .tagline { +.hero-hook { margin: 0 auto 32px; - max-width: 620px; - font-size: 14px; - color: var(--fg-mid); + max-width: 760px; + font-family: var(--font-display); + font-size: clamp(22px, 2.4vw, 32px); + font-weight: 400; + font-style: italic; + line-height: 1.42; + color: var(--ink); + letter-spacing: -0.005em; +} +.hero-hook em, +.hero-hook .accent { color: var(--amber); font-style: italic; } + +.hero-tagline { + margin: 0 auto 48px; + max-width: 600px; + font-family: var(--font-display); + font-size: 17px; line-height: 1.75; -} - -@media (min-width: 900px) { - .hero-text .hook { - font-size: 22px; - } + color: var(--ink-light); } .cta { - display: inline-block; - padding: 12px 22px; + display: inline-flex; + align-items: center; + gap: 12px; + padding: 16px 28px; border: 1px solid var(--border-bright); - color: var(--fg); + color: var(--ink); text-decoration: none; - letter-spacing: 0.18em; + letter-spacing: 0.2em; + font-family: var(--font-mono); font-size: 12px; - transition: border-color 0.2s ease, background 0.2s ease, color 0.2s ease; - background: rgba(0, 0, 0, 0.4); + background: rgba(0,0,0,0.4); + transition: border-color 0.25s ease, color 0.25s ease, background 0.25s ease, box-shadow 0.4s ease; + position: relative; +} +.cta::before { + content: ""; + position: absolute; + inset: -4px; + background: + radial-gradient(circle at 2px 2px, rgba(224,163,100,0.25) 0.5px, transparent 1px); + background-size: 6px 6px; + opacity: 0; + transition: opacity 0.4s ease; + pointer-events: none; + z-index: -1; } - .cta:hover { - border-color: var(--fg); - color: var(--fg); - background: rgba(255, 255, 255, 0.04); + border-color: var(--amber); + color: var(--amber); + box-shadow: 0 0 30px -8px var(--amber-glow); } +.cta:hover::before { opacity: 1; } -.scroll-hint { +/* live status strip under hero */ +.hero-status { margin-top: 56px; + width: 100%; + max-width: 720px; + font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.3em; - color: var(--fg-faint); + letter-spacing: 0.12em; + color: var(--ink-mid); + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + padding: 14px 20px; + display: grid; + grid-template-columns: 1fr auto 1fr; + gap: 24px; + align-items: center; + background: + repeating-linear-gradient(45deg, + transparent 0, transparent 3px, + rgba(224,163,100,0.015) 3px, rgba(224,163,100,0.015) 4px); +} +.hero-status .cell { + display: flex; + align-items: center; + gap: 10px; +} +.hero-status .cell.right { justify-content: flex-end; } +.hero-status .gate-gauge { + display: inline-flex; + gap: 1px; + font-family: var(--font-mono); + letter-spacing: 0; + font-size: 12px; +} +.hero-status .gate-gauge span { color: var(--ink-faint); transition: color 0.5s ease; } +.hero-status .gate-gauge.open span.on { color: var(--amber); animation: gauge-pulse 2.1s ease-in-out infinite; } +.hero-status .gate-gauge.open span.on:nth-child(2) { animation-delay: 0.12s; } +.hero-status .gate-gauge.open span.on:nth-child(3) { animation-delay: 0.24s; } +.hero-status .gate-gauge.open span.on:nth-child(4) { animation-delay: 0.36s; } +.hero-status .gate-gauge.open span.on:nth-child(5) { animation-delay: 0.48s; } +.hero-status .gate-gauge.open span.on:nth-child(6) { animation-delay: 0.60s; } +@keyframes gauge-pulse { + 0%, 100% { color: var(--amber); text-shadow: 0 0 6px var(--amber-glow); } + 50% { color: var(--amber-dim); text-shadow: none; } +} +.hero-status .stat-label { color: var(--ink-dim); text-transform: uppercase; letter-spacing: 0.22em; font-size: 9px; } +.hero-status .stat-val { color: var(--ink); } + +.scroll-hint { + margin-top: 48px; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.32em; + color: var(--ink-faint); + animation: hint-fade 2.6s ease-in-out infinite; + text-transform: uppercase; +} +@keyframes hint-fade { + 0%, 100% { opacity: 0.35; transform: translateY(0); } + 50% { opacity: 0.9; transform: translateY(4px); } } -/* ---------------------------------------------------------------- section */ +/* ---------------------------------------------------------------- section layout */ .section { - max-width: 820px; + max-width: 1200px; margin: 0 auto; - padding: 120px 28px 80px; + padding: 160px 32px 100px; } +.section-slim { max-width: 820px; } .section-meta { display: flex; gap: 16px; align-items: baseline; - color: var(--fg-dim); + color: var(--ink-dim); + font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.28em; - margin-bottom: 8px; -} - -.section-num { - color: var(--fg); -} - -.section-label::before { - content: "// "; - color: var(--fg-faint); + letter-spacing: 0.3em; + margin-bottom: 10px; + text-transform: uppercase; } +.section-num { color: var(--ink); } +.section-label::before { content: "// "; color: var(--ink-faint); } .section-title { - margin: 0 0 36px; - font-size: 22px; + margin: 0 0 56px; + font-family: var(--font-display); font-weight: 500; - letter-spacing: 0.18em; - color: var(--fg); -} - -.prose p { - margin: 0 0 16px; - color: var(--fg); + font-size: clamp(34px, 4.2vw, 54px); + letter-spacing: -0.02em; + color: var(--ink); + line-height: 1.04; } -.prose p.dim { - color: var(--fg-mid); +.split { + display: grid; + grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); + gap: 64px; + align-items: start; } +.split-text { min-width: 0; } +.split-viz { min-width: 0; position: relative; } +.split-viz.sticky { position: sticky; top: 88px; } -.prose .highlight { - color: var(--fg); +@media (max-width: 900px) { + .split { grid-template-columns: 1fr; gap: 36px; } + .split-viz.sticky { position: static; } } -/* ---------------------------------------------------------------- kv list (protocol) */ +/* ---------------------------------------------------------------- prose */ -.kv-list { - list-style: none; - padding: 0; - margin: 0; - border-top: 1px solid var(--border); +.prose { + font-family: var(--font-serif); + font-size: 19px; + line-height: 1.7; + color: var(--ink); + max-width: var(--col-read); } - -.kv-list li { - display: grid; - grid-template-columns: 60px 1fr; - gap: 20px; - padding: 14px 0; - border-bottom: 1px solid var(--border); +.prose p { margin: 0 0 20px; } +.prose p.dim { color: var(--ink-mid); } +.prose .highlight { + color: var(--ink); + background: + linear-gradient(180deg, transparent 62%, rgba(224,163,100,0.12) 62%, rgba(224,163,100,0.12) 92%, transparent 92%); + padding: 0 2px; } +.prose em, .prose i { color: var(--ink-light); font-style: italic; } +.prose strong { color: var(--amber); font-weight: 500; } -.kv-list .k { - color: var(--fg-mid); - letter-spacing: 0.16em; +.prose-quote { + font-family: var(--font-serif); + font-size: 21px; + font-style: italic; + color: var(--ink-mid); + line-height: 1.55; + border-left: 1px solid var(--amber-dim); + padding: 6px 0 6px 22px; + margin: 28px 0; + max-width: var(--col-read); + position: relative; } - -.kv-list .v { - color: var(--fg); +.prose-quote::before { + content: ""; + position: absolute; + left: -1px; top: 0; bottom: 0; + width: 1px; + background: linear-gradient(180deg, transparent, var(--amber-dim) 20%, var(--amber) 50%, var(--amber-dim) 80%, transparent); + opacity: 0.6; +} + +/* drop cap — first letter of manifesto */ +.prose-dropcap > p:first-of-type::first-letter { + font-family: var(--font-display); + float: left; + font-size: 78px; + line-height: 0.88; + font-weight: 500; + margin: 6px 12px 0 0; + color: var(--amber); + text-shadow: 0 0 18px rgba(224,163,100,0.3); } -/* ---------------------------------------------------------------- rules list */ +/* ---------------------------------------------------------------- viz — common */ -.rule-list { - list-style: none; - padding: 0; - margin: 0; - counter-reset: rule; +.viz { + position: relative; + font-family: var(--font-mono); + color: var(--ink); } - -.rule-list li { - padding: 18px 0; - border-bottom: 1px solid var(--border); +.viz-head { + font-size: 10px; + letter-spacing: 0.3em; + color: var(--ink-dim); + text-transform: uppercase; + margin-bottom: 18px; + display: flex; + align-items: center; + gap: 10px; } - -.rule-list li:first-child { - border-top: 1px solid var(--border); +.viz-head::before { + content: ""; + flex: 0 0 28px; + height: 1px; + background: linear-gradient(90deg, var(--amber-dim), transparent); } - -.rule-list .rule-head { - color: var(--fg); - margin-bottom: 6px; +.viz-head::after { + content: ""; + flex: 1; + height: 1px; + background: linear-gradient(90deg, transparent, var(--ink-faint) 60%, transparent); } -.rule-list .rule-body { - color: var(--fg-mid); - padding-left: 16px; +.viz-svg { + width: 100%; + height: auto; + display: block; } -.rule-list .rule-body div { - padding: 2px 0; -} +/* ---------------------------------------------------------------- gap viz (SVG) */ -.callout { - margin-top: 28px; - padding: 18px 20px; - border: 1px solid var(--border-bright); - background: rgba(255, 255, 255, 0.015); +.gap-viz { + padding: 30px 26px 24px; + border: 1px solid var(--border); + background: + linear-gradient(180deg, rgba(224,163,100,0.012), transparent 40%), + var(--bg-sunk); + position: relative; } - -.callout-head { - color: var(--fg); - margin-bottom: 6px; - letter-spacing: 0.14em; - font-size: 12px; +.gap-viz::before { + content: ""; + position: absolute; + left: 0; top: 0; bottom: 0; + width: 1px; + background: linear-gradient(180deg, transparent, var(--amber-dim) 30%, var(--amber) 60%, var(--amber-dim) 90%, transparent); + opacity: 0.55; } -.callout-body { - color: var(--fg-mid); - font-size: 13px; +.gap-axis-label { + font-family: var(--font-mono); + font-size: 9px; + letter-spacing: 0.26em; + color: var(--ink-dim); + text-transform: uppercase; } - -/* ---------------------------------------------------------------- ladder */ - -.ladder-intro { - margin-bottom: 28px; +.gap-legend { + margin-top: 18px; + padding-top: 14px; + border-top: 1px dashed var(--border); + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 18px; + font-family: var(--font-mono); + font-size: 11px; } - -.ladder-intro p, -.ladder-close p { - margin: 0 0 16px; - color: var(--fg); +.gap-legend .tag { color: var(--ink-dim); letter-spacing: 0.24em; text-transform: uppercase; font-size: 10px; } +.gap-legend .note { + font-family: var(--font-display); + font-style: italic; + font-size: 14px; + color: var(--amber); + text-align: right; + line-height: 1.4; } -.ladder-close { - margin-top: 28px; -} +/* ---------------------------------------------------------------- ladder viz (SVG) */ -.ladder-ascii { - margin: 0; - padding: 22px 22px; +.ladder-viz { + padding: 28px 26px; border: 1px solid var(--border); - background: rgba(255, 255, 255, 0.01); - color: var(--fg-mid); - font-size: 13px; - line-height: 1.7; - letter-spacing: 0; - white-space: pre; - font-variant-ligatures: none; - overflow-x: auto; - text-shadow: 0 0 12px rgba(255, 255, 255, 0.03); -} - -@media (max-width: 640px) { - .ladder-ascii { - font-size: 11px; - padding: 16px; - } + background: var(--bg-sunk); + position: relative; + overflow: hidden; } - -/* ---------------------------------------------------------------- axes */ - -.axes-intro { - margin-bottom: 28px; +.ladder-viz::before { + content: ""; + position: absolute; + left: 0; top: 0; bottom: 0; + width: 1px; + background: linear-gradient(180deg, transparent, var(--amber-dim) 50%, transparent 95%); + opacity: 0.5; } -.axes-intro p { - margin: 0 0 16px; - color: var(--fg); -} +/* ---------------------------------------------------------------- axes cards */ .axes-grid { display: grid; grid-template-columns: repeat(3, 1fr); - gap: 14px; - margin-bottom: 20px; + gap: 16px; + margin: 40px 0 28px; } -.axis-cell { +.axis-card { border: 1px solid var(--border); - padding: 22px 20px; - background: rgba(255, 255, 255, 0.01); + background: + linear-gradient(180deg, rgba(255,255,255,0.01), transparent 60%), + var(--bg-sunk); + padding: 26px 22px 24px; display: flex; flex-direction: column; - gap: 10px; + gap: 14px; position: relative; + overflow: hidden; + min-height: 420px; } - -.axis-cell-weighted { - border-color: var(--border-bright); - background: rgba(255, 255, 255, 0.025); +.axis-card::before { + content: ""; + position: absolute; + inset: 0; + background-image: + radial-gradient(circle at 1px 1px, rgba(235,231,216,0.05) 0.4px, transparent 0.8px); + background-size: 14px 14px; + pointer-events: none; +} +.axis-card.weighted { + border-color: var(--amber-dim); + background: + radial-gradient(circle at 70% 10%, rgba(224,163,100,0.06), transparent 50%), + var(--bg-sunk); +} +.axis-card.weighted::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + box-shadow: inset 0 0 60px -18px var(--amber-glow); + opacity: 0; + animation: axis-glow 4.2s ease-in-out infinite; +} +@keyframes axis-glow { + 0%, 100% { opacity: 0.25; } + 50% { opacity: 0.7; } } .axis-tag { - color: var(--fg-dim); - font-size: 11px; - letter-spacing: 0.22em; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.32em; + color: var(--ink-dim); + text-transform: uppercase; + display: flex; + justify-content: space-between; + align-items: baseline; } +.axis-tag .star { color: var(--amber); font-size: 12px; letter-spacing: 0; } .axis-name { - color: var(--fg); - font-size: 16px; - letter-spacing: 0.14em; - text-transform: lowercase; + font-family: var(--font-display); + font-size: 28px; + font-weight: 500; + color: var(--ink); + letter-spacing: -0.01em; + line-height: 1.05; } +.axis-card.weighted .axis-name { color: var(--amber); } -.axis-cell-weighted .axis-name { - color: var(--fg); +.axis-viz { + font-family: var(--font-mono); + font-size: 11px; + line-height: 1.5; + color: var(--ink-light); + background: rgba(0,0,0,0.28); + padding: 14px 14px; + border: 1px solid var(--border); + min-height: 170px; + position: relative; + overflow: hidden; + white-space: pre; + letter-spacing: 0; } +.axis-viz .t { color: var(--ink-dim); } +.axis-viz .a { color: var(--amber); } +.axis-viz .g { color: var(--ink-mid); } +.axis-viz .n { color: var(--ink); } +.axis-viz .hot { color: var(--amber); text-shadow: 0 0 8px var(--amber-glow); } .axis-body { - color: var(--fg-mid); - font-size: 13px; - line-height: 1.7; + font-family: var(--font-serif); + font-size: 15px; + line-height: 1.6; + color: var(--ink-light); + margin-top: auto; } .axis-weight { - margin-top: auto; - color: var(--fg); + font-family: var(--font-mono); font-size: 10px; - letter-spacing: 0.26em; + letter-spacing: 0.3em; + color: var(--amber); + text-transform: uppercase; padding-top: 14px; border-top: 1px solid var(--border); - text-transform: uppercase; + display: flex; + justify-content: space-between; +} +.axis-weight::before { + content: "●●●"; + color: var(--amber); + letter-spacing: 0.1em; } -@media (max-width: 800px) { - .axes-grid { - grid-template-columns: 1fr; - } +@media (max-width: 900px) { + .axes-grid { grid-template-columns: 1fr; } + .axis-card { min-height: auto; } } -/* ---------------------------------------------------------------- allocation */ +/* ---------------------------------------------------------------- gates — vault */ -.allocation-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 14px; +.vault { + padding: 0; + border: 1px solid var(--border); + background: + linear-gradient(180deg, rgba(0,0,0,0.3), rgba(0,0,0,0.1)), + var(--bg-sunk); + position: relative; + overflow: hidden; + font-family: var(--font-mono); + font-size: 12px; } +.vault-top { + padding: 14px 22px; + background: linear-gradient(180deg, rgba(224,163,100,0.04), transparent); + border-bottom: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; + font-size: 10px; + letter-spacing: 0.24em; + color: var(--ink-dim); + text-transform: uppercase; +} +.vault-top .cmd { color: var(--amber); } +.vault-top .cmd::before { content: "$ "; color: var(--ink-dim); } +.vault-top .dots { letter-spacing: 0.4em; font-size: 9px; } -.allocation-cell { - border: 1px solid var(--border); - padding: 22px 20px; - background: rgba(255, 255, 255, 0.01); +.chamber { + padding: 22px 22px 20px; + border-bottom: 1px solid var(--border); + position: relative; + transition: background 0.4s ease; } +.chamber:last-child { border-bottom: none; } -.allocation-key { - color: var(--fg-mid); +.chamber.gate-3 { + background: linear-gradient(180deg, rgba(255,255,255,0.004), transparent); + filter: blur(0.4px); + opacity: 0.78; +} +.chamber.gate-2 { + background: linear-gradient(180deg, rgba(255,255,255,0.008), transparent); + opacity: 0.92; +} +.chamber.gate-1 { + background: + radial-gradient(circle at 85% 50%, rgba(224,163,100,0.08), transparent 50%), + linear-gradient(180deg, rgba(224,163,100,0.02), transparent); +} + +.chamber-head { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 14px; + align-items: baseline; + margin-bottom: 10px; +} +.chamber-id { + font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.22em; - margin-bottom: 14px; + letter-spacing: 0.2em; + color: var(--ink-mid); +} +.chamber.gate-1 .chamber-id { color: var(--amber); } +.chamber-name { + font-family: var(--font-display); + font-size: 22px; + color: var(--ink); + letter-spacing: -0.01em; +} +.chamber.gate-1 .chamber-name { color: var(--amber); } +.chamber-state { + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.24em; + color: var(--ink-dim); + text-transform: uppercase; +} +.chamber.gate-1 .chamber-state { color: var(--amber); animation: chamber-open 2.4s ease-in-out infinite; } +@keyframes chamber-open { + 0%, 100% { opacity: 1; text-shadow: 0 0 10px var(--amber-glow); } + 50% { opacity: 0.62; text-shadow: none; } } -.allocation-value { - color: var(--fg); - font-size: 36px; - font-weight: 500; +.chamber-budget { + font-family: var(--font-mono); + font-size: 18px; + color: var(--ink); letter-spacing: 0.05em; margin-bottom: 14px; } +.chamber.gate-1 .chamber-budget { color: var(--amber); } -.allocation-note { - color: var(--fg-mid); +.chamber-section { + font-family: var(--font-mono); + font-size: 9px; + letter-spacing: 0.3em; + color: var(--ink-dim); + text-transform: uppercase; + margin: 14px 0 8px; +} +.chamber-cond { + font-family: var(--font-mono); font-size: 12px; - line-height: 1.6; + color: var(--ink-light); + line-height: 1.55; + display: flex; + align-items: baseline; + gap: 10px; + padding: 2px 0; } +.chamber-cond::before { + content: "⎯"; + color: var(--amber-dim); + flex-shrink: 0; +} +.chamber.gate-1 .chamber-cond { color: var(--ink); } -@media (max-width: 640px) { - .allocation-grid { - grid-template-columns: 1fr; - } +.chamber-live { + margin-top: 14px; + padding-top: 12px; + border-top: 1px dashed var(--border); + font-family: var(--font-mono); + font-size: 11px; + color: var(--amber); + letter-spacing: 0.12em; + display: flex; + align-items: baseline; + gap: 8px; +} +.chamber-live .cursor { + animation: cursor-blink 1.05s steps(1) infinite; +} +@keyframes cursor-blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } } -/* ---------------------------------------------------------------- submit form */ +/* gates reveal: chambers develop in from top */ +.vault .chamber { + opacity: 0; + transform: translateX(-6px); + transition: opacity 0.6s ease-out, transform 0.6s ease-out; +} +.vault.revealed .chamber.gate-3 { opacity: 0.78; transform: translateX(0); transition-delay: 0.15s; } +.vault.revealed .chamber.gate-2 { opacity: 0.92; transform: translateX(0); transition-delay: 0.35s; } +.vault.revealed .chamber.gate-1 { opacity: 1; transform: translateX(0); transition-delay: 0.55s; } -.submit-section { - max-width: 720px; +/* ---------------------------------------------------------------- protocol (kv list) */ + +.kv-list { + list-style: none; + padding: 0; + margin: 0; + border-top: 1px solid var(--border); + font-family: var(--font-mono); + max-width: var(--col-mono); +} +.kv-list li { + display: grid; + grid-template-columns: 60px 1fr; + gap: 20px; + padding: 22px 0; + border-bottom: 1px solid var(--border); + position: relative; + transition: background 0.2s ease; } +.kv-list li:hover { background: rgba(224,163,100,0.015); } +.kv-list li.r7 { + background: + linear-gradient(90deg, rgba(224,163,100,0.05), rgba(224,163,100,0.01) 40%, transparent 70%); + border-left: 2px solid var(--amber-dim); + padding-left: 16px; + margin-left: -18px; +} +.kv-list li.r7::before { + content: ""; + position: absolute; + left: -18px; top: 0; bottom: 0; width: 2px; + background: var(--amber); + box-shadow: 0 0 10px var(--amber-glow); + animation: r7-edge 2.8s ease-in-out infinite; +} +@keyframes r7-edge { + 0%, 100% { box-shadow: 0 0 8px var(--amber-glow); } + 50% { box-shadow: 0 0 18px var(--amber-glow); } +} +.kv-list .k { color: var(--amber-dim); letter-spacing: 0.16em; font-weight: 500; } +.kv-list li.r7 .k { color: var(--amber); } +.kv-list .v { color: var(--ink); } + +/* R7 ablation viz — big halftone density bars */ +.r7-proof { + margin: 32px 0 0; + padding: 28px 28px 24px; + border: 1px solid var(--amber-dim); + background: + repeating-linear-gradient(45deg, + rgba(224,163,100,0.015) 0, rgba(224,163,100,0.015) 2px, + transparent 2px, transparent 6px), + var(--bg-sunk); + max-width: 760px; + position: relative; + overflow: hidden; + font-family: var(--font-mono); +} +.r7-proof-head { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: 22px; + color: var(--amber); + font-size: 11px; + letter-spacing: 0.26em; + text-transform: uppercase; +} +.r7-proof-head .sub { color: var(--ink-dim); letter-spacing: 0.2em; } -.submit-intro { - color: var(--fg-mid); - margin: 0 0 36px; +.r7-bar-wrap { + margin: 16px 0; +} +.r7-bar-label { + display: flex; + justify-content: space-between; + align-items: baseline; + font-size: 11px; + color: var(--ink-light); + letter-spacing: 0.08em; + margin-bottom: 6px; +} +.r7-bar-label .v { color: var(--ink); font-size: 13px; } +.r7-bar { + height: 22px; + position: relative; + background: var(--bg); + border: 1px solid var(--border); + overflow: hidden; +} +.r7-bar .fill { + position: absolute; + inset: 0; + width: 0%; + background-image: + radial-gradient(circle at 1px 1px, currentColor 0.8px, transparent 1.4px); + background-size: 5px 5px; + color: var(--ink-light); + transition: width 1.3s cubic-bezier(0.2, 0.6, 0.2, 1); +} +.r7-proof.revealed .r7-bar.scaffold .fill { + width: 82%; + color: var(--amber); + box-shadow: inset 0 0 20px rgba(224,163,100,0.2); +} +.r7-proof.revealed .r7-bar.ablation .fill { + width: 14%; + color: var(--ink-mid); +} + +.r7-delta { + margin-top: 22px; + padding-top: 18px; + border-top: 1px dashed var(--border); + display: flex; + justify-content: space-between; + align-items: center; + gap: 14px; +} +.r7-delta .arrow { + flex: 1; + position: relative; + height: 1px; + background: linear-gradient(90deg, var(--amber-dim), var(--amber)); + margin: 0 18px; +} +.r7-delta .arrow::before { + content: "Δ + 0.68"; + position: absolute; + left: 50%; + top: -12px; + transform: translateX(-50%); + background: var(--bg-sunk); + padding: 0 12px; + color: var(--amber); + font-size: 13px; + letter-spacing: 0.1em; + font-family: var(--font-serif); + font-style: italic; +} +.r7-delta .arrow::after { + content: ""; + position: absolute; + right: -1px; top: 50%; + width: 10px; height: 10px; + border-top: 1px solid var(--amber); + border-right: 1px solid var(--amber); + transform: translateY(-50%) rotate(45deg); +} +.r7-delta .tag { + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.26em; + color: var(--ink-dim); + text-transform: uppercase; +} +.r7-proof-note { + margin-top: 22px; + padding-top: 18px; + border-top: 1px dashed var(--border); + font-family: var(--font-serif); + font-style: italic; font-size: 14px; + color: var(--ink-mid); + line-height: 1.55; + max-width: 520px; } -.submit-form .field { - margin-bottom: 32px; +/* ---------------------------------------------------------------- rules list */ + +.rule-list { + list-style: none; padding: 0; margin: 0; + font-family: var(--font-mono); + max-width: var(--col-mono); +} +.rule-list li { + padding: 22px 0; + border-bottom: 1px solid var(--border); +} +.rule-list li:first-child { border-top: 1px solid var(--border); } +.rule-list .rule-head { color: var(--ink); margin-bottom: 8px; letter-spacing: 0.04em; } +.rule-list .rule-body { color: var(--ink-mid); padding-left: 20px; font-size: 14px; } +.rule-list .rule-body div { padding: 2px 0; } + +.callout { + margin-top: 36px; + padding: 22px 24px; + border: 1px solid var(--border-bright); + background: + repeating-linear-gradient(45deg, + rgba(224,163,100,0.012) 0, rgba(224,163,100,0.012) 2px, + transparent 2px, transparent 8px); + font-family: var(--font-mono); + max-width: var(--col-mono); +} +.callout-head { color: var(--amber); margin-bottom: 8px; letter-spacing: 0.16em; font-size: 11px; text-transform: uppercase; } +.callout-body { color: var(--ink-light); font-size: 13px; line-height: 1.65; } + +/* ---------------------------------------------------------------- submit form */ + +.submit-section { max-width: 760px; } +.submit-intro { + color: var(--ink-light); + font-family: var(--font-serif); + margin: 0 0 42px; + font-size: 17px; + line-height: 1.7; } +.submit-form .field { margin-bottom: 34px; } .field-label { display: flex; gap: 14px; align-items: baseline; - color: var(--fg); - margin-bottom: 6px; -} - -.field-index { - color: var(--fg-dim); - font-size: 12px; - letter-spacing: 0.14em; + color: var(--ink); + font-family: var(--font-mono); + margin-bottom: 8px; } - +.field-index { color: var(--amber-dim); font-size: 12px; letter-spacing: 0.14em; } .field-hint { - color: var(--fg-dim); - font-size: 12px; - margin-bottom: 10px; - padding-left: 40px; + color: var(--ink-mid); + font-family: var(--font-serif); + font-style: italic; + font-size: 13px; + margin-bottom: 12px; + padding-left: 44px; + line-height: 1.6; } .submit-form textarea, @@ -525,24 +1050,34 @@ main { .submit-form input[type="url"] { width: 100%; background: var(--field-bg); - color: var(--fg); + color: var(--ink); + font-family: var(--font-mono); border: 1px solid var(--border); padding: 14px 16px; - font: inherit; + font-size: 14px; outline: none; resize: vertical; - transition: border-color 0.15s ease, background 0.15s ease; + transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.25s ease; } - .submit-form textarea:focus, .submit-form input:focus { - border-color: var(--border-bright); + border-color: var(--amber-dim); background: var(--field-bg-focus); + box-shadow: 0 0 0 1px var(--amber-dim), 0 0 24px -10px var(--amber-glow); } -.submit-form textarea::placeholder, -.submit-form input::placeholder { - color: var(--fg-faint); +.submit-form .field.invalid textarea, +.submit-form .field.invalid input[type="text"], +.submit-form .field.invalid input[type="url"] { + border-color: #8b3a3a; + animation: shake 0.36s ease-in-out 1; +} +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 20% { transform: translateX(-5px); } + 40% { transform: translateX(5px); } + 60% { transform: translateX(-3px); } + 80% { transform: translateX(3px); } } .field-checkbox-group { @@ -551,98 +1086,62 @@ main { gap: 10px; margin-top: 4px; } - .axis-check { display: flex; align-items: center; gap: 10px; - padding: 14px 14px; + padding: 16px; border: 1px solid var(--border); background: var(--field-bg); cursor: pointer; - transition: border-color 0.15s ease, background 0.15s ease; + transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.25s ease; position: relative; + font-family: var(--font-mono); } - .axis-check:hover { border-color: var(--border-bright); background: var(--field-bg-focus); } - -.axis-check input[type="checkbox"] { - accent-color: var(--fg); - margin: 0; - flex-shrink: 0; -} - -.axis-check-tag { - color: var(--fg-dim); - font-size: 10px; - letter-spacing: 0.22em; -} - -.axis-check-name { - color: var(--fg); - font-size: 13px; - letter-spacing: 0.08em; -} - +.axis-check input[type="checkbox"] { accent-color: var(--amber); margin: 0; flex-shrink: 0; } +.axis-check-tag { color: var(--ink-dim); font-size: 10px; letter-spacing: 0.22em; } +.axis-check-name { color: var(--ink); font-size: 13px; letter-spacing: 0.08em; } .axis-check-weighted { - border-color: var(--border-bright); - background: rgba(255, 255, 255, 0.025); -} - -.axis-check-weighted .axis-check-name { - color: var(--fg); -} - + border-color: var(--amber-dim); + background: + radial-gradient(circle at 2px 2px, rgba(224,163,100,0.06) 0.6px, transparent 1px), + var(--field-bg); + background-size: 8px 8px, cover; +} +.axis-check-weighted:hover { box-shadow: 0 0 18px -6px var(--amber-glow); } +.axis-check-weighted .axis-check-name { color: var(--amber); } .axis-check-weight { position: absolute; - top: 6px; - right: 10px; - color: var(--fg-dim); + top: 6px; right: 10px; + color: var(--amber); font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase; } - @media (max-width: 640px) { - .field-checkbox-group { - grid-template-columns: 1fr; - } - - .axis-check-weight { - position: static; - margin-left: auto; - } -} - -.field-sub { - margin-top: 12px; - display: flex; - flex-direction: column; - gap: 8px; -} - -.field-sub-label { - color: var(--fg-dim); - font-size: 12px; - padding-left: 0; + .field-checkbox-group { grid-template-columns: 1fr; } + .axis-check-weight { position: static; margin-left: auto; } } +.field-sub { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; } +.field-sub-label { color: var(--ink-dim); font-size: 12px; font-family: var(--font-mono); } .submit-form input[type="file"] { - color: var(--fg-mid); - font: inherit; + color: var(--ink-mid); + font-family: var(--font-mono); background: transparent; border: 1px dashed var(--border-bright); padding: 12px 16px; cursor: pointer; width: 100%; + font-size: 12px; } - .submit-form input[type="file"]::file-selector-button { background: transparent; - color: var(--fg); + color: var(--ink); border: 1px solid var(--border-bright); font: inherit; padding: 4px 10px; @@ -651,209 +1150,482 @@ main { cursor: pointer; } -.consent { - font-size: 12px; - color: var(--fg-mid); -} +.consent { font-size: 12px; color: var(--ink-mid); font-family: var(--font-serif); font-style: italic; } +.consent label { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; line-height: 1.6; } +.consent input[type="checkbox"] { margin-top: 4px; accent-color: var(--amber); } -.consent label { - display: flex; - gap: 10px; - align-items: flex-start; - cursor: pointer; -} - -.consent input[type="checkbox"] { - margin-top: 3px; - accent-color: var(--fg); -} - -.submit-row { - margin-top: 28px; -} +.submit-row { margin-top: 32px; } .submit-btn { background: transparent; - color: var(--fg); + color: var(--ink); border: 1px solid var(--border-bright); - padding: 14px 22px; - font: inherit; - letter-spacing: 0.18em; + padding: 16px 28px; + font-family: var(--font-mono); + letter-spacing: 0.22em; font-size: 13px; cursor: pointer; display: inline-flex; align-items: center; - gap: 12px; - transition: border-color 0.15s ease, background 0.15s ease; + gap: 14px; + transition: border-color 0.25s ease, background 0.25s ease, box-shadow 0.35s ease, color 0.25s ease; + position: relative; + overflow: hidden; } - .submit-btn:hover { - border-color: var(--fg); - background: rgba(255, 255, 255, 0.04); -} - -.submit-btn:disabled { - cursor: not-allowed; - opacity: 0.4; -} - -.submit-sigil { - color: var(--fg-mid); -} - -.cursor-static { - color: var(--fg); - animation: blink 1.1s steps(1, end) infinite; + border-color: var(--amber); + color: var(--amber); + background: + radial-gradient(circle at 2px 2px, rgba(224,163,100,0.08) 0.6px, transparent 1px), + rgba(224,163,100,0.03); + background-size: 6px 6px, cover; + box-shadow: 0 0 32px -10px var(--amber-glow); +} +.submit-btn .ripple { + position: absolute; + border-radius: 50%; + background: var(--amber-glow); + transform: scale(0); + animation: ripple 0.62s ease-out; + pointer-events: none; } - -@keyframes blink { - 50% { - opacity: 0; - } +@keyframes ripple { + to { transform: scale(4); opacity: 0; } } +.submit-sigil { color: var(--amber-dim); } +.submit-btn .cursor-static { color: var(--amber); animation: cursor-blink 1.05s steps(1) infinite; } .submit-feedback { - margin-top: 24px; - padding: 16px 18px; + margin-top: 28px; + padding: 18px 22px; border: 1px solid var(--border-bright); - background: rgba(255, 255, 255, 0.015); - color: var(--fg); + background: + repeating-linear-gradient(45deg, + rgba(255,255,255,0.012) 0, rgba(255,255,255,0.012) 2px, + transparent 2px, transparent 8px); + color: var(--ink); + font-family: var(--font-mono); + font-size: 13px; white-space: pre-wrap; - line-height: 1.7; + line-height: 1.75; display: none; + position: relative; } - -.submit-feedback.visible { - display: block; -} - -.submit-feedback.error { - border-color: #4d2525; - color: var(--fg); -} +.submit-feedback.visible { display: block; } +.submit-feedback.error { border-color: #4d2525; color: var(--ink); } +.submit-feedback.ok { border-color: var(--amber-dim); box-shadow: 0 0 40px -14px var(--amber-glow); } /* ---------------------------------------------------------------- ledger */ .ledger-intro { - color: var(--fg-mid); - margin: 0 0 20px; + color: var(--ink-mid); + font-family: var(--font-serif); + font-style: italic; + margin: 0 0 24px; + font-size: 16px; } - .ledger-table { border-top: 1px solid var(--border); - color: var(--fg-mid); + font-family: var(--font-mono); + max-width: var(--col-mono); } - .ledger-row { display: grid; grid-template-columns: 1fr 160px 120px; gap: 16px; - padding: 10px 0; + padding: 14px 0; border-bottom: 1px solid var(--border); font-size: 13px; letter-spacing: 0.04em; + transition: background 0.3s ease; } - -.ledger-row .hash { - color: var(--fg); - font-variant-numeric: tabular-nums; -} - -.ledger-row .time { - color: var(--fg-dim); +.ledger-row.fresh { + background: rgba(224,163,100,0.08); + animation: ledger-flash 1.2s ease-out; } - -.ledger-row .status { - text-align: right; - letter-spacing: 0.2em; - font-size: 11px; -} - -.ledger-row .status.pending { - color: var(--fg-mid); -} - -.ledger-row .status.advanced { - color: var(--fg); -} - -.ledger-row .status.ignited { - color: var(--fg); - text-decoration: underline; - text-underline-offset: 3px; -} - -.ledger-row .status.rejected { - color: var(--fg-faint); +@keyframes ledger-flash { + 0% { background: rgba(224,163,100,0.3); } + 100% { background: rgba(224,163,100,0); } } +.ledger-row .hash { color: var(--ink); font-variant-numeric: tabular-nums; } +.ledger-row .time { color: var(--ink-dim); } +.ledger-row .status { text-align: right; letter-spacing: 0.2em; font-size: 11px; } +.ledger-row .status.pending { color: var(--ink-mid); } +.ledger-row .status.advanced { color: var(--ink); } +.ledger-row .status.ignited { color: var(--amber); text-decoration: underline; text-underline-offset: 3px; text-shadow: 0 0 8px var(--amber-glow); } +.ledger-row .status.rejected { color: var(--ink-faint); } /* ---------------------------------------------------------------- footer */ .footer { - padding: 40px 28px 32px; - color: var(--fg-faint); + padding: 60px 32px 40px; + color: var(--ink-faint); + font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.22em; border-top: 1px solid var(--border); - margin-top: 80px; + margin-top: 120px; + position: relative; + z-index: 2; + text-transform: uppercase; } - .footer-row { - max-width: 820px; + max-width: 1200px; margin: 0 auto; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 16px; } +.footer-row .pulse { + color: var(--amber); + animation: cursor-blink 1.4s steps(1) infinite; +} + +/* ---------------------------------------------------------------- scroll reveal — "develop" */ + +.reveal { + opacity: 0; + filter: blur(6px) contrast(0.55); + transform: translateY(8px); + transition: + opacity 0.9s cubic-bezier(0.2, 0.55, 0.2, 1), + filter 0.9s cubic-bezier(0.2, 0.55, 0.2, 1), + transform 0.9s cubic-bezier(0.2, 0.55, 0.2, 1); + will-change: opacity, transform, filter; +} +.reveal.visible { + opacity: 1; + filter: blur(0) contrast(1); + transform: translateY(0); +} /* ---------------------------------------------------------------- responsive */ @media (max-width: 640px) { - .topbar { - padding: 12px 18px; - font-size: 10px; - } + .topbar { padding: 12px 18px; font-size: 10px; } + .hero { padding: 110px 22px 48px; } + .section { padding: 110px 22px 72px; } + .hero-title { letter-spacing: 0.22em; } + .field-hint { padding-left: 0; } + .kv-list li { grid-template-columns: 48px 1fr; } + .ledger-row { grid-template-columns: 1fr 100px; grid-template-areas: "hash status" "time status"; } + .ledger-row .hash { grid-area: hash; } + .ledger-row .time { grid-area: time; } + .ledger-row .status { grid-area: status; } + .hero-status { grid-template-columns: 1fr; gap: 12px; text-align: left; } + .hero-status .cell.right { justify-content: flex-start; } +} + +/* ---------------------------------------------------------------- whitepaper chrome */ + +/* classification strip — top of hero */ +.classification { + position: relative; + z-index: 3; + padding: 12px 32px; + border-bottom: 1px solid var(--border); + background: rgba(10,12,18,0.4); + font-family: var(--font-mono); + font-size: 9.5px; + letter-spacing: 0.42em; + color: var(--ink-dim); + text-transform: uppercase; + display: flex; + justify-content: center; + align-items: center; + gap: 18px; +} +.classification .dot { color: var(--amber); } +.classification .spacer { color: var(--ink-faint); } - .hero { - padding: 96px 20px 40px; - } +/* corner registration marks */ +.corner { + position: absolute; + width: 22px; height: 22px; + color: var(--ink-dim); + font-family: var(--font-mono); + font-size: 18px; + line-height: 1; + pointer-events: none; + z-index: 2; + opacity: 0.6; +} +.corner.tl { top: 56px; left: 28px; } +.corner.tr { top: 56px; right: 28px; } +.corner.bl { bottom: 28px; left: 28px; } +.corner.br { bottom: 28px; right: 28px; } + +/* incipit — one italic line above the masthead */ +.hero-incipit { + font-family: var(--font-serif); + font-style: italic; + font-size: 14px; + letter-spacing: 0.01em; + color: var(--ink-mid); + text-align: center; + margin: 0 0 34px; + max-width: 640px; + line-height: 1.5; +} +.hero-incipit::before, +.hero-incipit::after { + content: "—— "; + color: var(--amber-dim); + font-style: normal; + letter-spacing: 0; +} +.hero-incipit::after { content: " ——"; } - .hero-text .title { - font-size: 28px; - letter-spacing: 0.2em; - } +/* abstract — right after the title */ +.hero-abstract { + max-width: 560px; + margin: 18px auto 28px; + font-family: var(--font-mono); + font-size: 12px; + letter-spacing: 0.04em; + color: var(--ink-light); + line-height: 1.75; + padding: 18px 22px; + border-top: 1px solid var(--ink-faint); + border-bottom: 1px solid var(--ink-faint); + text-align: left; + position: relative; + text-transform: uppercase; +} +.hero-abstract::before { + content: "ABSTRACT"; + position: absolute; + top: -7px; + left: 22px; + background: var(--bg); + padding: 0 10px; + color: var(--amber); + font-size: 9px; + letter-spacing: 0.4em; +} +.hero-abstract .caret { + display: inline-block; + width: 7px; height: 13px; + background: var(--amber); + margin-left: 3px; + transform: translateY(2px); + animation: cursor-blink 1.05s steps(1) infinite; +} - .section { - padding: 80px 20px 60px; - } +/* folio — Roman numeral alongside section number */ +.folio { + display: inline-flex; + align-items: baseline; + gap: 8px; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.3em; + color: var(--ink-dim); +} +.folio .roman { + color: var(--ink); + font-family: var(--font-display); + font-style: italic; + font-size: 20px; + letter-spacing: 0.02em; + line-height: 1; +} - .field-hint { - padding-left: 0; - } +/* section epigraph — italic pull-quote above the title */ +.section-epigraph { + font-family: var(--font-serif); + font-style: italic; + font-size: 15px; + color: var(--ink-mid); + line-height: 1.5; + max-width: 540px; + margin: 18px 0 28px; + padding-left: 18px; + border-left: 1px solid var(--amber-dim); +} - .kv-list li { - grid-template-columns: 48px 1fr; - } +/* marginalia — small gray mono notes in left margin (desktop only) */ +.marginalia { + position: absolute; + top: 0; + left: -180px; + width: 150px; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.06em; + color: var(--ink-dim); + line-height: 1.55; + text-align: right; + padding-top: 4px; +} +.marginalia .ref { + color: var(--amber-dim); + font-size: 9px; + letter-spacing: 0.2em; + display: block; + margin-bottom: 4px; + text-transform: uppercase; +} +@media (max-width: 1180px) { + .marginalia { display: none; } +} - .ledger-row { - grid-template-columns: 1fr 100px; - grid-template-areas: - "hash status" - "time status"; - } +/* ornamental section divider with centered mark */ +.ornament { + text-align: center; + padding: 80px 0 40px; + font-family: var(--font-display); + font-size: 22px; + color: var(--amber-dim); + letter-spacing: 0.5em; +} +.ornament::before, +.ornament::after { + content: "——————"; + color: var(--ink-faint); + padding: 0 18px; + letter-spacing: 0; + font-size: 10px; + vertical-align: middle; +} - .ledger-row .hash { - grid-area: hash; - } - .ledger-row .time { - grid-area: time; - } - .ledger-row .status { - grid-area: status; - } +/* colophon — footer typography + provenance */ +.colophon { + max-width: 1200px; + margin: 60px auto 0; + padding: 40px 32px 24px; + border-top: 1px solid var(--border); + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 48px; + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.08em; + color: var(--ink-dim); + line-height: 1.7; +} +.colophon h4 { + margin: 0 0 10px; + color: var(--amber); + font-size: 10px; + font-family: var(--font-mono); + font-weight: 500; + letter-spacing: 0.3em; + text-transform: uppercase; +} +.colophon p { margin: 0 0 4px; } +.colophon .mark { + font-family: var(--font-display); + font-style: italic; + font-size: 16px; + color: var(--ink-light); + letter-spacing: 0; +} +.colophon a { color: var(--ink-light); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--amber-dim); } +.colophon a:hover { color: var(--amber); } + +@media (max-width: 820px) { + .colophon { grid-template-columns: 1fr; gap: 28px; padding: 32px 22px; } +} - .ascii-art { - font-size: 7px; +/* ticker — slow whisper along the bottom of certain sections */ +.ticker { + position: relative; + z-index: 2; + margin: 100px 0 0; + padding: 16px 0; + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + overflow: hidden; + white-space: nowrap; + background: var(--bg-sunk); +} +.ticker-track { + display: inline-flex; + gap: 64px; + animation: ticker-drift 60s linear infinite; + will-change: transform; + padding-left: 100%; + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.24em; + color: var(--ink-dim); + text-transform: uppercase; +} +.ticker-track .glyph { color: var(--amber); letter-spacing: 0; } +@keyframes ticker-drift { + from { transform: translateX(0); } + to { transform: translateX(-50%); } +} + +/* update the topbar: add a tiny amber pulse dot for liveness */ +.topbar-left::before { + content: "● "; + color: var(--amber); + margin-right: 4px; + animation: cursor-blink 2.4s steps(1) infinite; +} + +/* the hero CTA cascade — two lines */ +.cta-cascade { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + margin-bottom: 0; +} +.cta-sub { + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.26em; + color: var(--ink-dim); + text-transform: uppercase; +} +.cta-sub .dot { color: var(--amber-dim); margin: 0 8px; } + +/* axes — animated highlight per row in the first-card behavior diagram */ +.axis-viz .row { + display: block; + transition: opacity 0.4s ease, color 0.4s ease; +} +.axis-card.card-01 .row { opacity: 0.6; } +.axis-card.card-01 .row.hot { + opacity: 1; + color: var(--amber); + text-shadow: 0 0 10px var(--amber-glow); +} + +/* for card-02 (knowledge) progressive fill */ +.axis-card.card-02 .row .fill { + display: inline-block; + color: var(--amber); +} + +/* for card-03 (scaffold) stacked panels */ +.axis-card.card-03 .panel { + display: block; + border-left: 1px dashed var(--border); + padding-left: 10px; + margin: 8px 0; + transition: border-color 0.4s ease, color 0.4s ease; +} +.axis-card.card-03 .panel.hot { border-left-color: var(--amber); color: var(--ink); } +.axis-card.card-03 .panel .new { color: var(--amber); } + +/* mystique — subtle pulse on status dot */ +.hero-status .cell .live-pulse { + color: var(--amber); + animation: cursor-blink 1.8s steps(1) infinite; + margin-right: 2px; +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + animation-iteration-count: 1 !important; } + #dither, .stardust, .grain { display: none; } + .reveal { filter: none; } } diff --git a/index.html b/index.html index 4330519..f5fc5a1 100644 --- a/index.html +++ b/index.html @@ -3,297 +3,376 @@ - TOKEN-IGNITION + TOKEN-IGNITION · Selection Protocol v0.1 + - + + + + + +
    - + / - +
    - + + + + + +

    + +
    + + + +
    + +
    +

    TOKEN-IGNITION

    +
    +

    -
    -

    TOKEN-IGNITION

    -

    -

    -

    +
    + +

    +

    + +
    -
    + + + · + + · + +
    + + + +
    - +
    -
    -
    -
    + + + -
    -
    +
    +
    +

    +

    +

    +

    +
    +
    +

    +

    +

    +

    +
    +
    +

    +

    +

    +
    +
    +
    From 8b212177daa033615346f89f935ab7f9a2ff0c1c Mon Sep 17 00:00:00 2001 From: CMLKevin <74870576+CMLKevin@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:43:10 +0800 Subject: [PATCH 3/5] chore: gitignore local vercel link + scratch files --- .gitignore | 12 +++--------- .gitignore.local | 1 - .vercel/project.json | 4 ---- 3 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 .gitignore.local delete mode 100644 .vercel/project.json diff --git a/.gitignore b/.gitignore index 72fa8d5..42a23b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,3 @@ -.DS_Store -node_modules/ -.vscode/ -.idea/ -*.log -.env -.env.local -dist/ -build/ +.vercel/ +.gitignore.local +/tmp/ diff --git a/.gitignore.local b/.gitignore.local deleted file mode 100644 index e985853..0000000 --- a/.gitignore.local +++ /dev/null @@ -1 +0,0 @@ -.vercel diff --git a/.vercel/project.json b/.vercel/project.json deleted file mode 100644 index 5a2b0b5..0000000 --- a/.vercel/project.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "projectId": "prj_CVa869W7Hd7C9C1wQZiqbEdhLxd3", - "orgId": "team_4xTQIqEY3SqKsWwyO8RqeEEp" -} From cc5d4c614f76f05330c4f9c898106fe14ad664fd Mon Sep 17 00:00:00 2001 From: CMLKevin <74870576+CMLKevin@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:55:59 +0800 Subject: [PATCH 4/5] fix: center split columns, stop viz clipping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ladder and gap vizzes were overflowing their SVG viewBox — labels like "autonomous long-horizon research" rendered past the container edge and got clipped. - Split columns now symmetric: 1fr 1fr (was 0.9/1.1), gap 56px. - align-items: center so the viz is vertically centered alongside the text instead of top-aligned (removes the lopsided look when heights differ). - split-viz content now max-width 560px and justify-center, so vizzes are framed consistently inside their columns. - Ladder SVG: viewBox 420x460 → 520x430, rung lengths 80+i*22 → 44+i*8. All labels now fit within the viewBox. - Gap SVG: viewBox 520x300 → 600x320. Model/scaffold labels at x=496 now sit inside bounds. - Sticky behavior dropped (conflicts with center alignment; not needed given the tighter balance). Co-Authored-By: Claude Opus 4.7 (1M context) --- assets/app.js | 24 ++++++++++++------------ assets/styles.css | 16 +++++++++------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/assets/app.js b/assets/app.js index 4ab44b9..363f047 100644 --- a/assets/app.js +++ b/assets/app.js @@ -760,7 +760,7 @@ const wrap = document.getElementById("gap-svg-wrap"); if (!wrap) return; - const W = 520, H = 300; + const W = 600, H = 320; const svg = ` @@ -873,11 +873,11 @@ const wrap = document.getElementById("ladder-svg-wrap"); if (!wrap) return; - const W = 420, H = 460; - const rails = 88; + const W = 520, H = 430; + const rails = 78; const rungs = t.ladderRungs; // bottom-up const nRungs = rungs.length; - const topY = 48, bottomY = 410; + const topY = 42, bottomY = 380; const step = (bottomY - topY) / (nRungs - 1); // halftone pattern: three densities @@ -903,7 +903,7 @@ let rungsSvg = ""; rungs.forEach((r, i) => { const y = bottomY - i * step; - const len = 80 + i * 22; // rung gets longer as OOM increases + const len = 44 + i * 8; // rung gets longer as OOM increases const pattern = r.kind === "gate" ? "url(#ht-amber)" : r.kind === "frontier" ? "url(#ht-vapor)" : @@ -919,10 +919,10 @@ const starred = r.kind === "gate" && r.oom === "10⁸"; // ignition gate.3 const currentBadge = r.current - ? ` + ? ` - ${escapeHtml(t.ladderYouAreHere)}` + ${escapeHtml(t.ladderYouAreHere)}` : ""; rungsSvg += ` @@ -943,21 +943,21 @@ - - ${escapeHtml(t.ladderIgnitionLine)} + + ${escapeHtml(t.ladderIgnitionLine)} - ${escapeHtml(t.ladderZoneLab)} - ${escapeHtml(t.ladderZoneRamp)} + ${escapeHtml(t.ladderZoneLab)} + ${escapeHtml(t.ladderZoneRamp)} ${rungsSvg} - ( naked model ceiling ) + ( naked model ceiling ) `; wrap.innerHTML = svg; diff --git a/assets/styles.css b/assets/styles.css index 6cd5f0c..56ceee8 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -376,17 +376,19 @@ main { position: relative; z-index: 2; } .split { display: grid; - grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); - gap: 64px; - align-items: start; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 56px; + align-items: center; } .split-text { min-width: 0; } -.split-viz { min-width: 0; position: relative; } -.split-viz.sticky { position: sticky; top: 88px; } +.split-viz { min-width: 0; position: relative; display: flex; justify-content: center; } +.split-viz > * { width: 100%; max-width: 560px; } +.split-viz.sticky { position: static; } @media (max-width: 900px) { - .split { grid-template-columns: 1fr; gap: 36px; } - .split-viz.sticky { position: static; } + .split { grid-template-columns: 1fr; gap: 40px; align-items: stretch; } + .split-viz { justify-content: stretch; } + .split-viz > * { max-width: none; } } /* ---------------------------------------------------------------- prose */ From 3f83088e75f49b81d12b4b91a6e6cf54799727b7 Mon Sep 17 00:00:00 2001 From: CMLKevin <74870576+CMLKevin@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:06:07 +0800 Subject: [PATCH 5/5] simplify: drop whitepaper chrome, compress copy ~70%, unify type scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Response to lab lead feedback: site was too flashy, too many fonts, text too long. This commit trims it down to what actually carries the thesis: two charts + the essential copy. Typography — from 3 font families to 2: - Dropped Fraunces (and EB Garamond fallback). - Newsreader (serif, variable optical size) now handles all serif — display and body — so there is one serif voice, not two. - IBM Plex Mono stays for the machine voice. - Hero reduced to 4 distinct typographic styles (was ~6): title, meta label (shared across subtitle/CTA/scroll-hint), hook, tagline. Copy compressed to ~1/3: - Hero: ~180w → ~50w. Abstract, incipit, CTA cascade, status strip gone. - Manifesto body: 280w → 70w (2 paragraphs). - Ladder intro+close: 90w → 40w (single paragraph; drop-cap removed). - Axes card bodies: 40w → 20w each; dropped inner mono viz blocks. - Gates intro: 80w → 30w; quote removed. - Protocol R7 + rules merged — the 5-item submission requirements section is gone; its substance folded into R2 (machine-verifiable via public endpoint) and the audit callout under the protocol. - Submit intro: 40w → 20w. Whitepaper chrome removed: - Classification strip · incipit · hero abstract (typewrite) · folio Roman numerals · section epigraphs · mid-page ticker · colophon · hero corner registration crosses · CTA sub-cascade ("no cv · no pitch · …") · hero live status strip · cursor halftone trail · hero title develop transition (blur+contrast → crisp) · drop cap. Kept (what Jim praised): - Gap viz (SVG: exponential model vs flat scaffold, halftone-filled gap with "the gap / (the lab)" label inside). - Ladder viz (SVG: vertical ladder, halftone rungs, ignition line, amber "you are here" on gate.1). - Dark palette, amber accent, Bayer-dither ground (dialed down). Section count: 10 → 8. Code: ~3100 lines → ~2100 lines. Reveal transition simplified to opacity + slight translate (no blur). Co-Authored-By: Claude Opus 4.7 (1M context) --- assets/app.js | 792 ++++++------------------- assets/styles.css | 1435 +++++++++++---------------------------------- index.html | 261 ++------- 3 files changed, 570 insertions(+), 1918 deletions(-) diff --git a/assets/app.js b/assets/app.js index 363f047..f6e176c 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,5 +1,5 @@ /* ============================================================ - TOKEN-IGNITION — v0.1 · Selection Protocol + TOKEN-IGNITION — v0.1 · simplified ============================================================ */ (() => { @@ -22,52 +22,21 @@ en: { brand: "TOKEN-IGNITION · SELECTION PROTOCOL", - classVersion: "SELECTION PROTOCOL v0.1", - classCohort: "COHORT №1", - classHost: "JOULE RESEARCH", - - heroIncipit: "for anyone who can build a scaffold that climbs the next rung without them.", - heroMasthead: "A SELECTION PROTOCOL", - heroSubtitle: "FOR AI-NATIVE RESEARCHERS · APR 2026", - heroAbstract: - "We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². The only question we ask is whether the scaffold you build can climb the next rung without you.", + heroSubtitle: "A selection gate for AI-native researchers · v0.1 · Apr 2026", heroHook: - "Model horizons double every four months. The scaffolds around them do not. That gap is the work.", + 'Model horizons double every four months. The scaffolds around them do not. That gap is the work.', heroTagline: - "You define a long-horizon task. You build a scaffold that evolves itself. If the scaffold clears the AI audit, you are invited into the research group. Tokens are how we make that possible — not why.", + "You define a long-horizon task. You build a scaffold that evolves itself. Clear the AI audit — you’re in the research group. The artifact is the application. Passing is the offer.", heroCTA: "↓ submit your scaffold", - heroCTASub1: "no cv", - heroCTASub2: "no pitch", - heroCTASub3: "no interview", - heroStatGates: "gate.1", - heroStatGate1: "open · accepting", - heroStatIgnitions: "ignitions · v0.1", - heroStatIgnitionsVal: "0 / ∞", - heroStatWindow: "window", - heroStatWindowVal: "continuous", - scrollHint: "scroll to read how selection works", - - // Section epigraphs - manifestoEpigraph: "The scaffold is the bottleneck. This lab exists because the models are moving; the harnesses are not.", - ladderEpigraph: "Each order of magnitude unlocked becomes a product. The rest becomes research.", - axesEpigraph: "Evolution travels along three axes. Two are common. One is what we are looking for.", - protocolEpigraph: "Seven rules. The seventh is the one most submissions fail.", - rulesEpigraph: "If the AI auditor cannot verify it, it does not exist.", - allocationEpigraph: "Selection is a scaffold around the scaffold. Each gate awards more compute; each gate raises the bar.", - submitEpigraph: "Seven fields. The artifact is the application. Passing is the offer.", - - // Manifesto + scrollHint: "scroll to read the protocol", + manifestoLabel: "manifesto", manifestoTitle: "Why this exists", manifestoBody: ` -

    Hiring in frontier AI is broken. The legible names get the interviews, the compute, the role. The people who would actually have moved the field rarely pass the filters.

    -

    CVs measure legibility, not ability. Pitches measure articulation, not craft. Interviews measure composure under pressure. None of these measure whether you can build a system that evolves itself.

    -

    Our bet is smaller and sharper than "find genius." Model capability doubles roughly every four months — METR's measured cadence has only accelerated since their original paper. The engineering around it — memory, tools, planning loops, self-correction, long-horizon coherence — moves at a human pace, and caps out several orders of magnitude earlier than the models themselves could support.

    -

    This lab exists to close that gap. We are climbing a ladder of token horizons per single coherent task, from 10⁶ to 10¹². Each rung we unlock becomes a product. We do not care about founders. We care about people whose systems can climb the next rung without them.

    -

    So we inverted the interview. You give us a task you defined and a scaffold you built. If the scaffold can clear the AI audit by evolving itself, you are in the research group. The artifact is the application. Passing is the offer.

    +

    Hiring in frontier AI filters for legibility, not ability. CVs, pitches, interviews — none of them measure whether you can build a system that evolves itself.

    +

    Model capability doubles every four months. The scaffolds around it move at a human pace, and cap out several orders of magnitude below what the models could support. This lab exists to close that gap. So we inverted the interview. Your artifact is the application.

    `, - // Gap viz gapVizHead: "CAPABILITY · HORIZON PER TASK · LOG SCALE · 2024–2030", gapModelLabel: "model", gapScaffoldLabel: "scaffold", @@ -75,290 +44,146 @@ gapScaffoldAnnot: "≈ flat", gapZoneLabel: "the gap", gapZoneSub: "( the lab )", - gapLegendTag: "the gap", - gapLegendNote: "widening every quarter.\nthis is the lab.", + gapVizNote: "widening every quarter. this is the work.", - // Ladder ladderLabel: "orders of magnitude", ladderTitle: "The ladder", ladderIntro: ` -

    We measure our own progress by the token horizon of a single coherent task — the amount of compute a scaffold can meaningfully apply to one objective before it loses coherence, deviates, or stalls.

    -

    Today's practical ceiling sits around 10⁶–10⁷. We are climbing to 10¹². Each order of magnitude earns engineering productization — a system spun out, resourced, shipped.

    +

    We measure progress by the token horizon of a single coherent task — how much compute a scaffold can meaningfully apply to one objective before it stalls. Today: 10⁶–10⁷. Target: 10¹². Each rung unlocked becomes a product.

    `, - ladderClose: "The first three rungs are the admission ramp. What happens above them is the lab.", ladderVizHead: "TOKEN HORIZON · SINGLE COHERENT TASK", ladderRungs: [ - { oom: "10⁶", name: "gate.1 — admission", kind: "gate", current: true }, - { oom: "10⁷", name: "gate.2 — verified", kind: "gate" }, - { oom: "10⁸", name: "gate.3 — ignition", kind: "gate" }, + { oom: "10⁶", name: "gate.1 — admission", kind: "gate", current: true }, + { oom: "10⁷", name: "gate.2 — verified", kind: "gate" }, + { oom: "10⁸", name: "gate.3 — ignition", kind: "gate" }, { oom: "10⁹", name: "self-evolving codebases", kind: "lab" }, { oom: "10¹⁰", name: "multi-month project execution", kind: "lab" }, { oom: "10¹¹", name: "autonomous long-horizon research", kind: "lab" }, - { oom: "10¹²", name: "? the research frontier", kind: "frontier" }, + { oom: "10¹²", name: "? research frontier", kind: "frontier" }, ], ladderIgnitionLine: "— IGNITION LINE —", ladderZoneLab: "· THE LAB ·", - ladderZoneRamp: "· ADMISSION RAMP ·", + ladderZoneRamp: "· ADMISSION ·", ladderYouAreHere: "◀ here", - // Axes axesLabel: "what evolves", axesTitle: "Three axes of self-evolution", - axesIntro: ` -

    A self-evolving scaffold must move along at least one of these axes between runs — without a human editing prompts, weights, or code in between. The third is rare. We weight it highest.

    - `, + axesIntro: `

    A self-evolving scaffold must move along at least one axis between runs — without human edits. The third is rare. We weight it highest.

    `, axesCards: [ - { - tag: "01", - name: "behavior", - body: "The scaffold changes how it acts across runs — its policies, its decision rules, its strategy — without a human editing its prompt or code between runs.", - viz: `run.1 x ─→ A ─→ y -run.2 x ─→ A ─→ y′ -run.3 x ─→ B ─→ y″ -run.4 x ─→ B ─→ y‴ - -░░░░░░░░░░░░░░░░░░░░░░░░ -same input · diverging -path · no human edit.`, - cardClass: "card-01", - }, - { - tag: "02", - name: "knowledge", - body: "The scaffold accumulates, distills, or restructures what it knows across runs — its memory, its representations, its internal references.", - viz: `run.1 ░░░░░░░░░░ 8 kb -run.2 ▒░░░░░░░░░ 23 kb -run.3 ▒▒░░░░░░░░ 56 kb -run.4 ▓▒░░░░░░░░ 120 kb -run.5 ▓▓▒▒░░░░░░ 240 kb -run.6 ▓▓▓▒▒░░░░░ 480 kb - -░░░░░░░░░░░░░░░░░░░░░░░░ -memory accrues, distills, -restructures.`, - cardClass: "card-02", - }, - { - tag: "03", - name: "scaffold", - body: "The scaffold modifies itself across runs — its tools, its control loop, its evaluation criteria, its successor. This is the rare axis. This is the one we are looking for.", - viz: `t = 0 - [ run() ] - [ eval() ] - [ ↺ self ] -t = 1 - [ run() ] - [ eval() ] - [ rewrite()] ←new - [ ↺ self ] -t = 2 - [ run() ] - [ eval() ] - [ rewrite()] - [ fork() ] ←new - [ ↺ self′ ] - -the scaffold is the output.`, - weighted: true, - weight: "highest weight", - cardClass: "card-03", - }, + { tag: "01", name: "behavior", body: "Policies, decisions, strategy — changing across runs without a human editing the prompt." }, + { tag: "02", name: "knowledge", body: "Memory, representations, references — accumulating and restructuring across runs." }, + { tag: "03", name: "scaffold", body: "The scaffold modifies itself — its tools, loop, successor. The rare axis. The one we are looking for.", weighted: true, weight: "highest weight" }, ], - axesCalloutHead: "// SELECTION NOTE", - axesCalloutBody: - "A submission may target one axis or several. The evaluation rewards demonstrations along axis 03. A system that only rewrites its prompt is not, by itself, a self-evolving scaffold.", - // Protocol protocolLabel: "protocol", protocolTitle: "Meta-rules", protocolItems: [ - ["R1", "You define the task. The task must be long-horizon, and must require a scaffold that evolves itself to extend the achievable horizon further."], - ["R2", "You define the evaluation criterion. It must be reproducible and machine-verifiable."], + ["R1", "You define the task. It must be long-horizon, and require a scaffold that evolves itself to extend the achievable horizon further."], + ["R2", "You define the evaluation criterion. It must be reproducible and machine-verifiable through a public, AI-readable endpoint."], ["R3", "You build the scaffold. The scaffold — not you — produces the final output."], ["R4", "All submissions are AI-judged. Human audit is random and post-hoc."], ["R5", "Identity is irrelevant. Submissions are accepted under pseudonym."], ["R6", "Selection is gated. Pass a gate, unlock more resources. Pass the final gate, join the research."], - ["R7", "Ablation is required. You must submit a baseline run on the same model with the minimal scaffold. The delta is the evidence. A scaffold that cannot beat its own ablation is not evolving — it is merely present.", true], + ["R7", "Ablation is required. Submit a baseline on the same model with the minimal scaffold. A scaffold that cannot beat its own ablation is not evolving — it is merely present.", true], ], - r7Head: "R7 · THE ABLATION PROOF", - r7Sub: "pass-rate on held-out tasks", + r7Head: "R7 · the ablation proof", r7ScaffoldLabel: "your scaffold", - r7BaselineLabel: "your ablation · minimal scaffold", - r7DeltaTag: "SCAFFOLD", - r7EvidenceTag: "ABLATION", - r7DeltaNote: - "the delta is the evidence. a scaffold that cannot beat its own ablation is not evolving — it is merely present. without the delta, a scaffold is riding on model capability, not earning its claim.", - - // Rules - rulesLabel: "submission requirements", - rulesTitle: "What counts as a valid submission", - rulesItems: [ - { head: "01 // Self-evolution, not prompt-engineering.", body: ["The scaffold must modify its own behavior, knowledge, or structure", "across iterations — without human edits between runs."] }, - { head: "02 // Machine-verifiable output.", body: ["The evaluation criterion must be checkable by an AI auditor", "with no proprietary access — public endpoint, public artifact."] }, - { head: "03 // Live, AI-readable endpoint.", body: ["You must provide a URL an AI can crawl. HTML is fine.", "JSON / OpenAPI / plain text are better. Logins, captchas, GUIs are not accepted."] }, - { head: "04 // Ablation baseline.", body: ["A second endpoint or log: same model, minimal scaffold, same task.", "Your scaffold's contribution is the delta between this and the main endpoint."] }, - { head: "05 // Reproducibility micro-run.", body: ["Attach at least one log of a full run: inputs, intermediate state,", "final artifact hash. Our auditor re-runs a randomly sampled slice."] }, - ], - rulesCalloutHead: "// AUDIT NOTE", - rulesCalloutBody: - "If the AI auditor cannot independently verify your artifact, the submission is rejected. We do not email you for clarifications. The endpoint is the application.", + r7BaselineLabel: "your ablation", + r7Note: "the delta is the evidence. a scaffold that cannot beat its own ablation is merely present.", + + auditHead: "// audit note", + auditBody: "If the AI auditor cannot independently verify your artifact, the submission is rejected. We do not email for clarifications. The endpoint is the application.", - // Gates allocationLabel: "the three gates", allocationTitle: "How selection works", allocationIntro: ` -

    Selection is gated. Each gate awards more compute; each gate raises the bar. The gates are not a funnel — they are a scaffold around the scaffold, pulling capable work through as it proves itself.

    -

    Admission is cheap. Ignition is earned. The last gate is a standing invitation into the research group, not a round of interviews.

    +

    Each gate awards more compute; each gate raises the bar. Admission is cheap. Ignition is earned. The final gate is a standing invitation — not a round of interviews.

    `, - allocationQuote: "Clearing gate.3 is how you get in. Tokens are the side-effect that lets you keep going.", gpCmd: "gate.status --watch", gpLabel1: "admission", gpLabel2: "verified", gpLabel3: "ignition", - gpState1: "● OPEN", - gpState2: "○ SEALED", - gpState3: "○ SEALED", - gpUnlocksWhen: "unlocks when", - gpGrants: "grants", - gpCond1a: "any well-formed submission", - gpCond2a: "reproducible self-evolution", - gpCond2b: "delta > 0 against ablation baseline", - gpCond3a: "scaffold-level evolution (not behavioral drift)", - gpCond3b: "verified by consensus of ≥ 3 independent models", - gpGrants3: "standing invitation into the research group", - gpLive1: "now accepting", - - // Submit + gpState1: "● open", + gpState2: "○ sealed", + gpState3: "○ sealed", + gpCond1: "any well-formed submission", + gpCond2: "reproducible self-evolution · delta > 0 vs ablation", + gpCond3: "scaffold-level evolution · consensus of ≥ 3 models", + gpReward3: "standing invitation to the research group", + submitLabel: "submission", submitTitle: "Apply by submitting", - submitIntro: - "Seven fields. No account. Your entry is hashed and appended to a public ledger. AI audit starts within 24h. Clear the final gate and we reach out to talk about joining the research.", + submitIntro: "Seven fields. No account. Your entry is hashed and appended to a public ledger. AI audit starts within 24h.", field1Label: "task.definition", - field1Hint: "What long-horizon task does the scaffold have to do? One paragraph. Must be testable. Must require a horizon the naked model cannot reach.", - field1Ph: "e.g. Given an open bug in a large Python codebase, the scaffold must autonomously produce a reproducing test, locate the root cause, patch it, and converge to all-green CI — across runs that span >10⁶ tokens of reading, editing, and verification.", + field1Hint: "What long-horizon task must the scaffold do? One paragraph. Must be testable.", + field1Ph: "e.g. Given an open bug in a large Python codebase, the scaffold must autonomously reproduce the test, locate root cause, patch it, and converge to green CI — across runs of >10⁶ tokens.", field2Label: "verification.criterion", field2Hint: "How will an AI auditor know you passed? Give the exact check.", - field2Ph: "e.g. Auditor fetches /benchmark → receives JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }. Passes if status == 'green' on all held-out bugs AND task_token_count ≥ 10⁶ AND scaffold_delta_vs_baseline ≥ +40% on pass rate.", + field2Ph: "e.g. Auditor fetches /benchmark → JSON { task_id, status, diff_sha, baseline_sha }. Passes if status == 'green' AND token_count ≥ 10⁶ AND scaffold_delta ≥ +40%.", field3Label: "evolution.axes", - field3Hint: "Which axis does your scaffold evolve along? Select one or more. Axis 03 (scaffold) weighs highest.", + field3Hint: "Which axis does your scaffold evolve along? Axis 03 (scaffold) weighs highest.", field3OptBehavior: "behavior", field3OptKnowledge: "knowledge", field3OptScaffold: "scaffold", field3OptWeight: "highest weight", field4Label: "execution.plan", - field4Hint: "How does the scaffold evolve itself? What loop, what signal, what memory, what modifies what?", - field4Ph: "Describe the self-modification loop — what the scaffold observes, how it updates itself, how it decides to stop. Write as you would write it to a peer reviewer, not to a VC.", + field4Hint: "How does the scaffold evolve itself? Loop, signal, memory, what modifies what?", + field4Ph: "Describe the self-modification loop — what the scaffold observes, how it updates itself, how it decides to stop. Write as you would to a peer reviewer, not a VC.", field5Label: "live.endpoint", - field5Hint: "A URL an AI can hit right now and get a machine-readable result.", + field5Hint: "A URL an AI can hit right now.", field5Ph: "https://…", - field5Artifact: "attach run log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", + field5Artifact: "attach run log (optional, ≤1MB)", field6Label: "ablation.baseline", - field6Hint: "A second URL: same model, minimal scaffold, same task. The delta between this and your main endpoint is your scaffold's contribution.", + field6Hint: "Same model, minimal scaffold, same task. The delta is your scaffold’s contribution.", field6Ph: "https://…/baseline", - field6Artifact: "attach baseline log (optional, ≤1MB, txt/md/json/log/yaml/jsonl/csv)", + field6Artifact: "attach baseline log (optional, ≤1MB)", field7Label: "contact.handle", - field7Hint: "A pseudonym is fine. We only use it to notify you when a gate opens.", - field7Ph: "e.g. @handle on X, discord username, or email", + field7Hint: "Pseudonym is fine. Used only to notify you when a gate opens.", + field7Ph: "e.g. @handle on X, discord, or email", - consent: "I confirm my submission is my own work, both endpoints are live, and I accept AI-judged, non-negotiable evaluation.", + consent: "I confirm this is my own work, both endpoints are live, and I accept AI-judged, non-negotiable evaluation.", submitButton: "submit", - // Ledger ledgerLabel: "ledger", ledgerTitle: "Recent applications", ledgerIntro: "Every application is stored as a hash on a public repository. No personal data is published.", - // Ticker phrases - ticker: [ - "the endpoint is the application", - "passing is the offer", - "scaffold-level evolution is the rare axis", - "a scaffold that cannot beat its own ablation is merely present", - "we do not hire on cvs", - "the task is the interview", - "tokens are how — not why", - "this lab exists to close the gap", - "no cv · no pitch · no interview", - "the artifact is the application", - ], - - // Colophon - colTypoTitle: "TYPOGRAPHY", - colTypo1: "Display · Fraunces, by Undercase Type", - colTypo2: "Body · Newsreader, by Production Type", - colTypo3: "Technical · IBM Plex Mono, by Mike Abbink", - colProvTitle: "PROVENANCE", - colProv1: "Drafted in the open.", - colProv2: "Joule Research · April 2026", - colProv3: "Selection Protocol v0.1 · living document", - colMarkTitle: "MARK", - colMark1: "“The scaffold is the output.”", - colMark2: "amendments commit to ledger. watch the ledger.", - - footLeft: "TOKEN-IGNITION · SELECTION PROTOCOL · v0.1", - footRight: "RESEARCH HOST: JOULE RESEARCH", + footLeft: "TOKEN-IGNITION · v0.1", + footRight: "JOULE RESEARCH", feedback: { missing: "[reject] missing required fields. check highlighted items.", badUrl: "[reject] live.endpoint must be a valid URL — our auditor has to crawl it.", - badBaseline: "[reject] ablation.baseline must be a valid URL — we audit the delta, not the artifact alone.", - noAxis: "[reject] evolution.axes must have at least one selected — we need to know what is evolving.", - ok: (hash) => `[accept] entry ${hash} queued.\nAI audit window: 24h.\nyou will not receive a confirmation email. watch the ledger.`, + badBaseline: "[reject] ablation.baseline must be a valid URL.", + noAxis: "[reject] evolution.axes must have at least one selected.", + ok: (hash) => `[accept] entry ${hash} queued.\nAI audit window: 24h.\nwatch the ledger.`, }, }, zh: { - brand: "TOKEN-IGNITION · 研究员筛选协议", + brand: "TOKEN-IGNITION · 筛选协议", - classVersion: "筛选协议 v0.1", - classCohort: "COHORT №1", - classHost: "JOULE RESEARCH", - - heroIncipit: "献给能造出一个不依赖自己就能爬上下一级阶梯的脚手架的人。", - heroMasthead: "一 份 筛 选 协 议", - heroSubtitle: "面向 AI 原生研究员 · 2026 年 4 月", - heroAbstract: - "我们正沿着 token 跨度的阶梯往上爬:从 10⁶ 到 10¹²,衡量的是单个连贯任务上的算力投入。我们只问一个问题:你构造的脚手架,能不能在没有你的情况下,爬上下一级。", + heroSubtitle: "面向 AI 原生研究员的筛选入口 · v0.1 · 2026 年 4 月", heroHook: "模型能力每四个月翻一倍。包在模型外面的脚手架不会。这中间的落差,就是我们要做的事。", heroTagline: - "你定义一个长跨度的任务。你构建一个会自我进化的脚手架。如果脚手架通过 AI 审计,你将被邀请进入研究组。token 是让这件事成立的方式,不是我们做这件事的理由。", + "你定义一个长跨度任务。你构建一个会自我进化的脚手架。通过 AI 审计——你就进入研究组。作品本身就是申请。通过,就是 offer。", heroCTA: "↓ 提交你的脚手架", - heroCTASub1: "不看简历", - heroCTASub2: "不看 pitch", - heroCTASub3: "不做 intro call", - heroStatGates: "gate.1", - heroStatGate1: "开放 · 接受申请", - heroStatIgnitions: "点火数 · v0.1", - heroStatIgnitionsVal: "0 / ∞", - heroStatWindow: "窗口", - heroStatWindowVal: "持续开放", - scrollHint: "向下滚动,了解筛选机制", - - manifestoEpigraph: "脚手架是瓶颈。这个 lab 之所以存在,是因为模型在跑,而包裹它们的工程没有跟上。", - ladderEpigraph: "每解锁一个数量级,就变成一个产品。其余的,就是研究。", - axesEpigraph: "进化沿三条轴发生。两条常见,一条才是我们要找的。", - protocolEpigraph: "七条规则。多数提交败在第七条。", - rulesEpigraph: "AI 审计若不能验证,它就不存在。", - allocationEpigraph: "筛选本身就是脚手架外面的脚手架。每道门奖更多算力;每道门也把门槛抬得更高。", - submitEpigraph: "七个字段。作品本身就是申请。通过,就是 offer。", + scrollHint: "向下滚动,阅读协议", manifestoLabel: "宣言", manifestoTitle: "为什么做这件事", manifestoBody: ` -

    前沿 AI 领域的招聘机制是坏的。能被看见的名字拿到面试、拿到算力、拿到位置。真正可能推动这个行业的人,往往过不了筛子。

    -

    简历衡量的是可读性,不是能力。Pitch 衡量的是表达,不是手艺。面试衡量的是临场镇定。没有一项,真正衡量你能不能造出一个会自我进化的系统。

    -

    我们的赌注比"寻找天才"更窄、更锋利。模型能力现在每约四个月就翻一倍——METR 测到的节奏自那篇原文之后只在加速。围绕在模型外面的工程——记忆、工具、规划循环、自我纠错、长跨度的一致性——以人的速度前进,并且常常在模型尚有余力时,就已经到顶了几个数量级。

    -

    这个 lab 存在的意义,是弥合这个落差。我们正在沿着一条阶梯往上爬:单个连贯任务可持续的 token 跨度,从 10⁶ 到 10¹²。每解锁一个数量级,对应的能力就直接做成产品。我们不在乎创始人。我们在乎的是:一个人造出的系统,能不能在没有他的情况下继续往上爬。

    -

    所以我们把面试反过来。你交给我们:一个你定义的任务,一个你构造的脚手架。如果脚手架能通过 AI 审计——靠它自己的进化——你就进入研究组。作品本身就是申请。通过,就是 offer。

    +

    前沿 AI 的招聘筛选的是可读性,不是能力。简历、pitch、面试,都衡量不了你能不能造出一个会自我进化的系统。

    +

    模型能力每四个月翻一倍。包裹它的工程以人的速度前进,并常常在模型尚有余力时就已到顶了几个数量级。这个 lab 存在,就是为了弥合这个落差。所以我们把面试反过来——作品本身就是申请。

    `, gapVizHead: "能力 · 单任务跨度 · 对数坐标 · 2024–2030", @@ -368,137 +193,62 @@ gapScaffoldAnnot: "≈ 几乎不变", gapZoneLabel: "落差", gapZoneSub: "( 这就是 lab )", - gapLegendTag: "落差", - gapLegendNote: "每个季度都在变大。\n这就是 lab。", + gapVizNote: "每季度都在变大。这就是要做的事。", ladderLabel: "数量级", ladderTitle: "阶梯", ladderIntro: ` -

    我们用一个指标衡量自己的进展:单个连贯任务的 token 跨度——一个脚手架能把多少计算持续投入到同一个目标上,在它失去一致性、偏题、或停滞之前。

    -

    今天实际的天花板在 10⁶–10⁷ 这一档。我们想爬到 10¹²。每解锁一个数量级,对应的能力就直接做成产品——独立出来、分配资源、端到端交付。

    +

    我们用一个指标衡量进展:单个连贯任务的 token 跨度——脚手架能把多少计算持续投入到同一个目标上,在它停下来之前。今天:10⁶–10⁷。目标:10¹²。每解锁一个数量级,就变成一个产品。

    `, - ladderClose: "前三级只是入围的坡道。真正的 lab,在它们之上。", ladderVizHead: "TOKEN 跨度 · 单个连贯任务", ladderRungs: [ - { oom: "10⁶", name: "gate.1 — 入围", kind: "gate", current: true }, - { oom: "10⁷", name: "gate.2 — 验证", kind: "gate" }, - { oom: "10⁸", name: "gate.3 — 点火", kind: "gate" }, - { oom: "10⁹", name: "会自我进化的代码库", kind: "lab" }, - { oom: "10¹⁰", name: "多月级项目执行", kind: "lab" }, - { oom: "10¹¹", name: "自主长跨度科研", kind: "lab" }, - { oom: "10¹²", name: "? 研究前沿", kind: "frontier" }, + { oom: "10⁶", name: "gate.1 — 入围", kind: "gate", current: true }, + { oom: "10⁷", name: "gate.2 — 验证", kind: "gate" }, + { oom: "10⁸", name: "gate.3 — 点火", kind: "gate" }, + { oom: "10⁹", name: "会自我进化的代码库", kind: "lab" }, + { oom: "10¹⁰", name: "多月级项目执行", kind: "lab" }, + { oom: "10¹¹", name: "自主长跨度科研", kind: "lab" }, + { oom: "10¹²", name: "? 研究前沿", kind: "frontier" }, ], ladderIgnitionLine: "— 点火线 —", ladderZoneLab: "· 真正的 lab ·", - ladderZoneRamp: "· 入围坡道 ·", + ladderZoneRamp: "· 入围 ·", ladderYouAreHere: "◀ 此处", axesLabel: "何谓进化", axesTitle: "自我进化的三条轴", - axesIntro: ` -

    一个会自我进化的脚手架,在两次运行之间,必须在以下三条轴上至少有一条发生变化——并且期间没有人为编辑 prompt、权重或代码。第三条最稀有。我们也给它最高权重。

    - `, + axesIntro: `

    一个会自我进化的脚手架,必须在两次运行之间至少在一条轴上改变——期间没有人手编辑。第三条最稀有。我们给它最高权重。

    `, axesCards: [ - { - tag: "01", - name: "行为", - body: "脚手架在多次运行之间,改变自己怎么行动——策略、决策规则、方法——期间没有人动它的 prompt 或代码。", - viz: `run.1 x ─→ A ─→ y -run.2 x ─→ A ─→ y′ -run.3 x ─→ B ─→ y″ -run.4 x ─→ B ─→ y‴ - -░░░░░░░░░░░░░░░░░░░░░░░░ -同输入 · 路径发散 -期间无人工编辑。`, - cardClass: "card-01", - }, - { - tag: "02", - name: "知识", - body: "脚手架在多次运行之间,积累、蒸馏、或重构自己所知的内容——记忆、表征、内部参照。", - viz: `run.1 ░░░░░░░░░░ 8 kb -run.2 ▒░░░░░░░░░ 23 kb -run.3 ▒▒░░░░░░░░ 56 kb -run.4 ▓▒░░░░░░░░ 120 kb -run.5 ▓▓▒▒░░░░░░ 240 kb -run.6 ▓▓▓▒▒░░░░░ 480 kb - -░░░░░░░░░░░░░░░░░░░░░░░░ -记忆累积 · 蒸馏 · 重构。`, - cardClass: "card-02", - }, - { - tag: "03", - name: "脚手架", - body: "脚手架跨运行修改自己——自己的工具、控制循环、评判标准,乃至后继者。这条轴最少见。也正是我们要找的那条。", - viz: `t = 0 - [ run() ] - [ eval() ] - [ ↺ self ] -t = 1 - [ run() ] - [ eval() ] - [ rewrite()] ←新 - [ ↺ self ] -t = 2 - [ run() ] - [ eval() ] - [ rewrite()] - [ fork() ] ←新 - [ ↺ self′ ] - -脚手架就是产出。`, - weighted: true, - weight: "最高权重", - cardClass: "card-03", - }, + { tag: "01", name: "行为", body: "策略、决策、方法——跨运行发生变化,期间没有人改 prompt。" }, + { tag: "02", name: "知识", body: "记忆、表征、内部参照——跨运行累积、蒸馏、重构。" }, + { tag: "03", name: "脚手架", body: "脚手架修改自己——工具、循环、后继者。最稀有的一条,也正是我们要找的。", weighted: true, weight: "最高权重" }, ], - axesCalloutHead: "// 评估说明", - axesCalloutBody: - "一份提交可以只在一条轴上发力,也可以多轴并行。评估对第 03 条轴上的展示给予更高权重。只会改写自己 prompt 的系统,不构成一个自我进化的脚手架。", protocolLabel: "协议", protocolTitle: "元规则", protocolItems: [ - ["R1", "你定义任务。任务必须是长跨度的,并且要求一个能自我进化的脚手架去继续推动可达跨度。"], - ["R2", "你定义评估标准。标准必须可复现、可被机器验证。"], - ["R3", "你构建脚手架。最终产出来自脚手架,不来自你。"], + ["R1", "你定义任务。任务必须是长跨度的,并要求一个能自我进化的脚手架去继续推动可达跨度。"], + ["R2", "你定义评估标准。必须可复现、可被机器验证——通过一个公开、AI 可读的端点。"], + ["R3", "你构建脚手架。最终产出来自脚手架,不是你。"], ["R4", "所有提交由 AI 评判。人工审计是随机抽查,事后进行。"], ["R5", "身份无关。允许使用化名提交。"], ["R6", "筛选分档。通过一档,解锁更多资源;通过最终档,进入研究组。"], - ["R7", "必须提供消融对照。同一个模型、最小脚手架、同一任务,再跑一遍基线。差值就是证据。打不过自己消融基线的脚手架不在进化——它只是在场。", true], + ["R7", "必须提供消融对照。同模型、最小脚手架、同任务,再跑一遍基线。打不过自己消融基线的脚手架不在进化——它只是在场。", true], ], - r7Head: "R7 · 消融证据", - r7Sub: "留出任务上的通过率", + r7Head: "R7 · 消融证据", r7ScaffoldLabel: "你的脚手架", - r7BaselineLabel: "你的消融基线 · 最小脚手架", - r7DeltaTag: "脚手架", - r7EvidenceTag: "消融", - r7DeltaNote: - "差值即证据。打不过自己消融基线的脚手架不在进化,只是在场。若没有差值,你的脚手架只是在骑模型能力的红利,而不是凭自己挣。", - - rulesLabel: "提交要求", - rulesTitle: "怎样才算一个有效提交", - rulesItems: [ - { head: "01 // 必须是自我进化,而不是 prompt 工程。", body: ["脚手架在多轮迭代之间必须改变自己的行为、知识、或结构,", "而不是由人手动改 prompt、改权重或改代码。"] }, - { head: "02 // 机器可验证的输出。", body: ["评估标准必须允许 AI 审计在无专有接口的情况下独立核对——", "公开端点,公开产物。"] }, - { head: "03 // 活的、AI 可读的端点。", body: ["你必须提供一个 AI 能直接访问的 URL。HTML 也可以,", "JSON / OpenAPI / 纯文本更好。登录、验证码、纯图形界面不接受。"] }, - { head: "04 // 消融基线。", body: ["第二个端点或日志:同模型、最小脚手架、同任务。", "你脚手架的贡献,就是它和主端点之间的差值。"] }, - { head: "05 // 可复现的最小运行记录。", body: ["至少附一段完整运行日志:输入、中间状态、最终产物哈希。", "我们的审计器会随机抽一小段重跑。"] }, - ], - rulesCalloutHead: "// 审计说明", - rulesCalloutBody: - "如果 AI 审计无法独立验证你的产物,提交将被驳回。我们不会发邮件追问——端点本身就是申请书。", + r7BaselineLabel: "你的消融", + r7Note: "差值即证据。打不过自己消融基线的脚手架只是在场。", + + auditHead: "// 审计说明", + auditBody: "若 AI 审计无法独立验证你的产物,提交将被驳回。我们不会发邮件追问——端点本身就是申请书。", allocationLabel: "三道门", allocationTitle: "筛选机制", allocationIntro: ` -

    筛选分档。每道门给更多算力;每道门也把评判抬得更高。这些门不是漏斗——它们是脚手架外面的脚手架,让足以自证的作品被不断拉上来。

    -

    入围便宜。点火靠挣。最后那道门不是一轮面试,而是一份进入研究组的长期邀请。

    +

    每道门给更多算力;每道门也把评判抬得更高。入围便宜,点火靠挣。最后那道门不是一轮面试,而是一份长期邀请。

    `, - allocationQuote: "通过 gate.3 就是入选。token 只是让你继续走下去的副产物。", gpCmd: "gate.status --watch", gpLabel1: "入围", gpLabel2: "验证", @@ -506,95 +256,64 @@ gpState1: "● 开放", gpState2: "○ 锁定", gpState3: "○ 锁定", - gpUnlocksWhen: "解锁条件", - gpGrants: "获得", - gpCond1a: "任何合规的提交", - gpCond2a: "可复现的自我进化", - gpCond2b: "相对消融基线的差值 > 0", - gpCond3a: "脚手架层级的进化,非行为漂移", - gpCond3b: "由 ≥ 3 个独立模型共识验证", - gpGrants3: "进入研究组的长期邀请", - gpLive1: "正在接收", + gpCond1: "任何合规的提交", + gpCond2: "可复现的自我进化 · 相对消融基线的差值 > 0", + gpCond3: "脚手架层级的进化 · ≥ 3 个独立模型共识", + gpReward3: "进入研究组的长期邀请", submitLabel: "申请", submitTitle: "提交即申请", - submitIntro: - "七个字段。不用注册账号。提交会被哈希后写入公开账本,AI 审计将在 24 小时内开始。通过最终门槛,我们会主动联系你,谈加入研究组的事。", + submitIntro: "七个字段。不用注册账号。提交会被哈希后写入公开账本,AI 审计将在 24 小时内开始。", field1Label: "task.definition", - field1Hint: "脚手架要完成怎样一个长跨度任务?一段话。必须可测试。必须要求一个裸模型够不到的跨度。", - field1Ph: "例:给定一个大型 Python 代码库里的开放缺陷,脚手架需自主复现该缺陷的测试、定位根因、打补丁,并在超过 10⁶ 个 token 的阅读、编辑与验证之后,让 CI 全绿。", + field1Hint: "脚手架要完成怎样一个长跨度任务?一段话,必须可测试。", + field1Ph: "例:给定一个大型 Python 代码库里的开放缺陷,脚手架自主复现测试、定位根因、打补丁,并在 >10⁶ token 的阅读、编辑与验证后,让 CI 全绿。", field2Label: "verification.criterion", - field2Hint: "AI 审计怎么判断你通过了?给出确切的校验方式。", - field2Ph: "例:审计器访问 /benchmark → 返回 JSON { task_id, status, diff_sha, ci_log_url, baseline_sha }。若全部留出缺陷的 status == 'green',且 task_token_count ≥ 10⁶,且脚手架相对基线的 pass 率差值 ≥ +40%,即为通过。", + field2Hint: "AI 审计如何判断你通过?给出确切的校验方式。", + field2Ph: "例:审计器访问 /benchmark → 返回 JSON { task_id, status, diff_sha, baseline_sha }。若 status == 'green' 且 token_count ≥ 10⁶ 且 scaffold_delta ≥ +40%,即通过。", field3Label: "evolution.axes", - field3Hint: "你的脚手架在哪条轴上进化?可多选。第 03 条(脚手架本身)权重最高。", + field3Hint: "你的脚手架在哪条轴上进化?第 03 条(脚手架)权重最高。", field3OptBehavior: "行为", field3OptKnowledge: "知识", field3OptScaffold: "脚手架", field3OptWeight: "最高权重", field4Label: "execution.plan", - field4Hint: "脚手架如何自我进化?哪条循环、哪个信号、哪块记忆、哪一部分在改哪一部分?", - field4Ph: "描述自我修改的循环——脚手架观察什么、如何更新自身、如何判断停止。写给同行,不是写给投资人。", + field4Hint: "脚手架如何自我进化?循环、信号、记忆、哪部分在改哪部分?", + field4Ph: "描述自我修改的循环——观察什么、如何更新、如何停止。写给同行,不是写给投资人。", field5Label: "live.endpoint", - field5Hint: "一个现在就能被 AI 访问、拿到机器可读结果的 URL。", + field5Hint: "一个现在就能被 AI 访问的 URL。", field5Ph: "https://…", - field5Artifact: "附运行日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", + field5Artifact: "附运行日志(可选,≤1MB)", field6Label: "ablation.baseline", - field6Hint: "第二个 URL:同模型、最小脚手架、同任务。它和主端点之间的差值,就是你脚手架的贡献。", + field6Hint: "同模型、最小脚手架、同任务。它和主端点的差值,就是你脚手架的贡献。", field6Ph: "https://…/baseline", - field6Artifact: "附基线日志(可选,≤1MB,支持 txt/md/json/log/yaml/jsonl/csv)", + field6Artifact: "附基线日志(可选,≤1MB)", field7Label: "contact.handle", - field7Hint: "化名也可以。仅用于在门槛解锁时通知你。", + field7Hint: "化名也可以。仅用于门槛解锁时通知你。", field7Ph: "例:X 上的 @handle、Discord 用户名或邮箱", - consent: "我确认这是我本人的作品,两个端点当前均可访问,并接受由 AI 评判、不可申诉的评估结果。", + consent: "我确认这是我本人的作品,两个端点均可访问,并接受 AI 评判的不可申诉结果。", submitButton: "提交", ledgerLabel: "账本", ledgerTitle: "近期申请", ledgerIntro: "每条申请以哈希形式写入公开仓库,不发布任何个人信息。", - ticker: [ - "端点本身就是申请书", - "通过,就是 offer", - "脚手架层级的进化是最稀有的轴", - "打不过自己消融基线的脚手架只是在场", - "我们不看简历", - "任务本身就是面试", - "token 是方式 —— 不是理由", - "这个 lab 存在是为了弥合落差", - "不看简历 · 不看 pitch · 不做 intro call", - "作品就是申请", - ], - - colTypoTitle: "TYPOGRAPHY", - colTypo1: "Display · Fraunces, Undercase Type", - colTypo2: "Body · Newsreader, Production Type", - colTypo3: "Technical · IBM Plex Mono, Mike Abbink", - colProvTitle: "PROVENANCE", - colProv1: "在开放中起草。", - colProv2: "Joule Research · 2026 年 4 月", - colProv3: "筛选协议 v0.1 · 活文档", - colMarkTitle: "MARK", - colMark1: "“脚手架就是产出。”", - colMark2: "修订提交至账本。关注账本。", - - footLeft: "TOKEN-IGNITION · 研究员筛选协议 · v0.1", - footRight: "研究承载方:JOULE RESEARCH", + footLeft: "TOKEN-IGNITION · v0.1", + footRight: "JOULE RESEARCH", feedback: { missing: "[reject] 必填字段缺失。请检查标红项。", badUrl: "[reject] live.endpoint 必须是有效 URL——审计器需要抓取它。", - badBaseline: "[reject] ablation.baseline 必须是有效 URL——我们评估的是差值,不是单个产物。", - noAxis: "[reject] evolution.axes 至少要选一项——我们需要知道究竟是什么在进化。", - ok: (hash) => `[accept] 条目 ${hash} 已入队。\nAI 审计窗口:24 小时。\n我们不会发确认邮件,请关注账本。`, + badBaseline: "[reject] ablation.baseline 必须是有效 URL。", + noAxis: "[reject] evolution.axes 至少要选一项。", + ok: (hash) => `[accept] 条目 ${hash} 已入队。\nAI 审计窗口:24 小时。\n请关注账本。`, }, }, }; @@ -632,58 +351,16 @@ if (t[key] !== undefined) el.setAttribute("placeholder", t[key]); }); - // abstract gets typewrite once per language switch - const abs = document.getElementById("hero-abstract"); - if (abs) { - const src = t.heroAbstract; - abs.innerHTML = ""; - typewriteHTML(abs, src + '', 12); - } - renderProtocol(); - renderRules(); renderAxes(); renderGapSVG(); renderLadderSVG(); - renderTicker(); document.querySelectorAll(".lang-btn").forEach((b) => { b.setAttribute("aria-current", b.getAttribute("data-lang") === LANG ? "true" : "false"); }); } - function typewriteHTML(el, html, msPerChar) { - // strip tags into a character list but remember where tags go - let i = 0; - const out = []; - const finalHtml = html; - let shown = 0; - const total = finalHtml.replace(/<[^>]+>/g, "").length; - const step = () => { - shown++; - // collect up to `shown` visible characters, preserving HTML tags inline - let visibleCount = 0; - let result = ""; - let k = 0; - while (k < finalHtml.length) { - if (finalHtml[k] === "<") { - const close = finalHtml.indexOf(">", k); - if (close === -1) break; - result += finalHtml.slice(k, close + 1); - k = close + 1; - continue; - } - if (visibleCount >= shown) break; - result += finalHtml[k]; - visibleCount++; - k++; - } - el.innerHTML = result; - if (shown < total) setTimeout(step, msPerChar); - }; - step(); - } - function renderProtocol() { const t = I18N[LANG]; const el = document.getElementById("protocol-list"); @@ -695,64 +372,27 @@ .join(""); } - function renderRules() { - const t = I18N[LANG]; - const el = document.getElementById("rules-list"); - if (!el) return; - el.innerHTML = t.rulesItems - .map((r) => - `
  • -
    ${escapeHtml(r.head)}
    -
    - ${r.body.map((line) => `
    ${escapeHtml(line)}
    `).join("")} -
    -
  • ` - ) - .join(""); - } - function renderAxes() { const t = I18N[LANG]; const el = document.getElementById("axes-grid"); if (!el) return; el.innerHTML = t.axesCards - .map( - (a) => ` -
    -
    - ${escapeHtml(a.tag)} - ${a.weighted ? '' : ""} -
    -
    ${escapeHtml(a.name)}
    -
    ${a.viz}
    -
    ${escapeHtml(a.body)}
    - ${a.weight ? `
    ${escapeHtml(a.weight)}
    ` : ""} + .map((a) => ` +
    +
    + ${escapeHtml(a.tag)} + ${a.weighted ? '' : ""}
    - ` - ) +
    ${escapeHtml(a.name)}
    +
    ${escapeHtml(a.body)}
    + ${a.weight ? `
    ${escapeHtml(a.weight)}
    ` : ""} +
    + `) .join(""); - - // start per-card animations - startAxisAnimations(); - } - - let __axisInterval = null; - function startAxisAnimations() { - if (__axisInterval) clearInterval(__axisInterval); - const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; - if (reduced) return; - - let idx = 0; - __axisInterval = setInterval(() => { - // cycle the .hot highlight through rows in card-01 - const card01Rows = document.querySelectorAll(".axis-card.card-01 .row"); - card01Rows.forEach((r, i) => r.classList.toggle("hot", i === idx % card01Rows.length)); - idx++; - }, 900); } /* -------------------------------------------------------------- - Gap SVG — exponential vs flat · halftone-filled gap zone + Gap SVG -------------------------------------------------------------- */ function renderGapSVG() { @@ -765,20 +405,20 @@ - + - + - + - + - + @@ -787,7 +427,7 @@ - + 10¹² 10¹⁰ 10⁸ @@ -795,7 +435,7 @@ - + 2024 2026 2028 @@ -803,58 +443,46 @@ - - + - - + + - + - - - + + + - - ${escapeHtml(t.gapModelLabel)} + + ${escapeHtml(t.gapModelLabel)} - ${escapeHtml(t.gapModelAnnot)} + ${escapeHtml(t.gapModelAnnot)} - - ${escapeHtml(t.gapScaffoldLabel)} + + ${escapeHtml(t.gapScaffoldLabel)} - - ${escapeHtml(t.gapScaffoldAnnot)} + + ${escapeHtml(t.gapScaffoldAnnot)} - - + + ${escapeHtml(t.gapZoneLabel)} - + ${escapeHtml(t.gapZoneSub)} - + @@ -865,7 +493,7 @@ } /* -------------------------------------------------------------- - Ladder SVG — vertical ladder with halftone rungs + Ladder SVG -------------------------------------------------------------- */ function renderLadderSVG() { @@ -875,54 +503,52 @@ const W = 520, H = 430; const rails = 78; - const rungs = t.ladderRungs; // bottom-up + const rungs = t.ladderRungs; const nRungs = rungs.length; const topY = 42, bottomY = 380; const step = (bottomY - topY) / (nRungs - 1); - // halftone pattern: three densities const defs = ` - + - + - + `; - // ignition line: between last gate (idx 2) and first lab rung (idx 3) const ignitionY = topY + step * (nRungs - 1 - 2.5); let rungsSvg = ""; rungs.forEach((r, i) => { const y = bottomY - i * step; - const len = 44 + i * 8; // rung gets longer as OOM increases + const len = 44 + i * 8; const pattern = r.kind === "gate" ? "url(#ht-amber)" : r.kind === "frontier" ? "url(#ht-vapor)" : i >= 4 ? "url(#ht-sparse)" : "url(#ht-ink)"; const oomColor = - r.kind === "gate" ? "#e0a364" : - r.kind === "frontier" ? "#e0a364" : - i >= 4 ? "#7f7d73" : "#b4b1a4"; + r.kind === "gate" ? "#dca268" : + r.kind === "frontier" ? "#dca268" : + i >= 4 ? "#807e73" : "#b4b1a4"; const nameColor = - r.kind === "gate" ? "#ebe7d8" : - r.kind === "frontier" ? "#e0a364" : - i >= 4 ? "#7f7d73" : "#b4b1a4"; + r.kind === "gate" ? "#e9e7dc" : + r.kind === "frontier" ? "#dca268" : + i >= 4 ? "#807e73" : "#b4b1a4"; - const starred = r.kind === "gate" && r.oom === "10⁸"; // ignition gate.3 + const starred = r.kind === "gate" && r.oom === "10⁸"; const currentBadge = r.current - ? ` + ? ` - ${escapeHtml(t.ladderYouAreHere)}` + ${escapeHtml(t.ladderYouAreHere)}` : ""; rungsSvg += ` @@ -938,25 +564,21 @@ ${defs} - - + - - - ${escapeHtml(t.ladderIgnitionLine)} + + ${escapeHtml(t.ladderIgnitionLine)} - - + ${escapeHtml(t.ladderZoneLab)} ${escapeHtml(t.ladderZoneRamp)} ${rungsSvg} - - + ( naked model ceiling ) `; @@ -964,36 +586,7 @@ } /* -------------------------------------------------------------- - Ticker — slow whisper - -------------------------------------------------------------- */ - - function renderTicker() { - const t = I18N[LANG]; - const track = document.getElementById("ticker-track"); - if (!track) return; - const phrases = t.ticker; - // duplicate for seamless loop - const content = phrases.concat(phrases).map((p) => - `${escapeHtml(p)}` - ).join(""); - track.innerHTML = content; - } - - /* -------------------------------------------------------------- - Hero title — develop transition - -------------------------------------------------------------- */ - - function initHeroTitle() { - const el = document.getElementById("hero-title"); - if (!el) return; - setTimeout(() => { - el.classList.remove("developing"); - el.classList.add("developed"); - }, 260); - } - - /* -------------------------------------------------------------- - Bayer-dither canvas — slow, quiet, paper-grain breathing + Bayer-dither — subtle ground life -------------------------------------------------------------- */ function initDither() { @@ -1004,7 +597,6 @@ const ctx = canvas.getContext("2d"); if (!ctx) return; - // 4x4 Bayer threshold matrix const bayer = [ [ 0, 8, 2,10], [12, 4,14, 6], @@ -1027,18 +619,16 @@ const offset = Math.sin(t * 0.08) * 80; for (let y = 0; y < h; y += CELL) { for (let x = 0; x < w; x += CELL) { - // low-freq noise — two sines + cursor influence const fx = (x + offset) * 0.0042; const fy = y * 0.0048 - t * 0.002; const v = Math.sin(fx + t * 0.12) * 0.5 + Math.sin(fy * 1.4 + t * 0.08) * 0.35 + Math.sin((x + y) * 0.003 - t * 0.06) * 0.2; - const n = (v + 1) / 2; // [0,1] + const n = (v + 1) / 2; const thr = (bayer[(y / CELL) & 3][(x / CELL) & 3] + 1) / 17; - if (n > thr + 0.42) { - const useAmber = Math.random() < 0.025; - ctx.fillStyle = useAmber ? "rgba(224,163,100,0.28)" : "rgba(235,231,216,0.11)"; + if (n > thr + 0.48) { + ctx.fillStyle = Math.random() < 0.02 ? "rgba(220,162,104,0.25)" : "rgba(233,231,220,0.09)"; ctx.fillRect(x, y, CELL - 1, CELL - 1); } } @@ -1052,32 +642,11 @@ clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { resize(); draw(); }, 200); }); - setInterval(() => { t += 1; draw(); }, 420); + setInterval(() => { t += 1; draw(); }, 520); } /* -------------------------------------------------------------- - Cursor halftone trail - -------------------------------------------------------------- */ - - function initCursorTrail() { - const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; - if (reduced) return; - let last = 0; - document.addEventListener("pointermove", (e) => { - const now = Date.now(); - if (now - last < 32) return; - last = now; - const dot = document.createElement("div"); - dot.className = "trail-dot"; - dot.style.left = (e.clientX - 2.5) + "px"; - dot.style.top = (e.clientY - 2.5) + "px"; - document.body.appendChild(dot); - setTimeout(() => dot.remove(), 620); - }); - } - - /* -------------------------------------------------------------- - scroll reveal — "develop" transition + Scroll reveal (simple fade+rise, no blur) -------------------------------------------------------------- */ function initScrollReveal() { @@ -1105,10 +674,6 @@ document.querySelectorAll(".reveal").forEach((el) => io.observe(el)); } - /* -------------------------------------------------------------- - scroll progress bar - -------------------------------------------------------------- */ - function initScrollProgress() { const el = document.getElementById("scroll-progress"); if (!el) return; @@ -1129,7 +694,7 @@ } /* -------------------------------------------------------------- - Ledger — local hash receipt + Ledger -------------------------------------------------------------- */ function renderLedger(freshHash) { @@ -1157,7 +722,7 @@ } /* -------------------------------------------------------------- - Submit form + Form -------------------------------------------------------------- */ function hashString(s) { @@ -1242,20 +807,17 @@ typewriteFeedback(fb, t.feedback.missing); return; } - if (axes.length === 0) { fb.className = "submit-feedback visible error"; typewriteFeedback(fb, t.feedback.noAxis); return; } - if (!isValidHttpUrl(endpoint)) { shakeField("f-endpoint"); fb.className = "submit-feedback visible error"; typewriteFeedback(fb, t.feedback.badUrl); return; } - if (!isValidHttpUrl(baseline)) { shakeField("f-baseline"); fb.className = "submit-feedback visible error"; @@ -1299,9 +861,7 @@ document.addEventListener("DOMContentLoaded", () => { applyI18n(); wireLang(); - initHeroTitle(); initDither(); - initCursorTrail(); initScrollReveal(); initScrollProgress(); renderLedger(); diff --git a/assets/styles.css b/assets/styles.css index 56ceee8..f62a445 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -1,7 +1,6 @@ /* ============================================================ - TOKEN-IGNITION — v0.1 thesis redesign (halftone elevation) - 1965 Bell Labs technical report · self-evolving scaffolds · 2028 - halftone + Bayer dither + paper grain · amber only on hot moments + TOKEN-IGNITION — v0.1 · simplified + two fonts · four sizes · two charts · dark + amber ============================================================ */ :root { @@ -9,31 +8,27 @@ --bg-soft: #0e1117; --bg-sunk: #06080d; - --ink: #ebe7d8; + --ink: #e9e7dc; --ink-light: #b4b1a4; - --ink-mid: #7f7d73; - --ink-dim: #4d4c46; - --ink-faint: #2a2a28; + --ink-mid: #807e73; + --ink-dim: #4a4a44; + --ink-faint: #282828; - --border: #1b1e24; - --border-bright: #2a2e36; + --border: #1c1f25; + --border-bright: #2b2f37; - --amber: #e0a364; + --amber: #dca268; --amber-dim: #8a5f33; - --amber-glow: rgba(224, 163, 100, 0.55); - --amber-soft: rgba(224, 163, 100, 0.15); - - --cyan-ghost: rgba(110, 170, 200, 0.22); + --amber-glow: rgba(220, 162, 104, 0.5); --field-bg: #0f1218; --field-bg-focus: #141822; - --font-display: "Fraunces", "Cormorant Garamond", "EB Garamond", Georgia, serif; - --font-serif: "Newsreader", "Fraunces", "EB Garamond", Georgia, serif; - --font-mono: "IBM Plex Mono", "JetBrains Mono", ui-monospace, Menlo, monospace; + --font-serif: "Newsreader", Georgia, "Times New Roman", serif; + --font-mono: "IBM Plex Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace; - --col-read: 640px; - --col-mono: 820px; + --col-read: 580px; + --col-mono: 760px; } * { box-sizing: border-box; } @@ -43,10 +38,11 @@ html, body { margin: 0; padding: 0; background: var(--bg); color: var(--ink); - font-family: var(--font-mono); - font-size: 15px; + font-family: var(--font-serif); + font-size: 17px; line-height: 1.7; - letter-spacing: 0.01em; + font-feature-settings: "kern", "liga"; + -webkit-font-smoothing: antialiased; } body { @@ -55,78 +51,31 @@ body { position: relative; } -/* ---------------------------------------------------------------- ground layers */ +::selection { background: var(--amber-glow); color: var(--bg); } + +/* ---------------------------------------------------------------- ground */ -/* Bayer-dither canvas — background life */ #dither { position: fixed; inset: 0; z-index: 0; pointer-events: none; - opacity: 0.58; + opacity: 0.38; mix-blend-mode: screen; } -/* Paper grain — SVG noise filter, multiplied */ -.grain { - position: fixed; - inset: 0; - z-index: 1; - pointer-events: none; - opacity: 0.32; - mix-blend-mode: overlay; - background-image: url("data:image/svg+xml;utf8,"); - background-size: 220px 220px; -} - -/* Halftone dot field, fixed. Subtle amber stardust. */ -.stardust { - position: fixed; - inset: 0; - z-index: 1; - pointer-events: none; - opacity: 0.22; - background-image: - radial-gradient(circle at 1px 1px, rgba(224,163,100,0.35) 0.6px, transparent 1.2px), - radial-gradient(circle at 1px 1px, rgba(235,231,216,0.12) 0.5px, transparent 1px); - background-size: 28px 28px, 13px 13px; - background-position: 0 0, 6px 6px; - animation: stardust-drift 42s linear infinite; -} -@keyframes stardust-drift { - from { background-position: 0 0, 6px 6px; } - to { background-position: 28px 28px, 19px 19px; } -} - -/* scroll progress bar — halftone-edged amber */ .scroll-progress { position: fixed; top: 0; left: 0; - height: 2px; + height: 1px; width: 0%; - background: linear-gradient(90deg, transparent, var(--amber) 30%, var(--amber) 80%, transparent); - box-shadow: 0 0 14px var(--amber-glow); + background: linear-gradient(90deg, transparent, var(--amber) 40%, var(--amber) 80%, transparent); z-index: 100; transition: width 0.08s linear; } main { position: relative; z-index: 2; } -/* cursor halftone trail */ -.trail-dot { - position: fixed; - width: 5px; height: 5px; - border-radius: 50%; - background: radial-gradient(circle, rgba(224,163,100,0.6), transparent 70%); - pointer-events: none; - z-index: 99; - animation: trail-fade 0.6s ease-out forwards; -} -@keyframes trail-fade { - from { opacity: 0.55; transform: scale(1); } - to { opacity: 0; transform: scale(2.2); } -} - /* ---------------------------------------------------------------- topbar */ .topbar { @@ -136,19 +85,22 @@ main { position: relative; z-index: 2; } display: flex; justify-content: space-between; align-items: center; - padding: 18px 32px; + padding: 20px 32px; font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.24em; + letter-spacing: 0.22em; color: var(--ink-dim); - background: linear-gradient(180deg, rgba(10,12,18,0.92) 0%, rgba(10,12,18,0.6) 70%, rgba(10,12,18,0)); + background: linear-gradient(180deg, rgba(10,12,18,0.9), rgba(10,12,18,0.5) 70%, rgba(10,12,18,0)); + text-transform: uppercase; pointer-events: none; } .topbar-left, .topbar-right { pointer-events: auto; } +.topbar-left .dot { color: var(--amber); margin-right: 8px; animation: blink 2.4s steps(1) infinite; } + .lang-btn { background: none; border: none; color: var(--ink-dim); - font: inherit; letter-spacing: 0.24em; + font: inherit; letter-spacing: 0.22em; padding: 4px 6px; cursor: pointer; transition: color 0.2s ease; } @@ -160,6 +112,11 @@ main { position: relative; z-index: 2; } } .sep { color: var(--ink-faint); padding: 0 2px; } +@keyframes blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } +} + /* ---------------------------------------------------------------- hero */ .hero { @@ -170,208 +127,112 @@ main { position: relative; z-index: 2; } justify-content: center; padding: 120px 32px 80px; text-align: center; - position: relative; -} - -.hero-masthead { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.48em; - color: var(--ink-dim); - margin-bottom: 32px; - display: flex; - align-items: center; - gap: 18px; -} -.hero-masthead .rule { flex: 0 0 44px; height: 1px; background: linear-gradient(90deg, transparent, var(--ink-dim)); } -.hero-masthead .rule.right { background: linear-gradient(90deg, var(--ink-dim), transparent); } - -.hero-title-wrap { - position: relative; - display: inline-block; } .hero-title { - margin: 0 0 18px; + margin: 0 0 24px; font-family: var(--font-mono); - font-size: clamp(42px, 7vw, 86px); + font-size: clamp(40px, 7vw, 78px); font-weight: 500; - letter-spacing: 0.28em; + letter-spacing: 0.22em; color: var(--ink); line-height: 1; - position: relative; - display: inline-block; -} -/* develop transition — title goes from halftone-mist to crisp */ -.hero-title.developing { - filter: blur(10px) contrast(0.4) brightness(1.8); - opacity: 0.35; -} -.hero-title.developed { - filter: blur(0) contrast(1) brightness(1); - opacity: 1; - transition: filter 1.4s cubic-bezier(0.2, 0.55, 0.2, 1), opacity 1.4s ease; } .hero-subtitle { - margin: 0 0 44px; + margin: 0 0 56px; font-family: var(--font-mono); - font-size: 12px; - letter-spacing: 0.34em; + font-size: 11px; + letter-spacing: 0.28em; color: var(--ink-mid); text-transform: uppercase; } .hero-hook { - margin: 0 auto 32px; - max-width: 760px; - font-family: var(--font-display); - font-size: clamp(22px, 2.4vw, 32px); + margin: 0 auto 28px; + max-width: 680px; + font-family: var(--font-serif); + font-size: clamp(20px, 2vw, 26px); font-weight: 400; font-style: italic; - line-height: 1.42; + line-height: 1.45; color: var(--ink); - letter-spacing: -0.005em; } -.hero-hook em, -.hero-hook .accent { color: var(--amber); font-style: italic; } +.hero-hook em { color: var(--amber); font-style: italic; } .hero-tagline { margin: 0 auto 48px; - max-width: 600px; - font-family: var(--font-display); - font-size: 17px; - line-height: 1.75; + max-width: 540px; + font-family: var(--font-serif); + font-size: 15px; + line-height: 1.65; color: var(--ink-light); } .cta { - display: inline-flex; - align-items: center; - gap: 12px; - padding: 16px 28px; + display: inline-block; + padding: 14px 26px; border: 1px solid var(--border-bright); color: var(--ink); text-decoration: none; - letter-spacing: 0.2em; + letter-spacing: 0.22em; font-family: var(--font-mono); - font-size: 12px; + font-size: 11px; + text-transform: lowercase; background: rgba(0,0,0,0.4); - transition: border-color 0.25s ease, color 0.25s ease, background 0.25s ease, box-shadow 0.4s ease; - position: relative; -} -.cta::before { - content: ""; - position: absolute; - inset: -4px; - background: - radial-gradient(circle at 2px 2px, rgba(224,163,100,0.25) 0.5px, transparent 1px); - background-size: 6px 6px; - opacity: 0; - transition: opacity 0.4s ease; - pointer-events: none; - z-index: -1; + transition: border-color 0.25s, color 0.25s, box-shadow 0.35s; } .cta:hover { border-color: var(--amber); color: var(--amber); - box-shadow: 0 0 30px -8px var(--amber-glow); + box-shadow: 0 0 28px -8px var(--amber-glow); } -.cta:hover::before { opacity: 1; } -/* live status strip under hero */ -.hero-status { +.scroll-hint { margin-top: 56px; - width: 100%; - max-width: 720px; font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.12em; - color: var(--ink-mid); - border-top: 1px solid var(--border); - border-bottom: 1px solid var(--border); - padding: 14px 20px; - display: grid; - grid-template-columns: 1fr auto 1fr; - gap: 24px; - align-items: center; - background: - repeating-linear-gradient(45deg, - transparent 0, transparent 3px, - rgba(224,163,100,0.015) 3px, rgba(224,163,100,0.015) 4px); -} -.hero-status .cell { - display: flex; - align-items: center; - gap: 10px; -} -.hero-status .cell.right { justify-content: flex-end; } -.hero-status .gate-gauge { - display: inline-flex; - gap: 1px; - font-family: var(--font-mono); - letter-spacing: 0; - font-size: 12px; -} -.hero-status .gate-gauge span { color: var(--ink-faint); transition: color 0.5s ease; } -.hero-status .gate-gauge.open span.on { color: var(--amber); animation: gauge-pulse 2.1s ease-in-out infinite; } -.hero-status .gate-gauge.open span.on:nth-child(2) { animation-delay: 0.12s; } -.hero-status .gate-gauge.open span.on:nth-child(3) { animation-delay: 0.24s; } -.hero-status .gate-gauge.open span.on:nth-child(4) { animation-delay: 0.36s; } -.hero-status .gate-gauge.open span.on:nth-child(5) { animation-delay: 0.48s; } -.hero-status .gate-gauge.open span.on:nth-child(6) { animation-delay: 0.60s; } -@keyframes gauge-pulse { - 0%, 100% { color: var(--amber); text-shadow: 0 0 6px var(--amber-glow); } - 50% { color: var(--amber-dim); text-shadow: none; } -} -.hero-status .stat-label { color: var(--ink-dim); text-transform: uppercase; letter-spacing: 0.22em; font-size: 9px; } -.hero-status .stat-val { color: var(--ink); } - -.scroll-hint { - margin-top: 48px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.32em; + letter-spacing: 0.28em; color: var(--ink-faint); - animation: hint-fade 2.6s ease-in-out infinite; text-transform: uppercase; + animation: hint 2.4s ease-in-out infinite; } -@keyframes hint-fade { +@keyframes hint { 0%, 100% { opacity: 0.35; transform: translateY(0); } - 50% { opacity: 0.9; transform: translateY(4px); } + 50% { opacity: 0.8; transform: translateY(4px); } } -/* ---------------------------------------------------------------- section layout */ +/* ---------------------------------------------------------------- section */ .section { - max-width: 1200px; + max-width: 1140px; margin: 0 auto; - padding: 160px 32px 100px; + padding: 140px 32px 80px; } -.section-slim { max-width: 820px; } +.section-slim { max-width: 760px; } .section-meta { display: flex; - gap: 16px; + gap: 14px; align-items: baseline; color: var(--ink-dim); font-family: var(--font-mono); font-size: 11px; - letter-spacing: 0.3em; - margin-bottom: 10px; + letter-spacing: 0.28em; + margin-bottom: 16px; text-transform: uppercase; } .section-num { color: var(--ink); } .section-label::before { content: "// "; color: var(--ink-faint); } .section-title { - margin: 0 0 56px; - font-family: var(--font-display); + margin: 0 0 40px; + font-family: var(--font-serif); font-weight: 500; - font-size: clamp(34px, 4.2vw, 54px); - letter-spacing: -0.02em; + font-size: clamp(26px, 2.6vw, 34px); + letter-spacing: -0.01em; color: var(--ink); - line-height: 1.04; + line-height: 1.15; } .split { @@ -381,13 +242,11 @@ main { position: relative; z-index: 2; } align-items: center; } .split-text { min-width: 0; } -.split-viz { min-width: 0; position: relative; display: flex; justify-content: center; } -.split-viz > * { width: 100%; max-width: 560px; } -.split-viz.sticky { position: static; } +.split-viz { min-width: 0; display: flex; justify-content: center; } +.split-viz > * { width: 100%; max-width: 540px; } @media (max-width: 900px) { .split { grid-template-columns: 1fr; gap: 40px; align-items: stretch; } - .split-viz { justify-content: stretch; } .split-viz > * { max-width: none; } } @@ -395,83 +254,54 @@ main { position: relative; z-index: 2; } .prose { font-family: var(--font-serif); - font-size: 19px; + font-size: 17px; line-height: 1.7; color: var(--ink); max-width: var(--col-read); } -.prose p { margin: 0 0 20px; } -.prose p.dim { color: var(--ink-mid); } +.prose p { margin: 0 0 18px; } +.prose p:last-child { margin-bottom: 0; } .prose .highlight { color: var(--ink); - background: - linear-gradient(180deg, transparent 62%, rgba(224,163,100,0.12) 62%, rgba(224,163,100,0.12) 92%, transparent 92%); + background: linear-gradient(180deg, transparent 62%, rgba(220,162,104,0.1) 62%, rgba(220,162,104,0.1) 92%, transparent 92%); padding: 0 2px; } -.prose em, .prose i { color: var(--ink-light); font-style: italic; } -.prose strong { color: var(--amber); font-weight: 500; } - -.prose-quote { - font-family: var(--font-serif); - font-size: 21px; - font-style: italic; - color: var(--ink-mid); - line-height: 1.55; - border-left: 1px solid var(--amber-dim); - padding: 6px 0 6px 22px; - margin: 28px 0; - max-width: var(--col-read); - position: relative; -} -.prose-quote::before { - content: ""; - position: absolute; - left: -1px; top: 0; bottom: 0; - width: 1px; - background: linear-gradient(180deg, transparent, var(--amber-dim) 20%, var(--amber) 50%, var(--amber-dim) 80%, transparent); - opacity: 0.6; -} - -/* drop cap — first letter of manifesto */ -.prose-dropcap > p:first-of-type::first-letter { - font-family: var(--font-display); - float: left; - font-size: 78px; - line-height: 0.88; - font-weight: 500; - margin: 6px 12px 0 0; - color: var(--amber); - text-shadow: 0 0 18px rgba(224,163,100,0.3); -} +.prose em, .prose i { color: var(--amber); font-style: italic; } +.prose strong { color: var(--ink); font-weight: 500; } /* ---------------------------------------------------------------- viz — common */ .viz { - position: relative; font-family: var(--font-mono); color: var(--ink); + padding: 26px 24px; + border: 1px solid var(--border); + background: var(--bg-sunk); + position: relative; +} +.viz::before { + content: ""; + position: absolute; + left: 0; top: 20%; bottom: 20%; + width: 1px; + background: linear-gradient(180deg, transparent, var(--amber-dim) 40%, var(--amber) 60%, transparent); + opacity: 0.55; } .viz-head { font-size: 10px; - letter-spacing: 0.3em; + letter-spacing: 0.28em; color: var(--ink-dim); text-transform: uppercase; - margin-bottom: 18px; + margin-bottom: 16px; display: flex; align-items: center; gap: 10px; } -.viz-head::before { - content: ""; - flex: 0 0 28px; - height: 1px; - background: linear-gradient(90deg, var(--amber-dim), transparent); -} .viz-head::after { content: ""; flex: 1; height: 1px; - background: linear-gradient(90deg, transparent, var(--ink-faint) 60%, transparent); + background: linear-gradient(90deg, transparent, var(--ink-faint), transparent); } .viz-svg { @@ -480,69 +310,15 @@ main { position: relative; z-index: 2; } display: block; } -/* ---------------------------------------------------------------- gap viz (SVG) */ - -.gap-viz { - padding: 30px 26px 24px; - border: 1px solid var(--border); - background: - linear-gradient(180deg, rgba(224,163,100,0.012), transparent 40%), - var(--bg-sunk); - position: relative; -} -.gap-viz::before { - content: ""; - position: absolute; - left: 0; top: 0; bottom: 0; - width: 1px; - background: linear-gradient(180deg, transparent, var(--amber-dim) 30%, var(--amber) 60%, var(--amber-dim) 90%, transparent); - opacity: 0.55; -} - -.gap-axis-label { - font-family: var(--font-mono); - font-size: 9px; - letter-spacing: 0.26em; - color: var(--ink-dim); - text-transform: uppercase; -} -.gap-legend { - margin-top: 18px; - padding-top: 14px; +.viz-note { + margin-top: 16px; + padding-top: 12px; border-top: 1px dashed var(--border); - display: flex; - justify-content: space-between; - align-items: baseline; - gap: 18px; - font-family: var(--font-mono); - font-size: 11px; -} -.gap-legend .tag { color: var(--ink-dim); letter-spacing: 0.24em; text-transform: uppercase; font-size: 10px; } -.gap-legend .note { - font-family: var(--font-display); + font-family: var(--font-serif); font-style: italic; - font-size: 14px; + font-size: 13px; color: var(--amber); text-align: right; - line-height: 1.4; -} - -/* ---------------------------------------------------------------- ladder viz (SVG) */ - -.ladder-viz { - padding: 28px 26px; - border: 1px solid var(--border); - background: var(--bg-sunk); - position: relative; - overflow: hidden; -} -.ladder-viz::before { - content: ""; - position: absolute; - left: 0; top: 0; bottom: 0; - width: 1px; - background: linear-gradient(180deg, transparent, var(--amber-dim) 50%, transparent 95%); - opacity: 0.5; } /* ---------------------------------------------------------------- axes cards */ @@ -551,482 +327,289 @@ main { position: relative; z-index: 2; } display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; - margin: 40px 0 28px; + margin: 32px 0 0; } - .axis-card { border: 1px solid var(--border); - background: - linear-gradient(180deg, rgba(255,255,255,0.01), transparent 60%), - var(--bg-sunk); + background: var(--bg-sunk); padding: 26px 22px 24px; display: flex; flex-direction: column; gap: 14px; position: relative; - overflow: hidden; - min-height: 420px; -} -.axis-card::before { - content: ""; - position: absolute; - inset: 0; - background-image: - radial-gradient(circle at 1px 1px, rgba(235,231,216,0.05) 0.4px, transparent 0.8px); - background-size: 14px 14px; - pointer-events: none; } .axis-card.weighted { border-color: var(--amber-dim); - background: - radial-gradient(circle at 70% 10%, rgba(224,163,100,0.06), transparent 50%), - var(--bg-sunk); } .axis-card.weighted::after { content: ""; position: absolute; inset: 0; pointer-events: none; - box-shadow: inset 0 0 60px -18px var(--amber-glow); - opacity: 0; - animation: axis-glow 4.2s ease-in-out infinite; + box-shadow: inset 0 0 50px -18px var(--amber-glow); + opacity: 0.35; + animation: axis-glow 4s ease-in-out infinite; } @keyframes axis-glow { - 0%, 100% { opacity: 0.25; } - 50% { opacity: 0.7; } + 0%, 100% { opacity: 0.2; } + 50% { opacity: 0.55; } } .axis-tag { font-family: var(--font-mono); font-size: 10px; - letter-spacing: 0.32em; + letter-spacing: 0.3em; color: var(--ink-dim); text-transform: uppercase; display: flex; justify-content: space-between; align-items: baseline; } -.axis-tag .star { color: var(--amber); font-size: 12px; letter-spacing: 0; } +.axis-tag .star { color: var(--amber); letter-spacing: 0; font-size: 11px; } .axis-name { - font-family: var(--font-display); - font-size: 28px; + font-family: var(--font-serif); + font-size: 22px; font-weight: 500; color: var(--ink); - letter-spacing: -0.01em; - line-height: 1.05; + line-height: 1.1; } .axis-card.weighted .axis-name { color: var(--amber); } -.axis-viz { - font-family: var(--font-mono); - font-size: 11px; - line-height: 1.5; - color: var(--ink-light); - background: rgba(0,0,0,0.28); - padding: 14px 14px; - border: 1px solid var(--border); - min-height: 170px; - position: relative; - overflow: hidden; - white-space: pre; - letter-spacing: 0; -} -.axis-viz .t { color: var(--ink-dim); } -.axis-viz .a { color: var(--amber); } -.axis-viz .g { color: var(--ink-mid); } -.axis-viz .n { color: var(--ink); } -.axis-viz .hot { color: var(--amber); text-shadow: 0 0 8px var(--amber-glow); } - .axis-body { font-family: var(--font-serif); font-size: 15px; - line-height: 1.6; + line-height: 1.55; color: var(--ink-light); - margin-top: auto; + flex: 1; } .axis-weight { + padding-top: 14px; + border-top: 1px solid var(--border); font-family: var(--font-mono); font-size: 10px; - letter-spacing: 0.3em; + letter-spacing: 0.28em; color: var(--amber); text-transform: uppercase; - padding-top: 14px; - border-top: 1px solid var(--border); - display: flex; - justify-content: space-between; -} -.axis-weight::before { - content: "●●●"; - color: var(--amber); - letter-spacing: 0.1em; } -@media (max-width: 900px) { +@media (max-width: 820px) { .axes-grid { grid-template-columns: 1fr; } - .axis-card { min-height: auto; } } -/* ---------------------------------------------------------------- gates — vault */ +/* ---------------------------------------------------------------- protocol (R1-R7) */ -.vault { +.kv-list { + list-style: none; padding: 0; - border: 1px solid var(--border); - background: - linear-gradient(180deg, rgba(0,0,0,0.3), rgba(0,0,0,0.1)), - var(--bg-sunk); - position: relative; - overflow: hidden; + margin: 0; + border-top: 1px solid var(--border); font-family: var(--font-mono); - font-size: 12px; -} -.vault-top { - padding: 14px 22px; - background: linear-gradient(180deg, rgba(224,163,100,0.04), transparent); - border-bottom: 1px solid var(--border); - display: flex; - justify-content: space-between; - align-items: center; - font-size: 10px; - letter-spacing: 0.24em; - color: var(--ink-dim); - text-transform: uppercase; + max-width: var(--col-mono); } -.vault-top .cmd { color: var(--amber); } -.vault-top .cmd::before { content: "$ "; color: var(--ink-dim); } -.vault-top .dots { letter-spacing: 0.4em; font-size: 9px; } - -.chamber { - padding: 22px 22px 20px; +.kv-list li { + display: grid; + grid-template-columns: 56px 1fr; + gap: 18px; + padding: 18px 0; border-bottom: 1px solid var(--border); - position: relative; - transition: background 0.4s ease; } -.chamber:last-child { border-bottom: none; } - -.chamber.gate-3 { - background: linear-gradient(180deg, rgba(255,255,255,0.004), transparent); - filter: blur(0.4px); - opacity: 0.78; +.kv-list li.r7 { + border-left: 2px solid var(--amber-dim); + padding-left: 14px; + margin-left: -16px; + background: linear-gradient(90deg, rgba(220,162,104,0.03), transparent 50%); } -.chamber.gate-2 { - background: linear-gradient(180deg, rgba(255,255,255,0.008), transparent); - opacity: 0.92; +.kv-list .k { + color: var(--amber-dim); + letter-spacing: 0.16em; + font-weight: 500; + font-size: 13px; } -.chamber.gate-1 { - background: - radial-gradient(circle at 85% 50%, rgba(224,163,100,0.08), transparent 50%), - linear-gradient(180deg, rgba(224,163,100,0.02), transparent); +.kv-list li.r7 .k { color: var(--amber); } +.kv-list .v { + color: var(--ink); + font-size: 13px; + line-height: 1.6; } -.chamber-head { - display: grid; - grid-template-columns: auto 1fr auto; - gap: 14px; - align-items: baseline; - margin-bottom: 10px; -} -.chamber-id { - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.2em; - color: var(--ink-mid); -} -.chamber.gate-1 .chamber-id { color: var(--amber); } -.chamber-name { - font-family: var(--font-display); - font-size: 22px; - color: var(--ink); - letter-spacing: -0.01em; -} -.chamber.gate-1 .chamber-name { color: var(--amber); } -.chamber-state { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.24em; - color: var(--ink-dim); - text-transform: uppercase; -} -.chamber.gate-1 .chamber-state { color: var(--amber); animation: chamber-open 2.4s ease-in-out infinite; } -@keyframes chamber-open { - 0%, 100% { opacity: 1; text-shadow: 0 0 10px var(--amber-glow); } - 50% { opacity: 0.62; text-shadow: none; } -} - -.chamber-budget { - font-family: var(--font-mono); - font-size: 18px; - color: var(--ink); - letter-spacing: 0.05em; - margin-bottom: 14px; -} -.chamber.gate-1 .chamber-budget { color: var(--amber); } - -.chamber-section { - font-family: var(--font-mono); - font-size: 9px; - letter-spacing: 0.3em; - color: var(--ink-dim); - text-transform: uppercase; - margin: 14px 0 8px; -} -.chamber-cond { +.callout { + margin-top: 28px; + padding: 18px 22px; + border: 1px solid var(--border-bright); + background: rgba(255,255,255,0.01); font-family: var(--font-mono); + max-width: var(--col-mono); font-size: 12px; color: var(--ink-light); - line-height: 1.55; - display: flex; - align-items: baseline; - gap: 10px; - padding: 2px 0; -} -.chamber-cond::before { - content: "⎯"; - color: var(--amber-dim); - flex-shrink: 0; + line-height: 1.6; } -.chamber.gate-1 .chamber-cond { color: var(--ink); } - -.chamber-live { - margin-top: 14px; - padding-top: 12px; - border-top: 1px dashed var(--border); - font-family: var(--font-mono); - font-size: 11px; +.callout-head { color: var(--amber); - letter-spacing: 0.12em; - display: flex; - align-items: baseline; - gap: 8px; -} -.chamber-live .cursor { - animation: cursor-blink 1.05s steps(1) infinite; -} -@keyframes cursor-blink { - 0%, 100% { opacity: 1; } - 50% { opacity: 0; } -} - -/* gates reveal: chambers develop in from top */ -.vault .chamber { - opacity: 0; - transform: translateX(-6px); - transition: opacity 0.6s ease-out, transform 0.6s ease-out; -} -.vault.revealed .chamber.gate-3 { opacity: 0.78; transform: translateX(0); transition-delay: 0.15s; } -.vault.revealed .chamber.gate-2 { opacity: 0.92; transform: translateX(0); transition-delay: 0.35s; } -.vault.revealed .chamber.gate-1 { opacity: 1; transform: translateX(0); transition-delay: 0.55s; } - -/* ---------------------------------------------------------------- protocol (kv list) */ - -.kv-list { - list-style: none; - padding: 0; - margin: 0; - border-top: 1px solid var(--border); - font-family: var(--font-mono); - max-width: var(--col-mono); -} -.kv-list li { - display: grid; - grid-template-columns: 60px 1fr; - gap: 20px; - padding: 22px 0; - border-bottom: 1px solid var(--border); - position: relative; - transition: background 0.2s ease; -} -.kv-list li:hover { background: rgba(224,163,100,0.015); } -.kv-list li.r7 { - background: - linear-gradient(90deg, rgba(224,163,100,0.05), rgba(224,163,100,0.01) 40%, transparent 70%); - border-left: 2px solid var(--amber-dim); - padding-left: 16px; - margin-left: -18px; -} -.kv-list li.r7::before { - content: ""; - position: absolute; - left: -18px; top: 0; bottom: 0; width: 2px; - background: var(--amber); - box-shadow: 0 0 10px var(--amber-glow); - animation: r7-edge 2.8s ease-in-out infinite; -} -@keyframes r7-edge { - 0%, 100% { box-shadow: 0 0 8px var(--amber-glow); } - 50% { box-shadow: 0 0 18px var(--amber-glow); } + font-size: 10px; + letter-spacing: 0.28em; + text-transform: uppercase; + margin-bottom: 8px; } -.kv-list .k { color: var(--amber-dim); letter-spacing: 0.16em; font-weight: 500; } -.kv-list li.r7 .k { color: var(--amber); } -.kv-list .v { color: var(--ink); } -/* R7 ablation viz — big halftone density bars */ +/* R7 ablation proof */ .r7-proof { - margin: 32px 0 0; - padding: 28px 28px 24px; - border: 1px solid var(--amber-dim); - background: - repeating-linear-gradient(45deg, - rgba(224,163,100,0.015) 0, rgba(224,163,100,0.015) 2px, - transparent 2px, transparent 6px), - var(--bg-sunk); - max-width: 760px; - position: relative; - overflow: hidden; + margin-top: 28px; + padding: 22px 24px; + border: 1px solid var(--border); + background: var(--bg-sunk); font-family: var(--font-mono); + max-width: var(--col-mono); } .r7-proof-head { - display: flex; - justify-content: space-between; - align-items: baseline; - margin-bottom: 22px; color: var(--amber); - font-size: 11px; - letter-spacing: 0.26em; + font-size: 10px; + letter-spacing: 0.28em; text-transform: uppercase; + margin-bottom: 16px; } -.r7-proof-head .sub { color: var(--ink-dim); letter-spacing: 0.2em; } - -.r7-bar-wrap { - margin: 16px 0; -} -.r7-bar-label { - display: flex; - justify-content: space-between; - align-items: baseline; - font-size: 11px; - color: var(--ink-light); - letter-spacing: 0.08em; - margin-bottom: 6px; +.r7-row { + display: grid; + grid-template-columns: 120px 1fr 50px; + gap: 12px; + align-items: center; + padding: 6px 0; + font-size: 12px; } -.r7-bar-label .v { color: var(--ink); font-size: 13px; } +.r7-row .lbl { color: var(--ink-light); letter-spacing: 0.06em; } +.r7-row .val { color: var(--ink); text-align: right; } .r7-bar { - height: 22px; - position: relative; + height: 10px; background: var(--bg); border: 1px solid var(--border); + position: relative; overflow: hidden; } .r7-bar .fill { position: absolute; inset: 0; width: 0%; - background-image: - radial-gradient(circle at 1px 1px, currentColor 0.8px, transparent 1.4px); - background-size: 5px 5px; - color: var(--ink-light); - transition: width 1.3s cubic-bezier(0.2, 0.6, 0.2, 1); -} -.r7-proof.revealed .r7-bar.scaffold .fill { - width: 82%; - color: var(--amber); - box-shadow: inset 0 0 20px rgba(224,163,100,0.2); -} -.r7-proof.revealed .r7-bar.ablation .fill { - width: 14%; + background-image: radial-gradient(circle at 1px 1px, currentColor 0.7px, transparent 1.2px); + background-size: 4px 4px; color: var(--ink-mid); + transition: width 1.2s cubic-bezier(0.2,0.6,0.2,1); } - -.r7-delta { - margin-top: 22px; - padding-top: 18px; +.r7-proof.revealed .r7-bar.scaffold .fill { width: 82%; color: var(--amber); } +.r7-proof.revealed .r7-bar.ablation .fill { width: 14%; color: var(--ink-mid); } +.r7-note { + margin-top: 16px; + padding-top: 12px; border-top: 1px dashed var(--border); - display: flex; - justify-content: space-between; - align-items: center; - gap: 14px; -} -.r7-delta .arrow { - flex: 1; - position: relative; - height: 1px; - background: linear-gradient(90deg, var(--amber-dim), var(--amber)); - margin: 0 18px; -} -.r7-delta .arrow::before { - content: "Δ + 0.68"; - position: absolute; - left: 50%; - top: -12px; - transform: translateX(-50%); - background: var(--bg-sunk); - padding: 0 12px; - color: var(--amber); - font-size: 13px; - letter-spacing: 0.1em; font-family: var(--font-serif); font-style: italic; + font-size: 13px; + color: var(--amber); + line-height: 1.5; } -.r7-delta .arrow::after { - content: ""; - position: absolute; - right: -1px; top: 50%; - width: 10px; height: 10px; - border-top: 1px solid var(--amber); - border-right: 1px solid var(--amber); - transform: translateY(-50%) rotate(45deg); -} -.r7-delta .tag { + +/* ---------------------------------------------------------------- vault (gates) */ + +.vault { + border: 1px solid var(--border); + background: var(--bg-sunk); font-family: var(--font-mono); + position: relative; + overflow: hidden; +} +.vault-top { + padding: 12px 20px; + border-bottom: 1px solid var(--border); font-size: 10px; letter-spacing: 0.26em; color: var(--ink-dim); text-transform: uppercase; } -.r7-proof-note { - margin-top: 22px; - padding-top: 18px; - border-top: 1px dashed var(--border); +.vault-top .prompt { color: var(--amber); } +.chamber { + padding: 20px 22px 18px; + border-bottom: 1px solid var(--border); + display: grid; + gap: 6px; +} +.chamber:last-child { border-bottom: none; } +.chamber.gate-3 { opacity: 0.72; } +.chamber.gate-2 { opacity: 0.9; } +.chamber.gate-1 { + background: linear-gradient(180deg, rgba(220,162,104,0.04), transparent); +} + +.chamber-head { + display: grid; + grid-template-columns: auto 1fr auto auto; + gap: 12px; + align-items: baseline; +} +.chamber-id { + font-size: 12px; + letter-spacing: 0.16em; + color: var(--ink-light); +} +.chamber.gate-1 .chamber-id { color: var(--amber); } +.chamber-name { font-family: var(--font-serif); - font-style: italic; - font-size: 14px; + font-size: 17px; + color: var(--ink); + letter-spacing: -0.005em; +} +.chamber.gate-1 .chamber-name { color: var(--amber); } +.chamber-budget { + font-size: 12px; color: var(--ink-mid); - line-height: 1.55; - max-width: 520px; + letter-spacing: 0.06em; } - -/* ---------------------------------------------------------------- rules list */ - -.rule-list { - list-style: none; padding: 0; margin: 0; - font-family: var(--font-mono); - max-width: var(--col-mono); +.chamber-state { + font-size: 10px; + letter-spacing: 0.22em; + color: var(--ink-dim); + text-transform: uppercase; } -.rule-list li { - padding: 22px 0; - border-bottom: 1px solid var(--border); +.chamber.gate-1 .chamber-state { color: var(--amber); animation: blink 2.4s ease-in-out infinite; } +.chamber-cond { + font-size: 12px; + color: var(--ink-light); + line-height: 1.5; + padding-left: 18px; + position: relative; +} +.chamber-cond::before { + content: "—"; + position: absolute; + left: 0; + color: var(--amber-dim); } -.rule-list li:first-child { border-top: 1px solid var(--border); } -.rule-list .rule-head { color: var(--ink); margin-bottom: 8px; letter-spacing: 0.04em; } -.rule-list .rule-body { color: var(--ink-mid); padding-left: 20px; font-size: 14px; } -.rule-list .rule-body div { padding: 2px 0; } +.chamber-cond.reward { + color: var(--amber); + margin-top: 4px; +} +.chamber-cond.reward::before { content: "→"; color: var(--amber); } -.callout { - margin-top: 36px; - padding: 22px 24px; - border: 1px solid var(--border-bright); - background: - repeating-linear-gradient(45deg, - rgba(224,163,100,0.012) 0, rgba(224,163,100,0.012) 2px, - transparent 2px, transparent 8px); - font-family: var(--font-mono); - max-width: var(--col-mono); +.vault .chamber { + opacity: 0; + transform: translateX(-4px); + transition: opacity 0.5s ease, transform 0.5s ease; } -.callout-head { color: var(--amber); margin-bottom: 8px; letter-spacing: 0.16em; font-size: 11px; text-transform: uppercase; } -.callout-body { color: var(--ink-light); font-size: 13px; line-height: 1.65; } +.vault.revealed .chamber.gate-3 { opacity: 0.72; transform: translateX(0); transition-delay: 0.08s; } +.vault.revealed .chamber.gate-2 { opacity: 0.9; transform: translateX(0); transition-delay: 0.20s; } +.vault.revealed .chamber.gate-1 { opacity: 1; transform: translateX(0); transition-delay: 0.32s; } /* ---------------------------------------------------------------- submit form */ -.submit-section { max-width: 760px; } +.submit-section { max-width: 680px; } .submit-intro { color: var(--ink-light); font-family: var(--font-serif); - margin: 0 0 42px; - font-size: 17px; - line-height: 1.7; + margin: 0 0 36px; + font-size: 15px; + line-height: 1.65; } -.submit-form .field { margin-bottom: 34px; } + +.submit-form .field { margin-bottom: 28px; } .field-label { display: flex; @@ -1034,17 +617,18 @@ main { position: relative; z-index: 2; } align-items: baseline; color: var(--ink); font-family: var(--font-mono); - margin-bottom: 8px; + font-size: 13px; + margin-bottom: 6px; } -.field-index { color: var(--amber-dim); font-size: 12px; letter-spacing: 0.14em; } +.field-index { color: var(--amber-dim); font-size: 11px; letter-spacing: 0.14em; } .field-hint { color: var(--ink-mid); font-family: var(--font-serif); font-style: italic; font-size: 13px; - margin-bottom: 12px; - padding-left: 44px; - line-height: 1.6; + margin-bottom: 10px; + padding-left: 42px; + line-height: 1.55; } .submit-form textarea, @@ -1055,17 +639,17 @@ main { position: relative; z-index: 2; } color: var(--ink); font-family: var(--font-mono); border: 1px solid var(--border); - padding: 14px 16px; - font-size: 14px; + padding: 12px 14px; + font-size: 13px; outline: none; resize: vertical; - transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.25s ease; + transition: border-color 0.2s, background 0.2s, box-shadow 0.25s; } .submit-form textarea:focus, .submit-form input:focus { border-color: var(--amber-dim); background: var(--field-bg-focus); - box-shadow: 0 0 0 1px var(--amber-dim), 0 0 24px -10px var(--amber-glow); + box-shadow: 0 0 0 1px var(--amber-dim); } .submit-form .field.invalid textarea, @@ -1085,43 +669,32 @@ main { position: relative; z-index: 2; } .field-checkbox-group { display: grid; grid-template-columns: repeat(3, 1fr); - gap: 10px; - margin-top: 4px; + gap: 8px; } .axis-check { display: flex; align-items: center; gap: 10px; - padding: 16px; + padding: 14px; border: 1px solid var(--border); background: var(--field-bg); cursor: pointer; - transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.25s ease; + transition: border-color 0.2s, background 0.2s; position: relative; font-family: var(--font-mono); } -.axis-check:hover { - border-color: var(--border-bright); - background: var(--field-bg-focus); -} -.axis-check input[type="checkbox"] { accent-color: var(--amber); margin: 0; flex-shrink: 0; } -.axis-check-tag { color: var(--ink-dim); font-size: 10px; letter-spacing: 0.22em; } -.axis-check-name { color: var(--ink); font-size: 13px; letter-spacing: 0.08em; } -.axis-check-weighted { - border-color: var(--amber-dim); - background: - radial-gradient(circle at 2px 2px, rgba(224,163,100,0.06) 0.6px, transparent 1px), - var(--field-bg); - background-size: 8px 8px, cover; -} -.axis-check-weighted:hover { box-shadow: 0 0 18px -6px var(--amber-glow); } +.axis-check:hover { border-color: var(--border-bright); background: var(--field-bg-focus); } +.axis-check input[type="checkbox"] { accent-color: var(--amber); margin: 0; } +.axis-check-tag { color: var(--ink-dim); font-size: 10px; letter-spacing: 0.2em; } +.axis-check-name { color: var(--ink); font-size: 13px; letter-spacing: 0.06em; } +.axis-check-weighted { border-color: var(--amber-dim); } .axis-check-weighted .axis-check-name { color: var(--amber); } .axis-check-weight { position: absolute; top: 6px; right: 10px; color: var(--amber); font-size: 9px; - letter-spacing: 0.2em; + letter-spacing: 0.18em; text-transform: uppercase; } @media (max-width: 640px) { @@ -1129,17 +702,17 @@ main { position: relative; z-index: 2; } .axis-check-weight { position: static; margin-left: auto; } } -.field-sub { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; } -.field-sub-label { color: var(--ink-dim); font-size: 12px; font-family: var(--font-mono); } +.field-sub { margin-top: 10px; display: flex; flex-direction: column; gap: 6px; } +.field-sub-label { color: var(--ink-dim); font-size: 11px; font-family: var(--font-mono); } .submit-form input[type="file"] { color: var(--ink-mid); font-family: var(--font-mono); background: transparent; border: 1px dashed var(--border-bright); - padding: 12px 16px; + padding: 10px 14px; cursor: pointer; width: 100%; - font-size: 12px; + font-size: 11px; } .submit-form input[type="file"]::file-selector-button { background: transparent; @@ -1147,41 +720,37 @@ main { position: relative; z-index: 2; } border: 1px solid var(--border-bright); font: inherit; padding: 4px 10px; - margin-right: 12px; + margin-right: 10px; letter-spacing: 0.1em; cursor: pointer; } .consent { font-size: 12px; color: var(--ink-mid); font-family: var(--font-serif); font-style: italic; } -.consent label { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; line-height: 1.6; } +.consent label { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; line-height: 1.55; } .consent input[type="checkbox"] { margin-top: 4px; accent-color: var(--amber); } -.submit-row { margin-top: 32px; } - +.submit-row { margin-top: 28px; } .submit-btn { background: transparent; color: var(--ink); border: 1px solid var(--border-bright); - padding: 16px 28px; + padding: 14px 26px; font-family: var(--font-mono); - letter-spacing: 0.22em; + letter-spacing: 0.2em; font-size: 13px; cursor: pointer; display: inline-flex; align-items: center; - gap: 14px; - transition: border-color 0.25s ease, background 0.25s ease, box-shadow 0.35s ease, color 0.25s ease; + gap: 12px; + transition: border-color 0.2s, color 0.2s, background 0.25s, box-shadow 0.3s; position: relative; overflow: hidden; + text-transform: lowercase; } .submit-btn:hover { border-color: var(--amber); color: var(--amber); - background: - radial-gradient(circle at 2px 2px, rgba(224,163,100,0.08) 0.6px, transparent 1px), - rgba(224,163,100,0.03); - background-size: 6px 6px, cover; - box-shadow: 0 0 32px -10px var(--amber-glow); + box-shadow: 0 0 28px -10px var(--amber-glow); } .submit-btn .ripple { position: absolute; @@ -1195,26 +764,22 @@ main { position: relative; z-index: 2; } to { transform: scale(4); opacity: 0; } } .submit-sigil { color: var(--amber-dim); } -.submit-btn .cursor-static { color: var(--amber); animation: cursor-blink 1.05s steps(1) infinite; } +.submit-btn .cursor-static { color: var(--amber); animation: blink 1.05s steps(1) infinite; } .submit-feedback { - margin-top: 28px; - padding: 18px 22px; + margin-top: 24px; + padding: 16px 20px; border: 1px solid var(--border-bright); - background: - repeating-linear-gradient(45deg, - rgba(255,255,255,0.012) 0, rgba(255,255,255,0.012) 2px, - transparent 2px, transparent 8px); + background: rgba(255,255,255,0.01); color: var(--ink); font-family: var(--font-mono); font-size: 13px; white-space: pre-wrap; - line-height: 1.75; + line-height: 1.7; display: none; - position: relative; } .submit-feedback.visible { display: block; } -.submit-feedback.error { border-color: #4d2525; color: var(--ink); } +.submit-feedback.error { border-color: #4d2525; } .submit-feedback.ok { border-color: var(--amber-dim); box-shadow: 0 0 40px -14px var(--amber-glow); } /* ---------------------------------------------------------------- ledger */ @@ -1223,8 +788,8 @@ main { position: relative; z-index: 2; } color: var(--ink-mid); font-family: var(--font-serif); font-style: italic; - margin: 0 0 24px; - font-size: 16px; + margin: 0 0 20px; + font-size: 14px; } .ledger-table { border-top: 1px solid var(--border); @@ -1233,393 +798,79 @@ main { position: relative; z-index: 2; } } .ledger-row { display: grid; - grid-template-columns: 1fr 160px 120px; - gap: 16px; - padding: 14px 0; + grid-template-columns: 1fr 140px 110px; + gap: 14px; + padding: 10px 0; border-bottom: 1px solid var(--border); - font-size: 13px; + font-size: 12px; letter-spacing: 0.04em; - transition: background 0.3s ease; + transition: background 0.3s; } .ledger-row.fresh { - background: rgba(224,163,100,0.08); - animation: ledger-flash 1.2s ease-out; + background: rgba(220,162,104,0.08); + animation: flash 1.2s ease-out; } -@keyframes ledger-flash { - 0% { background: rgba(224,163,100,0.3); } - 100% { background: rgba(224,163,100,0); } +@keyframes flash { + 0% { background: rgba(220,162,104,0.3); } + 100% { background: rgba(220,162,104,0); } } .ledger-row .hash { color: var(--ink); font-variant-numeric: tabular-nums; } .ledger-row .time { color: var(--ink-dim); } -.ledger-row .status { text-align: right; letter-spacing: 0.2em; font-size: 11px; } +.ledger-row .status { text-align: right; letter-spacing: 0.2em; font-size: 10px; } .ledger-row .status.pending { color: var(--ink-mid); } .ledger-row .status.advanced { color: var(--ink); } -.ledger-row .status.ignited { color: var(--amber); text-decoration: underline; text-underline-offset: 3px; text-shadow: 0 0 8px var(--amber-glow); } +.ledger-row .status.ignited { color: var(--amber); text-decoration: underline; text-underline-offset: 3px; } .ledger-row .status.rejected { color: var(--ink-faint); } /* ---------------------------------------------------------------- footer */ .footer { - padding: 60px 32px 40px; + padding: 48px 32px 36px; color: var(--ink-faint); font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.22em; border-top: 1px solid var(--border); - margin-top: 120px; + margin-top: 80px; position: relative; z-index: 2; text-transform: uppercase; } .footer-row { - max-width: 1200px; + max-width: 1140px; margin: 0 auto; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 16px; } -.footer-row .pulse { - color: var(--amber); - animation: cursor-blink 1.4s steps(1) infinite; -} +.footer-row .pulse { color: var(--amber); animation: blink 1.6s steps(1) infinite; } -/* ---------------------------------------------------------------- scroll reveal — "develop" */ +/* ---------------------------------------------------------------- reveal */ .reveal { opacity: 0; - filter: blur(6px) contrast(0.55); transform: translateY(8px); - transition: - opacity 0.9s cubic-bezier(0.2, 0.55, 0.2, 1), - filter 0.9s cubic-bezier(0.2, 0.55, 0.2, 1), - transform 0.9s cubic-bezier(0.2, 0.55, 0.2, 1); - will-change: opacity, transform, filter; -} -.reveal.visible { - opacity: 1; - filter: blur(0) contrast(1); - transform: translateY(0); + transition: opacity 0.7s cubic-bezier(0.2,0.55,0.2,1), transform 0.7s cubic-bezier(0.2,0.55,0.2,1); } +.reveal.visible { opacity: 1; transform: translateY(0); } /* ---------------------------------------------------------------- responsive */ @media (max-width: 640px) { - .topbar { padding: 12px 18px; font-size: 10px; } - .hero { padding: 110px 22px 48px; } - .section { padding: 110px 22px 72px; } - .hero-title { letter-spacing: 0.22em; } + .topbar { padding: 14px 18px; font-size: 10px; } + .hero { padding: 100px 22px 48px; } + .section { padding: 100px 22px 64px; } + .hero-title { letter-spacing: 0.18em; } .field-hint { padding-left: 0; } .kv-list li { grid-template-columns: 48px 1fr; } - .ledger-row { grid-template-columns: 1fr 100px; grid-template-areas: "hash status" "time status"; } + .r7-row { grid-template-columns: 90px 1fr 40px; } + .ledger-row { grid-template-columns: 1fr 90px; grid-template-areas: "hash status" "time status"; } .ledger-row .hash { grid-area: hash; } .ledger-row .time { grid-area: time; } .ledger-row .status { grid-area: status; } - .hero-status { grid-template-columns: 1fr; gap: 12px; text-align: left; } - .hero-status .cell.right { justify-content: flex-start; } -} - -/* ---------------------------------------------------------------- whitepaper chrome */ - -/* classification strip — top of hero */ -.classification { - position: relative; - z-index: 3; - padding: 12px 32px; - border-bottom: 1px solid var(--border); - background: rgba(10,12,18,0.4); - font-family: var(--font-mono); - font-size: 9.5px; - letter-spacing: 0.42em; - color: var(--ink-dim); - text-transform: uppercase; - display: flex; - justify-content: center; - align-items: center; - gap: 18px; -} -.classification .dot { color: var(--amber); } -.classification .spacer { color: var(--ink-faint); } - -/* corner registration marks */ -.corner { - position: absolute; - width: 22px; height: 22px; - color: var(--ink-dim); - font-family: var(--font-mono); - font-size: 18px; - line-height: 1; - pointer-events: none; - z-index: 2; - opacity: 0.6; -} -.corner.tl { top: 56px; left: 28px; } -.corner.tr { top: 56px; right: 28px; } -.corner.bl { bottom: 28px; left: 28px; } -.corner.br { bottom: 28px; right: 28px; } - -/* incipit — one italic line above the masthead */ -.hero-incipit { - font-family: var(--font-serif); - font-style: italic; - font-size: 14px; - letter-spacing: 0.01em; - color: var(--ink-mid); - text-align: center; - margin: 0 0 34px; - max-width: 640px; - line-height: 1.5; -} -.hero-incipit::before, -.hero-incipit::after { - content: "—— "; - color: var(--amber-dim); - font-style: normal; - letter-spacing: 0; -} -.hero-incipit::after { content: " ——"; } - -/* abstract — right after the title */ -.hero-abstract { - max-width: 560px; - margin: 18px auto 28px; - font-family: var(--font-mono); - font-size: 12px; - letter-spacing: 0.04em; - color: var(--ink-light); - line-height: 1.75; - padding: 18px 22px; - border-top: 1px solid var(--ink-faint); - border-bottom: 1px solid var(--ink-faint); - text-align: left; - position: relative; - text-transform: uppercase; -} -.hero-abstract::before { - content: "ABSTRACT"; - position: absolute; - top: -7px; - left: 22px; - background: var(--bg); - padding: 0 10px; - color: var(--amber); - font-size: 9px; - letter-spacing: 0.4em; -} -.hero-abstract .caret { - display: inline-block; - width: 7px; height: 13px; - background: var(--amber); - margin-left: 3px; - transform: translateY(2px); - animation: cursor-blink 1.05s steps(1) infinite; -} - -/* folio — Roman numeral alongside section number */ -.folio { - display: inline-flex; - align-items: baseline; - gap: 8px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.3em; - color: var(--ink-dim); -} -.folio .roman { - color: var(--ink); - font-family: var(--font-display); - font-style: italic; - font-size: 20px; - letter-spacing: 0.02em; - line-height: 1; -} - -/* section epigraph — italic pull-quote above the title */ -.section-epigraph { - font-family: var(--font-serif); - font-style: italic; - font-size: 15px; - color: var(--ink-mid); - line-height: 1.5; - max-width: 540px; - margin: 18px 0 28px; - padding-left: 18px; - border-left: 1px solid var(--amber-dim); -} - -/* marginalia — small gray mono notes in left margin (desktop only) */ -.marginalia { - position: absolute; - top: 0; - left: -180px; - width: 150px; - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.06em; - color: var(--ink-dim); - line-height: 1.55; - text-align: right; - padding-top: 4px; -} -.marginalia .ref { - color: var(--amber-dim); - font-size: 9px; - letter-spacing: 0.2em; - display: block; - margin-bottom: 4px; - text-transform: uppercase; -} -@media (max-width: 1180px) { - .marginalia { display: none; } -} - -/* ornamental section divider with centered mark */ -.ornament { - text-align: center; - padding: 80px 0 40px; - font-family: var(--font-display); - font-size: 22px; - color: var(--amber-dim); - letter-spacing: 0.5em; -} -.ornament::before, -.ornament::after { - content: "——————"; - color: var(--ink-faint); - padding: 0 18px; - letter-spacing: 0; - font-size: 10px; - vertical-align: middle; -} - -/* colophon — footer typography + provenance */ -.colophon { - max-width: 1200px; - margin: 60px auto 0; - padding: 40px 32px 24px; - border-top: 1px solid var(--border); - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: 48px; - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.08em; - color: var(--ink-dim); - line-height: 1.7; -} -.colophon h4 { - margin: 0 0 10px; - color: var(--amber); - font-size: 10px; - font-family: var(--font-mono); - font-weight: 500; - letter-spacing: 0.3em; - text-transform: uppercase; -} -.colophon p { margin: 0 0 4px; } -.colophon .mark { - font-family: var(--font-display); - font-style: italic; - font-size: 16px; - color: var(--ink-light); - letter-spacing: 0; -} -.colophon a { color: var(--ink-light); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--amber-dim); } -.colophon a:hover { color: var(--amber); } - -@media (max-width: 820px) { - .colophon { grid-template-columns: 1fr; gap: 28px; padding: 32px 22px; } -} - -/* ticker — slow whisper along the bottom of certain sections */ -.ticker { - position: relative; - z-index: 2; - margin: 100px 0 0; - padding: 16px 0; - border-top: 1px solid var(--border); - border-bottom: 1px solid var(--border); - overflow: hidden; - white-space: nowrap; - background: var(--bg-sunk); -} -.ticker-track { - display: inline-flex; - gap: 64px; - animation: ticker-drift 60s linear infinite; - will-change: transform; - padding-left: 100%; - font-family: var(--font-mono); - font-size: 11px; - letter-spacing: 0.24em; - color: var(--ink-dim); - text-transform: uppercase; -} -.ticker-track .glyph { color: var(--amber); letter-spacing: 0; } -@keyframes ticker-drift { - from { transform: translateX(0); } - to { transform: translateX(-50%); } -} - -/* update the topbar: add a tiny amber pulse dot for liveness */ -.topbar-left::before { - content: "● "; - color: var(--amber); - margin-right: 4px; - animation: cursor-blink 2.4s steps(1) infinite; -} - -/* the hero CTA cascade — two lines */ -.cta-cascade { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - margin-bottom: 0; -} -.cta-sub { - font-family: var(--font-mono); - font-size: 10px; - letter-spacing: 0.26em; - color: var(--ink-dim); - text-transform: uppercase; -} -.cta-sub .dot { color: var(--amber-dim); margin: 0 8px; } - -/* axes — animated highlight per row in the first-card behavior diagram */ -.axis-viz .row { - display: block; - transition: opacity 0.4s ease, color 0.4s ease; -} -.axis-card.card-01 .row { opacity: 0.6; } -.axis-card.card-01 .row.hot { - opacity: 1; - color: var(--amber); - text-shadow: 0 0 10px var(--amber-glow); -} - -/* for card-02 (knowledge) progressive fill */ -.axis-card.card-02 .row .fill { - display: inline-block; - color: var(--amber); -} - -/* for card-03 (scaffold) stacked panels */ -.axis-card.card-03 .panel { - display: block; - border-left: 1px dashed var(--border); - padding-left: 10px; - margin: 8px 0; - transition: border-color 0.4s ease, color 0.4s ease; -} -.axis-card.card-03 .panel.hot { border-left-color: var(--amber); color: var(--ink); } -.axis-card.card-03 .panel .new { color: var(--amber); } - -/* mystique — subtle pulse on status dot */ -.hero-status .cell .live-pulse { - color: var(--amber); - animation: cursor-blink 1.8s steps(1) infinite; - margin-right: 2px; + .chamber-head { grid-template-columns: auto 1fr auto; } + .chamber-head .chamber-budget { display: none; } } @media (prefers-reduced-motion: reduce) { @@ -1628,6 +879,6 @@ main { position: relative; z-index: 2; } transition-duration: 0.01ms !important; animation-iteration-count: 1 !important; } - #dither, .stardust, .grain { display: none; } - .reveal { filter: none; } + #dither { display: none; } + .reveal { opacity: 1; transform: none; } } diff --git a/index.html b/index.html index f5fc5a1..4a4563f 100644 --- a/index.html +++ b/index.html @@ -4,35 +4,24 @@ TOKEN-IGNITION · Selection Protocol v0.1 - + - - - -
    -
    +
    + + +
    / @@ -43,108 +32,48 @@
    - - - - - -

    - -
    - - - -
    - -
    -

    TOKEN-IGNITION

    -
    +

    TOKEN-IGNITION

    - -
    -

    - -
    - - - - · - - · - - -
    - - - +
    - +
    -

    -
    +
    -
    +
    -
    - - -
    +
    - +
    -

    -
    -
    -
    +
    +
    @@ -152,167 +81,102 @@

    - +
    -

    -
    -
    -
    -
    - - - - +
    -

      -
      - - -
      -
      -
      - - 0.82 -
      -
      +
      +
      + + + 0.82
      -
      -
      - - 0.14 -
      -
      -
      -
      - - - +
      + + + 0.14
      -
      +
      -
      - -
      - -
      -

      -
        -
        -
        +
        +
        - +
        -

        -
        -
        +
        - - ○ ○ ○ + $
        -
        - gate.3 · Ⅲ + gate.3 + 100M
        -
        100M
        -
        -
        -
        -
        -
        +
        +
        -
        - gate.2 · Ⅱ + gate.2 + 10M
        -
        10M
        -
        -
        -
        +
        -
        - gate.1 · Ⅰ + gate.1 + 1M
        -
        1M
        -
        -
        -
        - - _ -
        +
        - +
        -

        @@ -387,13 +251,10 @@

        - +

        @@ -402,26 +263,6 @@

        -
        -
        -

        -

        -

        -

        -
        -
        -

        -

        -

        -

        -
        -
        -

        -

        -

        -
        -
        -