diff --git a/.claude/skills/explore/SKILL.md b/.claude/skills/explore/SKILL.md index 9fc23e170..7063ffe33 100644 --- a/.claude/skills/explore/SKILL.md +++ b/.claude/skills/explore/SKILL.md @@ -123,9 +123,10 @@ one (exploration 0421). `two-way` means just do it. Past its `review` date a doc is listed in `docs/explorations/STALE.md` by -`pnpm check:exploration-fallow`. Being listed is not a failure; it means -the claim on future attention has lapsed. Renew it (`review: `) or -release it (`status: withdrawn`) — both are one-line frontmatter edits. +`pnpm check:exploration-fallow`. With no date, the default window is 90 days. +Stale is an informational age classification, not a CI failure or a requirement +to renew, withdraw, or implement the draft. Leave dates and status unchanged +unless an actual decision about the work calls for an update. > [!IMPORTANT] > Never signal any of this by renaming the file. Status in the filename diff --git a/.claude/skills/mvp-followup/SKILL.md b/.claude/skills/mvp-followup/SKILL.md index d556645d1..be6854ff9 100644 --- a/.claude/skills/mvp-followup/SKILL.md +++ b/.claude/skills/mvp-followup/SKILL.md @@ -27,13 +27,12 @@ something genuinely blocks the current work from being used. ## Choosing among stale explorations -`docs/explorations/STALE.md` lists every document past its `review:` date, and -opens with the backlog's **retirement curve** (exploration 0430). Read the curve -before the list: it does not fall, so an old `[_]` is not work in progress — it -is a decision already made by inaction. Withdrawing one (`status: withdrawn`) is -a legitimate closeout and often the honest answer; renewing it (`review:`) is the -other. Neither renames the file. Proposing to _start_ a 120-day-old document is -new scope, not follow-up. +`docs/explorations/STALE.md` reports drafts past their `review:` date or the +default 90-day window, alongside age-cohort statistics (exploration 0430). +Staleness is informational: age alone does not require action, fail CI, or mean +the work has been rejected. Do not renew dates or withdraw drafts merely to +clear the report. Choose follow-up by its relevance to the current task; +starting an unrelated old draft is new scope. ## Output shape diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6dbc2e4c6..20b97aa28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,8 +45,8 @@ jobs: steps: # fetch-depth: 0 — check:exploration-fallow dates each exploration from # the commit that introduced it. A shallow clone has no such commit, so - # every document would look new and the ratchet would pass vacuously; it - # fails loudly below a coverage floor rather than reporting a false green. + # draft ages would be unreadable. Keep enough history for an honest report; + # staleness itself is informational and never a merge gate. - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -117,13 +117,13 @@ jobs: - name: Exploration references resolve (0421) run: pnpm check:exploration-links - # The backlog grows ~85 documents a month and nothing closes one. Ratchet - # only — the count may not EXCEED the committed baseline, so a green repo - # stays green and the fix is always a one-line frontmatter edit. Needs the - # full history checked out below: creation dates are what make a document - # "stale", and a shallow clone has none. (0421.) - - name: Exploration backlog ratchet (0421) - run: pnpm check:exploration-fallow + # Draft age is a derived status, not a deadline to renew or close work. + # Publish the current report for readers of the job summary; no stale-count + # threshold applies. Generation errors still surface as errors. (0421.) + - name: Exploration age report (0421) + run: | + pnpm check:exploration-fallow + cat docs/explorations/STALE.md >> "$GITHUB_STEP_SUMMARY" - name: Publish closure (0220) run: pnpm check:publish-closure diff --git a/docs/explorations/.fallow-baseline.json b/docs/explorations/.fallow-baseline.json deleted file mode 100644 index dddf65bfc..000000000 --- a/docs/explorations/.fallow-baseline.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "count": 50 -} diff --git a/docs/explorations/0421_[-]_FAST_WHAT_COLLISONS_LIST_MEASURES_AND_WHAT_XNET_LACKS.md b/docs/explorations/0421_[-]_FAST_WHAT_COLLISONS_LIST_MEASURES_AND_WHAT_XNET_LACKS.md index ebef3224b..4d26cdcc8 100644 --- a/docs/explorations/0421_[-]_FAST_WHAT_COLLISONS_LIST_MEASURES_AND_WHAT_XNET_LACKS.md +++ b/docs/explorations/0421_[-]_FAST_WHAT_COLLISONS_LIST_MEASURES_AND_WHAT_XNET_LACKS.md @@ -10,6 +10,12 @@ tags: [process, velocity, explorations, ci, decision-making] # Fast — What Collison's List Measures, And What xNet Actually Lacks +> **Policy update — October 10, 2026:** Drafts still become stale after their +> review date or the default 90-day window, but age is informational. Chris +> removed the CI stale-count gate; drafts can stay open without renewing +> dates. `STALE.md` and the CI job summary report their age. The ratchet +> proposal and baseline below are historical. + > [!TIP] > **TL;DR** — Collison's list measures **build time**, and xNet already clears > that bar: median PR cycle time is under an hour, CI is 8 minutes. The slow @@ -31,7 +37,7 @@ counterexample — San Francisco's Van Ness bus lane, ~7,600 days at $110,000 pe metre, versus the Alaska Highway's 1,700 miles at $793 per metre. A 139× cost-per-metre gap between two road projects. -The obvious question for a codebase is: *are we the P-80 or Van Ness?* +The obvious question for a codebase is: _are we the P-80 or Van Ness?_ That framing is a trap. It assumes velocity is one number. It is not, and the list itself is quietly evidence for that: every project on it was **already @@ -46,15 +52,15 @@ actually slow, and is the slowness buying anything?** Measured against this repository's own git history: -| Phase | Measured | Verdict | -| --- | --- | --- | -| PR build → merge | median **< 1h**, p90 **2h**, 54/60 under 8h | ✅ Already fast | -| CI wall-clock | median **8 min**, p90 11 min, max 12 | ✅ Already fast | -| CI reliability | **6 of 25** recent runs red (24%) | 🚧 Real tax, small | -| Exploration → shipped | **210 `[x]` / 485 files** (43%) | ❌ The bottleneck | -| Backlog growth | ~**+85 `[_]` per month**, net | ❌ Unbounded | -| Inbound link integrity | **31 stale refs** (25 names, 28 files) of 381 | ❌ Undetected defect | -| Stranded work | 1 PR at **592h** (24.7 days); 7 stranded branches (0410) | 🚧 Tail risk | +| Phase | Measured | Verdict | +| ---------------------- | -------------------------------------------------------- | -------------------- | +| PR build → merge | median **< 1h**, p90 **2h**, 54/60 under 8h | ✅ Already fast | +| CI wall-clock | median **8 min**, p90 11 min, max 12 | ✅ Already fast | +| CI reliability | **6 of 25** recent runs red (24%) | 🚧 Real tax, small | +| Exploration → shipped | **210 `[x]` / 485 files** (43%) | ❌ The bottleneck | +| Backlog growth | ~**+85 `[_]` per month**, net | ❌ Unbounded | +| Inbound link integrity | **31 stale refs** (25 names, 28 files) of 381 | ❌ Undetected defect | +| Stranded work | 1 PR at **592h** (24.7 days); 7 stranded branches (0410) | 🚧 Tail risk | The build phase is Collison-fast. The **decide** phase has no clock at all — no owner, no deadline, no expiry, no withdrawal state. An exploration written in @@ -96,12 +102,12 @@ reform — "cut the CI gates" — targets the one phase that is already fine. ### The ceremony surface is large but cheap -| Surface | Count | Cost | -| --- | --- | --- | -| Workflow files | 25 (`.github/workflows/`) | 3,363 lines YAML | -| `check:*` scripts | 16 (root `package.json`) | Nested inside lint/typecheck jobs | -| Root scripts | 52 | — | -| Git hooks | 5 (`.husky/`) | pre-push runs `typecheck` + `test` | +| Surface | Count | Cost | +| ----------------- | ------------------------- | ---------------------------------- | +| Workflow files | 25 (`.github/workflows/`) | 3,363 lines YAML | +| `check:*` scripts | 16 (root `package.json`) | Nested inside lint/typecheck jobs | +| Root scripts | 52 | — | +| Git hooks | 5 (`.husky/`) | pre-push runs `typecheck` + `test` | This looks like vetocracy. It mostly is not, for a specific structural reason: these gates are **ratchets and closures**, not approvals. `check:publish-closure` @@ -116,8 +122,8 @@ and `check:api-report` assert a property of the diff; nobody has to say yes. The > the scheduled run used to gate on 1,136 standing findings, so "every Monday > was a guaranteed red ✗ … nobody consumed." It was cut back to a **dead-code > regression ratchet**: the only decidable, consumed gate. This is `AGENTS.md`'s -> rule made concrete — *ratchet against a committed baseline instead of gating -> absolutes.* +> rule made concrete — _ratchet against a committed baseline instead of gating +> absolutes._ ### The decide loop has no clock @@ -133,16 +139,16 @@ and `check:api-report` assert a property of the diff; nobody has to say yes. The Split by number band, the shape of the graveyard is clear: -| Band | `[x]` | `[-]` | `[_]` | Conversion | -| --- | --- | --- | --- | --- | -| 0xx | 49 | 3 | 47 | 🚧 49% | -| 1xx | 51 | 3 | **96** | ❌ 34% — the graveyard | -| 2xx | 69 | 1 | 54 | 🚧 56% | -| 3xx | 37 | 2 | 58 | ❌ 38% | -| 4xx | 4 | 7 | 4 | ✅ 27% `[x]` but **73% touched** | +| Band | `[x]` | `[-]` | `[_]` | Conversion | +| ---- | ----- | ----- | ------ | -------------------------------- | +| 0xx | 49 | 3 | 47 | 🚧 49% | +| 1xx | 51 | 3 | **96** | ❌ 34% — the graveyard | +| 2xx | 69 | 1 | 54 | 🚧 56% | +| 3xx | 37 | 2 | 58 | ❌ 38% | +| 4xx | 4 | 7 | 4 | ✅ 27% `[x]` but **73% touched** | The 4xx band is healthiest not because recent explorations are better, but -because `/implement` now runs *immediately* after `/explore` while the context +because `/implement` now runs _immediately_ after `/explore` while the context is still loaded. Proximity, not quality, is doing the work — which is the Skunk Works finding restated: co-location beats process. @@ -216,17 +222,17 @@ The mechanism, confirmed case by case: -| Linked as (stale) | Actual file today | Broke because | -| --- | --- | --- | -| `0403_[_]_MDX_VISUAL…` | `0403_[x]_MDX_VISUAL…` | `/implement` checked it off | -| `0391_[_]_XNET_AS_THE_DAILY_DRIVER…` | `0391_[x]_…` | same | -| `0416_[_]_AGENT_HARNESS…` | `0416_[-]_…` | partial check-off | -| `0328_[_]_TLDRAW_CANVAS_ALTERNATIVE` | `0328_[_]_TLDRAW_CANVAS_REPLACEMENT_OR_ALTERNATIVE_SURFACE` | title edited | +| Linked as (stale) | Actual file today | Broke because | +| ------------------------------------ | ----------------------------------------------------------- | --------------------------- | +| `0403_[_]_MDX_VISUAL…` | `0403_[x]_MDX_VISUAL…` | `/implement` checked it off | +| `0391_[_]_XNET_AS_THE_DAILY_DRIVER…` | `0391_[x]_…` | same | +| `0416_[_]_AGENT_HARNESS…` | `0416_[-]_…` | partial check-off | +| `0328_[_]_TLDRAW_CANVAS_ALTERNATIVE` | `0328_[_]_TLDRAW_CANVAS_REPLACEMENT_OR_ALTERNATIVE_SURFACE` | title edited | > [!NOTE] > Names in that table are elided (`…`) rather than spelled in full. Writing a -> stale filename verbatim in a document that lives *in the repository being -> checked* makes the document itself a source of broken references — a lesson +> stale filename verbatim in a document that lives _in the repository being +> checked_ makes the document itself a source of broken references — a lesson > learned by breaking this very table during implementation. The casualties are not confined to scratch docs. They include @@ -251,13 +257,13 @@ The casualties are not confined to scratch docs. They include Reading the entries for common mechanism rather than common vibe, five properties recur, and none of them is "worked harder": -| Mechanism | Evidence from the list | -| --- | --- | -| **Decision made once, at the top** | Apollo 8: 134 days green-light → launch. The 134 days contain no re-litigation. | -| **A real, external deadline** | Marinship: 197 days telegram → first ship. Tegel: 92 days, because the Berlin Airlift did not pause. | -| **Frozen — often *cut* — scope** | Spirit of St. Louis, 60 days: Lindbergh removed the radio, the parachute, the fuel gauge, and the front windscreen to hit the date. | -| **Small, co-located team** | Unix, 3 weeks, one person. Xerox Alto, ~4 months, from a bet. | -| **Permission pre-granted** | BankAmericard: 90 days to 100,000+ customers because nobody had to ask. | +| Mechanism | Evidence from the list | +| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| **Decision made once, at the top** | Apollo 8: 134 days green-light → launch. The 134 days contain no re-litigation. | +| **A real, external deadline** | Marinship: 197 days telegram → first ship. Tegel: 92 days, because the Berlin Airlift did not pause. | +| **Frozen — often _cut_ — scope** | Spirit of St. Louis, 60 days: Lindbergh removed the radio, the parachute, the fuel gauge, and the front windscreen to hit the date. | +| **Small, co-located team** | Unix, 3 weeks, one person. Xerox Alto, ~4 months, from a bet. | +| **Permission pre-granted** | BankAmericard: 90 days to 100,000+ customers because nobody had to ask. | Scope-cutting is the underrated one. Lindbergh did not go faster; he built **less**. Nothing in xNet's process makes cutting scope easier than adding it — @@ -288,8 +294,8 @@ treated as a one-way door. Both failure modes are real, and they are opposites. ### The slowdown literature The page's own concluding argument cites Kaufman (bureau proliferation), Howard -(*The Death of Common Sense*), Fukuyama (vetocracy), and Olson (*The Rise and -Decline of Nations*, on interest-group accumulation). The shared claim: costs +(_The Death of Common Sense_), Fukuyama (vetocracy), and Olson (_The Rise and +Decline of Nations_, on interest-group accumulation). The shared claim: costs accrete because each individual veto point is locally reasonable and nobody is accountable for the sum. @@ -314,7 +320,7 @@ accountable for the sum. explorations per month. Writing one costs ~20 minutes of agent time; implementing one costs days. The economics guarantee divergence. 4. **The exploration lifecycle has no terminal failure state.** `[_]` → `[-]` → - `[x]` is a one-way ladder with no rung for *decided against* or *expired*. + `[x]` is a one-way ladder with no rung for _decided against_ or _expired_. A rejected idea and an untouched idea are indistinguishable on disk. 5. **Proximity beats process.** The 4xx band's 73% touch rate comes from `/implement` running while context is warm — the Skunk Works result. @@ -336,17 +342,17 @@ accountable for the sum. > improvement / BATNA / vanish tests do not apply. It is purely internal > process. Flagging this explicitly rather than omitting it silently. -| Option | Targets | Cost | Verdict | -| --- | --- | --- | --- | -| **A** — Status quo | nothing | 0 | ❌ Backlog compounds | -| **B** — Fallow ratchet on `[_]` | decide phase | ~150 LOC + baseline | ✅ Recommended | -| **C** — Decider + expiry in frontmatter | decide phase | `/explore` change | ✅ Recommended | -| **D** — Ceremony tiered by reversibility | both | doc + skill change | ✅ Recommended | -| **G** — Link-integrity check | correctness | ~80 LOC | ✅ Recommended — **ship first** | -| **E** — Cut CI gates | build phase | high risk | 🛑 Rejected — measured non-bottleneck | -| **F** — Hard "ship within N days" mandate | decide phase | — | 🛑 Rejected — manufactures fake deadlines | -| **H** — `[~]` withdrawn state in the filename | decide phase | mass rename | 🛑 Rejected — multiplies the 25-link rot defect | -| **I** — Move expired docs to `expired/` | decide phase | mass `git mv` | 🛑 Rejected — same defect at 10× scale, and irreversible | +| Option | Targets | Cost | Verdict | +| --------------------------------------------- | ------------ | ------------------- | -------------------------------------------------------- | +| **A** — Status quo | nothing | 0 | ❌ Backlog compounds | +| **B** — Fallow ratchet on `[_]` | decide phase | ~150 LOC + baseline | ✅ Recommended | +| **C** — Decider + expiry in frontmatter | decide phase | `/explore` change | ✅ Recommended | +| **D** — Ceremony tiered by reversibility | both | doc + skill change | ✅ Recommended | +| **G** — Link-integrity check | correctness | ~80 LOC | ✅ Recommended — **ship first** | +| **E** — Cut CI gates | build phase | high risk | 🛑 Rejected — measured non-bottleneck | +| **F** — Hard "ship within N days" mandate | decide phase | — | 🛑 Rejected — manufactures fake deadlines | +| **H** — `[~]` withdrawn state in the filename | decide phase | mass rename | 🛑 Rejected — multiplies the 25-link rot defect | +| **I** — Move expired docs to `expired/` | decide phase | mass `git mv` | 🛑 Rejected — same defect at 10× scale, and irreversible |
Why E is rejected, in detail @@ -361,7 +367,7 @@ records that `check:publish-closure` exists because a published package depending on a private one broke `npm install` for every consumer. More precisely: the gates are **not veto points**. Fukuyama's vetocracy requires -an *actor* who can say no for reasons of their own. A script asserting that the +an _actor_ who can say no for reasons of their own. A script asserting that the API report matches the source has no interests. Conflating the two is the exact error that makes "cut red tape" campaigns remove the load-bearing parts. @@ -383,7 +389,7 @@ which makes it a suggestion with extra steps, and the first time it is missed it teaches that the rule is ignorable. Worse, it inverts the actual value: some explorations are deliberately -*speculative research* (0396 on freenet-core, 0412 on the fellowship landscape, +_speculative research_ (0396 on freenet-core, 0412 on the fellowship landscape, explicitly marked "revisit Nov 2026"). Those should stay `[_]` for a year. Expiry must mean **re-decide**, not **implement**. @@ -420,9 +426,9 @@ still undecided and load-bearing" (not fine). The missing states are the whole point: The original sin is that one field answers two unrelated questions. **Split the -axes**: the filename keeps answering *"is it built?"* (owned by `/implement`, -unchanged, no new values), and frontmatter answers *"is this still a live -claim?"* — a field no link ever spells, so changing it renames nothing. +axes**: the filename keeps answering _"is it built?"_ (owned by `/implement`, +unchanged, no new values), and frontmatter answers _"is this still a live +claim?"_ — a field no link ever spells, so changing it renames nothing. ```mermaid stateDiagram-v2 @@ -460,7 +466,7 @@ stateDiagram-v2 ``` The two axes are genuinely independent — an exploration can be `[-]` partially -built *and* withdrawn (we built some of it, then decided against the rest), a +built _and_ withdrawn (we built some of it, then decided against the rest), a state today's single field cannot represent at all. --- @@ -477,27 +483,27 @@ state today's single field cannot represent at all. ### How long until an exploration expires? **90 days.** Not a guess — the age distribution of the 260 `[_]` explorations picks the -number, against the criterion that today's stale set must be a *meaningful -minority* rather than either a rounding error or the whole corpus: +number, against the criterion that today's stale set must be a _meaningful +minority_ rather than either a rounding error or the whole corpus: Of 276 undecided explorations, 234 have a creation date in this checkout and 42 do not (they predate the shallow graft). Undated documents are reported separately and never counted as stale — unknown age and not-yet-due are different facts: -| Window | Stale today | % of undecided | Verdict | -| --- | --- | --- | --- | -| 30d | 152 | 55% | ❌ Catches most of the corpus; meaningless | -| 60d | 53 | 19% | 🚧 Defensible | -| **90d** | **41** | **15%** | ✅ **Recommended** | -| 120d | 30 | 11% | 🚧 Defensible | -| 150d | 17 | 6% | 🚧 Thin | -| 180d | **0** | 0% | 🛑 **Vacuous today, a cliff tomorrow** | -| 240d | 0 | 0% | 🛑 Vacuous | +| Window | Stale today | % of undecided | Verdict | +| ------- | ----------- | -------------- | ------------------------------------------ | +| 30d | 152 | 55% | ❌ Catches most of the corpus; meaningless | +| 60d | 53 | 19% | 🚧 Defensible | +| **90d** | **41** | **15%** | ✅ **Recommended** | +| 120d | 30 | 11% | 🚧 Defensible | +| 150d | 17 | 6% | 🚧 Thin | +| 180d | **0** | 0% | 🛑 **Vacuous today, a cliff tomorrow** | +| 240d | 0 | 0% | 🛑 Vacuous | > [!NOTE] > An earlier draft of this table (181/82/70/59/47/14) was measured per-file with -> `git log --follow` and a fallback that dated *undated* files to the earliest +> `git log --follow` and a fallback that dated _undated_ files to the earliest > commit touching them — so 42 documents of unknown age were silently counted as > ancient. The table above uses the same method the shipped script does: > identity is the 4-digit **number** (filenames rename on every check-off, which @@ -512,7 +518,7 @@ different facts: > written) crosses the line at once. A gate that cannot fire is not a lenient > gate; it is an absent one, and its first appearance would be a 200-item wall > long after the author has forgotten the rule. 90 days is a meaningful minority -> now *and* stable as the corpus ages. +> now _and_ stable as the corpus ages. The window is a **default, not a policy**: it applies only when a document declines to name its own date. Deliberately long-horizon research says so @@ -521,12 +527,12 @@ explicitly — 0412 already carries "revisit Nov 2026" in prose — and a ### What happens to an expired exploration? **Nothing moves. Nothing is deleted.** -| Option | Verdict | Why | -| --- | --- | --- | -| Delete the file | 🛑 Rejected | git retains the bytes but kills discoverability; breaks all 426 inbound references; an idea rejected once is the cheapest thing to re-derive *only if you can still find why* | -| `git mv` to `docs/explorations/expired/` | 🛑 Rejected | Path-based links break en masse — this is the 25-broken-links defect at 10× scale, and the move is the *only* irreversible option here | -| Add `[~]` to the filename | 🛑 Rejected | Same rot mechanism; a mass rename of ~70 documents would break more of the 192 filename-spelling links than every transition to date combined | -| **Leave it exactly where it is** | ✅ **Recommended** | Expiry is a property of the *decision*, not of the *document* | +| Option | Verdict | Why | +| ---------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Delete the file | 🛑 Rejected | git retains the bytes but kills discoverability; breaks all 426 inbound references; an idea rejected once is the cheapest thing to re-derive _only if you can still find why_ | +| `git mv` to `docs/explorations/expired/` | 🛑 Rejected | Path-based links break en masse — this is the 25-broken-links defect at 10× scale, and the move is the _only_ irreversible option here | +| Add `[~]` to the filename | 🛑 Rejected | Same rot mechanism; a mass rename of ~70 documents would break more of the 192 filename-spelling links than every transition to date combined | +| **Leave it exactly where it is** | ✅ **Recommended** | Expiry is a property of the _decision_, not of the _document_ | > [!IMPORTANT] > Expiry does not mean "this document is worthless." It means **the claim it @@ -554,7 +560,7 @@ Three signals, in ascending order of intrusiveness: `graphify`, and to agents doing retrieval. Costs nothing. 2. **In a generated index** — `docs/explorations/STALE.md`, rebuilt by the check, listing every lapsed document with its `decider` and age. This is the - *named consumer* `AGENTS.md` requires: `/mvp-followup` reads it to answer + _named consumer_ `AGENTS.md` requires: `/mvp-followup` reads it to answer "what's next," which today it cannot do against 259 identical-looking candidates. 3. **In CI** — the lint job prints the count on every run, green or red, and @@ -563,7 +569,7 @@ Three signals, in ascending order of intrusiveness: `decider` as a single name is deliberate: Kelly Johnson, not a committee. Renewing is a one-line diff (`review: 2027-02-01`) and needs no ceremony — -the point is to force a *conscious* renewal, not to make renewal expensive. +the point is to force a _conscious_ renewal, not to make renewal expensive. ### The higher-value gate found along the way @@ -574,7 +580,7 @@ the defect is **already present** (25 broken, including four public-facing is the safety net that makes any future rename survivable. It should land **first**. -### What this does *not* change +### What this does _not_ change - CI stays at 7 jobs and 8 minutes. - All 16 `check:*` gates stay. @@ -649,7 +655,7 @@ if (stale.length > baseline.count) { `\n\n Both fixes are one-line frontmatter edits — NO rename, so no\n` + ` inbound link breaks:\n` + ` review: 2027-02-01 # renew the claim\n` + - ` status: withdrawn # release it; the document stays put\n`, + ` status: withdrawn # release it; the document stays put\n` ) process.exit(1) } @@ -695,14 +701,14 @@ git commit -m "chore(explorations): seed fallow ratchet baseline" > all reversible by deletion, none renaming a file. That is the door test > applied to this document's own recommendation. -| Risk | Likelihood | Mitigation | -| --- | --- | --- | -| Shallow CI checkout makes every file look new | High | `fetch-depth: 0` on the lint job; **assert non-shallow and exit 1** rather than silently treating all 485 as fresh | -| `review:` becomes cargo-cult boilerplate | Medium | `/explore` must ask for a *reason*, not just a date; a date with no rationale is worse than no date | -| Baseline gets bumped instead of fixed | Medium | Require the bump in its own commit with a reason; it is a visible one-line diff in review | -| `STALE.md` regenerates noisily on every run | Medium | Sort deterministically; commit it, so the diff is empty unless the set genuinely changed | -| Ratchet adds a 17th gate — the thing we criticised | Low | Mechanically decidable, named consumer, always greenable by a one-line frontmatter edit — per `AGENTS.md` | -| `check:exploration-links` finds far more than 25 once it covers relative links inside `docs/explorations/` too | Medium | Seed it as a ratchet as well, then burn the baseline down | +| Risk | Likelihood | Mitigation | +| -------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------ | +| Shallow CI checkout makes every file look new | High | `fetch-depth: 0` on the lint job; **assert non-shallow and exit 1** rather than silently treating all 485 as fresh | +| `review:` becomes cargo-cult boilerplate | Medium | `/explore` must ask for a _reason_, not just a date; a date with no rationale is worse than no date | +| Baseline gets bumped instead of fixed | Medium | Require the bump in its own commit with a reason; it is a visible one-line diff in review | +| `STALE.md` regenerates noisily on every run | Medium | Sort deterministically; commit it, so the diff is empty unless the set genuinely changed | +| Ratchet adds a 17th gate — the thing we criticised | Low | Mechanically decidable, named consumer, always greenable by a one-line frontmatter edit — per `AGENTS.md` | +| `check:exploration-links` finds far more than 25 once it covers relative links inside `docs/explorations/` too | Medium | Seed it as a ratchet as well, then burn the baseline down | **Open questions:** @@ -743,7 +749,7 @@ _Phase 1 — stop the bleeding (independently valuable; ship even if the rest is _Phase 2 — give the backlog a clock_ - [x] Add `review:`, `decider:`, `door:` to the `/explore` frontmatter template; - require a one-line *reason* alongside the date + require a one-line _reason_ alongside the date - [x] Write `scripts/check-exploration-fallow.mjs` with a **90-day** default window; scrub `GIT_*` before any `git` subprocess (0413 hazard) - [x] Make the script exit 1 on a shallow checkout rather than treating every @@ -809,10 +815,10 @@ _Phase 3 — make it consumed_ **Slowdown literature cited by the page** -- Herbert Kaufman, *Are Government Organizations Immortal?* -- Philip K. Howard, *The Death of Common Sense* +- Herbert Kaufman, _Are Government Organizations Immortal?_ +- Philip K. Howard, _The Death of Common Sense_ - Francis Fukuyama, on vetocracy -- Mancur Olson, *The Rise and Decline of Nations* +- Mancur Olson, _The Rise and Decline of Nations_ - [Survivorship bias — Wikipedia](https://en.wikipedia.org/wiki/Survivorship_bias) **This repository** diff --git a/docs/explorations/0470_[x]_A_WORKSPACE_OF_YOUR_OWN_MARKETING_REDESIGN.md b/docs/explorations/0470_[x]_A_WORKSPACE_OF_YOUR_OWN_MARKETING_REDESIGN.md new file mode 100644 index 000000000..8167c8582 --- /dev/null +++ b/docs/explorations/0470_[x]_A_WORKSPACE_OF_YOUR_OWN_MARKETING_REDESIGN.md @@ -0,0 +1,201 @@ +--- +title: A workspace of your own — marketing redesign +status: approved +last_updated: 2026-10-10 +review: 2026-10-24 +decider: Chris Smothers +door: two-way +tags: [site, brand, product, vision] +--- + +# A workspace of your own + +> [!TIP] +> Lead with the workspace people can use, then explain the larger world it could grow into. Use the new mesh mark as a visual anchor, and the essays as the source of the argument. + +> [!IMPORTANT] +> Chris approved the revised white, compact direction and restored platform download icons on October 10, 2026, and explicitly requested that it be merged. The design review requirement is satisfied. + +## Problem + +The homepage sells an easy coding-agent integration as the main product. The owner’s current assessment is that this is ahead of the shipping experience. The repository supports a narrower claim: agent interfaces exist, while integrated daily work, clear in-product review, and consumer-friendly setup remain goals in `docs/ROADMAP.md`. + +The site also has several competing visual treatments: gradient SaaS landing pages, illustrated long-form essays, developer documentation, a dense pricing grid, and a newly refined wordmark. The essays contain a richer account of why the project exists than the homepage does. + +Chris selected **people who want a workspace they own** as the primary audience. Developers remain an important second route. + +## Recommendation after the first review + +Chris found the first preview less scannable than the old website. The warm paper background, repeated serif headlines, large spacing, and abstract copy made it feel monotonous and harder to read. The revised direction keeps the copy corrections and returns to the old site’s section components, feature cards, code panels, and direct headings. + +Use neutral white and zinc surfaces, black text, and distinct indigo, emerald, amber, and violet accents. The hero shows the app rather than a decorative mesh drawing. Its headline is “A workspace you own.” The core tools fit into a six-card grid. The builder section pairs nodes, schemas, and views with a short schema example. Three illustrated blog links explain the broader vision, followed by a compact current-release / in-progress / longer-term roadmap. + +The white foundation also leaves room for the app redesign Chris is considering. This preview changes the website; it does not make that future app design decision. + +The supporting pages follow the same hierarchy. The blog index has small thumbnails and searchable rows; the vision and roadmap pages use compact grids. Practical nouns replace abstract headlines: “Download xNet,” “Plugins and extensions,” “AI and agent tools.” The longer arguments remain in the essays. + +Chris approved this revision on October 10. The October 24 review date remains a follow-up design checkpoint, not a release commitment. + +## What the repository actually supports + +| Claim | Evidence | Treatment | +| --------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| Documents, databases, and canvases | `apps/electron/src/renderer/App.tsx`, workspace components; `README.md` | Available in alpha | +| Personal library | `apps/electron/src/library/`, renderer library views | Explicitly desktop | +| Browser demo | `README.md`, `apps/web/` | Passkey; limited temporary hosted backups; export important work | +| Local data and workspace export | `README.md`, storage/export implementation, `docs/CHARTER.md` | Concrete ownership mechanisms | +| Agent connection tools | `packages/cli/src/commands/connect.ts`, `site/src/data/agents.ts` | Developer setup; write permission explicit | +| Easy integrated AI daily driver | `docs/ROADMAP.md`, owner correction | Being built; never presented as the default experience | +| Own hub and managed hosting foundations | `packages/hub/`, `apps/cloud/`, `site/src/data/pricing.ts` | Explain choices and operator trust; preserve prices and limits | +| Full mobile workspace | `apps/expo/`, `site/src/pages/mobile.astro` | Developer demo; setup depends on whether a hosted build is configured | +| Broad discovery commons | `docs/ROADMAP.md`, `docs/VISION.md` | Longer-term direction; distinguish publishing foundations from a finished community network | + +The existing app screenshot is retained as an actual workspace illustration and labelled **example content**. Its sample document is not evidence of customer counts or completed features. + +## The essays as the organising idea + +The survey covered the headings, opening and closing arguments of all 25 published essays, plus the charter, roadmap, vision, and relevant code. Metaphors inform the design; their scientific or historical details do not become new product claims. + +| Thread | Essays | Where it enters the redesign | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Keep the thing you made | The Hundred-Year Machine; Weights You Can Hold; The Door Inside the House; The Right to Say No | Ownership lead, downloads, backups, exit, hosting choices | +| Data is common ground | Data Should Work Like Soil; The Forest and the Field; The Desert That Feeds the Forest; The Vault and the View | Vision cards: data persists while tools change; links to the essays | +| An open workshop | The Workshop and the Walled Garden; Clutch Power; The Tip of the Hook; The Loom You Can Read | Developer route, open schemas, extension foundations, inspectable machinery | +| Keep a legible history | Tree Rings; Palimpsest; People in Disguise | Provenance and agency, without promising a finished history-review UI | +| Choose and correct the course | Hand on the Tiller; The Gentlest Furnace; Atoms for the Ballot | Permission, feedback, limits, a direction that stays open to revision | +| A community can keep going | A Great Pirate Age; The World’s Greatest Record Store; The Table and the Wall | The commons horizon, voluntary connection, communities outlasting servers | +| Respect a person’s life | Timeout; The Matchmaker and the Meter; Rig the Game or Play; The Harvest You Can Count | Calm presentation, no urgency tricks or invented growth metrics; charter links | + +The dedicated vision page walks through permanence, interdependence, creative agency, consent, the commons, and room to go quiet. Each compact card links to the essay behind it. The home page includes three selected essays. The journal preserves every published post and its metadata, adding topic and text filtering across all 25 essays, including the latest entry. + +## Information architecture + +```mermaid +flowchart TD + Home["Home: a workspace of your own"] --> Workspace["The workspace: what you can use"] + Home --> Vision["The vision: why it matters"] + Home --> Journal["Field notes: the full argument"] + Home --> Builders["For builders: open foundations"] + Workspace --> Download["Desktop / browser / mobile demo"] + Vision --> Charter["Commitments and evidence"] + Vision --> Roadmap["Now / current focus / next / horizon"] + Builders --> Tools["React / DevTools / demos / plugins"] + Roadmap --> Agents["AI: current tools and unfinished experience"] + Roadmap --> Hosting["Cloud, self-hosting, prices, status"] +``` + +The header links to App, Developers, Vision, Blog, Agents, and Docs, with one product action. Mobile uses a native disclosure menu, retaining access to the destinations rather than hiding the navigation. The footer keeps the detailed paths available without making the first screen a directory. + +## Scope and implementation map + +| Surface | Change | +| ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `/` | Original section framework with corrected copy; app screenshot; six feature cards; substrate and code; blog vision; maturity | +| `/workspace` | New product tour, concrete features, alpha and platform questions | +| `/why` | New illustrated vision, connected directly to six essay themes | +| `/privacy-by-design` | Preserves the former detailed privacy argument at a discoverable route | +| `/roadmap` | New reader-oriented sequence, with present capability separated from goals | +| `/blog` | Compact searchable article rows with thumbnails, dates, authors, and topic filters | +| `/agents` | New honest introduction and setup framing; retains working setup tabs, permission details, and receipts | +| `/download` | Rebuilt platform chooser; preserves release asset discovery and describes unresolved lookup honestly | +| `/cloud` | Rewritten hosting story and operator choice; marks easier onboarding as a goal | +| `/build-with`, `/devtool` | Direct introductions; existing technical examples and controls retained | +| `/react`, `/mobile`, `/plugins`, `/cloud/pricing`, `/open`, `/compare`, `/commitments`, `/status`, `/changelog`, `/demos` | Shared visual overhaul and targeted copy/hierarchy corrections; underlying data, pricing, filters, and useful depth retained | +| Individual essays and legal pages | New shared navigation, footer, and palette; article arguments, artwork, citations, and legal text preserved | +| Documentation and application UI | Outside this redesign; existing destinations remain linked | + +Implementation lives in the real Astro pages and `site/src/components/marketing/`. This is a runnable visual companion rather than a Storybook sketch: Astro’s real routing, responsive layout, theme behavior, and data-driven controls are what the reviewer needs to see. The markdown remains the record of decisions. + +## Options considered + +| Option | Strength | Cost | Decision | +| --------------------------------------------------- | ---------------------------------------- | ----------------------------------------- | ----------------------------- | +| Refine the current agent-first page | Small diff | Retains the central mismatch | Rejected for this pass | +| Lead with the entire decentralised-network vision | Strong philosophy | Hard to tell what a visitor can use today | Vision becomes the second act | +| Lead with an owned workspace, then open the horizon | Useful entry point and room for ambition | Requires a genuine narrative rewrite | Recommended | + +## External reference points + +[Ink & Switch’s local-first essay](https://www.inkandswitch.com/essay/local-first/) grounds ownership in practical properties: local copies, offline work, collaboration, and long-term access. This supports explaining mechanisms before making a broad claim about freedom. + +[Linear’s current site](https://linear.app/) is a useful reference for deliberate hierarchy and a legible product route. The first preview’s editorial treatment was rejected in review. The revised design returns to xNet’s existing product-oriented section framework. + +The primary voice and visual material come from xNet’s own essays and illustrations, rather than a third-party template. + +## Review questions and tradeoffs + +- Is the revised density close to the old site’s useful level of detail? +- The homepage keeps the ownership message, the builder explanation, and the blog-derived vision. Longer passages live on their dedicated pages. +- White and zinc are the neutral base; accents distinguish tools and statuses. The brand assets stay unchanged. +- The public pricing catalog is retained. Operational readiness should be rechecked before publication; this preview does not certify hosted signup. +- The charter page summarises six commitments while the source charter has a seventh Floor section. The redesign does not invent its enforcement status. + +## Implementation checklist + +- [x] Ground the claim map in source, roadmap, and owner correction. +- [x] Implement the shared shell and responsive visual system. +- [x] Build the homepage, workspace, vision, roadmap, and journal. +- [x] Rework supporting marketing routes while retaining working data and controls. +- [x] Preserve essay and legal prose, and make the previous privacy argument reachable. +- [x] Provide a local browser preview for Chris. +- [x] Receive Chris’s approval of the revised preview before any publication. + +## Validation checklist + +- [x] Site production build and existing content/output validators pass. +- [x] Check desktop, tablet, and narrow phone layouts in light and dark themes. +- [x] Check menu, theme toggle, journal search/topics, developer tabs, and links. +- [x] Check internal route references and heading structure. +- [x] Keep the redesign local until Chris completed the design review. + +## First-preview verification notes + +The local review runs at `http://127.0.0.1:4330/` from a production Astro build with +`PUBLIC_DESIGN_PREVIEW=true`. That environment flag adds a review strip; it does +not change the production deployment configuration. The branch is +`codex/marketing-redesign-preview` in the managed `marketing-redesign-preview` worktree. + +- The first browser sweep covered 20 routes at 1440, 768, 375, and 320 pixels. It found an agent-tab overflow at 320 pixels; the tab row now wraps, and the 320-pixel recheck passes. +- Journal title search, empty results, topic filters, and reset all worked. The reset restores all 25 essays. +- The mobile navigation opens and routes to the builder page. Developer language and agent-client tabs switch correctly; language selection and the theme persist after reload. +- An exact source comparison confirms the 25 essay bodies and six legal pages preserve their prose. Their only direct edit is the skip-link target on `main`. +- The local status page cannot fetch the Cloud status endpoint because that endpoint does not allow the localhost origin. Its existing dated snapshot fallback remains visible. This preview does not verify hosted service health, signup, or billing. +- The final production build passed: 136 pages built; the output validator verified 52 static routes. A static check followed 3,640 internal links across 71 marketing outputs with zero missing routes or anchors. +- Dark-theme checks covered eight routes at desktop, tablet, and phone widths with no overflow or page exceptions. The final homepage check also passed at 320 pixels. Reduced-motion scrolling is `auto`; the mobile menu and mechanics disclosure remain usable with JavaScript disabled. +- The full site build runs the existing comparison, changelog, plugin, surveillance, metrics, search, and output validators. No new UI test suite or CI gate is introduced. + +## References + +- `docs/VISION.md`, `docs/ROADMAP.md`, `docs/CHARTER.md`, `README.md` +- `site/src/data/blog.ts`, `site/src/data/blog-art.ts`, all `site/src/pages/blog/*.astro` +- `site/src/data/agents.ts`, `site/src/data/pricing.ts`, `site/src/data/commitments.ts` +- `apps/electron/src/renderer/App.tsx`, `apps/electron/src/library/` +- `packages/cli/src/commands/connect.ts` +- `site/src/styles/marketing.css`, `site/src/components/marketing/`, `site/src/layouts/Base.astro` + +## Revision 2 verification + +- [x] Production build and existing site validators. +- [x] Desktop, tablet, and narrow-phone layouts in both themes. +- [x] Mobile navigation, blog filters, code tabs, and mechanics disclosure. +- [x] Internal routes and fragment targets. +- [x] Updated local preview and screenshots available for review. + +The production build generated 136 pages and passed the output validator for +52 static routes. The browser sweep covered 20 routes at four widths (1440, +768, 375, and 320 pixels) in both themes, with no page exceptions. A long inline +schema address overflowed on the narrowest blog layout; inline code now wraps, +and that route passes the 320-pixel recheck in both themes. + +Mobile navigation closes after following a homepage anchor. Blog title search, +empty results, topic selection, and the reset to all 25 essays work. Developer +language selection persists after reload, and agent-client tabs switch. The +theme also persists. The mobile menu and mechanics disclosure remain usable +with JavaScript disabled. + +The static link audit checked 3,962 internal links across 71 marketing outputs, +with no missing routes or fragment targets. Current screenshots are saved in +`output/marketing-redesign-2026-10-10/revision-2/` in the primary checkout. +The preview server remains available at `http://127.0.0.1:4330/`. + +The first preview is saved in commit `c069c4fa1`. Chris approved the revised direction, including the restored platform icons and download colours, and requested a merge on October 10, 2026. diff --git a/docs/explorations/STALE.md b/docs/explorations/STALE.md index 1beca5fae..755ae5237 100644 --- a/docs/explorations/STALE.md +++ b/docs/explorations/STALE.md @@ -2,19 +2,11 @@ # Stale explorations -Explorations past their `review:` date (or 90 days old with none). Being -listed here is not a failure — it means the claim this document makes on -future attention has lapsed and needs renewing or releasing. +Drafts are classified as stale after their `review:` date, or after the +default 90-day window. This is an age report, not a CI failure or a deadline +to build, renew, or close anything. Stale drafts can remain open until useful. -Two fixes, both one-line frontmatter edits. Neither renames the file, so -neither breaks an inbound reference: - -```yaml -review: 2027-02-01 # renew the claim -status: withdrawn # release it; the document stays exactly where it is -``` - -**50** stale of 310 undecided. +**54** stale of 310 undecided. ## How this backlog retires @@ -23,75 +15,77 @@ only documents old enough to have had that many days, so a recent bulge cannot drag the curve down. | Days since written | Cohort | Still unshipped | -| --- | --- | --- | -| 1 | 448 | 57% | -| 7 | 446 | 56% | -| 14 | 445 | 56% | -| 30 | 444 | 55% | -| 60 | 431 | 54% | -| 90 | 295 | 49% | -| 120 | 165 | 60% | +| ------------------ | ------ | --------------- | +| 1 | 448 | 57% | +| 7 | 448 | 56% | +| 14 | 445 | 56% | +| 30 | 444 | 55% | +| 60 | 431 | 54% | +| 90 | 312 | 50% | +| 120 | 179 | 59% | -The curve does not fall: 57% of documents at least a day old are -unshipped, and 60% at 120 days. An exploration is checked off -within days of being written, or never — so an old `[_]` is not a pending -decision, it is a decision already made by inaction. Renew it deliberately, -or withdraw it; both are one line and neither renames the file. +57% of documents at least a day old remain unshipped, +compared with 59% of those at least 120 days old. +These are age cohorts, not requirements to retire drafts. ## Past review date -| Exploration | Due | Overdue | Decider | -| --- | --- | --- | --- | -| [0079_[_]_AUTH_SCHEMA_DSL_VARIATIONS.md](0079_%5B_%5D_AUTH_SCHEMA_DSL_VARIATIONS.md) | 2026-05-09 *(default)* | 153d | — | -| [0080_[_]_UCAN_HYBRID_AUTHORIZATION_INTEGRATION.md](0080_%5B_%5D_UCAN_HYBRID_AUTHORIZATION_INTEGRATION.md) | 2026-05-10 *(default)* | 152d | — | -| [0081_[_]_NODE_PERMISSIONS_UCAN_EVALUATION.md](0081_%5B_%5D_NODE_PERMISSIONS_UCAN_EVALUATION.md) | 2026-05-10 *(default)* | 152d | — | -| [0082_[_]_GLOBAL_NAMESPACE_AUTHORIZATION.md](0082_%5B_%5D_GLOBAL_NAMESPACE_AUTHORIZATION.md) | 2026-05-10 *(default)* | 152d | — | -| [0083_[_]_UNIFIED_AUTHORIZATION_ARCHITECTURE.md](0083_%5B_%5D_UNIFIED_AUTHORIZATION_ARCHITECTURE.md) | 2026-05-10 *(default)* | 152d | — | -| [0084_[_]_GROUPS_AS_RELATIONS.md](0084_%5B_%5D_GROUPS_AS_RELATIONS.md) | 2026-05-10 *(default)* | 152d | — | -| [0086_[_]_NATIVE_REWRITE_ZIG_RUST.md](0086_%5B_%5D_NATIVE_REWRITE_ZIG_RUST.md) | 2026-05-12 *(default)* | 150d | — | -| [0088_[_]_DATABASE_UI_COMPETITIVE_ARCHITECTURE.md](0088_%5B_%5D_DATABASE_UI_COMPETITIVE_ARCHITECTURE.md) | 2026-05-13 *(default)* | 149d | — | -| [0089_[_]_REST_GRAPHQL_INTEROPERABILITY_BOUNDARY.md](0089_%5B_%5D_REST_GRAPHQL_INTEROPERABILITY_BOUNDARY.md) | 2026-05-18 *(default)* | 144d | — | -| [0090_[_]_ELECTRON_P2P_REMOTE_SHARE_OPTIONS.md](0090_%5B_%5D_ELECTRON_P2P_REMOTE_SHARE_OPTIONS.md) | 2026-05-21 *(default)* | 141d | — | -| [0091_[_]_GLOBAL_SCHEMA_FEDERATION_MODEL.md](0091_%5B_%5D_GLOBAL_SCHEMA_FEDERATION_MODEL.md) | 2026-05-21 *(default)* | 141d | — | -| [0093_[_]_NODE_NATIVE_GLOBAL_SCHEMA_FEDERATION_MODEL.md](0093_%5B_%5D_NODE_NATIVE_GLOBAL_SCHEMA_FEDERATION_MODEL.md) | 2026-05-21 *(default)* | 141d | — | -| [0095_[_]_PACKAGE_PORTFOLIO_CLEANUP_AND_API_SIMPLIFICATION.md](0095_%5B_%5D_PACKAGE_PORTFOLIO_CLEANUP_AND_API_SIMPLIFICATION.md) | 2026-05-30 *(default)* | 132d | — | -| [0096_[_]_PLAN03_ERP_REALITY_CHECK_AND_EXECUTION_RESET.md](0096_%5B_%5D_PLAN03_ERP_REALITY_CHECK_AND_EXECUTION_RESET.md) | 2026-05-30 *(default)* | 132d | — | -| [0098_[_]_OPENCLAW_INTEGRATION.md](0098_%5B_%5D_OPENCLAW_INTEGRATION.md) | 2026-06-01 *(default)* | 130d | — | -| [0099_[_]_DATABASE_EDITING_UX_AND_UNDO_REDO_REMEDIATION_PLAN.md](0099_%5B_%5D_DATABASE_EDITING_UX_AND_UNDO_REDO_REMEDIATION_PLAN.md) | 2026-06-01 *(default)* | 130d | — | -| [0100_[_]_NPM_PUBLISH_WORKFLOW_FOR_XNETJS.md](0100_%5B_%5D_NPM_PUBLISH_WORKFLOW_FOR_XNETJS.md) | 2026-06-02 *(default)* | 129d | — | -| [0101_[_]_END_TO_END_NPM_TRUSTED_PUBLISHING_PLAYBOOK.md](0101_%5B_%5D_END_TO_END_NPM_TRUSTED_PUBLISHING_PLAYBOOK.md) | 2026-06-03 *(default)* | 128d | — | -| [0102_[_]_AFFINE_BLOCKSUITE_INTEGRATION_FEASIBILITY.md](0102_%5B_%5D_AFFINE_BLOCKSUITE_INTEGRATION_FEASIBILITY.md) | 2026-06-03 *(default)* | 128d | — | -| [0103_[-]_TASKS_EMBEDDED_IN_PAGES_BACKED_BY_NODES_MENTIONS_DUE_DATES_NESTED_SUBTASKS_DATABASES_CANVASES_AND_CROSS_SURFACE_TASK_MODEL.md](0103_%5B-%5D_TASKS_EMBEDDED_IN_PAGES_BACKED_BY_NODES_MENTIONS_DUE_DATES_NESTED_SUBTASKS_DATABASES_CANVASES_AND_CROSS_SURFACE_TASK_MODEL.md) | 2026-06-04 *(default)* | 127d | — | -| [0104_[-]_EXPLORE_DRAMATICALLY_SIMPLIFYING_THE_UX_AROUND_A_CANVAS_FIRST_PRIMARY_APP_INSPIRED_BY_AFFINE_MINIMIZING_BUTTONS_AND_CHROME_WITH_ZOOM_IN_DOCUMENTS_AND_DATABASES.md](0104_%5B-%5D_EXPLORE_DRAMATICALLY_SIMPLIFYING_THE_UX_AROUND_A_CANVAS_FIRST_PRIMARY_APP_INSPIRED_BY_AFFINE_MINIMIZING_BUTTONS_AND_CHROME_WITH_ZOOM_IN_DOCUMENTS_AND_DATABASES.md) | 2026-06-04 *(default)* | 127d | — | -| [0105_[_]_WHAT_TO_WORK_ON_NEXT_AFTER_OPEN_SOURCE_LAUNCH.md](0105_%5B_%5D_WHAT_TO_WORK_ON_NEXT_AFTER_OPEN_SOURCE_LAUNCH.md) | 2026-06-05 *(default)* | 126d | — | -| [0106_[_]_CI_PERF_TESTING_OPTIONS.md](0106_%5B_%5D_CI_PERF_TESTING_OPTIONS.md) | 2026-06-05 *(default)* | 126d | — | -| [0106_[_]_JOIN_QUERIES_MULTI_TYPE_AGGREGATES_QUERY_PLANNING_API.md](0106_%5B_%5D_JOIN_QUERIES_MULTI_TYPE_AGGREGATES_QUERY_PLANNING_API.md) | 2026-06-05 *(default)* | 126d | — | -| [0107_[_]_STORYBOOK_PERFORMANCE_PANEL_AND_ELECTRON_IDE_WORKSHOP.md](0107_%5B_%5D_STORYBOOK_PERFORMANCE_PANEL_AND_ELECTRON_IDE_WORKSHOP.md) | 2026-06-06 *(default)* | 125d | — | -| [0108_[_]_CANVAS_V1_PAGES_DATABASES_AND_INFINITE_CANVAS_DEEP_DIVE.md](0108_%5B_%5D_CANVAS_V1_PAGES_DATABASES_AND_INFINITE_CANVAS_DEEP_DIVE.md) | 2026-06-07 *(default)* | 124d | — | -| [0108_[_]_EXPO_APP_PARITY_WITH_ELECTRON_AND_WEB.md](0108_%5B_%5D_EXPO_APP_PARITY_WITH_ELECTRON_AND_WEB.md) | 2026-06-07 *(default)* | 124d | — | -| [0108_[_]_TIMING_FOR_INTEGRATING_CHAT_AND_VIDEO_INTO_XNET_NOW_VS_LATER.md](0108_%5B_%5D_TIMING_FOR_INTEGRATING_CHAT_AND_VIDEO_INTO_XNET_NOW_VS_LATER.md) | 2026-06-07 *(default)* | 124d | — | -| [0108_[_]_USEQUERY_UPGRADE_TIMING_AND_INTEGRATION_SEQUENCING.md](0108_%5B_%5D_USEQUERY_UPGRADE_TIMING_AND_INTEGRATION_SEQUENCING.md) | 2026-06-07 *(default)* | 124d | — | -| [0109_[_]_REPOSITORY_AND_PROJECT_SUMMARY_FOR_NON_TECHNICAL_USERS.md](0109_%5B_%5D_REPOSITORY_AND_PROJECT_SUMMARY_FOR_NON_TECHNICAL_USERS.md) | 2026-06-08 *(default)* | 123d | — | -| [0110_[_]_XNET_AS_A_VIABLE_WIKIPEDIA_ALTERNATIVE.md](0110_%5B_%5D_XNET_AS_A_VIABLE_WIKIPEDIA_ALTERNATIVE.md) | 2026-07-04 *(default)* | 97d | — | -| [0111_[_]_UNIFIED_WORKBENCH_ARCHITECTURE_FOR_XNET.md](0111_%5B_%5D_UNIFIED_WORKBENCH_ARCHITECTURE_FOR_XNET.md) | 2026-07-04 *(default)* | 97d | — | -| [0112_[_]_UNIVERSAL_CLIPPER_AND_AI_KNOWLEDGE_GRAPH_INGESTION.md](0112_%5B_%5D_UNIVERSAL_CLIPPER_AND_AI_KNOWLEDGE_GRAPH_INGESTION.md) | 2026-07-04 *(default)* | 97d | — | -| [0113_[_]_OTHER_INTERNET_INFRASTRUCTURE_ROLES_FOR_XNET.md](0113_%5B_%5D_OTHER_INTERNET_INFRASTRUCTURE_ROLES_FOR_XNET.md) | 2026-07-04 *(default)* | 97d | — | -| [0114_[_]_DECENTRALIZED_ALTERNATIVES_FOR_NON_XNET_INTERNET_LAYERS.md](0114_%5B_%5D_DECENTRALIZED_ALTERNATIVES_FOR_NON_XNET_INTERNET_LAYERS.md) | 2026-07-04 *(default)* | 97d | — | -| [0115_[_]_ARCHITECTING_FULLY_DECENTRALIZED_GLOBAL_WEB_SEARCH.md](0115_%5B_%5D_ARCHITECTING_FULLY_DECENTRALIZED_GLOBAL_WEB_SEARCH.md) | 2026-07-06 *(default)* | 95d | — | -| [0116_[_]_ARCHITECTING_DECENTRALIZED_TWITTER_X_ON_XNET.md](0116_%5B_%5D_ARCHITECTING_DECENTRALIZED_TWITTER_X_ON_XNET.md) | 2026-07-06 *(default)* | 95d | — | -| [0117_[_]_ARCHITECTING_DECENTRALIZED_AI_ON_XNET.md](0117_%5B_%5D_ARCHITECTING_DECENTRALIZED_AI_ON_XNET.md) | 2026-07-06 *(default)* | 95d | — | -| [0118_[_]_ARCHITECTING_A_DECENTRALIZED_OSS_FORGE_ON_XNET.md](0118_%5B_%5D_ARCHITECTING_A_DECENTRALIZED_OSS_FORGE_ON_XNET.md) | 2026-07-06 *(default)* | 95d | — | -| [0119_[_]_XNET_AS_A_COMPELLING_WEB_AND_MOBILE_DEVELOPER_TOOL.md](0119_%5B_%5D_XNET_AS_A_COMPELLING_WEB_AND_MOBILE_DEVELOPER_TOOL.md) | 2026-07-06 *(default)* | 95d | — | -| [0120_[_]_XNET_PACKAGE_SECURITY_AND_RELIABILITY_EXPLORATION.md](0120_%5B_%5D_XNET_PACKAGE_SECURITY_AND_RELIABILITY_EXPLORATION.md) | 2026-07-06 *(default)* | 95d | — | -| [0283_[_]_CI_FAILURE_PATTERNS_AND_PIPELINE_HEALTH.md](0283_%5B_%5D_CI_FAILURE_PATTERNS_AND_PIPELINE_HEALTH.md) | 2026-10-06 *(default)* | 3d | — | -| [0286_[_]_ALTERNATIVE_CLOUD_HOSTING_SUBSTRATES_COMPUTE_AND_STORAGE_TRADEOFFS.md](0286_%5B_%5D_ALTERNATIVE_CLOUD_HOSTING_SUBSTRATES_COMPUTE_AND_STORAGE_TRADEOFFS.md) | 2026-10-07 *(default)* | 2d | — | -| [0287_[_]_FLEET_SCALABILITY_SHARP_EDGES_AND_HARD_CAPS.md](0287_%5B_%5D_FLEET_SCALABILITY_SHARP_EDGES_AND_HARD_CAPS.md) | 2026-10-07 *(default)* | 2d | — | -| [0288_[_]_FULLY_INTEGRATING_LITESTREAM_INTO_THE_CLOUD_OFFERING.md](0288_%5B_%5D_FULLY_INTEGRATING_LITESTREAM_INTO_THE_CLOUD_OFFERING.md) | 2026-10-07 *(default)* | 2d | — | -| [0288_[_]_WIRING_THE_FLOATING_SHELL_AFFORDANCES.md](0288_%5B_%5D_WIRING_THE_FLOATING_SHELL_AFFORDANCES.md) | 2026-10-07 *(default)* | 2d | — | -| [0289_[_]_SECURELY_CONNECTING_THE_BROWSER_TO_A_LOCAL_MODEL.md](0289_%5B_%5D_SECURELY_CONNECTING_THE_BROWSER_TO_A_LOCAL_MODEL.md) | 2026-10-07 *(default)* | 2d | — | -| [0290_[-]_SHARE_LINK_GENERATION_FAILURE_MODES.md](0290_%5B-%5D_SHARE_LINK_GENERATION_FAILURE_MODES.md) | 2026-10-08 *(default)* | 1d | — | -| [0291_[_]_DEMO_HUB_RUNAWAY_STORAGE_QUOTA_AND_EVICTION_NOT_ENFORCED.md](0291_%5B_%5D_DEMO_HUB_RUNAWAY_STORAGE_QUOTA_AND_EVICTION_NOT_ENFORCED.md) | 2026-10-08 *(default)* | 1d | — | -| [0293_[_]_DEPOT_DEV_CI_PERFORMANCE_EVALUATION.md](0293_%5B_%5D_DEPOT_DEV_CI_PERFORMANCE_EVALUATION.md) | 2026-10-08 *(default)* | 1d | — | +| Exploration | Due | Overdue | Decider | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ------- | ------- | +| [0079*[*]\_AUTH_SCHEMA_DSL_VARIATIONS.md](0079_%5B_%5D_AUTH_SCHEMA_DSL_VARIATIONS.md) | 2026-05-09 _(default)_ | 155d | — | +| [0080*[*]\_UCAN_HYBRID_AUTHORIZATION_INTEGRATION.md](0080_%5B_%5D_UCAN_HYBRID_AUTHORIZATION_INTEGRATION.md) | 2026-05-10 _(default)_ | 154d | — | +| [0081*[*]\_NODE_PERMISSIONS_UCAN_EVALUATION.md](0081_%5B_%5D_NODE_PERMISSIONS_UCAN_EVALUATION.md) | 2026-05-10 _(default)_ | 154d | — | +| [0082*[*]\_GLOBAL_NAMESPACE_AUTHORIZATION.md](0082_%5B_%5D_GLOBAL_NAMESPACE_AUTHORIZATION.md) | 2026-05-10 _(default)_ | 154d | — | +| [0083*[*]\_UNIFIED_AUTHORIZATION_ARCHITECTURE.md](0083_%5B_%5D_UNIFIED_AUTHORIZATION_ARCHITECTURE.md) | 2026-05-10 _(default)_ | 154d | — | +| [0084*[*]\_GROUPS_AS_RELATIONS.md](0084_%5B_%5D_GROUPS_AS_RELATIONS.md) | 2026-05-10 _(default)_ | 154d | — | +| [0086*[*]\_NATIVE_REWRITE_ZIG_RUST.md](0086_%5B_%5D_NATIVE_REWRITE_ZIG_RUST.md) | 2026-05-12 _(default)_ | 152d | — | +| [0088*[*]\_DATABASE_UI_COMPETITIVE_ARCHITECTURE.md](0088_%5B_%5D_DATABASE_UI_COMPETITIVE_ARCHITECTURE.md) | 2026-05-13 _(default)_ | 151d | — | +| [0089*[*]\_REST_GRAPHQL_INTEROPERABILITY_BOUNDARY.md](0089_%5B_%5D_REST_GRAPHQL_INTEROPERABILITY_BOUNDARY.md) | 2026-05-18 _(default)_ | 146d | — | +| [0090*[*]\_ELECTRON_P2P_REMOTE_SHARE_OPTIONS.md](0090_%5B_%5D_ELECTRON_P2P_REMOTE_SHARE_OPTIONS.md) | 2026-05-21 _(default)_ | 143d | — | +| [0091*[*]\_GLOBAL_SCHEMA_FEDERATION_MODEL.md](0091_%5B_%5D_GLOBAL_SCHEMA_FEDERATION_MODEL.md) | 2026-05-21 _(default)_ | 143d | — | +| [0093*[*]\_NODE_NATIVE_GLOBAL_SCHEMA_FEDERATION_MODEL.md](0093_%5B_%5D_NODE_NATIVE_GLOBAL_SCHEMA_FEDERATION_MODEL.md) | 2026-05-21 _(default)_ | 143d | — | +| [0095*[*]\_PACKAGE_PORTFOLIO_CLEANUP_AND_API_SIMPLIFICATION.md](0095_%5B_%5D_PACKAGE_PORTFOLIO_CLEANUP_AND_API_SIMPLIFICATION.md) | 2026-05-30 _(default)_ | 134d | — | +| [0096*[*]\_PLAN03_ERP_REALITY_CHECK_AND_EXECUTION_RESET.md](0096_%5B_%5D_PLAN03_ERP_REALITY_CHECK_AND_EXECUTION_RESET.md) | 2026-05-30 _(default)_ | 134d | — | +| [0098*[*]\_OPENCLAW_INTEGRATION.md](0098_%5B_%5D_OPENCLAW_INTEGRATION.md) | 2026-06-01 _(default)_ | 132d | — | +| [0099*[*]\_DATABASE_EDITING_UX_AND_UNDO_REDO_REMEDIATION_PLAN.md](0099_%5B_%5D_DATABASE_EDITING_UX_AND_UNDO_REDO_REMEDIATION_PLAN.md) | 2026-06-01 _(default)_ | 132d | — | +| [0100*[*]\_NPM_PUBLISH_WORKFLOW_FOR_XNETJS.md](0100_%5B_%5D_NPM_PUBLISH_WORKFLOW_FOR_XNETJS.md) | 2026-06-02 _(default)_ | 131d | — | +| [0101*[*]\_END_TO_END_NPM_TRUSTED_PUBLISHING_PLAYBOOK.md](0101_%5B_%5D_END_TO_END_NPM_TRUSTED_PUBLISHING_PLAYBOOK.md) | 2026-06-03 _(default)_ | 130d | — | +| [0102*[*]\_AFFINE_BLOCKSUITE_INTEGRATION_FEASIBILITY.md](0102_%5B_%5D_AFFINE_BLOCKSUITE_INTEGRATION_FEASIBILITY.md) | 2026-06-03 _(default)_ | 130d | — | +| [0103\_[-]\_TASKS_EMBEDDED_IN_PAGES_BACKED_BY_NODES_MENTIONS_DUE_DATES_NESTED_SUBTASKS_DATABASES_CANVASES_AND_CROSS_SURFACE_TASK_MODEL.md](0103_%5B-%5D_TASKS_EMBEDDED_IN_PAGES_BACKED_BY_NODES_MENTIONS_DUE_DATES_NESTED_SUBTASKS_DATABASES_CANVASES_AND_CROSS_SURFACE_TASK_MODEL.md) | 2026-06-04 _(default)_ | 129d | — | +| [0104\_[-]\_EXPLORE_DRAMATICALLY_SIMPLIFYING_THE_UX_AROUND_A_CANVAS_FIRST_PRIMARY_APP_INSPIRED_BY_AFFINE_MINIMIZING_BUTTONS_AND_CHROME_WITH_ZOOM_IN_DOCUMENTS_AND_DATABASES.md](0104_%5B-%5D_EXPLORE_DRAMATICALLY_SIMPLIFYING_THE_UX_AROUND_A_CANVAS_FIRST_PRIMARY_APP_INSPIRED_BY_AFFINE_MINIMIZING_BUTTONS_AND_CHROME_WITH_ZOOM_IN_DOCUMENTS_AND_DATABASES.md) | 2026-06-04 _(default)_ | 129d | — | +| [0105*[*]\_WHAT_TO_WORK_ON_NEXT_AFTER_OPEN_SOURCE_LAUNCH.md](0105_%5B_%5D_WHAT_TO_WORK_ON_NEXT_AFTER_OPEN_SOURCE_LAUNCH.md) | 2026-06-05 _(default)_ | 128d | — | +| [0106*[*]\_CI_PERF_TESTING_OPTIONS.md](0106_%5B_%5D_CI_PERF_TESTING_OPTIONS.md) | 2026-06-05 _(default)_ | 128d | — | +| [0106*[*]\_JOIN_QUERIES_MULTI_TYPE_AGGREGATES_QUERY_PLANNING_API.md](0106_%5B_%5D_JOIN_QUERIES_MULTI_TYPE_AGGREGATES_QUERY_PLANNING_API.md) | 2026-06-05 _(default)_ | 128d | — | +| [0107*[*]\_STORYBOOK_PERFORMANCE_PANEL_AND_ELECTRON_IDE_WORKSHOP.md](0107_%5B_%5D_STORYBOOK_PERFORMANCE_PANEL_AND_ELECTRON_IDE_WORKSHOP.md) | 2026-06-06 _(default)_ | 127d | — | +| [0108*[*]\_CANVAS_V1_PAGES_DATABASES_AND_INFINITE_CANVAS_DEEP_DIVE.md](0108_%5B_%5D_CANVAS_V1_PAGES_DATABASES_AND_INFINITE_CANVAS_DEEP_DIVE.md) | 2026-06-07 _(default)_ | 126d | — | +| [0108*[*]\_EXPO_APP_PARITY_WITH_ELECTRON_AND_WEB.md](0108_%5B_%5D_EXPO_APP_PARITY_WITH_ELECTRON_AND_WEB.md) | 2026-06-07 _(default)_ | 126d | — | +| [0108*[*]\_TIMING_FOR_INTEGRATING_CHAT_AND_VIDEO_INTO_XNET_NOW_VS_LATER.md](0108_%5B_%5D_TIMING_FOR_INTEGRATING_CHAT_AND_VIDEO_INTO_XNET_NOW_VS_LATER.md) | 2026-06-07 _(default)_ | 126d | — | +| [0108*[*]\_USEQUERY_UPGRADE_TIMING_AND_INTEGRATION_SEQUENCING.md](0108_%5B_%5D_USEQUERY_UPGRADE_TIMING_AND_INTEGRATION_SEQUENCING.md) | 2026-06-07 _(default)_ | 126d | — | +| [0109*[*]\_REPOSITORY_AND_PROJECT_SUMMARY_FOR_NON_TECHNICAL_USERS.md](0109_%5B_%5D_REPOSITORY_AND_PROJECT_SUMMARY_FOR_NON_TECHNICAL_USERS.md) | 2026-06-08 _(default)_ | 125d | — | +| [0110*[*]\_XNET_AS_A_VIABLE_WIKIPEDIA_ALTERNATIVE.md](0110_%5B_%5D_XNET_AS_A_VIABLE_WIKIPEDIA_ALTERNATIVE.md) | 2026-07-04 _(default)_ | 99d | — | +| [0111*[*]\_UNIFIED_WORKBENCH_ARCHITECTURE_FOR_XNET.md](0111_%5B_%5D_UNIFIED_WORKBENCH_ARCHITECTURE_FOR_XNET.md) | 2026-07-04 _(default)_ | 99d | — | +| [0112*[*]\_UNIVERSAL_CLIPPER_AND_AI_KNOWLEDGE_GRAPH_INGESTION.md](0112_%5B_%5D_UNIVERSAL_CLIPPER_AND_AI_KNOWLEDGE_GRAPH_INGESTION.md) | 2026-07-04 _(default)_ | 99d | — | +| [0113*[*]\_OTHER_INTERNET_INFRASTRUCTURE_ROLES_FOR_XNET.md](0113_%5B_%5D_OTHER_INTERNET_INFRASTRUCTURE_ROLES_FOR_XNET.md) | 2026-07-04 _(default)_ | 99d | — | +| [0114*[*]\_DECENTRALIZED_ALTERNATIVES_FOR_NON_XNET_INTERNET_LAYERS.md](0114_%5B_%5D_DECENTRALIZED_ALTERNATIVES_FOR_NON_XNET_INTERNET_LAYERS.md) | 2026-07-04 _(default)_ | 99d | — | +| [0115*[*]\_ARCHITECTING_FULLY_DECENTRALIZED_GLOBAL_WEB_SEARCH.md](0115_%5B_%5D_ARCHITECTING_FULLY_DECENTRALIZED_GLOBAL_WEB_SEARCH.md) | 2026-07-06 _(default)_ | 97d | — | +| [0116*[*]\_ARCHITECTING_DECENTRALIZED_TWITTER_X_ON_XNET.md](0116_%5B_%5D_ARCHITECTING_DECENTRALIZED_TWITTER_X_ON_XNET.md) | 2026-07-06 _(default)_ | 97d | — | +| [0117*[*]\_ARCHITECTING_DECENTRALIZED_AI_ON_XNET.md](0117_%5B_%5D_ARCHITECTING_DECENTRALIZED_AI_ON_XNET.md) | 2026-07-06 _(default)_ | 97d | — | +| [0118*[*]\_ARCHITECTING_A_DECENTRALIZED_OSS_FORGE_ON_XNET.md](0118_%5B_%5D_ARCHITECTING_A_DECENTRALIZED_OSS_FORGE_ON_XNET.md) | 2026-07-06 _(default)_ | 97d | — | +| [0119*[*]\_XNET_AS_A_COMPELLING_WEB_AND_MOBILE_DEVELOPER_TOOL.md](0119_%5B_%5D_XNET_AS_A_COMPELLING_WEB_AND_MOBILE_DEVELOPER_TOOL.md) | 2026-07-06 _(default)_ | 97d | — | +| [0120*[*]\_XNET_PACKAGE_SECURITY_AND_RELIABILITY_EXPLORATION.md](0120_%5B_%5D_XNET_PACKAGE_SECURITY_AND_RELIABILITY_EXPLORATION.md) | 2026-07-06 _(default)_ | 97d | — | +| [0283*[*]\_CI_FAILURE_PATTERNS_AND_PIPELINE_HEALTH.md](0283_%5B_%5D_CI_FAILURE_PATTERNS_AND_PIPELINE_HEALTH.md) | 2026-10-06 _(default)_ | 5d | — | +| [0286*[*]\_ALTERNATIVE_CLOUD_HOSTING_SUBSTRATES_COMPUTE_AND_STORAGE_TRADEOFFS.md](0286_%5B_%5D_ALTERNATIVE_CLOUD_HOSTING_SUBSTRATES_COMPUTE_AND_STORAGE_TRADEOFFS.md) | 2026-10-07 _(default)_ | 4d | — | +| [0287*[*]\_FLEET_SCALABILITY_SHARP_EDGES_AND_HARD_CAPS.md](0287_%5B_%5D_FLEET_SCALABILITY_SHARP_EDGES_AND_HARD_CAPS.md) | 2026-10-07 _(default)_ | 4d | — | +| [0288*[*]\_FULLY_INTEGRATING_LITESTREAM_INTO_THE_CLOUD_OFFERING.md](0288_%5B_%5D_FULLY_INTEGRATING_LITESTREAM_INTO_THE_CLOUD_OFFERING.md) | 2026-10-07 _(default)_ | 4d | — | +| [0288*[*]\_WIRING_THE_FLOATING_SHELL_AFFORDANCES.md](0288_%5B_%5D_WIRING_THE_FLOATING_SHELL_AFFORDANCES.md) | 2026-10-07 _(default)_ | 4d | — | +| [0289*[*]\_SECURELY_CONNECTING_THE_BROWSER_TO_A_LOCAL_MODEL.md](0289_%5B_%5D_SECURELY_CONNECTING_THE_BROWSER_TO_A_LOCAL_MODEL.md) | 2026-10-07 _(default)_ | 4d | — | +| [0290\_[-]\_SHARE_LINK_GENERATION_FAILURE_MODES.md](0290_%5B-%5D_SHARE_LINK_GENERATION_FAILURE_MODES.md) | 2026-10-08 _(default)_ | 3d | — | +| [0291*[*]\_DEMO_HUB_RUNAWAY_STORAGE_QUOTA_AND_EVICTION_NOT_ENFORCED.md](0291_%5B_%5D_DEMO_HUB_RUNAWAY_STORAGE_QUOTA_AND_EVICTION_NOT_ENFORCED.md) | 2026-10-08 _(default)_ | 3d | — | +| [0293*[*]\_DEPOT_DEV_CI_PERFORMANCE_EVALUATION.md](0293_%5B_%5D_DEPOT_DEV_CI_PERFORMANCE_EVALUATION.md) | 2026-10-08 _(default)_ | 3d | — | +| [0300*[*]\_RUNNING_AN_XNET_HUB_ON_A_RASPBERRY_PI.md](0300_%5B_%5D_RUNNING_AN_XNET_HUB_ON_A_RASPBERRY_PI.md) | 2026-10-10 _(default)_ | 1d | — | +| [0301*[*]\_ATPROTO_INTEGRATION_IDENTITY_SYNC_AND_HUB_AS_PDS.md](0301_%5B_%5D_ATPROTO_INTEGRATION_IDENTITY_SYNC_AND_HUB_AS_PDS.md) | 2026-10-10 _(default)_ | 1d | — | +| [0302*[*]\_CONNECTING_TO_UMH_CORE.md](0302_%5B_%5D_CONNECTING_TO_UMH_CORE.md) | 2026-10-10 _(default)_ | 1d | — | +| [0307*[*]\_SECURITY_OF_NODE_AND_CHANGE_FLOW.md](0307_%5B_%5D_SECURITY_OF_NODE_AND_CHANGE_FLOW.md) | 2026-10-10 _(default)_ | 1d | — | ## Undated @@ -100,48 +94,48 @@ or withdraw it; both are one line and neither renames the file. unknown age and not-yet-due are different facts. Give one a `review:` date to move it out of this list. -- [0001_[_]_graph-performance-research.md](0001_%5B_%5D_graph-performance-research.md) -- [0010_[_]_I18N_ARCHITECTURE.md](0010_%5B_%5D_I18N_ARCHITECTURE.md) -- [0012_[_]_PNPM_TO_BUN_MIGRATION.md](0012_%5B_%5D_PNPM_TO_BUN_MIGRATION.md) -- [0017_[_]_IDENTITY_MIGRATION_PLAN.md](0017_%5B_%5D_IDENTITY_MIGRATION_PLAN.md) -- [0020_[_]_REGENERATIVE_FARMING_ERP.md](0020_%5B_%5D_REGENERATIVE_FARMING_ERP.md) -- [0021_[_]_CLOJURE_PORT.md](0021_%5B_%5D_CLOJURE_PORT.md) -- [0022_[_]_RAMA_HUB_AT_SCALE.md](0022_%5B_%5D_RAMA_HUB_AT_SCALE.md) -- [0023_[_]_DECENTRALIZED_SEARCH.md](0023_%5B_%5D_DECENTRALIZED_SEARCH.md) -- [0028_[_]_CHAT_AND_VIDEO.md](0028_%5B_%5D_CHAT_AND_VIDEO.md) -- [0029_[_]_MASTODON_SOCIAL_NETWORKING.md](0029_%5B_%5D_MASTODON_SOCIAL_NETWORKING.md) -- [0030_[_]_UNIVERSAL_SOCIAL_PRIMITIVES.md](0030_%5B_%5D_UNIVERSAL_SOCIAL_PRIMITIVES.md) -- [0031_[_]_NOSTR_INTEGRATION.md](0031_%5B_%5D_NOSTR_INTEGRATION.md) -- [0033_[_]_NAMING_DATAGARDEN.md](0033_%5B_%5D_NAMING_DATAGARDEN.md) -- [0037_[_]_USEQUERY_PAGINATION.md](0037_%5B_%5D_USEQUERY_PAGINATION.md) -- [0038_[_]_YJS_HISTORY_INTEGRATION.md](0038_%5B_%5D_YJS_HISTORY_INTEGRATION.md) -- [0040_[_]_FIRST_CLASS_RELATIONS.md](0040_%5B_%5D_FIRST_CLASS_RELATIONS.md) -- [0042_[_]_UNIFIED_QUERY_API.md](0042_%5B_%5D_UNIFIED_QUERY_API.md) -- [0044_[_]_AI_COLLABORATIVE_EDITING.md](0044_%5B_%5D_AI_COLLABORATIVE_EDITING.md) -- [0047_[_]_PLUGIN_MARKETPLACE.md](0047_%5B_%5D_PLUGIN_MARKETPLACE.md) -- [0052_[_]_LIBP2P_REINTEGRATION.md](0052_%5B_%5D_LIBP2P_REINTEGRATION.md) -- [0057_[_]_USAGE_BASED_DONATIONS.md](0057_%5B_%5D_USAGE_BASED_DONATIONS.md) -- [0059_[_]_VERSION_COMPATIBILITY.md](0059_%5B_%5D_VERSION_COMPATIBILITY.md) -- [0061_[_]_AI_AGENT_INTEGRATION.md](0061_%5B_%5D_AI_AGENT_INTEGRATION.md) -- [0062_[_]_VERSION_COMPATIBILITY_IMPLEMENTATION.md](0062_%5B_%5D_VERSION_COMPATIBILITY_IMPLEMENTATION.md) -- [0063_[_]_COMMUNITY_TOOLS.md](0063_%5B_%5D_COMMUNITY_TOOLS.md) -- [0064_[_]_MONOREPO_RELEASE_AUTOMATION.md](0064_%5B_%5D_MONOREPO_RELEASE_AUTOMATION.md) -- [0065_[_]_SECURE_PASSKEY_FALLBACK.md](0065_%5B_%5D_SECURE_PASSKEY_FALLBACK.md) -- [0067_[-]_DATABASE_DATA_MODEL_V2.md](0067_%5B-%5D_DATABASE_DATA_MODEL_V2.md) -- [0068_[-]_CANVAS_OPTIMIZATION.md](0068_%5B-%5D_CANVAS_OPTIMIZATION.md) -- [0070_[_]_COMPACT_WIRE_FORMAT.md](0070_%5B_%5D_COMPACT_WIRE_FORMAT.md) -- [0073_[-]_STORAGEADAPTER_REMOVAL.md](0073_%5B-%5D_STORAGEADAPTER_REMOVAL.md) -- [0076_[_]_AUTHORIZATION_API_DESIGN.md](0076_%5B_%5D_AUTHORIZATION_API_DESIGN.md) -- [0077_[_]_AUTHORIZATION_API_DESIGN_V2.md](0077_%5B_%5D_AUTHORIZATION_API_DESIGN_V2.md) -- [0078_[_]_TRULY_P2P_DISCOVERY_AND_ROUTING.md](0078_%5B_%5D_TRULY_P2P_DISCOVERY_AND_ROUTING.md) -- [0199_[_]_ELEGANT_COMPOSABLE_MOTION_SYSTEM.md](0199_%5B_%5D_ELEGANT_COMPOSABLE_MOTION_SYSTEM.md) -- [0199_[_]_NOTION_AND_AIRTABLE_GRADE_DATABASE_UI_AND_NATIVE_QUERIES.md](0199_%5B_%5D_NOTION_AND_AIRTABLE_GRADE_DATABASE_UI_AND_NATIVE_QUERIES.md) -- [0306_[_]_EPOCH_RESOLVED_HUB_ARBITRATION.md](0306_%5B_%5D_EPOCH_RESOLVED_HUB_ARBITRATION.md) -- [0323_[_]_ENTITY_COMPONENT_SYSTEM_AND_HIGH_FREQUENCY_STATE.md](0323_%5B_%5D_ENTITY_COMPONENT_SYSTEM_AND_HIGH_FREQUENCY_STATE.md) -- [0345_[_]_COPYLEFT_LICENSING_GPL_AGPL_VS_MIT_PLUS_FSL.md](0345_%5B_%5D_COPYLEFT_LICENSING_GPL_AGPL_VS_MIT_PLUS_FSL.md) -- [0359_[_]_COMMUNITY_HOSTING_AND_RECURRING_REVENUE_THE_SKOOL_QUESTION.md](0359_%5B_%5D_COMMUNITY_HOSTING_AND_RECURRING_REVENUE_THE_SKOOL_QUESTION.md) -- [0362_[_]_PUBLISHING_ON_XNET_GHOST_SUBSTACK_AND_THE_OWNED_AUDIENCE.md](0362_%5B_%5D_PUBLISHING_ON_XNET_GHOST_SUBSTACK_AND_THE_OWNED_AUDIENCE.md) -- [0372_[_]_JOINING_THE_ATMOSPHERE_ADOPT_EXTEND_MINT_AND_THE_HUB_AS_A_KNOT.md](0372_%5B_%5D_JOINING_THE_ATMOSPHERE_ADOPT_EXTEND_MINT_AND_THE_HUB_AS_A_KNOT.md) -- [0426_[-]_SHOULD_THE_USER_BE_IN_CHARGE_SURRENDER_AS_A_DESIGN_CONSTRAINT.md](0426_%5B-%5D_SHOULD_THE_USER_BE_IN_CHARGE_SURRENDER_AS_A_DESIGN_CONSTRAINT.md) -- [0427_[-]_MOTION_DEV_ESCAPE_HATCH.md](0427_%5B-%5D_MOTION_DEV_ESCAPE_HATCH.md) -- [0428_[-]_CAN_YOU_JUST_DO_THINGS_SEEING_THE_DEGREES_OF_FREEDOM.md](0428_%5B-%5D_CAN_YOU_JUST_DO_THINGS_SEEING_THE_DEGREES_OF_FREEDOM.md) +- [0001*[*]\_graph-performance-research.md](0001_%5B_%5D_graph-performance-research.md) +- [0010*[*]\_I18N_ARCHITECTURE.md](0010_%5B_%5D_I18N_ARCHITECTURE.md) +- [0012*[*]\_PNPM_TO_BUN_MIGRATION.md](0012_%5B_%5D_PNPM_TO_BUN_MIGRATION.md) +- [0017*[*]\_IDENTITY_MIGRATION_PLAN.md](0017_%5B_%5D_IDENTITY_MIGRATION_PLAN.md) +- [0020*[*]\_REGENERATIVE_FARMING_ERP.md](0020_%5B_%5D_REGENERATIVE_FARMING_ERP.md) +- [0021*[*]\_CLOJURE_PORT.md](0021_%5B_%5D_CLOJURE_PORT.md) +- [0022*[*]\_RAMA_HUB_AT_SCALE.md](0022_%5B_%5D_RAMA_HUB_AT_SCALE.md) +- [0023*[*]\_DECENTRALIZED_SEARCH.md](0023_%5B_%5D_DECENTRALIZED_SEARCH.md) +- [0028*[*]\_CHAT_AND_VIDEO.md](0028_%5B_%5D_CHAT_AND_VIDEO.md) +- [0029*[*]\_MASTODON_SOCIAL_NETWORKING.md](0029_%5B_%5D_MASTODON_SOCIAL_NETWORKING.md) +- [0030*[*]\_UNIVERSAL_SOCIAL_PRIMITIVES.md](0030_%5B_%5D_UNIVERSAL_SOCIAL_PRIMITIVES.md) +- [0031*[*]\_NOSTR_INTEGRATION.md](0031_%5B_%5D_NOSTR_INTEGRATION.md) +- [0033*[*]\_NAMING_DATAGARDEN.md](0033_%5B_%5D_NAMING_DATAGARDEN.md) +- [0037*[*]\_USEQUERY_PAGINATION.md](0037_%5B_%5D_USEQUERY_PAGINATION.md) +- [0038*[*]\_YJS_HISTORY_INTEGRATION.md](0038_%5B_%5D_YJS_HISTORY_INTEGRATION.md) +- [0040*[*]\_FIRST_CLASS_RELATIONS.md](0040_%5B_%5D_FIRST_CLASS_RELATIONS.md) +- [0042*[*]\_UNIFIED_QUERY_API.md](0042_%5B_%5D_UNIFIED_QUERY_API.md) +- [0044*[*]\_AI_COLLABORATIVE_EDITING.md](0044_%5B_%5D_AI_COLLABORATIVE_EDITING.md) +- [0047*[*]\_PLUGIN_MARKETPLACE.md](0047_%5B_%5D_PLUGIN_MARKETPLACE.md) +- [0052*[*]\_LIBP2P_REINTEGRATION.md](0052_%5B_%5D_LIBP2P_REINTEGRATION.md) +- [0057*[*]\_USAGE_BASED_DONATIONS.md](0057_%5B_%5D_USAGE_BASED_DONATIONS.md) +- [0059*[*]\_VERSION_COMPATIBILITY.md](0059_%5B_%5D_VERSION_COMPATIBILITY.md) +- [0061*[*]\_AI_AGENT_INTEGRATION.md](0061_%5B_%5D_AI_AGENT_INTEGRATION.md) +- [0062*[*]\_VERSION_COMPATIBILITY_IMPLEMENTATION.md](0062_%5B_%5D_VERSION_COMPATIBILITY_IMPLEMENTATION.md) +- [0063*[*]\_COMMUNITY_TOOLS.md](0063_%5B_%5D_COMMUNITY_TOOLS.md) +- [0064*[*]\_MONOREPO_RELEASE_AUTOMATION.md](0064_%5B_%5D_MONOREPO_RELEASE_AUTOMATION.md) +- [0065*[*]\_SECURE_PASSKEY_FALLBACK.md](0065_%5B_%5D_SECURE_PASSKEY_FALLBACK.md) +- [0067\_[-]\_DATABASE_DATA_MODEL_V2.md](0067_%5B-%5D_DATABASE_DATA_MODEL_V2.md) +- [0068\_[-]\_CANVAS_OPTIMIZATION.md](0068_%5B-%5D_CANVAS_OPTIMIZATION.md) +- [0070*[*]\_COMPACT_WIRE_FORMAT.md](0070_%5B_%5D_COMPACT_WIRE_FORMAT.md) +- [0073\_[-]\_STORAGEADAPTER_REMOVAL.md](0073_%5B-%5D_STORAGEADAPTER_REMOVAL.md) +- [0076*[*]\_AUTHORIZATION_API_DESIGN.md](0076_%5B_%5D_AUTHORIZATION_API_DESIGN.md) +- [0077*[*]\_AUTHORIZATION_API_DESIGN_V2.md](0077_%5B_%5D_AUTHORIZATION_API_DESIGN_V2.md) +- [0078*[*]\_TRULY_P2P_DISCOVERY_AND_ROUTING.md](0078_%5B_%5D_TRULY_P2P_DISCOVERY_AND_ROUTING.md) +- [0199*[*]\_ELEGANT_COMPOSABLE_MOTION_SYSTEM.md](0199_%5B_%5D_ELEGANT_COMPOSABLE_MOTION_SYSTEM.md) +- [0199*[*]\_NOTION_AND_AIRTABLE_GRADE_DATABASE_UI_AND_NATIVE_QUERIES.md](0199_%5B_%5D_NOTION_AND_AIRTABLE_GRADE_DATABASE_UI_AND_NATIVE_QUERIES.md) +- [0306*[*]\_EPOCH_RESOLVED_HUB_ARBITRATION.md](0306_%5B_%5D_EPOCH_RESOLVED_HUB_ARBITRATION.md) +- [0323*[*]\_ENTITY_COMPONENT_SYSTEM_AND_HIGH_FREQUENCY_STATE.md](0323_%5B_%5D_ENTITY_COMPONENT_SYSTEM_AND_HIGH_FREQUENCY_STATE.md) +- [0345*[*]\_COPYLEFT_LICENSING_GPL_AGPL_VS_MIT_PLUS_FSL.md](0345_%5B_%5D_COPYLEFT_LICENSING_GPL_AGPL_VS_MIT_PLUS_FSL.md) +- [0359*[*]\_COMMUNITY_HOSTING_AND_RECURRING_REVENUE_THE_SKOOL_QUESTION.md](0359_%5B_%5D_COMMUNITY_HOSTING_AND_RECURRING_REVENUE_THE_SKOOL_QUESTION.md) +- [0362*[*]\_PUBLISHING_ON_XNET_GHOST_SUBSTACK_AND_THE_OWNED_AUDIENCE.md](0362_%5B_%5D_PUBLISHING_ON_XNET_GHOST_SUBSTACK_AND_THE_OWNED_AUDIENCE.md) +- [0372*[*]\_JOINING_THE_ATMOSPHERE_ADOPT_EXTEND_MINT_AND_THE_HUB_AS_A_KNOT.md](0372_%5B_%5D_JOINING_THE_ATMOSPHERE_ADOPT_EXTEND_MINT_AND_THE_HUB_AS_A_KNOT.md) +- [0426\_[-]\_SHOULD_THE_USER_BE_IN_CHARGE_SURRENDER_AS_A_DESIGN_CONSTRAINT.md](0426_%5B-%5D_SHOULD_THE_USER_BE_IN_CHARGE_SURRENDER_AS_A_DESIGN_CONSTRAINT.md) +- [0427\_[-]\_MOTION_DEV_ESCAPE_HATCH.md](0427_%5B-%5D_MOTION_DEV_ESCAPE_HATCH.md) +- [0428\_[-]\_CAN_YOU_JUST_DO_THINGS_SEEING_THE_DEGREES_OF_FREEDOM.md](0428_%5B-%5D_CAN_YOU_JUST_DO_THINGS_SEEING_THE_DEGREES_OF_FREEDOM.md) diff --git a/scripts/check-exploration-fallow.mjs b/scripts/check-exploration-fallow.mjs index 2e882aec3..5f7fa974b 100644 --- a/scripts/check-exploration-fallow.mjs +++ b/scripts/check-exploration-fallow.mjs @@ -1,54 +1,31 @@ #!/usr/bin/env node /** - * Ratchet the exploration backlog (exploration 0421). + * Report exploration age (exploration 0421). * - * xNet's build loop is already fast — median PR cycle time under an hour, CI at - * eight minutes. What has no clock at all is *deciding what to build*: 259 - * explorations sit at `[_]`, the backlog grows ~85 documents a month, and - * nothing ever closes one. A document written in February and never started is - * indistinguishable from one written yesterday. + * Drafts become stale after their explicit review date, or 90 days after + * first appearing in git. Age is informational: stale drafts can remain open + * without blocking CI or requiring a new date. This report never rewrites, + * renames, or withdraws the source documents. * - * This gives the backlog the two things every fast project on Collison's list - * had and this one lacks: a decider and an expiry. - * - * review: when to RE-DECIDE — not when to ship - * decider: who closes it; a single name, never a list - * - * Absent `review:`, a document is due 90 days after it first appeared. 90 is - * measured, not guessed: it marks 41 of 276 undecided documents stale (15%), - * where 180 marks *zero* today and ~200 in three months as the June/July bulge - * crosses at once. A gate that cannot fire is not lenient, it is absent. - * - * Expiry never moves, renames or deletes anything. Status in the *filename* is - * a proven link-rot generator (see check-exploration-links.mjs); `review:` and - * `status: withdrawn` live in frontmatter precisely because changing them - * renames nothing. Withdrawing is a legitimate, encouraged outcome — recording - * that a decision was *made* is the point. - * - * Named consumer: `docs/explorations/STALE.md`, which `/mvp-followup` reads to - * answer "what's next" — today it has no principled way to choose among 259 - * identical-looking candidates. - * - * Pass condition: the stale count must not EXCEED the committed baseline in - * `.fallow-baseline.json`. A ratchet, never an absolute — per AGENTS.md, and - * per fallow.yml's own postmortem, where gating the absolute made every Monday - * a guaranteed red nobody consumed. + * Consumers: `docs/explorations/STALE.md`, `/mvp-followup`, and the CI job + * summary. Generation succeeds when the report can be read and written; + * the number of stale drafts does not affect the exit status. * * Run: `node scripts/check-exploration-fallow.mjs` (or `pnpm check:exploration-fallow`). - * `--write-baseline` reseeds the baseline to today's count. */ -import { readFileSync, writeFileSync, readdirSync, existsSync } from 'node:fs' +import { readFileSync, writeFileSync, readdirSync } from 'node:fs' import { execFileSync } from 'node:child_process' import { join, resolve } from 'node:path' import { dayDiff, dueDay, formatDay, isOverdue, overdueDays } from './exploration-fallow/dates.mjs' const root = resolve(process.cwd()) const DIR = join(root, 'docs/explorations') -const BASELINE = join(DIR, '.fallow-baseline.json') const STALE_INDEX = join(DIR, 'STALE.md') const DEFAULT_WINDOW_DAYS = 90 -const writeBaseline = process.argv.includes('--write-baseline') +if (process.argv.includes('--write-baseline')) { + throw new Error('Exploration age is report-only; --write-baseline is no longer supported.') +} /** * Git hooks export GIT_DIR / GIT_WORK_TREE, which hijack any `git` subprocess @@ -306,17 +283,9 @@ const index = [ '', '# Stale explorations', '', - 'Explorations past their `review:` date (or 90 days old with none). Being', - 'listed here is not a failure — it means the claim this document makes on', - 'future attention has lapsed and needs renewing or releasing.', - '', - 'Two fixes, both one-line frontmatter edits. Neither renames the file, so', - 'neither breaks an inbound reference:', - '', - '```yaml', - 'review: 2027-02-01 # renew the claim', - 'status: withdrawn # release it; the document stays exactly where it is', - '```', + 'Drafts are classified as stale after their `review:` date, or after the', + 'default 90-day window. This is an age report, not a CI failure or a deadline', + 'to build, renew, or close anything. Stale drafts can remain open until useful.', '', `**${stale.length}** stale of ${considered} undecided.`, '', @@ -334,11 +303,9 @@ const index = [ '', ...(shape ? [ - `The curve does not fall: ${shape.first}% of documents at least a day old are`, - `unshipped, and ${shape.last}% at ${shape.lastDay} days. An exploration is checked off`, - 'within days of being written, or never — so an old `[_]` is not a pending', - 'decision, it is a decision already made by inaction. Renew it deliberately,', - 'or withdraw it; both are one line and neither renames the file.', + `${shape.first}% of documents at least a day old remain unshipped,`, + `compared with ${shape.last}% of those at least ${shape.lastDay} days old.`, + 'These are age cohorts, not requirements to retire drafts.', '' ] : []), @@ -368,38 +335,5 @@ const index = [ writeFileSync(STALE_INDEX, index) -if (writeBaseline) { - writeFileSync(BASELINE, `${JSON.stringify({ count: stale.length }, null, 2)}\n`) - console.log(`✓ baseline seeded at ${stale.length}`) - process.exit(0) -} - -const baseline = existsSync(BASELINE) ? JSON.parse(readFileSync(BASELINE, 'utf8')).count : 0 - -// Printed on green runs too: the number should be familiar long before it is -// ever binding (0283 — a gate whose first appearance is a failure gets ignored). -console.log(`explorations past review date: ${stale.length} (baseline ${baseline})`) - -if (stale.length > baseline) { - // Least-overdue first: whatever just crossed the line is what this change - // most likely introduced, and it is buried if the list is alphabetical. - const newest = [...stale].sort((a, b) => a.days - b.days) - console.error( - `\n✗ stale explorations increased: ${stale.length} > ${baseline}\n\n` + - ' Most recently gone stale — start here:\n' + - newest - .slice(0, 10) - .map((s) => ` ${s.file} (${s.days}d overdue${s.decider ? `, ${s.decider}` : ''})`) - .join('\n') + - (stale.length > 10 ? `\n … and ${stale.length - 10} more` : '') + - '\n\n Both fixes are one-line frontmatter edits — no rename, so no\n' + - ' inbound reference breaks:\n' + - ' review: 2027-02-01 # renew the claim\n' + - ' status: withdrawn # release it; the document stays put\n\n' + - ` Full list: docs/explorations/STALE.md\n` - ) - process.exit(1) -} - -console.log(`✓ exploration backlog OK (${considered} undecided, ${stale.length} stale)`) -process.exit(0) +console.log(`Exploration age report: ${stale.length} stale of ${considered} undecided.`) +console.log('Staleness is informational and does not block CI. See docs/explorations/STALE.md.') diff --git a/scripts/exploration-fallow/dates.mjs b/scripts/exploration-fallow/dates.mjs index e2a4ad562..8945ea7ee 100644 --- a/scripts/exploration-fallow/dates.mjs +++ b/scripts/exploration-fallow/dates.mjs @@ -1,5 +1,5 @@ /** - * Date arithmetic for the exploration fallow ratchet. + * Date arithmetic for the exploration age report. * * Split out of `check-exploration-fallow.mjs` so it can be tested without * shelling out to git or rewriting `STALE.md`. diff --git a/site/src/components/marketing/Closing.astro b/site/src/components/marketing/Closing.astro new file mode 100644 index 000000000..5f28bb131 --- /dev/null +++ b/site/src/components/marketing/Closing.astro @@ -0,0 +1,18 @@ +--- +const { + title = 'Try the xNet alpha', + body = 'Download the desktop app or open the browser demo.' +} = Astro.props +--- + +
+
+
+

{title}

+

{body}

+
+ + Try xNet + +
+
diff --git a/site/src/components/marketing/PageHero.astro b/site/src/components/marketing/PageHero.astro new file mode 100644 index 000000000..c04737296 --- /dev/null +++ b/site/src/components/marketing/PageHero.astro @@ -0,0 +1,17 @@ +--- +interface Props { + eyebrow: string + title: string + description: string +} +const { eyebrow, title, description } = Astro.props +--- + +
+
+

{eyebrow}

+

{title}

+

{description}

+ +
+
diff --git a/site/src/components/marketing/Substrate.astro b/site/src/components/marketing/Substrate.astro new file mode 100644 index 000000000..b88a83ecc --- /dev/null +++ b/site/src/components/marketing/Substrate.astro @@ -0,0 +1,85 @@ +--- +import CodeBlock from '../ui/CodeBlock.astro' +const pieces = [ + { + name: 'Nodes', + label: 'Reusable records', + example: 'A task, a contact, a page.', + description: 'Each record has an ID. Relations connect records across your workspace.', + color: 'text-indigo-600 dark:text-indigo-400 bg-indigo-500/10' + }, + { + name: 'Schemas', + label: 'A shared structure', + example: 'Title, status, project.', + description: 'Define fields and relations. Add fields in your namespace or create a new type.', + color: 'text-emerald-700 dark:text-emerald-400 bg-emerald-500/10' + }, + { + name: 'Views', + label: 'Different ways to work', + example: 'A table, a board, your own app.', + description: 'Read and edit the same records through a different interface.', + color: 'text-violet-600 dark:text-violet-400 bg-violet-500/10' + } +] +const schemaCode = `import { defineSchema, text, checkbox } + from '@xnetjs/data' + +const Task = defineSchema({ + name: 'Task', + namespace: 'xnet://my-app/', + properties: { + title: text({ required: true }), + done: checkbox({ default: false }) + } +})` +--- + +
+
    + {pieces.map((piece) => ( +
  1. +
    +

    {piece.name}

    + {piece.label} +
    +

    + {piece.example}{' '} + {piece.description} +

    +
  2. + ))} +
+
+ +

+ A schema defines the data. Your interface decides how to display it. +

+
+
+
+ + How storage, sync, and permissions work + +
+

+ Local storage. The workspace keeps a + copy on your device. Offline changes sync when connected. +

+

+ Signed changes. Structured edits + form a signed, hash-linked log. Peers can check who signed an edit and detect changes to it. +

+

+ Merge rules. Yjs merges document + edits; structured fields use last-writer-wins rules. Grants govern sharing and access. +

+
+ + Data model documentation → + +
diff --git a/site/src/components/marketing/WorkspaceImage.astro b/site/src/components/marketing/WorkspaceImage.astro new file mode 100644 index 000000000..eb5c19c23 --- /dev/null +++ b/site/src/components/marketing/WorkspaceImage.astro @@ -0,0 +1,24 @@ +
+
+ xNet’s workspace with a document open beside the explorer. The document contains example project content. + xNet’s workspace in dark mode, showing an example project document and explorer. +
+
+ The xNet workspace · example content + Documents, databases, and canvases on your device. +
+
diff --git a/site/src/components/sections/Footer.astro b/site/src/components/sections/Footer.astro index baae4f03a..5c1ab3d35 100644 --- a/site/src/components/sections/Footer.astro +++ b/site/src/components/sections/Footer.astro @@ -1,207 +1,150 @@ --- import BrandWordmark from '../BrandWordmark.astro' - -const agentLinks = [ - { label: 'Connect your agent', href: '/agents' }, - { label: 'Use from Claude Code', href: '/docs/guides/coding-agents/' }, - { label: 'Agent Interfaces', href: '/docs/guides/agent-interfaces/' }, - { label: 'agents.md', href: '/agents.md' }, - { label: 'llms.txt', href: '/llms.txt' }, -] - -const productLinks = [ - { label: 'Try the App', href: '/app' }, - { label: 'Run on Mobile', href: '/mobile' }, - { label: 'Download Desktop', href: '/download' }, - { label: 'Plugins', href: '/plugins' }, - { label: 'Documentation', href: '/docs' }, - { label: 'Quickstart', href: '/docs/quickstart/' }, - { label: 'Changelog', href: '/changelog' }, -] - -const cloudLinks = [ - { label: 'xNet Cloud', href: '/cloud' }, - { label: 'Pricing', href: '/cloud/pricing' }, - { label: 'Open metrics', href: '/open' }, - { label: 'Status', href: '/status' }, -] - -const developLinks = [ - { label: 'xNet for React', href: '/react' }, - { label: 'Build with any language', href: '/build-with' }, - { label: 'Swift SDK', href: '/docs/languages/swift/' }, - { label: 'Rust core', href: '/docs/languages/rust/' }, - { label: 'DevTools', href: '/devtool' }, - { label: 'React Hooks', href: '/docs/hooks/overview/' }, - { label: 'Your own server', href: '/docs/guides/server/' }, -] - -const resourceLinks = [ - { label: 'Why xNet', href: '/why' }, - { label: 'Blog', href: '/blog' }, - { label: 'Compare', href: '/compare' }, - { label: 'Commitments', href: '/commitments' }, - { label: 'Roadmap', href: '/roadmap' }, - { label: 'Architecture', href: '/docs/architecture/overview/' }, - { label: 'Contributing', href: '/docs/contributing/getting-started/' }, -] - -const communityLinks = [ - { label: 'GitHub', href: 'https://github.com/crs48/xNet' }, - { label: 'GitHub Discussions', href: 'https://github.com/crs48/xNet/discussions' }, - { label: 'Bluesky', href: 'https://bsky.app/profile/xnetfyi.bsky.social' }, - { label: 'X', href: 'https://x.com/xnetfyi' }, - { label: 'Governance', href: 'https://github.com/crs48/xNet/blob/main/GOVERNANCE.md' }, - { label: 'Trademark & Brand', href: 'https://github.com/crs48/xNet/blob/main/TRADEMARK.md' }, - { label: 'Code of Conduct', href: 'https://github.com/crs48/xNet/blob/main/CODE_OF_CONDUCT.md' }, -] - -const legalLinks = [ - { label: 'MIT License', href: 'https://github.com/crs48/xNet/blob/main/LICENSE' }, - { label: 'Privacy', href: '/privacy' }, - { label: 'Terms', href: '/terms' }, - { label: 'Acceptable Use', href: '/acceptable-use' }, - { label: 'Security', href: 'https://github.com/crs48/xNet/blob/main/SECURITY.md' }, - { label: 'Sub-processors', href: '/subprocessors' }, +const groups = [ + { + title: 'Workspace', + links: [ + ['The workspace', '/workspace'], + ['Download', '/download'], + ['Browser demo', 'https://xnet.fyi/app/'], + ['What’s new', '/changelog'], + ['Roadmap', '/roadmap'], + ['Mobile demo', '/mobile'] + ] + }, + { + title: 'Project', + links: [ + ['Vision', '/why'], + ['Blog', '/blog'], + ['Our commitments', '/commitments'], + ['Open metrics', '/open'], + ['Cloud & hosting', '/cloud'], + ['Hosting prices', '/cloud/pricing'] + ] + }, + { + title: 'Developers', + links: [ + ['Developer overview', '/build-with'], + ['Documentation', '/docs/introduction/'], + ['React SDK', '/react'], + ['Agent tools', '/agents'], + ['Plugins', '/plugins'], + ['Live demos', '/demos'], + ['DevTools', '/devtool'], + ['Compare', '/compare'] + ] + } ] --- -