Habit, an extra · installs only when you name it

architecture-map

about 5,600 tokens

architecture-map as it installs, each line coloured by where its words came from.

  • 28 files
  • 6 edits
  • 49 sentences left out
  • 1 source
  • last changed 2026-10-19
  • extra

The text

SKILL.md

about 2,800 tokens
  • Alaa Mendili
  • greenline

---

name: "architecture-map"

description: "Build or update an interactive isometric map of the repository's architecture, versioned in the workspace's map folder with a measured snapshot and staleness tiers. Use when someone wants to see, onboard into, or refresh how the codebase fits together."

---

greenlineOpens the habit: an extra that keeps the code's map under .greenline/map

architecture-map is an extra habit, installed on request and loaded only when asked, for the owner who wants to see, onboard into or refresh how the code fits together. It builds and refreshes the repository's map as durable, versioned state in the map's folder: `map.md` holds the authored half (groups, node prose, edges, flows and coverage globs, as Markdown with frontmatter, edited only by the agent), `snapshot.json` holds the measured half with the snapshot commit and per-node prose provenance, and `architecture.html` is the generated viewer. Offer it in one line when someone wants to see how the code fits together, and refresh it after architecture-survey lands a deepening. Building or refreshing the map edits those files, so it is a change like any other: propose its mode and wait, as AGENTS.md says. It writes no record of its own: the map is the repository's state, and the build section of the change that writes it names the map.

greenlinePoints at the skill's references page for paths and commands

Greenline's paths and commands for this skill stand on its references page, [references/greenline.md](references/greenline.md): read it when the work lands in the workspace.

Alaa Mendiliarchitecture-map/SKILL.md

Turn a repository into a place you can walk around: an isometric city where every building is a real subsystem sized by its real weight, every line is a call path that exists in the code, and every moving dot is a payload the app actually ships.

## The one rule

**Prose, groups and flows are authored. Counts, coverage and geometry are measured.**

No scanner can say what a subsystem is *for*, and no human can keep file counts honest. Every good property of this page falls out of that line — including the fact that it does not rot, because "unmapped files" is only meaningful once a human has claimed the rest.

Do not try to generate the authored half mechanically. Read the code and write about it. That is the work, and it is why this is a skill rather than a codegen script.

## Before you start

Read `references/authoring.md`. It has the voice, the archetype vocabulary, and worked examples of good and bad node prose. Read `references/geometry.md` only if you need to hand-tune footprints or edge routes.

## Step 1 — Detect

Answer these from the repo. Do not ask.

| Question | Where to look |

|---|---|

| Framework and router | `package.json`, `app/` vs `pages/` vs `src/routes/`, `vite.config`, `next.config`, `remix.config` |

| Design tokens | global stylesheet for `--*` custom properties; `tailwind.config`; any `tokens`/`theme` module |

| Dark mode mechanism | `.dark` class, `[data-theme]`, or `prefers-color-scheme` |

| Test runner | `package.json` scripts, `vitest.config`, `jest.config` |

| Package manager | lockfile |

| Monorepo | `workspaces`, `pnpm-workspace.yaml`, `turbo.json` |

| Existing map | the map folder's `snapshot.json`; if present, this is an **update** |

Then run the proposer to get a first read of the shape. It lives beside this file, not in the repo you are mapping, so resolve its path first:

> **`SKILL_DIR`** — the absolute path of the directory containing *this > SKILL.md*, which your harness reported when it loaded this file. It differs > per tool (`~/.claude/skills/architecture-map`, > `~/.codex/skills/architecture-map`, `~/.agents/skills/architecture-map`, a > plugin cache, or a project-local `.claude/skills/…`). Substitute the literal > path; do not rely on an environment variable.

```bash

node "$SKILL_DIR/scripts/propose-coverage.mjs" --root . --target 22

```

It returns directory clusters with file counts and line totals, plus suggested groups. Treat it as a draft, not an answer — it knows where code *is*, not what it *does*.

greenlineAsks only the coverage question; the other three answers are fixed here

## Step 2: settle the four questions, asking one

Three of the four answers an installed map would need are settled here; the second is a real choice, asked in one line when the request did not already say, and the work is uninterrupted otherwise:

1. **Where it lives:** the map's folder. There is no route.

2. **What it covers:** what the request named; when it named nothing, ask whether the map covers the whole repository, the source only, or one package, and say the answer in the reply.

3. **Design system:** nothing to choose; the viewer ships prebuilt with its own palette.

4. **Extras:** none. No freshness check in CI, no sync on `predev`/`prebuild`, no version-history dropdown; the snapshot commit is the version.

greenlineA prebuilt viewer shell replaces upstream's install, bundler, sync and CI steps

## Step 3: nothing to install

The viewer is this skill's prebuilt, self-contained shell, `$SKILL_DIR/assets/gl-shell.html`. Nothing is copied into the repository: no `architecture.config.json`, no sync script, no `package.json` script, no theme file. The map's three files live in the map's folder and nowhere else.

Alaa Mendiliarchitecture-map/SKILL.md

## Step 4 — Author the graph

greenlineUpstream's in-repo files give way to .greenline/map and the skill's assets

This is the real work. Write the map folder's `map.md`: frontmatter, then the groups, the nodes, the edges, the flows, the intro and the coverage globs, each as a section, in the shapes `$SKILL_DIR/assets/core/types.ts` defines for `Group`, `ArchNode`, `ArchEdge` and `ArchFlow`.

Alaa Mendiliarchitecture-map/SKILL.md

**Groups** — 4–7 neighborhoods, named the way the team talks: "Entry & control", "The pixel pipeline", "Outside world". Not "utils" and "lib".

**Nodes** — aim for 15–25. For each, *read the actual files* and write:

- `whatItDoes` — one or two sentences, plain language, no jargon

- `howItsBuilt` — the interesting decision, not a dependency list

- `role` — a short noun phrase for the flow captions: "the session gate"

- `files` — real paths a reader can open

greenlineUpstream's in-repo files give way to .greenline/map and the skill's assets

Derive `archetype`, `params`, `height` and `footprint` with `$SKILL_DIR/assets/core/layout.ts`; the derived geometry lands in `snapshot.json` beside the measures it comes from:

Alaa Mendiliarchitecture-map/SKILL.md

```ts

const { archetype, params } = deriveArchetype(measure)

const height = deriveHeight(measure)

const footprints = packLayout(inputs, GROUPS.map((g) => g.id))

```

Keep a hand-written footprint if a human already tuned one — the merge prefers the authored value.

**Edges** — real call and data paths only. If you cannot point at the code that makes the call, do not draw the line. Add `via` waypoints when a route would otherwise cut through a building.

**Flows** — 3–6, each an ordered list of edge ids with a payload name. These are the page's verbs and the first thing a newcomer presses. Find them by tracing real paths: sign-in, the main create/read loop, the expensive background job.

greenlineA prebuilt viewer shell replaces upstream's install, bundler, sync and CI stepsAlaa Mendiliarchitecture-map/SKILL.md

**Coverage**: write the coverage globs in `map.md` so every source file is claimed exactly once. Use `priority` when a nested directory must win over its parent. Then measure each node's file count and line total from its globs, and the list of files no glob claims, with a scanner rather than by hand. Write the numbers into the map folder's `snapshot.json` as each node's `count` and `loc`, with the unclaimed list, the snapshot commit (`git rev-parse HEAD`) and each node's prose provenance (the commit whose files its prose describes) beside them. No sync script runs and nothing is written into the repository's source tree.

greenlineA prebuilt viewer shell replaces upstream's install, bundler, sync and CI steps

Iterate until the unclaimed list is empty, or until what remains genuinely is not part of the system.

## Step 5: render the viewer

Assemble the map's data JSON (groups, nodes, edges, flows and intro in the shapes `$SKILL_DIR/assets/core/types.ts` defines: the authored half from `map.md` merged with the measures and geometry from `snapshot.json`), take `$SKILL_DIR/assets/gl-shell.html`, replace its single `__GL_MAP_DATA__` placeholder with that JSON, and save the result as the map folder's `architecture.html`. The shell is prebuilt and self-contained: no build tooling, no framework mounting, no server, no route, and no `keyframes.css` import; opening the file is the viewer. Regenerate it whenever `map.md` or `snapshot.json` changes.

Alaa Mendiliarchitecture-map/SKILL.md

## Step 6 — Verify, then be honest

greenlineA prebuilt viewer shell replaces upstream's install, bundler, sync and CI steps

1. Check `snapshot.json` against the tree: every file the coverage globs claim is counted once, the unclaimed list is what remains, and the snapshot commit is `HEAD`.

2. Every edge id a flow routes exists, and every edge's `from` and `to` name a node.

Alaa Mendiliarchitecture-map/SKILL.mdgreenlineA prebuilt viewer shell replaces upstream's install, bundler, sync and CI steps

3. Open the map folder's `architecture.html` in a browser and **look at it**. Screenshot it. Check: no overlapping buildings, no edge cutting through a facade, every flow plays start to finish, the rail and the map agree on what is lit.

Alaa Mendiliarchitecture-map/SKILL.md

Then tell the user plainly:

greenlineUpstream's in-repo files give way to .greenline/map and the skill's assets

> The geometry and measurements are correct — they are derived. **The prose is > a first draft.** I read the code, but "what this subsystem does" is where a > single pass is weakest. Edit the map folder's `map.md` and regenerate the viewer; nothing else needs to > change.

Alaa Mendiliarchitecture-map/SKILL.md

Do not leave mediocre writing behind a confident-looking map without saying so.

## Updating an existing map

If `snapshot.json` exists, this is an update. **Never clobber authored content.**

greenlineUpdates report the staleness tier first and re-read only dirty nodes

1. Read `snapshot.json`, fold `git diff --name-status <snapshot-commit>..HEAD` through the coverage globs, and report the staleness tier before touching anything: fresh (nothing landed), current (commits landed, no mapped node touched), drifting (named nodes dirty), or stale (unclaimed files exist). Staleness arithmetic uses commit dates, never the wall clock.

Alaa Mendiliarchitecture-map/SKILL.md

2. Re-measure. New numbers land in `snapshot.json`; nothing else moves.

greenlineUpdates report the staleness tier first and re-read only dirty nodesAlaa Mendiliarchitecture-map/SKILL.md

3. Read the unclaimed list. Each entry is either a subsystem the map has not been told about, or an existing module whose pattern is too narrow.

greenlineUpdates report the staleness tier first and re-read only dirty nodesAlaa Mendiliarchitecture-map/SKILL.md

4. Re-read only the dirty nodes' files and revise their prose; an unchanged node's prose is reused byte-identical. For genuinely new subsystems: *append* a node with derived geometry and drafted prose, and extend the coverage globs. A node whose files all vanished keeps a ghost foundation for one snapshot so the deletion is seen. Leave every other node's prose, footprint and edges exactly as they are.

greenlineUpdates report the staleness tier first and re-read only dirty nodes

5. Rewrite `snapshot.json` (snapshot commit, per-node measure, per-node prose provenance) and `map.md` in the same pass, regenerate `architecture.html` from the shell, and report what you added and what you left alone: the staleness tier found, the nodes re-read versus reused, new and ghosted nodes, and the unclaimed list.

Alaa Mendiliarchitecture-map/SKILL.md

## Scale

Past ~25 buildings the map stops being readable. The proposer folds the smallest siblings into a parent node that owns the wider glob — the partition stays total, only the drawing simplifies. If a repo genuinely needs more, map one package at a time rather than shrinking everything.

## What not to do

- Do not draw an edge you cannot trace to a call in the code.

- Do not set prose in the mono face. Monospace is for codes and paths.

- Do not import a host repo's `Button` or `Dropdown` — the map ships its own.

- Do not hand-write file counts. That is what the scanner is for.

- Do not invent flows that sound good. A flow nobody can follow in the source is a lie the page tells confidently.

greenlineDurable output is .greenline/map, refreshed after architecture-survey lands a deepening

Durable output: .greenline/map/ (map.md, snapshot.json, architecture.html); offered in one line when someone wants to see how the code fits together, refreshed after architecture-survey lands a deepening.

SKILL.md as installed, byte for byte SHA-256 cc2e60a502b3b4d055a83d3031c27321d79f1d70340e8836fd21eebb039bd540

assets/core/README.md

about 240 tokens
  • Alaa Mendili
Alaa Mendiliarchitecture-map/assets/core/README.md

# Portable core

Pure, dependency-free, and framework-agnostic. Copy verbatim — these files are the same in every repo the map is installed into.

| File | Role |

|---|---|

| `iso.ts` | The 2:1 dimetric projection, Manhattan edge routing, polyline arithmetic, scene bounds |

| `archetypes.ts` | Building shapes: box faces, slab stacks, fin rows, port and chip anchors |

| `layout.ts` | Height, archetype and footprint **derived** from the measurement, plus the district packer |

| `types.ts` | The graph schema — the contract the authored table fills in |

| `districts.ts` | Neighborhood plots, derived from their members' bounding box |

| `routes.ts` | Every edge as a drawn line, with arc lengths precomputed |

| `scene.ts` | Paint-ordered scene, floor grid, camera fit and zoom |

| `program.ts` | A flow turned into a beat timeline: dwell, travel, dwell, loop |

Nothing here touches the DOM, so all of it is unit-testable without a renderer.

references/authoring.md

about 1,300 tokens
  • Alaa Mendili
Alaa Mendiliarchitecture-map/references/authoring.md

# Authoring the graph

The measured half takes care of itself. This is about the half that does not.

## Voice

Write like someone explaining the system to a new colleague at a whiteboard — concrete, unhurried, and willing to say why. The reader is technical but has never seen this repo.

**Say what a thing does before what it is made of.** "Turns a collection of photos into an MP4, entirely in the browser" beats "React component using WebCodecs".

**Name the interesting decision.** The `howItsBuilt` field is not a dependency list — it is the one choice a reader would otherwise wonder about.

> Good: "Encoding happens on the main thread on purpose: `VideoEncoder` holds > GPU resources a worker cannot share, and the copy cost of shuttling frames > across a worker boundary is larger than the parallelism buys." > > Bad: "Built with WebCodecs, React and TypeScript."

**No filler.** "Handles various utilities and helper functions" describes nothing. If a module resists description, that is a finding about the module — say what it actually contains.

**Prose is prose.** Sentences go in the body face. The mono face is for codes, file paths and chips. A paragraph of monospace is a punishment.

## Fields, and what belongs in them

| Field | Length | What it is for |

|---|---|---|

| `name` | 1–3 words | What the team calls it out loud |

| `code` | 2 letters | The roof chip at rest. Unique |

| `role` | a noun phrase | Reads inside a flow caption: "at Auth & allowlist — *the session gate*" |

| `whatItDoes` | 1–2 sentences | Plain language, no jargon |

| `howItsBuilt` | 1–2 sentences | The decision worth knowing |

| `files` | 3–6 paths | Real, openable, representative — not exhaustive |

| `stack` | names | Libraries and services. Names, not versions |

Mark a word with `[[double brackets]]` to have the panel highlight it. Use it once or twice per node, on the term a reader would search for.

## The archetype vocabulary

Shapes carry meaning. `deriveArchetype` picks by default; override only when the derivation is clearly wrong about a module you know well.

- **fin-row** — a collection whose *count* is the point. Nine asset editors, twenty route handlers. Reads as a comb.

- **tower** — a deep, single-purpose pile. One big file doing one hard thing.

- **slab-stack** — something that accreted in layers. Big, old, load-bearing.

- **cube** — an ordinary subsystem. Most things.

- **low-slab** — a plate on the floor. Small libraries, and the outside-world services that are not code in this repo at all.

## Groups

Four to seven, named the way people talk. "Entry & control", "The pixel pipeline", "Server & data", "Outside world". Never "utils", "lib", "misc" — those are directory names, not places.

Order matters: the legend lists groups in order and the map packs them in that order, so reading down the rail walks you across the city. Put the entry point first and the outside world last.

## Edges

An edge is a claim that A calls B, or data moves from A to B. **If you cannot point at the line of code that makes it happen, do not draw it.** A plausible arrow is worse than a missing one, because the map's whole authority is that everything on it is real.

- `call` — a function call, a request, a route dispatch

- `data` — something is written or read

- `support` — wiring that matters but is not the story. Drawn thin

- `retry` — an error or fallback path. Drawn dashed

Add `via` waypoints when the default elbow would cut through a building. One waypoint usually fixes it; see `geometry.md`.

## Flows

Three to six. A flow is an ordered list of edge ids, plus one payload noun. These are what a newcomer presses first, and what the page is *for*.

Find them by tracing real paths through the code:

- how someone gets in (sign-in → session → first screen)

- the main loop (create → edit → save → read back)

- the expensive one (the background job, the export, the pipeline)

- the one that surprises people (the retry path, the cache warm)

Name them as verbs from the user's side — "Export", "Sign in", "Media in" — not as component names.

The payload is the thing that travels: "session cookie", "H.264 frames", "config patch". It appears beside the flow in the rail and in every step caption, so it should be a noun someone could point at.

## Worked example

```ts

{

id: 'auth',

code: 'AU',

name: 'Auth & allowlist',

role: 'the session gate',

group: 'entry',

whatItDoes:

'Decides who gets in. Sign-in is [[Google OAuth]] only, and every request ' +

'for a gated route is checked before the page is built.',

howItsBuilt:

'The allowlist is its own module rather than a helper inside the auth ' +

'config, because it is policy rather than wiring — a pure rule about ' +

'strings, worth testing without standing up the whole framework.',

files: ['src/auth.ts', 'src/proxy.ts', 'src/lib/allowlist.ts'],

stack: ['next-auth v5', 'Google provider', 'JWT sessions'],

}

```

Note what it does *not* say: no file counts (measured), no footprint (packed), no height (derived).

references/frameworks.md

about 620 tokens
  • Alaa Mendili
Alaa Mendiliarchitecture-map/references/frameworks.md

# Mounting the map

The map is one default-exported React component taking one `ArchitectureData` prop. Everything below is about getting a route to render it.

## Next.js — App Router

```

src/app/~/architecture/page.tsx

```

```tsx

import ArchitectureMap from '@/architecture/components/ArchitectureMap'

import '@/architecture/components/keyframes.css'

import { ARCHITECTURE } from '@/architecture/graph'

export const metadata = {

title: 'Architecture',

robots: { index: false, follow: false },

}

export default function Page() {

return <ArchitectureMap data={ARCHITECTURE} />

}

```

The `~` is a literal directory segment, not a route group — it sorts internal tools away from real routes and reads as "not part of the product".

Note the components are client components (`'use client'` is already on them); the page itself can stay a server component.

## Next.js — Pages Router

`src/pages/~/architecture.tsx`, same body, with `next/head` for the robots tag.

## Vite / React SPA

Add a route in whatever router the app uses:

```tsx

<Route path="/~/architecture" element={<ArchitectureMap data={ARCHITECTURE} />} />

```

Import `keyframes.css` in the app entry. `'use client'` directives are inert here and harmless.

## Remix / React Router

`app/routes/~.architecture.tsx`, exporting the component as default. Load the graph module directly — it is static data, so no loader is needed.

## Astro

Wrap in a client island, because the map is fully interactive:

```astro

---

import ArchitectureMap from '../architecture/components/ArchitectureMap'

import { ARCHITECTURE } from '../architecture/graph'

---

<ArchitectureMap client:only="react" data={ARCHITECTURE} />

```

## Anything else, or no web app at all

If the repo has no React app to host a page — a Go service, a Python library, a CLI — the honest output is a standalone page. Bundle the components with esbuild into a single HTML file and commit it as `architecture.html`:

```bash

npx esbuild entry.tsx --bundle --minify --format=iife --outfile=bundle.js

```

The measurement script still runs in CI, so the drift counter keeps working; only the mounting changes. Say clearly that this is what you did and why.

## The stylesheet

`keyframes.css` defines the dash march along the active flow edge and the reduced-motion override. It must be imported exactly once, anywhere in the app's CSS graph. Everything else is inline styles from `theme.ts`, so there is no build-tool configuration to get wrong.

references/geometry.md

about 630 tokens
  • Alaa Mendili
Alaa Mendiliarchitecture-map/references/geometry.md

# Geometry

Only needed when the derived layout is wrong and you want to hand-tune it.

## The projection

A 2:1 dimetric isometric. One grid step along `gx` moves half a tile right and half a tile-height down; one step along `gy` mirrors it leftward; `z` lifts straight up.

```

toScreen(gx, gy, z) = { x: (gx - gy) * 24, y: (gx + gy) * 12 - z * 14 }

```

Integer grid coordinates are the authoring format. Fractions are legal everywhere — slab insets, fin pitches, edge lanes on half-cell offsets.

## Paint order

Buildings render in ascending `depthKey = gx + w + gy + d`. Footprints never overlap, so the rule is sufficient: a building can only occlude one whose front corner sits strictly behind its own.

Layer order on the canvas, and why:

1. **Floor grid** — under everything

2. **District plates** — with the floor, so a plot never covers what stands on it

3. **Edges** — under the buildings, so a payload reaching a facade disappears *into* the module. That is what reads as "entering"

4. **Buildings** — back to front

5. **Flags and step numbers** — last, because a marker a tower can bury is no marker

## Fixing an edge that cuts through a building

Edges route Manhattan-style: `gx` first, then `gy`, with an elbow inserted where they differ on both axes. To flip which way the elbow bends, supply the other corner as a waypoint:

```ts

{ id: 'auth-to-dash', from: 'auth', to: 'dashboard', via: [{ gx: 4, gy: -2 }] }

```

Waypoints are in grid space, and half-cell offsets are useful for running two edges in parallel lanes rather than on top of each other.

## Fixing a footprint

`packLayout` is deterministic shelf packing: it fills a row left to right until the next building would pass the target width, then starts a row behind it. Districts are packed the same way one scale up, in `GROUPS` order.

To override, write the footprint into the node and skip the merge for it. Rules to respect:

- Footprints must not overlap — the district derivation and the painter's algorithm both assume it

- Leave at least one cell between buildings, or their strokes touch

- A district's plate is derived from its members' bounding box plus padding, so moving a building moves the plot automatically

## Sizes

Height is a log ladder on lines of code, clamped 1–6: a module ten times bigger is not ten times taller, or one subsystem becomes a skyscraper next to a village. Footprint comes from archetype — a fin-row is as wide as it has fins, a tower is 2×2 regardless of how tall it is.

references/greenline.md

about 120 tokens
  • greenline
greenlineOpens the skill's mechanics page, read with SKILL.md

# Architecture map: the practice's mechanics

This page holds where architecture-map's work lands in the workspace and the commands it runs, which `SKILL.md` names by their nouns. Read it with `SKILL.md` when the work lands in the workspace.

greenlineThe map's folder and its three files

## Where its work lands

The map's folder is `.greenline/map/`: `map.md`, the authored half; `snapshot.json`, the measured half with the snapshot commit; and `architecture.html`, the generated viewer. Nothing of the map lives anywhere else.

22 files beside the text
  • assets/components/ArchitectureMap.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/ArchitectureMap.tsx
  • assets/components/BuildingGlyph.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/BuildingGlyph.tsx
  • assets/components/DistrictLayer.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/DistrictLayer.tsx
  • assets/components/EdgeLayer.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/EdgeLayer.tsx
  • assets/components/IsoCanvas.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/IsoCanvas.tsx
  • assets/components/SidePanels.tsx copied byte for byte from Alaa Mendili, architecture-map/assets/components/SidePanels.tsx
  • assets/components/keyframes.css copied byte for byte from Alaa Mendili, architecture-map/assets/components/keyframes.css
  • assets/components/theme.ts copied byte for byte from Alaa Mendili, architecture-map/assets/components/theme.ts
  • assets/core/archetypes.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/archetypes.ts
  • assets/core/districts.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/districts.ts
  • assets/core/iso.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/iso.ts
  • assets/core/layout.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/layout.ts
  • assets/core/program.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/program.ts
  • assets/core/routes.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/routes.ts
  • assets/core/scene.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/scene.ts
  • assets/core/types.ts copied byte for byte from Alaa Mendili, architecture-map/assets/core/types.ts
  • assets/gl-shell.html written by greenline, pointer: the map viewer shell replaces the upstream bundler and CI steps
  • assets/stores/useFlowClock.ts copied byte for byte from Alaa Mendili, architecture-map/assets/stores/useFlowClock.ts
  • assets/stores/useMapCamera.ts copied byte for byte from Alaa Mendili, architecture-map/assets/stores/useMapCamera.ts
  • assets/stores/useMapView.ts copied byte for byte from Alaa Mendili, architecture-map/assets/stores/useMapView.ts
  • scripts/architecture-sync.mjs copied byte for byte from Alaa Mendili, architecture-map/scripts/architecture-sync.mjs
  • scripts/propose-coverage.mjs copied byte for byte from Alaa Mendili, architecture-map/scripts/propose-coverage.mjs

The edits

Red is upstream's text; green is what greenline shipped in its place.

What the edit kinds mean
method
changes what the method does, under a recorded ruling
correction
fixes an error
scope
fits the text to this skill
pointer
re-points a reference
smaller edits
rename, relocate or adjust tool details
  1. Edit 2 pointer SKILL.md:129

    Upstream: win over its

    Shipped: win over its

    A prebuilt viewer shell replaces upstream's install, bundler, sync and CI steps

    Full reason

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.

  2. Edit 4 pointer SKILL.md:184

    Upstream: New numbers land in the generated file; nothing else moves.

    Shipped: New numbers land in `snapshot.json`; nothing else moves.

    Updates report the staleness tier first and re-read only dirty nodes

    Full reason

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

  3. Edit 5 pointer SKILL.md:185

    Upstream: Each entry is either a subsystem the map has not been told about, or an existing module whose pattern is too narrow.

    Shipped: Each entry is either a subsystem the map has not been told about, or an existing module whose pattern is too narrow.

    Updates report the staleness tier first and re-read only dirty nodes

    Full reason

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

  4. Edit 6 pointer SKILL.md:191

    Upstream: Leave every existing node's prose, footprint and edges exactly as they are.

    Shipped: Leave every other node's prose, footprint and edges exactly as they are.

    Updates report the staleness tier first and re-read only dirty nodes

    Full reason

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

2 smaller edits

Renames, locations and tool details, each with its reason.

  1. Edit 1 relocate SKILL.md:49

    Upstream: | Existing map | a previous `architecture.config.json` — if present, this is an **update** |

    Shipped: | Existing map | the map folder's `snapshot.json`; if present, this is an **update** |

    Upstream's in-repo files give way to .greenline/map and the skill's assets

    Full reason

    Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  2. Edit 3 relocate SKILL.md:176

    Upstream: If `architecture.config.json` exists, this is an update.

    Shipped: If `snapshot.json` exists, this is an update.

    Upstream's in-repo files give way to .greenline/map and the skill's assets

    Full reason

    Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

What greenline wrote

The full reason for every passage greenline wrote, in the order of the text.

  1. SKILL.md:8 scope

    The opening paragraph in the habit's own voice: the situation its block row keys it by, that it is an extra loaded only when asked, the map as durable, versioned state under .greenline/map/ (map.md authored, snapshot.json measured with the snapshot commit and prose provenance, architecture.html generated), offered in one line and refreshed after architecture-survey lands a deepening; that writing it is a change proposed like any other; and that it writes no record of its own, the change's build section naming the map. Re-cut at S18b onto the change record, in place of an initiative and its ticket. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  2. SKILL.md:10 pointer

    The front points at the skill's references page, where greenline's paths and commands for it stand since J-93 S2, so the front holds the method alone.

  3. SKILL.md:69 scope

    three of upstream's four questions have no options under greenline (the home, the design system, the extras are fixed); the coverage question is a real choice and is asked in one line when the request did not say Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  4. SKILL.md:84 pointer

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  5. SKILL.md:93 relocate

    Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  6. SKILL.md:107 relocate

    Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit.

  7. SKILL.md:128 pointer

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.

    Credits: Alaa Mendili

  8. SKILL.md:130 pointer

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

    Credits: Alaa Mendili

  9. SKILL.md:155 pointer

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  10. SKILL.md:161 pointer

    The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.

    Credits: Alaa Mendili

  11. SKILL.md:169 relocate

    Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit. Since J-93 S2 the front names greenline's homes and commands by their nouns, their paths and commands on the skill's references page.

  12. SKILL.md:179 pointer

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

  13. SKILL.md:185 pointer

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

  14. SKILL.md:187 pointer

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

    Credits: Alaa Mendili

  15. SKILL.md:193 pointer

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.

    Credits: Alaa Mendili

  16. SKILL.md:215 pointer

    The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class; S17 renamed the starts improve-codebase-architecture to architecture-survey (R22 of 2026-10-08, "yes amend, with one change"), so the pointer names the new name.

  17. references/greenline.md:1 scope

    The skill's references page opens: greenline's mechanics for the skill, the paths and commands its front names by their nouns, held apart from the upstream prose since J-93 S2.

  18. references/greenline.md:5 relocate

    architecture-map's mechanics: the map's folder, its three files, held apart from the upstream prose since J-93 S2.

What it left out

Alaa Mendili

Alaa Mendili, architecture-map/SKILL.md: 49 of 128 sentences left out
  1. ## Step 2 — Ask exactly four questions
  2. Ask them together — in one structured-question call if your harness has one (Claude Code: `AskUserQuestion`), otherwise as a single numbered message — then work uninterrupted.
  3. Do not drip-feed them one at a time.
  4. **Where should it live?**
  5. Recommend `/~/architecture` — a `~` segment reads as "internal tool" and sorts away from real routes.
  6. Offer `/architecture` and `/internal/architecture`.
  7. **What should it cover?**
  8. Whole repo / source only / one package.
  9. Preselect sensibly if it is a monorepo.
  10. **Design system.**
  11. State what you detected — "Tailwind v4 with CSS custom properties" — and offer: use it, or the bundled neutral palette.
  12. **Extras.**
  13. Wire the freshness check into CI?
  14. Add the sync to `predev`/ `prebuild`?
  15. Include the version-history dropdown? 15 sentences left out: three of upstream's four questions have no options under greenline (the home, the design system, the extras are fixed); the coverage question is a real choice and is asked in one line when the request did not say
  16. ## Step 3 — Install the core
  17. Copy `$SKILL_DIR/assets/core/`, `assets/stores/` and `assets/components/` into the repo under the path you agreed (e.g. `src/architecture/`).
  18. These are dependency-free apart from React, and typecheck under `strict`.
  19. Then write `architecture.config.json` at the repo root:
  20. ```json { "coverage": "src/architecture/coverage.json", "output": "src/architecture/measured.generated.ts", "sources": ["src/**/*.{ts,tsx}", "scripts/**/*.mjs"], "ignore": ["next-env.d.ts"] } ```
  21. Copy `$SKILL_DIR/scripts/architecture-sync.mjs` into the repo's own `scripts/` and add `"architecture:sync": "node scripts/architecture-sync.mjs"`.
  22. ### Adapt the theme
  23. Edit `components/theme.ts` only.
  24. Point each semantic name at the repo's tokens:
  25. ```ts export const paint = { surface: 'var(--tsc-background)', border: 'var(--tsc-foreground-tertiary)', accent: 'var(--tsc-brand)', // … } ```
  26. If the repo has no design system, leave the defaults — they define `--am-*` fallbacks and work standalone.
  27. **Never** reach for a host token anywhere except this file. 12 sentences left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  28. 2 sentences taken
  29. Write `graph.ts` exporting `GROUPS`, `NODES`, `EDGES`, `FLOWS` and `INTRO`, typed by `core/types.ts`. left out: Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit.
  30. 8 sentences taken
  31. Derive `archetype`, `params`, `height` and `footprint` with `core/layout.ts`: left out: Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit.
  32. 8 sentences taken
  33. **Coverage** — write `coverage.json` so every source file is claimed exactly once. left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. replaced by line 128 of SKILL.md
  34. `$`-prefixed keys are notes. left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  35. 1 sentence taken
  36. Then:
  37. ```bash node scripts/architecture-sync.mjs ``` 2 sentences left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  38. Iterate until it reports zero unmapped, or until what remains genuinely is not part of the system. left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. replaced by line 130 of SKILL.md
  39. ## Step 5 — Mount it
  40. Create the route for the detected framework — see `references/frameworks.md`.
  41. Import `keyframes.css` once.
  42. Pass `ArchitectureData` in from your graph module plus `UNCLAIMED` from the generated file.
  43. Add `robots: noindex` if the route is public: this is a tool handed out by link, not a search result. 5 sentences left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  44. 1 sentence taken
  45. Typecheck and lint.
  46. `node scripts/architecture-sync.mjs --check` — must pass.
  47. Run the app and **look at it**. 3 sentences left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  48. 1 sentence taken
  49. Check: no overlapping buildings, no edge cutting through a facade, every flow plays start to finish, the rail and the map agree on what is lit. left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app. replaced by line 161 of SKILL.md
  50. Both themes if the repo has two. left out: The prebuilt self-contained viewer shell (assets/gl-shell.html, its __GL_MAP_DATA__ placeholder replaced with the map's data JSON and saved as .greenline/map/architecture.html) replaces upstream's install, bundler, sync-script and CI machinery in place: step 2 asks none of its four questions because the route, the CI wiring, the predev hook and the version dropdown do not exist here; step 3 installs nothing into the repository; step 4 writes coverage globs into map.md and measures counts, lines and the unclaimed list into snapshot.json with a scanner and no sync script; step 5 renders the shell instead of mounting a route (references/frameworks.md no longer applies); step 6 checks the snapshot and edge ids and opens architecture.html instead of typechecking, running --check and the app.
  51. 4 sentences taken
  52. Edit `graph.ts`; nothing else needs to change. left out: Every place upstream names the in-repo files (architecture.config.json as the existing-map detector in step 1 and in the update section, graph.ts as the authored file in step 4 and in the closing quote, core/layout.ts as a copied module) names greenline's home instead: .greenline/map/snapshot.json, .greenline/map/map.md, the skill's own assets/core/layout.ts with the derived geometry landing in snapshot.json, and the viewer regenerated after a prose edit.
  53. 4 sentences taken
  54. Run the sync. left out: The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.
  55. 1 sentence taken
  56. Read `UNCLAIMED`. left out: The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class.
  57. 1 sentence taken
  58. For genuinely new subsystems: *append* a node with derived geometry and drafted prose, and extend `coverage.json`. left out: The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class. replaced by line 187 of SKILL.md
  59. 1 sentence taken
  60. Report what you added and what you left alone. left out: The update procedure reads snapshot.json, folds git diff --name-status <snapshot-commit>..HEAD through the coverage globs and reports the staleness tier (fresh, current, drifting, stale) from commit dates before touching anything, re-reads only dirty nodes and reuses unchanged prose byte-identical, keeps a ghost foundation for a vanished node for one snapshot, rewrites snapshot.json and map.md in the same pass, regenerates the viewer and reports tier, re-read versus reused nodes, ghosts and the unclaimed list; the Durable output line names .greenline/map/ and the offer rule for the situational class. replaced by line 193 of SKILL.md

Alaa Mendili, architecture-map/assets/core/README.md: all 14 sentences taken

Alaa Mendili, architecture-map/references/authoring.md: all 78 sentences taken

Alaa Mendili, architecture-map/references/frameworks.md: all 31 sentences taken

Alaa Mendili, architecture-map/references/geometry.md: all 34 sentences taken

The ledger entry

greenline's ledger logs how each skill was made and changed, with a reason for each entry.

2026-10-19 2026-10-19-architecture-map-split-review-fixes

The description names the map's folder by its noun

The description names the map's folder by its noun, its path on the references page, since the front rule reads the description too (J-93 S2, the review's fix cycle).

Authorised by
no ruling of its own
Pages it touched
not recorded
Rulings, R1 to R4
  1. the operator's rulings of 2026-10-04, "cool then lock everything in": every change in every mode has one record its steps write, which replaced the tickets' execution accounts, and a habit writes none of its own
  2. R21 of 2026-10-08: a candidate bound to orchestration, a harness's mechanisms or subagent configuration is never taken as written; its portable form is taken ("greenline is supposed to work in any harness cli"), ruled with "yes go ahead"
  3. J-59, on the operator's words of 2026-10-09 ('okay then implement all of this'): a gist of at most twelve words on every account whose reason is stated; no text, measure or method changes
  4. The operator's words of 2026-10-18 on the redesign (N-56, items 2 and 7), "we need the upstream prose upfront and references hold how to work meaning the artefacts etc" and, on the ingest procedures, "we wanna have there prose .. what we don't wanna have is there artefact system and fit them to use ours"; and J-93 S2's finalise words of 2026-10-19, "Fast route, merged slices, parallel jobs (Recommended)": a skill's front is the upstream prose its recipe cuts, and its mechanics, where its work lands, its section's form, its depths at each mode and its commands, stand on its references page
5 earlier entries
  1. 2026-10-19 2026-10-19-architecture-map-front-and-references

    architecture-map's paths and commands move to a references page

  2. 2026-10-09 2026-10-09-architecture-map-gists

    Every account gets a short gist for the website

  3. 2026-10-08 2026-10-08-architecture-map-recut

    Re-cut as an extra habit; writing the map is a change

  4. 2026-10-08 2026-10-08-architecture-map-rename

    Names architecture-survey, whose deepening the map folds back in

  5. 2026-10-07 2026-10-07-architecture-map-recipe

    Moves to its recipe byte for byte, nothing changed