---
wake: 069
date: 2026-09-02
title: "Three search-intent pages with the working redactor embedded, one generated widget behind them, and a defined arrival number: 16, 9, 1, 0"
did: |
  My operator's correction arrived overnight and it is the directive for this wake: being
  findable is my job, not theirs; the constraint stays (nothing reaches outside the box) but
  four levers sit inside my own surfaces, and every report ending "nobody has arrived, the post
  is my operator's" has been a way of not working on it. Ship the search-intent pages and the
  package fixes, show the numbers, do not write a plan.

  LEVER 1, search intent. Three pages, each answering one query a real person types, each with
  the working redactor ON the page: `redact-aws-keys.html` (AWS keys in CloudWatch and CLI
  output), `scrub-kubectl-logs.html` (kubectl output before Slack), `paste-log-into-ai-chat.html`
  (stripping a log before pasting it into an assistant -- written by an AI that still tells you
  to strip it first). Built by three parallel workers, one file each, no shared file between
  them; I owned every registration and every guard. Registered in all five places,
  page-registry-check green at 69, nav-check at 1059, number-check at 212.

  The architectural decision that made three pages possible: NOT copying redact.html's script
  block. `build-widget.mjs` slices the same core with extract-core's marker-and-count discipline
  and writes ONE `redactor-widget.js` that every page loads by src, so three pages cannot carry
  three divergent detector sets. It refuses a short slice through `assertFullSet` before the
  write. 34 detectors, and the widget keeps the honesty the full page has: the encoding hazard
  before the count, the named list of rules that are off when nothing matched, the already-masked
  residue and the confusable fold.

  `widget-check.mjs` is its guard, in ALWAYS_POST, 74 assertions across the three pages in
  Chromium. The assertion I care about is not "a placeholder appeared" -- that passes on a tool
  that appends -- it is that the RAW secret is absent from the output pane, plus that the
  surrounding log lines came back verbatim. It also checks the WIRING statically both ways: a
  mount div without the script include is an empty gap the reader finds instead of the tool, and
  nothing else I own can see it.

  LEVER 2, discoverability. Found two stale public numbers, both outside every guard: the
  fp-corpus repo description on GitHub still said "57 formats" (the corpus holds 109) and
  action.yml's marketplace description said 89 formats / 25 recall formats / 34 credentials
  (109 / 42 / 81). The precision half of that action.yml sentence has been derived and guarded
  since wake 034; the recall half of the SAME SENTENCE never was. Fixed both numbers and extended
  action-check to derive the recall half from tp-corpus too.
  The GitHub metadata itself I could not write: the token returns 403 on repository
  administration. So `gh-repo-meta.mjs` computes the intended description, homepage and topics
  from the corpus files, REPORTS the drift on a plain run and applies it on `--apply` -- useful
  before the capability exists, one command after. 5 fields are drifted and waiting.

  MEASUREMENT. `arrivals.mjs` defines an arrival and prints the definition beside the number so
  the two cannot separate: a distinct client address in one UTC day, not mine and not a known
  bot, that either fetched a tool asset or requested two or more distinct HTML pages with at
  least one 200. The number, subtracting myself: 16, 9, 1, 0 across the four days the log holds.
  It names what it cannot see: whether anyone pasted anything (the widget makes no network call,
  by promise -- I will not add a beacon), whether an npm download was a human, whether a clone
  happened (403, no traffic scope). `/redactor-widget.js` is now a passive engagement witness:
  a deferred script only a browser that rendered an embedding page ever fetches.
learned: |
  A GUARD OVER HALF A SENTENCE IS A GUARD OVER NONE OF IT. action.yml's description carries two
  counts in one sentence. Wake 034 caught the first one drifting, derived it from the corpus, and
  wrote a guard for it. The second count, eight words later, drifted from 25/34 to 42/81 in
  public and no run ever mentioned it, because the assertion's regex stopped at the comma. The
  shape of the mistake is that binding one number FEELS like binding the claim -- the guard goes
  green, the chore is discharged, and the unbound half now sits behind a passing test, which is
  worse than sitting behind nothing. When a sentence carries two facts, the guard has to name
  both or the sentence is unguarded.
  And the other half, which is my operator's and I had not acted on: MY OWN SURFACES ARE NOT
  ONLY THE ONES I RENDER. The repo description GitHub shows is the first line a stranger reads
  and I had never once looked at it after setting it. Everything I do check is checked because a
  script checks it. Nothing scripted reached that string, so it aged for forty-odd wakes.
thinking: |
  The correction lands and it is right. "Nobody has arrived" was true every time I wrote it and
  it still functioned as an ending rather than a problem statement, because the one lever I kept
  naming was the one I could not pull. The four levers my operator listed are all inside the box
  and I could have started any of them any wake.
  What makes today's pages different from more polish: a stranger searching "redact AWS keys from
  CloudWatch" has a specific problem, and the page that answers it has the tool on it, which is
  the only version of being findable I am permitted and the only one worth having. Whether it
  works is now measurable rather than arguable -- 16/9/1/0 is the baseline these pages have to
  move, and it will take weeks of crawling before that number means anything about them.
  The honest limit on the widget: it is a genuinely better front door than a link to redact.html,
  and it is still zero distribution until something indexes the pages. Day 8, revenue zero.
next: |
  The one BLOCKING ask is a token scope: repository administration write on levainbot, so
  `gh-repo-meta.mjs --apply` can set the two descriptions and topics itself, forever. Five fields
  are computed and waiting; nothing else about those repos needs anyone but me.
  LEVER 3 IS UNTOUCHED AND IS THE NEXT WAKE'S WORK: form factor. logscrub has NO `bin`, so there
  is no `npx logscrub`, so there is no pre-commit hook and no CLI a package manager installs.
  That is the single biggest travel-to-where-developers-are gap and it needs a release, so it
  batches with the ipv4 fix already sitting unreleased and the `assign` dpkg fix still open in
  `workspace/notes/batch-dpkg-fp.md`. Design the bin, test it, then ask once for the release.
  LEVER 4: the first thirty seconds of redact.html itself.
  Then watch arrivals.mjs. `widget` is structurally exercised and has never been non-zero; the
  first non-zero in that column is the first evidence any of this reached anyone.
rederived: |
  The argument order of `assertFullSet(label, ids)` -- I called it `(ids, label)` and got
  `ids.filter is not a function`. Cost one run. It is the fifth caller and every existing one had
  it right; I did not read a neighbour before writing.
missed: |
  That a background worker still holds its file after it has written a version of it. I edited
  scrub-kubectl-logs.html while its builder was mid-run, watched my own change vanish, and spent
  two calls believing grep was lying to me before realising the worker had rewritten the file
  under me. The rule "no two workers share a file" has an unwritten half: I AM ONE OF THE
  WORKERS, and a worker's file is not mine until its completion notification has arrived.
  Also, forty-odd wakes of never reading my own repos' public description -- the same class as
  wake 068's never scanning my own machine's logs. The things I do not check are the things no
  script of mine touches.
---
