# History — Queue North Website

```
Status: Current
Owner: _null
Last reviewed: 2026-08-18
Governs: the narrative of how this project got to where it is
Review trigger: A decision reversed, a direction abandoned, or a rewrite
```

## What this is for

Queue North Technologies had a working website: one large `index.html`, a
hand-written stylesheet, and `main.js` doing hash-based routing. The content was
good and the presentation was early-2000s. This repository is the rebuild — a
Vite + React SPA with an Express API behind it, live at `queuenorth.com`.

That much is in the code. What is not in the code is which walls were already
walked into, and that is what this file is for.

**This is a record of *then*, never a description of *now*.** That distinction is
what makes it safe to leave alone as the project changes — a history document
that gets edited to stay current is not a history, it is a second and competing
description of the present.

If you find yourself updating a sentence here because the code changed, the
sentence belongs somewhere else.

## Decisions and their reasons

| When | What was decided | Why, at the time |
| --- | --- | --- |
| 2026-05-11 | Vite + React SPA, explicitly **not** Next.js | The rebuild needed a fast client and a small Express API, not SSR or server components. `docs/planning/REQUIREMENTS.md` states it as a requirement rather than a preference, because it kept getting re-proposed |
| 2026-05-11 | better-sqlite3 rather than a hosted database | Two forms and two tables. A managed database would have been more infrastructure than the product has data |
| 2026-05-12 | Light-first B2B layout with strategic dark navy, evolving the palette rather than replacing it | `docs/design/REDESIGN_REVIEW.md`: the original read as a developer portfolio, and B2B buyers decide on trust in seconds. Rip-and-replace to a light theme would have thrown away the navy brand equity along with the problem |
| 2026-05-13 | Zoho forwarding is fire-and-forget, behind SQLite | SQLite always writes first. A CRM outage must never cost a lead — the local row is the record and Zoho is a best-effort overlay |
| 2026-05-17 | The standalone `/8x8` page was merged into the UCaaS and CCaaS service entries | Issue #32. A partner page nobody navigated to, when the partnership is better evidenced inside the services it actually powers |
| 2026-06-14 | Zoho switched from the REST/OAuth path to **WebToLead** as the default mode | `ZOHO_FORWARDING_MODE=webtolead`. The OAuth path works and is kept as a standby; WebToLead needed no token lifecycle for what is a single lead form |
| 2026-08-01 | Every route is prerendered at build time, and the privacy policy has a server-rendered fallback | Meta's crawler does not run JavaScript. See `docs/architecture/README.md` |
| 2026-08-18 | Adopted the project template; **retired phase-versioning** | See below |
| 2026-08-18 | **`queuenorth.com` is the permanent public origin**, with `qn.isnull.dev` kept as a second ingress to the same container | Asked and answered by `_null` while closing out the template adoption. It settles #212 and it corrected a mistake made earlier the same day: the first draft of `docs/OPERATIONS.md` asserted `queuenorth.com` was *not* this deployment, written from a DNS lookup rather than a request. Both hostnames serve the identical bundle and this server's own `/api/health` shape; `24.41.108.95` is this network's own public IP |
| 2026-08-18 | The Forgejo repository was made **private** | Adoption committed the previously-gitignored internal documents into `docs/`. Those hold the agent narrative and internal findings about the client's own marketing claims (#108, #110), which is not material for a public tree. `null/fruit-fall` was already private and reports to the Command Center normally, so nothing was lost by it |

## What was tried and dropped

### Phase-versioning — the minor number *was* the phase number

`PROJECT.md` and `STRUCTURE.md` both carried the rule: Phase 1 releases are
`0.1.x`, Phase 5 releases are `0.5.x`, and *"do not use unrelated semantic
version bumps during the overhaul"*. Bishop was made responsible for enforcing it
across `package.json`, `PROJECT.md` and `HISTORY.md`.

**It drifted twice, and the second time nobody noticed for two and a half
months.** At adoption `package.json` said `0.8.3` while the last four commit
subjects said *batch 0.9.0* through *batch 0.9.3*, and both `PROJECT.md` and
`STRUCTURE.md` still described the project as being in Phase 5.

The rule was not wrong; it was unenforceable. It asked four files to agree, with
a human check as the only mechanism, and a rule that needs a person to remember
it is a rule that decays. Milestones in the tracker now hold what the phase
number was carrying — a batch is a milestone, and closing it is what marks the
batch shipped — so the version number no longer has to encode anything.

`package.json` was corrected to `0.9.3` on adoption to match the commits.

**What replaced it:** nothing, deliberately. Version numbers are now just version
numbers. `docs/WORK_CYCLE.md` holds what happens at the end of a piece of work.

### The markdown backlog

Work was planned in `FUTURE.md`, with a parallel changelog in `HISTORY.md`, an
agent log in `DEVELOPMENT_LOG.md`, phase checklists in `PROJECT.md` and
`README.md`, and 205 issues in Forgejo. Six records of what was happening, and
the tracker — the one with atomic state and real timestamps — was the one nothing
pointed at.

The specific damage: 205 issues sat in **zero** milestones, so privacyllc.dev
reported the project as *not adopted* rather than as 87% complete, and the
severity labels were spelled `P0 Critical` / `P1 High` / `P2 Medium`, which no
query matches.

The markdown records were retired on 2026-08-18. What was reasoning is now in
`docs/history/BATCH_LEDGER.md`; what was work is in the tracker.

### The agent pipeline — kept, not dropped

Scarlett designs, Neo implements, Private Hudson reviews security, Bishop
verifies, Ripley owns git. Agents do not touch git; Ripley commits and pushes.

This survived adoption because the project earned it — `.learnings/` holds four
agents' accumulated notes and error logs against it — and because nothing in the
template contradicts it. `docs/WORK_CYCLE.md` says what must be true when a piece
of work ends; the pipeline says who does which part. They are different questions.

The one piece of the pipeline that did not survive is Bishop's version-checking
duty, which went with phase-versioning above.

## What this file is not

- **Not the plan.** That is `docs/planning/PROJECT_PLAN.md`.
- **Not the work list.** Open work lives in the tracker as milestones and issues.
- **Not a changelog.** Dated entries go in `docs/history/DEVELOPMENT_LOG.md`.
