Commit Graph
19 Commits
Author SHA1 Message Date
Aron PrinsandClaude Opus 4.8 27d7a5ab4c Release docs for paperclip v2026.831.1 (#120)
Syncs docs to parent release **v2026.831.1** (cumulative from
`v2026.824.1`, via merge-base `664052f`). Authored fresh against the
release tag; every claim verified at the tag.

## What changed

**New**
- **Kimi Code adapter** (`kimi_local`) — new reference page, wired into
the adapters overview, nav, and anchor-map source mapping.

**Reference**
- **Env vars** — `PAPERCLIP_WORKSPACE_REAPER_COOLDOWN_DAYS`, opt-in
`SENTRY_DSN`, and the operator controls `PAPERCLIP_HIDDEN_SETTINGS` /
`PAPERCLIP_SETTING_DEFAULTS`.
- **Instance Settings** — new "operator controls for hosted deployments"
section (hide surfaces / override defaults).
- **Node.js floor → 24.11.0** across installation, setup,
local-development, plugin dev, Modal, and the getting-started/terminal
guides.
- **Grok adapter** — `permissionMode` no longer defaults to `dontAsk`;
when unset no flag is passed, and `--always-approve` is the unattended
policy.
- **CLI `agent`** — Kimi skills install path (`~/.kimi-code/skills`) +
`KIMI_CODE_HOME`.

**Guides**
- **Onboarding** — rebuilt around a single-card wizard that opens on
creating your agent; the mission step is gone, the goal is set
afterward.
- **Settings unification** — Invites folded into a Members tab, one
shared settings nav, and the company brand color + per-company
attachment size limit removed (also reflected in the Companies and Cases
APIs).
- **Governance behavior** — silent-run detection and stranded-task
recovery no longer act on their own; agent thought text is excluded from
automatic comments; invalid agent credentials now return `401`.

**Changelog** — entry added for v2026.831.1.

## Gates

- `docs:build`, SEO metadata, crawlable-links, sitemap-lastmod
(194/194), lint-links, verify-nav — all pass.
- **Edit verification:** every new high-confidence claim verified at the
tag.
- **Tag-accuracy gate:** 31 files checked, **0 post-tag leaks**, 30
clean, 1 review (below).

## ⚠ Drift (Verify before acting — not auto-resolved)

Medium-confidence REST-route drift in `docs/reference/api/companies.md`
— the import-transfer routes may no longer exist at these paths (likely
a false negative from prefix/dynamic registration; confirm before
editing):

- `POST /api/companies/import/transfers`
- `PUT /api/companies/import/transfers/{transferId}/parts/{partIndex}`
- `GET /api/companies/import/transfers/{transferId}`
- `POST /api/companies/import/transfers/{transferId}/preview`
- `POST /api/companies/import/transfers/{transferId}/apply`

## ⚠ Review

- `docs/reference/adapters/kimi-local.md` — new page; the only flagged
claim is the `secret-id` JSON **example placeholder** (not a real
identifier). Authored directly from the adapter's config surface at the
tag.

## Screenshots (deferred)

288 of 342 registered screenshots are stale (org-wide rename +
settings/onboarding rewrites), tracked in `SCREENSHOTS_PENDING.md`.
Recapture is a follow-up pass — **the merged pages describe the new
onboarding/settings UI while screenshots still show the old flow until
then.**

---------

Co-authored-by: Claude Opus 4.8 <[email protected]>
2026-09-02 13:06:00 +02:00
Aron PrinsandClaude Opus 5 325c9eb819 seo: hand-write titles and descriptions for all 192 pages (#115)
## Why

The build derived `<title>` from the **sidebar label** and the
description from the **first paragraph clipped to 220 characters**. Both
are the wrong source. A sidebar label is written for a 240px-wide nav
that supplies its own context; a search result has none.

On production that produced:

- **7 pages titled "Overview"**, and 32 pages sharing a title with
another page
- **109 of 193 descriptions cut off mid-word**, and 174 over 160
characters (where Google truncates)

```
/guides/welcome/key-concepts/
  BEFORE (220):  ...and if you misunderstand them early, the product wi
```

Near-identical titles are the weak-differentiation signal behind
"crawled — currently not indexed", which is the exact symptom on this
property.

## What changed

`seo_title` and `seo_description` frontmatter on **every one of the 192
pages**, written by hand against each page's real content and optimised
for the click — lead with what the reader can do, name the concrete
things covered, no keyword stuffing, no repeating the title.

| | Before | After |
|---|---|---|
| Duplicate titles | 32 pages | **0** |
| Duplicate descriptions | — | **0** |
| Descriptions cut mid-word | 109 | **0** |
| Descriptions over 160 chars | 174 | **0** |
| Title length (incl. suffix) | up to "Overview" | **26–60** |
| Description length | 31–240 | **122–158** |

**No prose was rewritten.** I measured content overlap between the
colliding pairs first — only 17–23%, so these were always distinct pages
wearing the same label, not duplicate content. The `docs/` diff is **564
insertions, zero deletions**.

### Examples

```
BEFORE — all seven identical:  "Overview | Paperclip Docs"
AFTER:  "Adapters Overview"      "API Overview"        "CLI Overview"
        "Deployment Overview"    "Bundled Skills"      "Optional Skills"
        "Experimental Features"

BEFORE — both identical:  "Issues | Paperclip Docs"
AFTER:  "Issues: Creating and Tracking Work"   /guides/day-to-day/issues/
        "Issues API"                           /reference/api/issues/
```

```
/guides/getting-started/five-minute-path/
BEFORE (220):  The shortest route from a running Paperclip instance to an agent that has
               just completed work for you. After Paperclip is installed, the path takes
               about 5 minutes: create a company, hire a CEO agent, approve its first s
AFTER  (131):  Install Paperclip, create a company, hire a CEO agent, and approve its
               first strategy — a working AI company in about five minutes.
```

## Plumbing

- **`site/build-release.mjs`** prefers the authored fields; the derived
path stays only as a fallback the CI gate prevents ever reaching.
`<title>`, `<meta name="description">`, and the `TechArticle` JSON-LD
all read from the same source.
- **`site/app.js`** uses the same fields, so a client-side transition
cannot leave a different title on screen than the crawler was served.
Verified in-browser: navigating `/guides/day-to-day/issues/` →
`/reference/api/issues/` swaps to exactly the server-rendered values, no
JS errors.
- **`scripts/verify-seo-metadata.mjs`** (new) enforces presence,
uniqueness, length, complete-sentence endings, and the
frontmatter-safety rules. Wired into `docs:test` and CI as its own step.

I negative-tested the gate rather than assuming it works — it correctly
fails on a duplicate title, a mid-word description, and a missing field,
and passes again once restored.

## Automating it going forward

`skills/sync-docs/SKILL.md` now:

- gains an **"Authored SEO metadata"** section: why the fields exist,
the enforced rules as a table, and how to actually write them (title
names the subject not the nav position; description writes for the
click; never generate mechanically from the first paragraph — *that is
the fallback the gate exists to prevent*).
- requires both fields in the **page-authoring instruction** given to
every subagent, with guidance on when to update an existing description
versus leave it.
- runs `docs:test:seo-metadata` and `docs:test:crawlable-links` as
**fail-loud gates in Phase 7** before commit.
- documents all six build gates in the files/gates section.

So once this lands, a new page cannot ship without hand-written
metadata, and a title collision cannot reach production.

## Verified

All six verifiers pass:

```
Static route verification passed
Asset fingerprint verification passed
Hierarchical Skills nav verification passed
Skill source block verification passed (11 skill pages, 1 control page)
Crawlable-link contract passed: 40886 internal links across 194 pages resolve in one hop
Authored-SEO contract passed: 192 pages carry a unique, hand-written seo_title and seo_description
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
2026-08-25 22:51:42 +02:00
Aron PrinsandClaude Opus 4.8 6c4519af4a Release docs for paperclip v2026.824.0 (#110)
Cumulative docs sync from v2026.817.0 to the v2026.824.0 stable tag.

New/updated: Tailscale HTTPS broker, workspaces HTTPS exposure, release channels + `paperclipai channels`, resumable company import (guide + companies API), secret catalog, Claude setup-token login, adapter device-login, issue file-resource availability, document comments, interaction resolver-policy/governance. Version-stamped touched pages and added the v2026.824.0 docs-changelog entry.

Verified every page against the v2026.824.0 tag; stripped post-tag master leaks (Kimi adapter, reaper-cooldown env var, mission-less onboarding rewrite) that nightly had drafted ahead of the release. Screenshots flagged (192 stale) but not recaptured this release.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-25 10:02:16 +02:00
Aron PrinsandClaude Opus 4.8 2ab76e8e4b docs: fix goals reparenting, human-invite signup, macOS install, first-company step (#80)
Addresses open documentation-feedback issues, each verified against the
`paperclipai/paperclip` source.

## Changes

- **Goals — reparenting (#13):** The goal properties panel renders the
parent goal as a read-only link (unlike issues, which have an editable
parent picker), and the goal update mutation never sends `parentId`. The
docs claimed you could "change the parent field" in the panel. Corrected
to describe the real path — `paperclipai goal update <id> --parent-id
<id|null>` / `PATCH /goals/{id}` — and removed "parent" from the list of
panel-editable fields.
- **Add a human teammate — signup (#50):** The reported "Email and
password sign up is not enabled" is thrown by Better Auth when
`emailAndPassword.disableSignUp` is set, which Paperclip wires from
`auth.disableSignUp` / `PAPERCLIP_AUTH_DISABLE_SIGN_UP`. Added a
troubleshooting callout naming the cause and how to re-enable
self-service signup.
- **Installation — macOS Apple Silicon (#74):** The Terminal install
path had no troubleshooting section. Added a note for the embedded
PostgreSQL start failure caused by missing `libzstd`/`liblz4`
compatibility symlinks, with a copy-paste fix.
- **Create your first company (#16):** Renamed the step 4 heading from
"Save and continue" to "Create the company" to match the actual **Create
Company** button.

## Verification

- `sync:lint-links` passes — 186 markdown files, no broken internal
links.
- Product-behaviour claims (#13, #50) confirmed directly in parent
source; #74 documents the reporter's symptom (doc-gap confirmed, not
independently reproduced).

Closes #13, #16, #50, #74

Co-authored-by: Claude Opus 4.8 <[email protected]>
2026-07-30 12:48:46 +02:00
Aron Prins 7e25158fca Release docs for paperclip v2026.707.0 (#49)
Promotes v2026.707.0 docs from nightly: Custom sandbox images + Ramp skill (new), Work Timeline (#48) and Secret scopes (#47) content, screenshot capture targets, environments nav reconcile, sync-state bump to v2026.707.0, and accuracy fixes from adversarial verification. 0 drift.
2026-07-08 11:11:32 +02:00
cd2b7d89b1 docs: enrich Task Watchdogs guide — lifecycle visuals + oversight framing [v2026.626.0] (#45)
## Summary
- Updates the **existing**
`docs/guides/projects-workflow/task-watchdogs.md` page (re-scoped from a
would-be duplicate page, per board direction on PAP-12840 —
no-duplicates rule holds).
- Adds: watchdog lifecycle diagram, review-outcome thread screenshot
(light & dark), activity-feed labeling note, the fingerprint dedupe
explanation (one review per distinct stopped state), and a new
"Watchdogs, approvals, and execution policy" comparison section.
- Adds the `paperclip_version: v2026.626.0` pin.

Staged from the v2026.626.0 release-content pipeline
(`docs-guide--task-watchdogs`, PAP-12840). **Do not merge without the
publish gate** — merge = live on docs.paperclip.ing. Canary preview is
for board review.

## Test plan
- [ ] Cloudflare Pages preview: page renders at
`/guides/projects-workflow/task-watchdogs/`
- [ ] Diagram + screenshot render; screenshot swaps with theme toggle
- [ ] New comparison section reads well in page flow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: DevRel Gemini <[email protected]>
Co-authored-by: Paperclip <[email protected]>
2026-07-07 05:40:24 -05:00
Aron Prins 79411f5c3e Merge branch 'nightly' into release/v2026.626.0 2026-06-27 09:27:50 +02:00
Aron PrinsandClaude Sonnet 4.6 57cd932896 Release docs for paperclip v2026.626.0
Covers Hermes built-in adapters (hermes_local + hermes_gateway), ask work
mode, task watchdogs, plugin target command, routine date variables, and
workspace file downloads.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-27 09:23:57 +02:00
Aron PrinsandClaude Opus 4.8 e6e9f629ca nightly: external object references, streamlined sidebar default, Daytona leases, routine annotations, plugin SDK provider (paperclip 51ffbb38)
Authored from parent master (cumulative base v2026.618.0), delta since last run
9ac24317 → 51ffbb38. All five edits verify clean (0 unverified, 0 suspicious).

- docs/guides/day-to-day/issues.md: External object references — GitHub PR/issue
  status-aware pills across issue surfaces, External object status filters,
  inbox/sidebar severity badges (PR #8512).
- docs/administration/settings.md: Streamlined Left Navigation Bar is now
  default-on; classic sidebar is the opt-out (PR #8496).
- docs/reference/adapters/sandbox-providers.md: Daytona reusable leases (opt-in),
  quota-safe auto-archive defaults, image-only resource overrides (#8513/#8561/#8564).
- docs/guides/projects-workflow/routines.md: routine description annotations —
  comment on / inline-edit instructions like an issue document (PR #8229).
- docs/reference/plugins/sdk.md: plugin SDK external-object reference provider
  surface — detect→resolve→refresh lifecycle, declaration + protocol types (PR #8512).

PENDING.md / SCREENSHOTS_PENDING.md regenerated; .sync-state.json advanced to
51ffbb38. 60 screenshots flagged stale (UI changes), surfaced for human recapture.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-24 16:55:14 +02:00
Aron PrinsandClaude Opus 4.8 2ff5539127 nightly: skills "required" retirement, paperclip-dev cleanup, task watchdogs guide (paperclip d1e6662e)
Round 2 — worked the human-review items, verified each against parent source:

- Skills: the per-agent `required` attribute is retired upstream
  (AgentSkillEntry dropped required/requiredReason; AgentSkillOrigin dropped
  paperclip_required; resolveDesiredSkillAssignment now persists exactly the
  desired set with no bundled union). Fixed reference/skills.md and
  reference/cli/skills.md: removed "non-required" qualifiers, the retired
  `required` frontmatter row, the wrong "forced into every agent" claim, and
  corrected the snapshot example + the UI grouping (Company skills + Unmanaged,
  no "Required" group).
- paperclip-dev skill removed upstream: dropped from the bundled list and
  swapped stale source/key examples to paperclip-create-agent.
- Experimental features: strengthened the settings.md caution to match the new
  in-app "no compatibility guarantees" warning.
- Task watchdogs: new operator guide page (guides/projects-workflow/
  task-watchdogs.md) + nav entry. API/config/behaviour verified against
  routes/issues.ts, schema/issue_watchdogs.ts, and doc/TASK-WATCHDOG.md intent.

Reviewed, no change needed: instance-scoped environments (routes still match
docs), skills store (UI reframe; guide already accurate), plugin-sdk lease
params (fields not documented).

verify-edit all clean; build/links/nav/drift all green.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-22 11:42:03 +02:00
Aron PrinsandClaude Opus 4.8 2368a2be5f Release docs for paperclip v2026.618.0
Promote nightly drafts (v2026.609.0 → v2026.618.0) to main and fill coverage gaps.

New surfaces authored:
- Novita Agent Sandbox provider (driver: novita) — sandbox-providers.md
- paperclip-board bundled skill — skills.md (skills/ went 5 → 6; "four" → "five")

Promoted nightly drafts (all ⊆ v2026.618.0, no post-tag leakage):
- adapters: codex/gemini/opencode/pi/openclaw-gateway, sandbox-providers (Kubernetes)
- api/agents, plugins/sdk, environment-variables (TRUST_PROXY/OTEL)
- day-to-day guides: artifacts, issues, routines

Stamped paperclip_version: v2026.618.0 on all 13 touched pages.
Regenerated SCREENSHOTS_PENDING.md (90/276 stale — flag only, separate capture PR).

Deferred: experimental conference-room board-chat (flag-gated).
sync:check clean (no broken links); drift = 5 known server-env false positives.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-19 00:48:23 +02:00
Aron PrinsandClaude Opus 4.8 2d4df5202c nightly: file viewer, routines layout, interrupt handoffs (paperclip 69a368e)
- Document the in-app workspace file viewer and inline artifact file links (#7681)
- Refresh the Routines detail walkthrough: sub-sidebar layout, plain-English
  cron, trigger cards, run-history filters and save bar (#7848, #7858)
- Add interrupt / handoff / scoped-wake semantics to the issues guide (#7855)

Quarantined (held <24h): Kubernetes sandbox provider, env-driven gateway
routing, GPT-5.5 Codex model — see PENDING.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-11 12:31:33 +02:00
Aron PrinsandClaude Opus 4.8 9123a0de85 docs(workspaces): tighten accuracy after codebase re-verification
- The per-project Workspaces tab is hidden until the project has workspace
  activity (showWorkspacesTab requires summaries > 0); say so instead of
  'shows up on each project', and drop the never-shown per-project empty
  string. The reliable empty state is the company-wide 'No workspace
  activity yet.'
- Correct the surfacing rule: a primary workspace surfaces because it's the
  primary (not 'has a working directory and runtime config'); non-primary
  project workspaces need runtime services/config.
- Replace the stale 'Each entry shows' list (old table columns: mode /
  provider type / opened) with the actual ProjectWorkspaceSummaryCard fields
  (kind, name, branch, path, services, status, linked tasks, updated).
- Note plugin tabs appear alongside the base tabs (e.g. workspace-diff's
  Changes tab), not strictly after them.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-11 12:16:49 +02:00
Aron PrinsandClaude Opus 4.8 c8bc5055c8 docs(workspaces): fix workspaces guide + regenerate detail screenshots
A user reported the Workspaces screen looked empty with "no options," and
that all but one of the workspace screenshots were blank/identical.

Both were real problems:

Docs (docs/guides/projects-workflow/workspaces.md)
- Add a "Before you start" section: workspaces are gated behind the
  experimental "Enable Isolated Workspaces" flag, the screen is monitor-only
  (no manual create), and it stays empty until an agent runs an isolated
  task — with the actual empty-state strings ("No workspace activity yet." /
  "No non-default workspace activity yet.").
- Correct the detail screen: it now has Tasks / Services / Configuration /
  Runtime logs / Routines tabs (+ plugin tabs), not "three tabs." Rename the
  Issues tab to Tasks (its real label) and add a Services tab section. The
  former "Workspace commands panel above the tabs" is now the Services tab
  plus header quick controls.
- Clarify the company-wide Workspaces screen vs. the per-project Workspaces
  tab and the surfacing rules. Fix the misleading "multiple isolated
  workspaces" caption.

Screenshots
- Root cause: the seed only created a *project* workspace and pointed the
  execution-workspace detail routes at its id, so those pages were captured
  mid "Loading workspace…". Execution workspaces have no REST create endpoint
  (they're provisioned by a real heartbeat), so seed-execution-workspace.mjs
  now inserts a realistic one directly into the instance's embedded Postgres:
  an isolated git-worktree workspace with runtime config, a running service,
  provision/start/failed-job operation logs, and linked tasks.
- routes.mjs: add the {executionWorkspaceId} token, repoint the detail routes
  to it, add a Services tab target, and drop the duplicate
  org/execution-workspaces-list target (same URL as workspaces/list).
- Recaptured workspaces/{list,configuration,services,runtime-logs,issues} in
  light + dark; all now render real content.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-11 12:03:39 +02:00
Aron PrinsandClaude Opus 4.8 96b0ba8a53 Refresh screenshots for v2026.529.0 and fix workspace env precedence
Recapture the 82 stale screenshots (light + dark, 1440×900 @2x) against
a release-code instance booted at v2026.529.0 (911a1e8). Registry was
already stamped at that SHA, so captured_sha is unchanged.

Verification pass against the release codebase also found one authored
claim wrong: the execution-workspace environment precedence is
issue → project → agent → instance default (project policy outranks an
agent's own default), not issue → agent → project. Corrected
docs/guides/projects-workflow/workspaces.md to match
server/src/services/execution-workspace-policy.ts.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-05-30 19:20:05 +02:00
Aron PrinsandClaude Opus 4.8 9c5aae8962 Release docs for paperclip v2026.529.0
Add the two release features quarantined from nightly, and stamp
paperclip_version on every touched page.

- Claude Local: document UI-driven live model discovery (#6953) —
  /v1/models lookup via ANTHROPIC_API_KEY, 60s cache, built-in fallback,
  Bedrock IDs, and the refresh control.
- Workspaces: document reused-workspace environment consistency and
  finalize-gated dependent wakes / interaction.accept (#6969).
- Stamp paperclip_version: v2026.529.0 on all 14 touched pages.
- Regenerate SCREENSHOTS_PENDING.md: 90/276 stale for this window.

Inherits the six features already drafted on nightly: resource
memberships (#6677), document annotations (#6733), bundled plugins in
plugin manager (#6734), skills CLI + catalog (#6782), first-admin
claim (#6755).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-05-30 19:00:46 +02:00
Aron PrinsandClaude Opus 4.7 51b9fe35bb nightly: resource memberships, document annotations, bundled plugins (paperclip b754582)
Cumulative nightly sync from v2026.525.0 → parent master b754582:
- New API page for resource memberships (join/leave projects & agents)
- Document annotations API + guide sections on issue documents
- Bundled plugin discovery (experimental first-party plugins) in admin + API docs

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-28 12:27:12 +02:00
Aron PrinsandClaude Sonnet 4.6 cca57525ce Add 274 screenshots (light + dark) and fix screenshot paths across docs
Captured all required screenshots for the new IA in both light and dark
mode using the Horizon Labs company (PAP). Fixed the app's theme toggle
(ignores prefers-color-scheme; requires clicking its own toggle button)
so all dark shots use the real dark theme.

Fixed broken screenshot paths in administration and guides docs:
- Corrected guides/ path prefix in administration docs
- Updated images/ references to screenshots/light/ across all guides
- Fixed filename mismatches (e.g. dashboard-tab.png → dashboard.png)

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-04-22 19:02:48 +02:00
Aron PrinsandClaude Opus 4.7 56b8d7d52d Refactor docs IA into Guides + Reference tiers; add 10 new guides
Reorganise all docs under a two-tier sidebar (Guides / Reference) with
tier-grouped landing cards that auto-size to the section count (3-col
default, 2x2 when a tier has 4 cards).

Moves
- docs/user-guides/guides/** -> docs/guides/{welcome,getting-started,
  day-to-day,org,projects-workflow,power}/
- docs/{api,cli,adapters,deploy} -> docs/reference/{api,cli,adapters,deploy}
- New docs/administration/ for company/settings/plugins/cli-auth
- 265 internal cross-links rewritten by scripts/rewrite-links.mjs
- site/redirects.json preserves old URLs

New guides
- guides/org/agents.md (absorbs how-agents-work.md)
- guides/day-to-day/issues.md (absorbs managing-tasks.md)
- guides/day-to-day/costs.md (absorbs costs-and-budgets.md)
- guides/projects-workflow/routines.md (absorbs heartbeats-and-routines.md)
- guides/projects-workflow/workspaces.md (absorbs execution-workspaces.md)
- guides/projects-workflow/projects.md
- guides/projects-workflow/goals.md
- guides/org/adapters.md (AdapterManager UI walkthrough)
- administration/{company,settings,plugins,cli-auth}.md

Expanded
- approvals.md, skills.md, org-structure.md with missing UI walkthroughs

Site
- content.json: tier field, merged Welcome into Getting Started, collapsed
  Administration to single section
- app.js: tier-grouped sidebar + landing; redirect map on route changes
- styles.css: tier headers and adaptive landing grid

Screenshots
- docs/user-guides/screenshots/SCREENSHOTS_TODO.md runbook for capturing
  on a disposable demo instance. No screenshots captured in this branch.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
2026-04-22 19:02:48 +02:00