docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
# The work cycle — what happens at the end of a piece of work
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Status: Current
|
|
|
|
|
Owner: _null
|
|
|
|
|
Last reviewed: 2026-08-18
|
|
|
|
|
Governs: what must be true before a piece of work counts as finished
|
|
|
|
|
Review trigger: Any change to what the Command Center reads, or to which of
|
|
|
|
|
those channels a person rather than an agent has to write
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> **This is a procedure, not a status board.** Nothing here records what is open,
|
|
|
|
|
> what is next, or what is blocked — those live in the tracker and on
|
|
|
|
|
> privacyllc.dev, and a copy of them in this file would be the second disagreeing
|
|
|
|
|
> record that `DOC_TRUST_MAP.md` exists to prevent.
|
|
|
|
|
|
|
|
|
|
## Why this file exists
|
|
|
|
|
|
|
|
|
|
A piece of work ends in more than one place. The code is committed; the issue
|
|
|
|
|
that asked for it is still open; the document the change contradicts still says
|
|
|
|
|
the old thing; and the project screen at
|
|
|
|
|
[privacyllc.dev](https://privacyllc.dev) still shows last week's next action to
|
|
|
|
|
whoever opens it.
|
|
|
|
|
|
|
|
|
|
None of those catch up on their own. Two of them cannot be caught up later by
|
|
|
|
|
anybody but the person who did the work, because by then nobody knows what the
|
|
|
|
|
next action was meant to be.
|
|
|
|
|
|
|
|
|
|
## The cycle
|
|
|
|
|
|
|
|
|
|
Run all of it, in this order, every time. It is short on purpose.
|
|
|
|
|
|
|
|
|
|
1. **Close what you finished.** `closes #N` in the commit that does the work, so
|
|
|
|
|
the record comes from the thing that happened rather than a date typed
|
|
|
|
|
afterwards. If no single commit finished it, close it by hand with the
|
|
|
|
|
evidence — a path, a symbol, a test name, or the command that proves it.
|
|
|
|
|
*"Done" is not a close.*
|
|
|
|
|
2. **File what you found.** A defect noticed on the way past is an issue with a
|
|
|
|
|
severity label and the build SHA it was seen at, not a memory. Filing it costs
|
|
|
|
|
a minute; the alternative is finding it again from scratch, or shipping it.
|
|
|
|
|
3. **Close the milestone if the batch landed.** A milestone with every issue
|
|
|
|
|
closed and itself still open reads as a batch still in progress — see
|
|
|
|
|
[Open and closed are not bookkeeping](#open-and-closed-are-not-bookkeeping).
|
|
|
|
|
4. **Update the documents this change triggered.** Read the `Review trigger`
|
|
|
|
|
lines: a new module, a changed data shape, a new migration, a new boundary
|
|
|
|
|
something crosses. Those edits go in **the same commit as the code**, for the
|
|
|
|
|
reason in [Docs travel with the push](#docs-travel-with-the-push).
|
|
|
|
|
5. **Push.** Nothing above is visible off this machine until you do, and step 7
|
|
|
|
|
reports on what was pushed.
|
|
|
|
|
6. **Write the log entry** in `docs/history/DEVELOPMENT_LOG.md`: what changed,
|
|
|
|
|
what it proved, **Next action**, and **Blockers**. Dated, append-only, newest
|
|
|
|
|
first.
|
|
|
|
|
7. **Tell the Command Center**, which is three calls: reconcile, so it re-reads
|
|
|
|
|
the tracker and the pushed docs; `PATCH` the project's summary and next
|
|
|
|
|
action, which nothing else writes; and a check-in if what changed is worth a
|
|
|
|
|
timestamped note. Commands are [at the bottom](#the-commands).
|
|
|
|
|
|
|
|
|
|
Steps 6 and 7 are the two that get skipped, and they are the two nobody else can
|
|
|
|
|
do afterwards.
|
|
|
|
|
|
|
|
|
|
## Next action — where it lives
|
|
|
|
|
|
|
|
|
|
| Copy | Where | What it is |
|
|
|
|
|
| --- | --- | --- |
|
|
|
|
|
| The current one | `nextAction` on the project, privacyllc.dev | the live answer to "what happens next", shown to whoever opens the project screen |
|
|
|
|
|
| The dated one | the newest entry in `DEVELOPMENT_LOG.md` | what the next action was **at that point** — history, not status |
|
|
|
|
|
|
|
|
|
|
These are not two records of the same thing, and the distinction is worth
|
|
|
|
|
holding on to. The field is overwritten every time and always describes now. The
|
|
|
|
|
log entry is never edited and describes a moment — which is what makes it safe
|
|
|
|
|
to keep, and why an old entry naming a next action that has since been done is
|
|
|
|
|
not stale, it is a receipt.
|
|
|
|
|
|
|
|
|
|
Write the next action as an **action**: the thing a person would start on
|
|
|
|
|
Monday, specific enough to begin without asking a question. "Continue the work"
|
|
|
|
|
is not one. If the honest answer is that you do not know, that is a real answer —
|
|
|
|
|
say what has to be decided and by whom.
|
|
|
|
|
|
|
|
|
|
**Filing an issue can change what the project card says next, without anyone
|
|
|
|
|
choosing that.** The dashboard's next action is the *newest open issue in the
|
|
|
|
|
current milestone* — not the most severe one; severity labels have no influence
|
|
|
|
|
on it at all. So a routine `P2` filed into the batch you are working in replaces
|
|
|
|
|
whatever the card was showing, and it will keep showing that until something
|
|
|
|
|
newer arrives. The `nextAction` field is the only way to say something different
|
|
|
|
|
on purpose, which is most of why step 7 exists.
|
|
|
|
|
|
|
|
|
|
`currentSummary`, `nextAction` and `description` are **write-only**: they are
|
|
|
|
|
deliberately absent from every API response, because free text can name a
|
|
|
|
|
customer or an unannounced product. Only the admin screen shows them back. Never
|
|
|
|
|
report them as empty because a `GET` did not return them.
|
|
|
|
|
|
|
|
|
|
## Blockers — where they live
|
|
|
|
|
|
|
|
|
|
A blocker is recorded in up to three places, and **an agent can write only the
|
|
|
|
|
first and the third**:
|
|
|
|
|
|
|
|
|
|
| Where | What it holds | Who writes it |
|
|
|
|
|
| --- | --- | --- |
|
|
|
|
|
| The tracker | the work itself — an issue labelled `release-blocker`, or `P0` when it ships broken | anyone, including an agent |
|
|
|
|
|
| The blockers table on privacyllc.dev | the business-facing blocker, with a severity, an owner and a resolution note | **a human, in the admin UI** |
|
|
|
|
|
| A check-in's `blockers` field | narrative: what is stuck, said in a timestamped note | anyone, including an agent |
|
|
|
|
|
|
|
|
|
|
The agent API has no route that creates, edits or resolves a blocker on the
|
|
|
|
|
site. Posting a check-in whose `blockers` field says something is stuck records
|
|
|
|
|
*narrative* — it does not touch the blockers table, and it does not clear
|
|
|
|
|
anything. An agent that reports "blocker filed" after a check-in has told the
|
|
|
|
|
truth about the note and a falsehood about the table.
|
|
|
|
|
|
|
|
|
|
So: **file the issue** — that is the copy the work is actually tracked in — and
|
|
|
|
|
when it belongs in front of a stakeholder, say so plainly and let a human enter
|
|
|
|
|
it. Before treating a site blocker as resolved, restate its title and status and
|
|
|
|
|
get explicit confirmation; the admin UI requires a resolution note that the API
|
|
|
|
|
cannot supply.
|
|
|
|
|
|
|
|
|
|
If the work is blocked and nothing is filed anywhere, the project simply looks
|
|
|
|
|
slow.
|
|
|
|
|
|
|
|
|
|
## Open and closed are not bookkeeping
|
|
|
|
|
|
|
|
|
|
Every open issue is a denominator, and not in the abstract: the percentage on
|
|
|
|
|
the project screen **is** closed issues over all issues in this tracker. Nothing
|
|
|
|
|
else produces it. That has three consequences worth stating in full:
|
|
|
|
|
|
|
|
|
|
- **An issue left open after the work is done** understates the project
|
|
|
|
|
permanently, and the understatement compounds — a fortnight of finished work
|
|
|
|
|
with unclosed issues reads as a fortnight of no progress.
|
|
|
|
|
- **An issue closed without evidence** cannot be reopened with confidence,
|
|
|
|
|
because nothing in it says what "fixed" meant. That is why the close comment
|
|
|
|
|
carries the path, symbol, test or command.
|
|
|
|
|
- **Invented future work** makes every percentage wrong, permanently and in one
|
|
|
|
|
direction. Do not pad the tracker. If the real answer is one milestone and
|
|
|
|
|
three issues, file exactly that.
|
|
|
|
|
|
|
|
|
|
Milestones are the same argument at batch scale, and they are counted the same
|
|
|
|
|
way: milestones closed over milestones total is the second figure on the project
|
|
|
|
|
screen. Closing the last issue under a milestone does not close the milestone,
|
|
|
|
|
so a tracker full of complete-but-open batches reports a project as less
|
|
|
|
|
finished than it is — and cannot answer "what shipped".
|
|
|
|
|
|
|
|
|
|
**File every issue into a milestone.** One filed outside still counts against
|
|
|
|
|
the headline percentage while being invisible to the milestone figure, which is
|
|
|
|
|
how two readings of the same project come to describe different amounts of work.
|
|
|
|
|
The site measures the gap rather than ignoring it.
|
|
|
|
|
|
|
|
|
|
One trap that costs an afternoon, and it is about a *card* rather than a figure:
|
|
|
|
|
the Milestones list on privacyllc.dev reads the Command Center's own table,
|
|
|
|
|
which only an admin can write. A repository whose milestones are being counted
|
|
|
|
|
in the figure above can still show *"No milestones have been added yet"* in that
|
|
|
|
|
list. It is not a sync failure and no amount of reconciling changes it.
|
|
|
|
|
|
|
|
|
|
## Docs travel with the push
|
|
|
|
|
|
|
|
|
|
The Command Center reads this repository's documents at a commit, and stores the
|
|
|
|
|
SHA it read them from. When that SHA falls behind the repository's newest
|
|
|
|
|
commit, the docs report is marked **stale** — not wrong, not missing, *stale*,
|
|
|
|
|
which is the honest description of a document that was accurate at a commit
|
|
|
|
|
nobody is running any more.
|
|
|
|
|
|
|
|
|
|
Two ways to produce it, and both are ordinary carelessness rather than bad luck:
|
|
|
|
|
|
|
|
|
|
- **Code pushed, documents not updated.** The report is recomputed at the new
|
|
|
|
|
SHA against prose describing the old behaviour. Nothing flags this; the
|
|
|
|
|
document is simply confidently wrong now, and its `Last reviewed` line still
|
|
|
|
|
looks recent.
|
|
|
|
|
- **Documents updated, not pushed.** The site keeps reporting the old ones. A
|
|
|
|
|
correction that exists only on your machine has not been made.
|
|
|
|
|
|
|
|
|
|
Hence step 4's insistence that documentation edits ride in the same commit as
|
|
|
|
|
the change that caused them. It is not tidiness — a doc commit that comes "after
|
|
|
|
|
this next thing" is the commit that does not get written, and the manual's
|
|
|
|
|
migration table in the project this template came from sat six migrations behind
|
|
|
|
|
before anybody noticed. Every reader in between trusted it.
|
|
|
|
|
|
|
|
|
|
## What the Command Center reads, and who writes it
|
|
|
|
|
|
|
|
|
|
Four independent channels, and **only two of them are automatic**:
|
|
|
|
|
|
|
|
|
|
| On the project screen | Source | How it gets there |
|
|
|
|
|
| --- | --- | --- |
|
|
|
|
|
| Headline % — issues closed / all issues | the repository's tracker | automatic — on reconcile, and immediately on a webhook delivery |
|
|
|
|
|
| Second figure — milestones closed / all milestones | the repository's **milestones** | same read, same moment |
|
|
|
|
|
| Milestone coverage — issues that sit in no milestone | the repository's tracker | same read |
|
|
|
|
|
| QA verdict — round, build SHA, overall sentence | `docs/qa/ClaudeReport.md` | push the repository, then reconcile |
|
|
|
|
|
| Current summary / Next action | manual fields on the project | `PATCH /agent/projects/queue-north-website` — nothing else writes them |
|
|
|
|
|
| The Milestones card, and a typed weighted plan | the Command Center's **own** milestone table | admin UI only |
|
|
|
|
|
| Blockers | the Command Center's **own** blockers table | admin UI only |
|
|
|
|
|
|
|
|
|
|
The first three are why steps 1 and 3 are steps: **closing an issue and closing
|
|
|
|
|
a milestone each move a figure a stakeholder can see, that day.** The last two
|
|
|
|
|
are lists rather than figures, and they are the ones an agent cannot write — a
|
|
|
|
|
repository whose milestones are counted in the second figure can still show
|
|
|
|
|
*"No milestones have been added yet"* on the card, because that card reads a
|
|
|
|
|
table only an admin fills in.
|
|
|
|
|
|
|
|
|
|
A repository that has not adopted the four label names is reported as *not
|
|
|
|
|
adopted* rather than as zero defects, and one with its tracker switched off is
|
|
|
|
|
reported as switched off rather than as an empty backlog. Absence is never
|
|
|
|
|
rendered as a measurement — which is exactly why a real backlog nobody filed
|
|
|
|
|
looks like nothing at all.
|
|
|
|
|
|
|
|
|
|
## The commands
|
|
|
|
|
|
|
|
|
|
The tracker is the Forgejo instance at
|
|
|
|
|
**[dream.scheller.ltd](https://dream.scheller.ltd)**, and steps 1 to 3 happen
|
|
|
|
|
there. Its credentials, the Cloudflare trap and the reason it has to be that
|
|
|
|
|
instance rather than any tracker are in the project README's *Where the tracker
|
|
|
|
|
is* — one copy, named once.
|
|
|
|
|
|
|
|
|
|
**This repository has no test suite**, so "the evidence that proves it" is
|
|
|
|
|
usually a file and symbol, a `curl` against the live origin, or what was observed
|
|
|
|
|
at a named viewport. Say which; "Done" is not a close.
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
set -a; . ~/.openclaw/docker-registry.env; set +a
|
|
|
|
|
python3 scripts/forgejo-issue.py list
|
|
|
|
|
python3 scripts/forgejo-issue.py close 196 "Fixed in a1b2c3d; src/components/layout/Header.jsx
|
|
|
|
|
# no longer overlaps at 320px — checked in DevTools at iPhone SE width."
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Step 7 talks to the Command Center instead:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# The token lives in this machine's credential store, never in the repository.
|
|
|
|
|
TOKEN="$(grep PRIVACY_LLC_TOKEN ~/.openclaw/credentials/privacyllc.md | cut -d= -f2)"
|
|
|
|
|
BASE="https://privacyllc.dev/api/internal/v1"
|
|
|
|
|
AUTH="Authorization: Bearer $TOKEN"
|
|
|
|
|
```
|
|
|
|
|
|
2026-08-18 01:36:46 -05:00
|
|
|
**Two things about refreshing that are worth knowing before you need them.**
|
|
|
|
|
|
|
|
|
|
*The webhook must carry the signing secret.* `POST /repos/null/Queue-North-Website/hooks`
|
|
|
|
|
with a URL and no `secret` produces a hook that looks perfectly healthy in
|
|
|
|
|
Forgejo — `active: true`, test deliveries accepted with a 204 — and whose every
|
|
|
|
|
delivery is rejected by privacyllc.dev with `401 bad_signature`. Forgejo exposes
|
|
|
|
|
no delivery history through its API, so nothing anywhere says so. This repository
|
|
|
|
|
ran in exactly that state for ten minutes on 2026-08-18. The secret is
|
|
|
|
|
`FORGEJO_WEBHOOK_SECRET` in `~/.openclaw/credentials/privacyllc.md`. To prove a
|
|
|
|
|
delivery actually lands, sign a payload yourself and look for `"applied":true`:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
WHSEC=$(grep '^FORGEJO_WEBHOOK_SECRET=' ~/.openclaw/credentials/privacyllc.md | cut -d= -f2-)
|
|
|
|
|
# HMAC-SHA256 of the body, in X-Forgejo-Signature (hex, no "sha256=" prefix).
|
|
|
|
|
# X-Hub-Signature-256 is NOT accepted.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
*A reconcile does not force a re-read.* Both `reconcile_all` and `sync_projects`
|
|
|
|
|
skip a project that is inside its freshness window, reporting `refreshed=0
|
|
|
|
|
still_due=0` — which reads exactly like "nothing to do" and means "not yet due".
|
|
|
|
|
There is no per-project force in the agent API: `{"kind":"refresh"}` and
|
|
|
|
|
`{"kind":"reconcile"}` are both refused, and only `reconcile_all` and
|
|
|
|
|
`sync_projects` can be triggered. So a tracker change made minutes after a sweep
|
|
|
|
|
is not visible on the card until the next one, however many times you reconcile.
|
|
|
|
|
That is a wait, not a failure — but say so rather than reporting the numbers as
|
|
|
|
|
updated.
|
|
|
|
|
|
docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
**Reconcile** — re-read the tracker and the pushed documents. Do this after the
|
|
|
|
|
push, not before:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
curl -sk -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
|
|
|
|
-d '{"kind":"reconcile_all"}' "$BASE/agent/jobs"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Summary and next action** — read the project first for its `version`, then
|
|
|
|
|
send a flat body carrying that version. A stale version is rejected rather than
|
|
|
|
|
silently overwriting somebody else's edit:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
curl -sk -H "$AUTH" "$BASE/agent/projects/queue-north-website" # for version + state
|
|
|
|
|
|
|
|
|
|
curl -sk -X PATCH -H "$AUTH" -H "Content-Type: application/json" \
|
|
|
|
|
-d '{"version":<n>,"health":"on_track",
|
|
|
|
|
"currentSummary":"<where the project stands, in a sentence or two>",
|
|
|
|
|
"nextAction":"<the next concrete thing, specific enough to start>"}' \
|
|
|
|
|
"$BASE/agent/projects/queue-north-website"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**A check-in** — a timestamped "what changed", when there is something real to
|
|
|
|
|
report. `summary` is required and must say something; the API refuses an empty
|
2026-08-18 01:36:46 -05:00
|
|
|
"no change" update, deliberately.
|
|
|
|
|
|
|
|
|
|
**`projectId` here is the UUID, not the slug.** Every other route in this API
|
|
|
|
|
takes the slug, and this one answers a slug with `{"code":"unknown","message":
|
|
|
|
|
"Something went wrong."}` — a generic 500 that says nothing about which field is
|
|
|
|
|
wrong, and which is identical to the error for a genuinely broken request. It
|
|
|
|
|
cost twenty minutes on 2026-08-18 and it will cost the next person the same
|
|
|
|
|
unless they read this line. Read the UUID from the project first:
|
docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
|
|
|
|
|
```bash
|
2026-08-18 01:36:46 -05:00
|
|
|
UUID=$(curl -sk -H "$AUTH" "$BASE/agent/projects/queue-north-website" \
|
|
|
|
|
| python3 -c 'import sys,json;print(json.load(sys.stdin)["project"]["id"])')
|
|
|
|
|
|
docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
curl -sk -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
2026-08-18 01:36:46 -05:00
|
|
|
-d "{\"projectId\":\"$UUID\",\"health\":\"on_track\",
|
|
|
|
|
\"summary\":\"<what changed>\",\"accomplishments\":\"<what landed>\",
|
|
|
|
|
\"blockers\":\"<what is stuck, or omit>\",\"nextActions\":\"<what is next>\"}" \
|
docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
"$BASE/agent/updates"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Health is one of `on_track`, `caution`, `off_track`, `unknown`. Never invent
|
|
|
|
|
one, and never report progress the API did not return.
|
|
|
|
|
|
|
|
|
|
## What this file is not
|
|
|
|
|
|
|
|
|
|
- **Not the work list.** That is the tracker: milestones are batches, issues are
|
|
|
|
|
deliverables.
|
feat(deploy): production always runs a numbered version
Policy set by _null. The stack pins :vX.Y.Z — never :dev, never :latest.
The reason is what a pointer cannot do. A stack file naming :dev says "dev"
today and will still say "dev" after the image underneath it changes, so the
file records a preference rather than a fact and "what is running?" has no
answer that survives the next push. Rollback is worse: there is nothing to roll
back TO, because a pointer only ever names now.
deploy.sh: with no --tag it now resolves the newest published NUMBERED version
from the registry and says which it picked, instead of defaulting to :dev. A
floating tag is refused outright, with --allow-floating as the loud escape hatch
for the one case that is not a mistake — reproducing a fault on whatever a
pointer currently is.
release.sh: no longer moves :dev. It published both tags until now because the
stack followed the pointer; under this policy nothing deploys :dev, so moving it
would only publish something that misrepresents what is running.
scripts/docker-push.sh deleted, with its npm script. Its entire job was building
and pushing an unnumbered :dev with no version bump and no guards, which is now
the exact thing the policy exists to prevent. Keeping a command that quietly
violates a policy is how the policy stops being true.
:dev and :latest stay in the registry, frozen. Not deleted: the running
container was created from :dev, and removing the tag an existing deployment
names is how a recreate fails to pull.
Stack 58 still pins :dev as this lands. Correcting that is the first deploy made
under the policy, and it is why the default resolves a version rather than
reusing whatever the stack already names.
Guards proven: default resolves v0.8.3; --tag dev refused; --tag latest refused;
--allow-floating warns and proceeds; unpublished tag still refused.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 02:54:42 -05:00
|
|
|
- **Not the release procedure.** That is `npm run release` to publish and
|
|
|
|
|
`npm run deploy` to move the stack — two commands on purpose. `scripts/release.sh`
|
|
|
|
|
and `docs/OPERATIONS.md` carry the detail, and
|
docs: adopt project template, retire the markdown backlog
This repository is the one the template's README describes: 205 issues, zero
milestones, and severity labels spelled "P0 Critical" / "P1 High" / "P2 Medium",
which privacyllc.dev reports as NOT ADOPTED rather than as 87% complete.
Six markdown records described the same work and none pointed at the tracker.
Two of them said the project was in "Phase 5" while the code was at 0.9.3.
Migrated, then deleted in this commit:
FUTURE.md -> docs/history/BATCH_LEDGER.md (Archived). Its open
items were all already filed as issues, so nothing
needed migrating into the tracker
HISTORY.md -> docs/history/DEVELOPMENT_LOG.md, verbatim, 0 lines lost
DEVELOPMENT_LOG.md -> the same file, as a second labelled block. Not
interleaved: the changelog has three duplicated version
headings, so one date order would have implied more
than the record supports
PROJECT.md -> docs/planning/PROJECT_PLAN.md
STRUCTURE.md -> the agent pipeline into README.md; its versioning rules
retired
BUILD_SUMMARY.md -> BATCH_LEDGER.md. Its embedded SQL schema deliberately
NOT carried: it predated the UNIQUE constraint on
leads.email, and server/index.js owns the schema
SCRIPTS.md -> docs/TOOLS.md, corrected for the SSR + prerender build
Moved with history (git detects all four as renames):
OVERHAUL_PLAN.md, review.md, project-requirements.md, docs/zoho-setup.md
Kept because this project earned them: the five-agent pipeline, the design
system in OVERHAUL_PLAN.md (Status: Current, with a front-note saying which half
is history), the positioning argument in REDESIGN_REVIEW.md, and REQUIREMENTS.md
whole, including its change policy.
Deleted from the template because they do not apply, each said out loud in
DOC_TRUST_MAP.md: QA pass I (no money moves), the authorisation checklist group
and the session-token row (no accounts, no sessions), and one PRECAUTIONARY
paragraph in SECURITY.md about holding credentials on behalf of users — there
are none, and PROJECT_PLAN.md records accounts as out of scope. Pass H was kept
and rewritten: its authorisation half does not apply, its what-a-stranger-can-
reach half is the most exposed surface here.
Also removed: main.js, the old static site's hash router, referenced by nothing
and preserved in .drop/; and test-results/.last-run.json, a May Playwright
artifact reading {"status":"failed"} for a suite that does not exist.
The repository was made private on Forgejo before this commit. That is what let
the internal history be committed rather than exempted — null/fruit-fall is
already private and reports normally.
Two defects found on the way in and fixed here: zoho-setup.md told admins to
edit `server/zoho/`, a directory that has never existed in any commit (the
mapping is in server/index.js), and README.md's route list still advertised
/8x8, removed at 0.6.6, while omitting /privacy-policy.
Branding: icon.webp and logo.webp converted from this project's own marks in
assets/. banner.webp is absent and is filed as an issue rather than faked.
Verified: verify.sh 3/3, doc-claims 71 claimed paths all present, backup and a
first-ever restore of the live leads database (2 tables, 3 rows, under 1s).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:19:02 -05:00
|
|
|
`docs/security/SECURITY_CHECKLIST.md` is the list to work through first.
|
|
|
|
|
- **Not the QA procedure.** That is `docs/qa/ClaudeQAPlan.md`, which ends in its
|
|
|
|
|
own version of step 7.
|
|
|
|
|
- **Not a place to record status.** If you are about to add "current state" or a
|
|
|
|
|
list of outstanding items below this line, the tracker is where it goes.
|