Skip to content

docs(naming): retire the two phantom Buzz repositories and delete the disambiguation rule they forced - #23

Closed
jeremylongshore wants to merge 7 commits into
mainfrom
chore/retire-phantom-lab-repos
Closed

docs(naming): retire the two phantom Buzz repositories and delete the disambiguation rule they forced#23
jeremylongshore wants to merge 7 commits into
mainfrom
chore/retire-phantom-lab-repos

Conversation

@jeremylongshore

@jeremylongshore jeremylongshore commented Aug 7, 2026

Copy link
Copy Markdown

What

Narrows the canonical naming record to assets that actually exist, and fixes a fork gate that is red on main today.

  • 000-docs/006-DR-STND (canonical naming record) — six assets → four, all of which exist. Drops the Contributor lab and Deferred plugin rows. Deletes §3 (the disambiguation rule) outright. The four-plane flow becomes three planes, ASCII diagram redrawn. Gate/boundary/IEP prose no longer routes through a lab that will not be built. Adds a dated Revision 2026-08-07 note recording what was removed and why.
  • 000-docs/001-PP-PLAN (master blueprint) — drops the ELab ledger row; rewrites Phase 6 as CLOSED, deferred indefinitely with the real reason; removes E9's phantom plugin-repo name (the epic stays deferred).
  • 000-docs/000-INDEX.md — the 006 summary no longer advertises six assets or the deleted rule.
  • CLAUDE.md — commits this session's fork-lane guidance (both gates, the two branch lanes, vendored-harness commands, task-state pointers); drops the now-stale "host-vs-repo boundaries" phrasing.
  • .harness-hash — re-pinned; see Verification.

Why

Neither intent-solutions-io/intent-ops-buzz nor intent-solutions-io/intent-ops-buzz-plugin has ever been created, and both are still 404. The lab repo was additionally given the same string as the real production VPS, and 006 papered over that collision with a rule enforced on every mention — "a bare intent-ops-buzz is a defect, fix it on sight." A name that needs a footnote every time it appears is the defect. Killing the phantom removes the collision at its source, so the rule is deleted rather than policed.

Track C is closed as deferred-indefinitely. The contribution practice has produced one upstream PR (block/buzz#4722) that needed no lab, and the flagship candidate the lab was designed to verify was dropped — Block fixed the relay half independently (#4196) and the desktop half turned out to be a fork-local defect.

Decision rationale

Amend 006 in place rather than supersede it with an 008: the change narrows the record rather than reversing it, and six downstream docs cite 006 by number — amending keeps every existing pointer valid. The dated Revision note carries the audit trail that a supersession would otherwise have provided.

⚠️ The production host name is unchanged

intent-ops-buzz is a real VPS with DNS, systemd units, compose files, and backup scripts. ~80 of the 86 references across the estate are to the host and are correct — none of them are touched. This is a ~8-file change, not an 86-reference rename.

Layer(s) touched

Fork-governance lane only (000-docs/, CLAUDE.md, .harness-hash, .beads/). All paths are fork-owned and gate-allowlisted; additive-only is unaffected. No invariant changes — the fork contract, the two declared divergences, and the must-survive set are all untouched.

Verification & evidence

Gate Before After
scripts/audit-harness verify exit 2 (HARNESS_TAMPERED) exit 0 (harness-hash: OK)
scripts/fork-gates/check-additive-only.sh pass additive-only OK vs upstream/main
scripts/fork-gates/check-must-survive.sh pass must-survive set intact (12 paths)

The harness gate was red before this branch, on committed content. 000-docs/000-INDEX.md had drifted from its pin and 000-docs/007-AA-AUDR-* was never pinned — both landed via #17/#20 with no follow-up re-pin, so pre-push was red for everyone in this repo. Reviewed the drift, confirmed both were legitimate content changes, then re-pinned 006/001/000-INDEX and added 007 in one pass (pinned 13 file(s)).

$ grep -rn 'intent-ops-buzz' 000-docs/
# every remaining hit is the production HOST, except 006's Revision note,
# which documents the retirement itself

$ gh repo view intent-solutions-io/intent-ops-buzz
GraphQL: Could not resolve to a Repository ... (repository)   # still 404 — and now nothing claims otherwise

Risk assessment

Low — documentation only, no runtime surface. The reachable failure mode is a future session hunting for a lab repo the docs no longer mention; addressed by the dated Revision note in 006, the CLOSED Phase 6 section in 001, and intent-os decision-log/048.

Operational impact

None. No prod, no compose, no secrets, no runbook procedure, no deploy order, no dependency or cost change. The production host and every script that reaches it are untouched.

Follow-up & deferred

  • Companion intent-os PR lands the parked architecture draft in version control at ops/buzz/PLAN-contrib-lab-architecture.md (DEFERRED, with un-parking conditions), syncs the ops/buzz/ docs + the buzz-ops skill mirror, and files decision-log/048 superseding D138 in decision-log/040.
  • Stale branch origin/fix/community-member-onboarding (the reverted PR fix(onboarding): auto-join invited members to General #16) is deleted separately — its work is fully resolved. contrib/push-gateway-image-override is kept until block/buzz#4722 closes.

Governance links

  • Fork contract: FORK.md · breach audit 000-docs/007-AA-AUDR-fork-contract-breach-2026-08-03.md
  • Canonical naming record: 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md § Revision 2026-08-07

Beads: buzz-v2p

  • Jeremy Longshore
    intentsolutions.io

Summary by CodeRabbit

  • Documentation

    • Updated Buzz architecture and naming guidance to reflect four active assets and the current three-plane workflow.
    • Clarified the production host’s canonical name and documented retirement of the contributor-lab and deferred-plugin repositories.
    • Added comprehensive review guidance covering governance, evidence, disclosure, status integrity, CI gates, and workflow standards.
  • Maintenance

    • Updated documentation integrity records, audit-harness references, and protected-file checks.
    • Recorded related work-item status changes and added follow-up tracking for production-state reconciliation.

… disambiguation rule they forced

WHAT
- 006 (canonical naming record): six assets -> four, all of which exist. The
  contributor-lab and deferred-plugin rows are gone; the "never write the bare
  phrase intent-ops-buzz" section is DELETED, not reworded; the four-plane flow
  and its ASCII diagram become three planes; the gate/boundary/IEP prose no
  longer routes through a lab that will not be built. A dated Revision
  2026-08-07 note records exactly what was removed and why.
- 001 (master blueprint): the ELab ledger row is dropped and Phase 6 is
  rewritten as CLOSED/deferred-indefinitely with the real reason. E9's phantom
  plugin-repo name is removed; the epic stays deferred.
- 000-INDEX: the 006 summary no longer advertises six assets or the deleted rule.
- CLAUDE.md: commits this session's fork-lane guidance (both gates, the two
  branch lanes, vendored-harness commands, task-state pointers) and drops the
  now-stale "host-vs-repo boundaries" phrasing.
- .harness-hash: re-pinned (see VERIFICATION).

WHY
Neither intent-solutions-io/intent-ops-buzz nor
intent-solutions-io/intent-ops-buzz-plugin has ever been created, and both are
still 404. The lab repo was additionally given the same string as the real
production VPS, and 006 papered over that collision with a rule enforced on
every mention ("a bare intent-ops-buzz is a defect, fix on sight"). A name that
needs a footnote every time it appears is the defect. Killing the phantom
removes the collision at the source, so the rule is deleted rather than policed.

Track C is closed as deferred-indefinitely: the contribution practice has
produced one upstream PR (block#4722) that needed no lab, and the flagship
candidate the lab was designed to verify was dropped -- Block fixed the relay
half independently (block#4196) and the desktop half was a fork-local defect.

Chose to AMEND 006 in place over superseding it with a 008: the change narrows
the record rather than reversing it, and six downstream docs cite 006 by number,
so amending keeps every existing pointer valid.

THE PRODUCTION HOST NAME IS UNCHANGED. intent-ops-buzz is a real VPS with DNS,
systemd units, compose files, and backup scripts; ~80 of the 86 references
across the estate are to it and are correct. This commit touches no prod, no
compose, no secrets, and no runbook procedure.

VERIFICATION
- scripts/audit-harness verify: exit 0. It exited 2 BEFORE this branch, on
  committed content -- 000-INDEX.md had drifted from its pin and
  007-AA-AUDR-* was never pinned (both landed via #17/#20 with no follow-up
  re-pin), so pre-push was red for everyone in this repo. Reviewed the drift,
  confirmed both were legitimate content changes, then re-pinned 006/001/
  000-INDEX and added 007 in one pass: "pinned 13 file(s)".
- scripts/fork-gates/check-additive-only.sh: "additive-only OK vs upstream/main".
- scripts/fork-gates/check-must-survive.sh: "must-survive set intact (12 paths)".
- grep -rn 'intent-ops-buzz' 000-docs/: every remaining hit is the production
  host, except 006's Revision note which documents the retirement itself.
- gh repo view intent-solutions-io/intent-ops-buzz: still 404 -- and now nothing
  claims otherwise.

RISK
Documentation only; no runtime surface. The reachable failure mode is a future
session looking for a lab repo that the docs no longer mention -- addressed by
the dated Revision note in 006, the CLOSED Phase 6 section in 001, and
intent-os decision-log/048.

UNFINISHED
The parked architecture draft lands in the private ops lane in a companion
intent-os PR (ops/buzz/PLAN-contrib-lab-architecture.md, DEFERRED) alongside
decision-log/048, which supersedes D138 in decision-log/040.

Beads: buzz-v2p
Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: da6082e3-b3a3-4b20-9e55-728e8ff5b4c3

📥 Commits

Reviewing files that changed from the base of the PR and between 2d251dd and 4cda592.

📒 Files selected for processing (1)
  • .beads/issues.jsonl
🚧 Files skipped from review as they are similar to previous changes (1)
  • .beads/issues.jsonl

📝 Walkthrough

Walkthrough

The PR retires phantom repositories, defers the contributor-lab architecture, preserves the production host name, revises Buzz to four assets and three planes, expands gate evidence, and adds fork review guidance with hash and gate protections.

Changes

Buzz governance and fork contract

Layer / File(s) Summary
Issue state and adoption plan
.beads/issues.jsonl, .beads/interactions.jsonl, 000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md
Records issue status, repository retirement, contributor-lab deferral, production-host boundaries, and operational findings.
Authoritative assets and execution boundaries
000-docs/000-INDEX.md, 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md
Defines four assets and three planes. Removes the contributor-lab stage, expands gate evidence, and assigns secrets and production state to the ops lane.
Fork guidance and review-policy enforcement
CLAUDE.md, REVIEW.md, FORK.md, scripts/fork-gates/*, .harness-hash*
Documents fork authority, branch lanes, review rules, gate commands, audit-harness operation, and hash protection. Adds REVIEW.md to the protected and allowed paths.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main documentation change: retiring two phantom Buzz repositories and removing the related naming disambiguation rule.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch chore/retire-phantom-lab-repos
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/retire-phantom-lab-repos

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kilo-code-bot

kilo-code-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

Code Review Summary

The review did not run because the selected model is no longer available.

Choose another model in Kilo Code review settings: https://app.kilo.ai/code-reviews

Previous Review Summaries (4 snapshots)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review

The review did not run because the selected model is no longer available.

Choose another model in Kilo Code review settings: https://app.kilo.ai/code-reviews

Previous review

The review did not run because the selected model is no longer available.

Choose another model in Kilo Code review settings: https://app.kilo.ai/code-reviews

Previous review

The review did not run because the selected model is no longer available.

Choose another model in Kilo Code review settings: https://app.kilo.ai/code-reviews

Previous review

The review did not run because the selected model is no longer available.

Choose another model in Kilo Code review settings: https://app.kilo.ai/code-reviews

@jeremylongshore

Copy link
Copy Markdown
Author

Linked bead: buzz-v2p (source of truth). Use bd-sync to mirror updates.

… flight, not landed

WHAT
006 and 001 both stated that Block "fixed the relay half independently
(block#4196)" as part of the rationale for closing Track C. Reworded to "Block has
its own upstream fix for the relay half in flight (block#4196, open at time of
writing)". Re-pinned .harness-hash for the two edited files.

WHY
block#4196 is OPEN, not merged -- verified against the GitHub API while
checking the same branch's other claims:

  $ gh pr view 4196 --repo block/buzz --json state,mergedAt
  {"mergedAt":null,"number":4196,"state":"OPEN", ...}

006 is the canonical naming record, so an overstated upstream status there
propagates to every doc that defers to it. The Track-C closure rationale is
unaffected in substance: the point is that the fork-local onboarding change was
dropped because upstream owns that fix, and that remains true whether block#4196 has
landed yet or not. The desktop half was a fork-local defect that had no
business on fork main regardless.

VERIFICATION
- scripts/audit-harness verify: exit 0 after re-pin.
- scripts/fork-gates/check-additive-only.sh: OK vs upstream/main.
- scripts/fork-gates/check-must-survive.sh: 12 paths intact.

Refs: #23
Beads: buzz-v2p
Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@jeremylongshore

Copy link
Copy Markdown
Author

bd-sync from buzz-v2p: Deleting stale remote branch fix/community-member-onboarding (the reverted PR #16 branch). Tip SHA recorded for recovery: a991d7c77643a59a76a9239bdc5cea98f24d7388. Its 6 commits are not ancestors of main (PR #16 was squash-merged, then reverted by #18), and each is resolved: the push-gateway CI fix is upstream as block/buzz#4722 (open) and also lives on contrib/push-gateway-image-override, which is KEPT until block#4722 closes; the nine RUSTSEC bumps were dropped because upstream carries them; the onboarding change was dropped because the relay half belongs upstream (Block's own #4196, open) and the desktop half was a fork-local defect that violated the additive-only contract. Recover with git fetch origin a991d7c77643a59a76a9239bdc5cea98f24d7388 if ever needed.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
000-docs/006-DR-STND-authoritative-naming-and-boundaries.md (1)

67-85: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Align the three-plane definition with the diagram.

The earlier boundary text identifies the code fork, live ops lane, and production host as the three planes. This section instead assigns the three jobs to IEP, Intent OS, and the host. The diagram also shows upstream, the code fork, IEP, the ops lane, and the host without assigning each box to a plane.

State explicitly whether IEP belongs to the contribution plane and define the code fork's role. Keep one plane mapping in both the prose and diagram.

As per coding guidelines, 006-DR-STND is canonical for asset naming and plane boundaries.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@000-docs/006-DR-STND-authoritative-naming-and-boundaries.md` around lines 67
- 85, Revise the “The three-plane flow” section so the prose and diagram use one
consistent plane mapping: explicitly place IEP within or outside the
contribution plane, define the code fork’s role, and identify how the upstream,
code fork, IEP, ops lane, and production host map to the three planes. Use
006-DR-STND’s canonical asset-naming and boundary definitions, and update both
the explanatory text and diagram together.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md`:
- Around line 92-94: Reconcile the E2d and E3 completion-ledger rows in the
blueprint with the current state recorded in .beads/issues.jsonl and
.beads/interactions.jsonl. Update them to reflect the permanent production URL,
passed production gate suite, and closed production epic, or explicitly mark the
outdated pre-cutover entries as historical so retired DNS/cutover work and
completed gates are not reopened.

In `@000-docs/006-DR-STND-authoritative-naming-and-boundaries.md`:
- Around line 111-114: Update the “code fork stays rebase-clean” guidance near
the additive-only rule to allow the declared fork-governance tooling and
divergences: scripts/fork-gates/, the vendored audit harness,
lefthook-local.yml, and the two documented divergences. Restrict the prohibition
to product and operational tooling while retaining the existing intent-only path
exclusions.

---

Outside diff comments:
In `@000-docs/006-DR-STND-authoritative-naming-and-boundaries.md`:
- Around line 67-85: Revise the “The three-plane flow” section so the prose and
diagram use one consistent plane mapping: explicitly place IEP within or outside
the contribution plane, define the code fork’s role, and identify how the
upstream, code fork, IEP, ops lane, and production host map to the three planes.
Use 006-DR-STND’s canonical asset-naming and boundary definitions, and update
both the explanatory text and diagram together.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a668bb7f-e4f3-4ab7-8cbf-d4ae98ab93d7

📥 Commits

Reviewing files that changed from the base of the PR and between 0611d14 and cc7841d.

📒 Files selected for processing (7)
  • .beads/interactions.jsonl
  • .beads/issues.jsonl
  • .harness-hash
  • 000-docs/000-INDEX.md
  • 000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md
  • 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md
  • CLAUDE.md

Comment thread 000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md
Comment thread 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md Outdated
…k-governance tooling in 006

WHAT
Two review findings on PR #23, both in text this branch touched:
- §3 "three-plane flow": the prose named IEP/IntentOS/host as the three planes
  while the diagram showed five boxes and §5 discussed fork/ops-lane/host, so a
  reader could not tell which boxes were planes. Now states outright that
  upstream and the fork are SOURCE (not planes), that the fork never decides,
  records, or runs, and tags every diagram box with its plane or SOURCE.
- §5 "boundaries": "internal tooling never enters the fork" contradicted the
  fork's actual surface. Narrowed to internal PRODUCT AND OPS tooling, with an
  explicit fork-governance exception naming scripts/fork-gates/, the vendored
  audit harness, and lefthook-local.yml as REQUIRED on governance main per
  FORK.md's must-survive table. Also made explicit that contrib/* excludes
  governance files too -- the two lanes never mix in either direction.

WHY
The §3 ambiguity is one I introduced in this branch by collapsing four planes
into three and leaving the diagram's box set unchanged. 006 is the canonical
naming and boundaries record; a plane mapping a reader has to infer is exactly
the class of defect this branch exists to remove.

The §5 contradiction is older -- the sentence predates this branch -- but it sits
in a section this branch rewrote, and it is a one-line carve-out rather than a
scope extension. Left as-is it says the fork gates violate the fork contract
they enforce.

DEFERRED, NOT FIXED (scope): the same review flagged that 001's E2d/E3 ledger
rows still describe pre-cutover production while the beads record the epic
closed 2026-07-30. That is pre-existing drift in lines this branch does not
modify, and reconciling it means asserting current production cutover state --
which needs verification against the host and the ops lane, not a docs edit.
Filed as bead buzz-51i.

VERIFICATION
- scripts/audit-harness verify: OK (re-pinned after the edit).
- scripts/fork-gates/check-additive-only.sh: OK vs upstream/main.
- scripts/fork-gates/check-must-survive.sh: 12 paths intact.
- `grep -n '^## ' 006`: sections still 1-6 with no renumbering, so the one
  in-repo cross-ref (`001` cites `006` §4 for the two gates) still resolves.

Refs: #23
Beads: buzz-v2p, buzz-51i
Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@jeremylongshore

Copy link
Copy Markdown
Author

Addressed the review in 3ed42b1a1.

Fixed (both in text this branch touched):

  1. §3 three-plane mapping was ambiguous — valid, and introduced by this branch: I collapsed four planes into three and left the diagram's box set unchanged, so the prose named IEP/IntentOS/host while the diagram showed five boxes and §5 discussed fork/ops-lane/host. §3 now states outright that upstream and the fork are SOURCE, not planes, that the fork never decides/records/runs, and every diagram box is tagged with its plane or SOURCE. The mapping is no longer left to inference — which is the exact defect class this branch exists to remove.

  2. §5 "internal tooling never enters the fork" contradicted the fork's own surface — valid. Narrowed to internal product and ops tooling, with an explicit fork-governance carve-out naming scripts/fork-gates/, the vendored audit harness, and lefthook-local.yml as required on governance main per FORK.md's must-survive table. Also made explicit that contrib/* excludes governance files too — the two lanes never mix in either direction. As written before, the canonical record said the fork gates violate the contract they enforce.

Deferred with a bead — buzz-51i:

  1. 001 E2d/E3 ledger rows are stale vs. bead state — the finding is correct, but it is pre-existing drift in lines this branch does not modify. This PR is scoped to retiring two phantom repositories; reconciling those rows means asserting current production cutover state, which needs verification against the host and the ops lane rather than a docs edit made in passing. Filed as buzz-51i with the risk recorded (001 is the standing execution authority, so stale rows can make a future session reopen retired cutover work).

Gates after the fix: audit-harness verify OK · check-additive-only.sh OK vs upstream/main · check-must-survive.sh 12 paths intact. 006's sections are still numbered 1–6 with no renumbering, so the one in-repo cross-ref (001 cites 006 §4 for the two gates) still resolves.

Note on the red Kilo Code Review check: it did not review anything — "the selected model is no longer available", a bot-settings issue already tracked as an owner action in the estate log, not a finding against this PR.

  • Jeremy Longshore
    intentsolutions.io

…l three gate surfaces

WHAT
- NEW REVIEW.md: repository-specific guidance for Kilo's automated PR reviewer,
  following the estate convention (intent-os, claude-code-plugins, and the three
  bobs-big-brain repos all carry a root REVIEW.md). Written for THIS repo rather
  than copied: the fork contract as the rule that outranks everything, the two
  branch lanes, public-repo disclosure safety, 006 as the canonical naming
  authority, the gate/pin mechanics, and severity calibration whose Critical
  tier is headed by "an upstream-owned path modified on main".
- Registered in all three places a new root file must appear, in lockstep:
  the ALLOW array in check-additive-only.sh, the MUST_SURVIVE array in
  check-must-survive.sh (12 -> 13 paths), and FORK.md's must-survive table.
- Added to .harness-hash-extra-patterns and re-pinned (13 -> 14 files).

WHY
This fork had no reviewer guidance at all, so the bot reviewed it as if it were
an ordinary repo -- with no idea that modifying an upstream-owned path is the
defect that matters most here. That is not hypothetical: PR #16 merged 14
upstream-owned paths onto main and had to be reverted
(000-docs/007-AA-AUDR-fork-contract-breach-2026-08-03.md). REVIEW.md puts the
contract, the breach audit, and the lane separation in front of the reviewer
before it reads a diff.

Verified REVIEW.md is NOT an upstream-owned path before adding it --
`git ls-tree upstream/main --name-only | grep -i '^review'` returns nothing --
so this is a true addition, not a third declared divergence.

The three-surface registration is not ceremony: check-additive-only.sh is a
strict prefix ALLOWLIST, so an unregistered new root file FAILS the gate rather
than passing silently. REVIEW.md is policy surface, so it is hash-pinned for the
same reason FORK.md is -- a silent edit to reviewer instructions is exactly the
drift the pin exists to catch. Chose to pin it over leaving it unpinned because
reviewer guidance that can be quietly weakened is worse than none.

VERIFICATION
- scripts/audit-harness verify: OK (14 files pinned, REVIEW.md among them).
- scripts/fork-gates/check-additive-only.sh: OK vs upstream/main.
- scripts/fork-gates/check-must-survive.sh: "must-survive set intact (13 paths)".
- Confirmed the gate would have rejected REVIEW.md before registration: it is a
  prefix allowlist with no wildcard for root files.

RISK
No runtime surface. The one real risk is the allowlist and FORK.md drifting
apart in future -- REVIEW.md itself now instructs the reviewer to flag a PR that
edits one without the other.

Refs: #23
Beads: buzz-v2p
Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@jeremylongshore

Copy link
Copy Markdown
Author

bd-sync from buzz-v2p: Scope addition (owner request mid-flight): added a fork-specific REVIEW.md — this repo had NO reviewer guidance, so the PR bot reviewed it as an ordinary repo with no notion that touching an upstream-owned path is the defect that matters most here (exactly how PR #16's breach got through). Registered across all three surfaces that a new root file must appear in, in lockstep: the ALLOW array in check-additive-only.sh, MUST_SURVIVE in check-must-survive.sh (12→13 paths), and FORK.md's table; also hash-pinned (13→14 files) so reviewer instructions cannot be silently weakened. Verified REVIEW.md is NOT upstream-owned (git ls-tree upstream/main → no match), so it is a true addition, not a third declared divergence. Proved the registration is load-bearing by running the gate with the allowlist entry stripped: 'NON-ADDITIVE CHANGE vs upstream/main: REVIEW.md', exit 1.

Also addressed the CodeRabbit review on #23: fixed the §3 three-plane ambiguity I introduced (every diagram box now tagged with its plane or SOURCE) and the §5 'internal tooling never enters the fork' contradiction (fork-governance carve-out). Deferred the stale 001 E2d/E3 ledger rows as bead buzz-51i — pre-existing drift in unmodified lines, and reconciling it means asserting prod cutover state that needs verification, not a passing docs edit.

…zz-51i

Captures the bd-sync notes made while PR #23 was in flight: the stale-branch
tip SHA recorded before deletion, the REVIEW.md scope addition and its
three-surface registration, and the CodeRabbit review disposition. Also lands
buzz-51i, the deferred 001 ledger-reconciliation bead filed from that review.

The mirror is the tracked portable export; Dolt holds the authoritative
history. Flushed with bd export, not hand-edited.

Refs: #23
Beads: buzz-v2p, buzz-51i
Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@jeremylongshore

Copy link
Copy Markdown
Author

bd-sync from buzz-v2p: CI verdict: all checks green on #23 except the Kilo bot (not a required check; it is failing on 'selected model is no longer available', a bot-settings issue, not a finding).

Desktop Smoke E2E (4) failed once on thread-focus-mode.spec.ts — investigated rather than waved off, and it is a FLAKE. Evidence: (1) the PR's complete diff is 12 files — 000-docs/, CLAUDE.md, FORK.md, REVIEW.md, both gate scripts, .harness-hash*, .beads/ — with nothing under desktop/, crates/, web/, mobile/, or src/, so there is no mechanism by which it breaks a desktop E2E test; (2) the same shard already reported relay-reconnect.spec.ts as flaky-passed-on-retry in that very run; (3) gh run rerun --failed on the identical commit returned RUN=success with zero code changes.

Correction worth recording: I nearly reported this as pre-existing drift, but the four earlier pushes on this branch all CANCELLED their CI runs, so this was the first Desktop suite to complete on the branch and there was no prior green to compare against. The re-run is the evidence, not the assumption.

Required-check status: buzz#23 fork-contract PASS; intent-os#392 Gates + Drills + gitleaks all PASS. Both awaiting merge approval.

The bead read 'Install nak on the Buzz hosts and run the real functional-probe
rehearsal, then enable the prod updater timer'. Two of those three were already
true or are now done, and the stated blocker was never the real one:

- nak was ALREADY installed on both hosts; the bead had been blocked on that
  since 2026-07-29 on a wrong diagnosis.
- The real blocker was that the functional probe defaults to ws://127.0.0.1:3004
  while the relay is vhost-scoped, so loopback 404s on the WS upgrade and a
  healthy relay looks broken.
- The rehearsal is now done and green on staging AND production, and both hosts
  were promoted off a 32-day-stale image in the process (intent-os PR block#455).

What remains is one drill: a persistent smoke failure on the NEW digest with a
healthy old one, proving a clean revert without latching HOLD. Until that passes
the timer stays dormant. Retitled so the next reader sees the actual gate instead
of re-deriving it from a stale description.

Status returned to open — the work is not in flight, it is waiting on that drill.

Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.beads/interactions.jsonl:
- Around line 38-39: Synchronize the status for issue buzz-2i6 using bd or
bd-sync so the tracked snapshot in issues.jsonl matches the latest interaction
log state, open, and retains the corresponding update timestamp; do not edit
either JSONL file directly.

In @.beads/issues.jsonl:
- Line 24: Update the description of issue buzz-v2p in .beads/issues.jsonl so
the reference to block/buzz#4196 reflects its verified open status rather than
claiming Block fixed the relay half. Keep the Track C deferral rationale
accurate by stating only the confirmed outcome supported by that issue’s current
state.
- Line 18: The issue title overstates readiness by naming only the clean-revert
drill while the description still lists restore_stores and the real SBOM gate as
prerequisites. Update the issue title to include all remaining timer-enablement
gates, or remove each gate from the description only after recording evidence
that it passed.
- Line 18: Sanitize the public bead record for issue “buzz-2i6” by removing
production-host identities, deployment and updater configuration, probe
behavior, backup/restore details, private paths, and other operational runbook
content from its description and notes. Retain only a concise public-safe status
and planning summary, and move the removed operational details into the private
intent-os/ops/buzz/ lane.

In `@REVIEW.md`:
- Around line 120-123: The task-state instructions in REVIEW.md should require
all beads mutations and synchronization through bd-sync, explicitly prohibit raw
bd commands, and retain the buzz prefix and manual or bulk JSONL edit
restrictions.
- Around line 12-13: Update the repository read-order guidance in REVIEW.md to
require AGENTS.md first, followed by FORK.md and 000-docs/000-INDEX.md. Move
CLAUDE.md after this mandatory sequence only if it remains necessary, and remove
the existing order that places it first and AGENTS.md third.
- Around line 26-28: Reconcile the fork-owned path lists by comparing the ALLOW
array in check-additive-only.sh with the must-survive table in FORK.md. Add
.gitleaksignore to both FORK.md and MUST_SURVIVE if it is fork-owned, or remove
it from ALLOW if it is not; ensure future edits to either list require updating
the other.

In `@scripts/fork-gates/check-additive-only.sh`:
- Line 25: Update the matcher in the additive-only gate around the ALLOW-entry
loop so entries ending in “/” use prefix matching, while file entries such as
“REVIEW.md” require an exact path match. Preserve the existing allowlist
behavior and ensure any newly added root-level or prefix file is also documented
in FORK.md.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 41a1e38f-aa19-4803-85f7-d5c81f777f1c

📥 Commits

Reviewing files that changed from the base of the PR and between cc7841d and 2d251dd.

📒 Files selected for processing (10)
  • .beads/interactions.jsonl
  • .beads/issues.jsonl
  • .harness-hash
  • .harness-hash-extra-patterns
  • 000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md
  • 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md
  • FORK.md
  • REVIEW.md
  • scripts/fork-gates/check-additive-only.sh
  • scripts/fork-gates/check-must-survive.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • 000-docs/001-PP-PLAN-buzz-adoption-master-blueprint.md
  • 000-docs/006-DR-STND-authoritative-naming-and-boundaries.md

Comment thread .beads/interactions.jsonl
Comment on lines +38 to +39
{"id":"int-a5479c82c5d9c3c7da53d4baf4bb8f08","kind":"field_change","created_at":"2026-08-11T19:49:36.533530195Z","actor":"jeremylongshore","issue_id":"buzz-2i6","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
{"id":"int-9c727b473c1d75965374aa86d3810db0","kind":"field_change","created_at":"2026-08-11T20:37:16.384829305Z","actor":"jeremylongshore","issue_id":"buzz-2i6","extra":{"field":"status","new_value":"open","old_value":"in_progress"}}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Synchronize the status snapshot with the interaction log.

Line 39 changes buzz-2i6 to open, but .beads/issues.jsonl Line 18 still reports in_progress with the same update timestamp. Snapshot readers and replay readers will return different states. Update the bead through bd/bd-sync so both records agree.

As per coding guidelines, synchronize the tracked JSONL mirror with bd-sync, not raw JSONL edits.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.beads/interactions.jsonl around lines 38 - 39, Synchronize the status for
issue buzz-2i6 using bd or bd-sync so the tracked snapshot in issues.jsonl
matches the latest interaction log state, open, and retains the corresponding
update timestamp; do not edit either JSONL file directly.

Source: Coding guidelines

Comment thread .beads/issues.jsonl
{"_type":"issue","id":"buzz-yfe","title":"Encode durable Buzz operational expertise — reference, skill, operator agents","description":"Stop operating Buzz by trial-and-error. Produce source-grounded reference docs, a buzz-ops skill that bundles them, and validated operator agents that actually know how Buzz is wired. Built via /skill-creator and /agent-creator (IS 8-field spec), grounded in the references. Home: ops/buzz/reference/ (docs), intent-os .claude/ (skill+agents).","status":"closed","priority":1,"issue_type":"epic","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-31T03:27:11Z","created_by":"jeremylongshore","updated_at":"2026-07-31T03:37:21Z","closed_at":"2026-07-31T03:37:21Z","close_reason":"All 7 children closed: 2 references + skill + 3 agents + validation; all PASS the IS validators","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"buzz-ehv","title":"Community channel layout and identity roster — build clean, keep clean","description":"The buzz-prod community's channel architecture and member/agent identity hygiene. Ground truth + procedures: ops/buzz/RUNBOOK-channels.md (source-cited). SHIPPED this session (2026-07-31): the clean provider-first open layout (0-general pinned, ask, ai-wire, anthropic-* group, \u003cprovider\u003e-wire firehoses, topic *-wire, private sys-*); persona agents (Bumble/Fizz/Honey/CCA-F) purged; canonical names set (Buzz Admin, goose minimax3, AI Wire, humans); RUNBOOK-channels.md written. Open children below.","status":"open","priority":1,"issue_type":"epic","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-31T03:27:09Z","created_by":"jeremylongshore","updated_at":"2026-07-31T03:27:09Z","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"buzz-2i6","title":"Install nak on the Buzz hosts and run the real functional-probe rehearsal, then enable the prod updater timer","description":"The updater lane is deployed to staging (dormant) but the real functional-probe rehearsal is blocked: nak (the NIP-42 auth+publish+readback CLI the probe uses) is absent on the Buzz hosts. buzz-admin IS in the relay image. Steps: install nak on staging (+ prod), run functional-probe.sh against the live staging relay (throwaway member auth+publish+readback, un-invited refused, cleans up), then a controlled no-op-digest updater rehearsal on staging, THEN install-updater-lane.sh intent-ops-buzz --enable-timer for prod. Parent: buzz-ocv.4.","notes":"REHEARSAL PARTIAL on live staging 2026-07-29 (nak copied to /usr/local/bin/nak on the staging host; jq present). VERIFIED LIVE: closed relay up+healthy+CORS-applied; buzz-admin add-member/remove-member/list-members work — EXACT syntax is 'buzz-admin add-member --pubkey \u003chex-or-npub\u003e' (NOT positional; positional errors with usage). nak emits 64-char hex from 'nak key public'; relay accepts hex. add+remove round-trip proven; test member cleaned up (relay left clean: owner + 1 pre-existing member). REMAINING: the nak publish/readback NIP-42 flow hung with reactive '--auth' — the closed relay likely needs '--force-pre-auth' (authenticate BEFORE the EVENT/REQ), and readback (nak req -i \u003cid\u003e) on a closed relay also needs auth so the member NSEC must be threaded into functional-probe.sh's readback() (currently it only gets the event id). NEXT: (1) prove 'NOSTR_SECRET_KEY=\u003cnsec\u003e nak event -k1 -c X --auth --force-pre-auth \u003cws\u003e' returns an id against staging; (2) prove readback with the member key; (3) bake the verified commands + --pubkey into functional-probe.sh add_member/del_member/publish/readback; (4) then no-op-digest updater rehearsal on staging; (5) install-updater-lane.sh intent-ops-buzz --enable-timer.\nREHEARSAL DONE on staging (intent-os PR #288): nak installed on the staging host; functional-probe.sh fixed to the real NIP-42 flow (--sec, public wss through Caddy, --force-pre-auth readback, --pubkey, keygen newline, global cleanup trap) and PROVEN GREEN E2E against the live staging relay — member publish+readback, un-invited refused; smoke-suite PASS; unauth-matrix 6/6. Self-cleaning; staging membership left clean. REMAINING: install nak on the PROD host + run the same 3 gates against buzz-prod off-network; then enable the prod updater timer.\nAdvanced 2026-07-30 (ultracode Track-A workflow), timer NOT armed by design: (1) nak installed on prod host intent-ops-buzz (/usr/local/bin/nak, keygen verified); (2) wrapped-updater lane installed DORMANT via install-updater-lane.sh (no --enable-timer) — 6/6 lane scripts + both systemd units present, daemon-reload+syntax OK; (3) smoke-suite.sh + unauth-matrix.sh pushed (the installer omits them); (4) functional-probe rehearsal PASSED green against live prod (see buzz-nry.3 gate-suite run — member auth/publish/readback, un-invited refused, self-cleaned). VERIFIED dormant: timer disabled+inactive, updater.service never ran, serving digest unchanged (a0f672). REMAINING = arm the timer (systemctl enable --now) — HELD pending owner call: arming = unattended weekly pre-1.0 prod deploys with advisory-only scan, before apex cutover. Recommend arming AFTER apex cutover; lane is one command from armed.","status":"open","priority":1,"issue_type":"task","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-29T21:47:43Z","created_by":"jeremylongshore","updated_at":"2026-07-30T05:40:19Z","labels":["go-live","probe","updater"],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"buzz-2i6","title":"Enable the Buzz prod updater timer — blocked only on drilling the clean revert case, everything else is done and proven","description":"The updater lane is deployed to staging (dormant) but the real functional-probe rehearsal is blocked: nak (the NIP-42 auth+publish+readback CLI the probe uses) is absent on the Buzz hosts. buzz-admin IS in the relay image. Steps: install nak on staging (+ prod), run functional-probe.sh against the live staging relay (throwaway member auth+publish+readback, un-invited refused, cleans up), then a controlled no-op-digest updater rehearsal on staging, THEN install-updater-lane.sh intent-ops-buzz --enable-timer for prod. Parent: buzz-ocv.4.","notes":"REHEARSAL PARTIAL on live staging 2026-07-29 (nak copied to /usr/local/bin/nak on the staging host; jq present). VERIFIED LIVE: closed relay up+healthy+CORS-applied; buzz-admin add-member/remove-member/list-members work — EXACT syntax is 'buzz-admin add-member --pubkey \u003chex-or-npub\u003e' (NOT positional; positional errors with usage). nak emits 64-char hex from 'nak key public'; relay accepts hex. add+remove round-trip proven; test member cleaned up (relay left clean: owner + 1 pre-existing member). REMAINING: the nak publish/readback NIP-42 flow hung with reactive '--auth' — the closed relay likely needs '--force-pre-auth' (authenticate BEFORE the EVENT/REQ), and readback (nak req -i \u003cid\u003e) on a closed relay also needs auth so the member NSEC must be threaded into functional-probe.sh's readback() (currently it only gets the event id). NEXT: (1) prove 'NOSTR_SECRET_KEY=\u003cnsec\u003e nak event -k1 -c X --auth --force-pre-auth \u003cws\u003e' returns an id against staging; (2) prove readback with the member key; (3) bake the verified commands + --pubkey into functional-probe.sh add_member/del_member/publish/readback; (4) then no-op-digest updater rehearsal on staging; (5) install-updater-lane.sh intent-ops-buzz --enable-timer.\nREHEARSAL DONE on staging (intent-os PR #288): nak installed on the staging host; functional-probe.sh fixed to the real NIP-42 flow (--sec, public wss through Caddy, --force-pre-auth readback, --pubkey, keygen newline, global cleanup trap) and PROVEN GREEN E2E against the live staging relay — member publish+readback, un-invited refused; smoke-suite PASS; unauth-matrix 6/6. Self-cleaning; staging membership left clean. REMAINING: install nak on the PROD host + run the same 3 gates against buzz-prod off-network; then enable the prod updater timer.\nAdvanced 2026-07-30 (ultracode Track-A workflow), timer NOT armed by design: (1) nak installed on prod host intent-ops-buzz (/usr/local/bin/nak, keygen verified); (2) wrapped-updater lane installed DORMANT via install-updater-lane.sh (no --enable-timer) — 6/6 lane scripts + both systemd units present, daemon-reload+syntax OK; (3) smoke-suite.sh + unauth-matrix.sh pushed (the installer omits them); (4) functional-probe rehearsal PASSED green against live prod (see buzz-nry.3 gate-suite run — member auth/publish/readback, un-invited refused, self-cleaned). VERIFIED dormant: timer disabled+inactive, updater.service never ran, serving digest unchanged (a0f672). REMAINING = arm the timer (systemctl enable --now) — HELD pending owner call: arming = unattended weekly pre-1.0 prod deploys with advisory-only scan, before apex cutover. Recommend arming AFTER apex cutover; lane is one command from armed.\nUNBLOCKED AND MOSTLY DONE, but the timer is deliberately NOT enabled. The bead's stated blocker was wrong: nak was already installed on BOTH hosts. The real blocker was that the functional probe defaults to ws://127.0.0.1:3004 and the relay is vhost-scoped, so loopback returns 404 on the WS upgrade - a healthy relay looked broken. Rehearsal then found the lane had never been runnable at all: (1) BUZZ_IMAGE_CHANNEL=ghcr.io/block/buzz:relay is a 404 tag on both hosts; (2) DW_SMOKE_CMD was UNSET on both hosts and deploy-wrapper treats unset as SUCCESS, so every promotion would self-certify and auto-revert could never fire; (3) backup.sh/restore.sh were never shipped by install-updater-lane.sh so staging aborted at 'bound snapshot failed'. All four fixed in intent-os PR #455 with a new smoke-probe.sh that self-resolves RELAY_URL per host. PROVEN LIVE: smoke gate passes healthy and fails closed on both hosts; staging AND production promoted a0f67203 (built 2026-07-10, 32 days stale) -\u003e 4e31b7c7 (2026-08-08) with the functional probe green; prod verified after - NIP-11 200, 13 members and 483 channel/roster event pairs intact. This closes the RUSTSEC-2026-0225..0232 nostr bump and the relay subscription lock-inversion fix. TIMER STAYS DORMANT because the clean revert case is still unproven: a /bin/false drill did revert the image but could not confirm health so it paged and latched HOLD (correct fail-closed), and a once-fail drill was defeated by the wrapper's bounded smoke retry. Remaining before enabling: drill the clean revert, drill restore_stores (never exercised), and replace the always-pass advisory-scan with a real SBOM gate.","status":"open","priority":1,"issue_type":"task","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-29T21:47:43Z","created_by":"jeremylongshore","updated_at":"2026-08-11T20:37:16Z","started_at":"2026-08-11T19:49:36Z","labels":["go-live","probe","updater"],"dependency_count":0,"dependent_count":0,"comment_count":0}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Align the title with all remaining timer gates.

Line 18 says the updater is blocked only on the clean-revert drill. The same record lists the restore_stores drill and replacement of the always-pass advisory scan with a real SBOM gate. This mismatch can cause premature production timer enablement. Update the title or remove each remaining gate only after evidence is recorded.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.beads/issues.jsonl at line 18, The issue title overstates readiness by
naming only the clean-revert drill while the description still lists
restore_stores and the real SBOM gate as prerequisites. Update the issue title
to include all remaining timer-enablement gates, or remove each gate from the
description only after recording evidence that it passed.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Remove private operational detail from public bead records.

Lines 18 and 24 add production-host identity and deployment details, including updater state, image configuration, probe behavior, backup/restore work, and private intent-os/ops/buzz paths. Keep a short public status and move runbook and configuration details to the private ops lane.

As per coding guidelines, the public repository must contain only public-safe planning; runbooks, backups, and private operational configuration belong in intent-os/ops/buzz/.

Also applies to: 24-24

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.beads/issues.jsonl at line 18, Sanitize the public bead record for issue
“buzz-2i6” by removing production-host identities, deployment and updater
configuration, probe behavior, backup/restore details, private paths, and other
operational runbook content from its description and notes. Retain only a
concise public-safe status and planning summary, and move the removed
operational details into the private intent-os/ops/buzz/ lane.

Source: Coding guidelines

Comment thread .beads/issues.jsonl
{"_type":"issue","id":"buzz-nry.2","title":"Deploy production from the proven staging artifacts with fresh secrets and cut DNS over","description":"Deploy prod from the proven staging artifacts (same digest-pinned compose) with FRESH secrets minted on the new box (new relay identity, new bootstrap owner key until the owner's desktop key swaps in, new db/redis/minio; staging keys never promote). DNS cuts over to the prod host at go-live; the shared stack renames to the staging domain. Deploy specifics + addressing in intent-os ops/buzz. Depends on the bootstrap child.","notes":"Prod deploy DONE (apex cutover pending): staging-proven digest-pinned compose deployed with FRESH prod secrets; 4 containers healthy; own Caddy ingress TLS + security headers. REMAINING (gated on the owner's client-generated desktop key): DNS cutover to the prod host, rename staging to the staging domain, swap BUZZ_DOMAIN/RELAY_URL/CORS to the apex, swap RELAY_OWNER_PUBKEY to the owner's desktop pubkey. Addressing + specifics in intent-os ops/buzz.","status":"closed","priority":1,"issue_type":"task","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-29T16:31:22Z","created_by":"jeremylongshore","updated_at":"2026-07-30T07:17:44Z","closed_at":"2026-07-30T07:17:44Z","close_reason":"DONE 2026-07-30. Production deployed from proven staging artifacts with FRESH secrets on the dedicated host intent-ops-buzz, serving buzz-prod.intentsolutions.io (169.58.95.32). The 'cut DNS over' (apex → buzz.) requirement is DROPPED by owner decision 2026-07-30: buzz-prod.intentsolutions.io is the PERMANENT production URL (no apex cutover). Prod DNS is therefore already on its permanent, correct name — nothing further to cut over.","labels":["hosting"],"dependencies":[{"issue_id":"buzz-nry.2","depends_on_id":"buzz-nry","type":"parent-child","created_at":"2026-07-29T10:31:22Z","created_by":"jeremylongshore","metadata":"{}"},{"issue_id":"buzz-nry.2","depends_on_id":"buzz-nry.1","type":"blocks","created_at":"2026-07-29T10:31:31Z","created_by":"jeremylongshore","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"buzz-nry.1","title":"Bootstrap the new production host to estate conventions","description":"Bootstrap the dedicated prod host to estate ops/host conventions: Ubuntu 24.04, tailnet-only SSH, ufw, fail2ban, unattended-upgrades, docker, its own Caddy (separate ingress = separate failure domain), age host key + sops, borg client, Netdata (tailnet-bound). Host addressing, key paths, and access detail live ONLY in intent-os ops/buzz. Gated on the owner installing the dev-box SSH key.","status":"closed","priority":1,"issue_type":"task","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-29T16:31:15Z","created_by":"jeremylongshore","updated_at":"2026-07-29T18:06:58Z","started_at":"2026-07-29T17:57:57Z","closed_at":"2026-07-29T18:06:58Z","close_reason":"intent-ops-buzz bootstrapped to estate baseline + verified: Ubuntu 24.04.4 LTS, hostname intent-ops-buzz, joined tailnet [tailnet addr — intent-os ops/buzz] (untagged/user-owned, matching estate); ufw default-deny (tailnet-trusted iface + public 80/443 only, public 22 CLOSED/times-out); sshd key-only + PermitRootLogin no + PasswordAuthentication no; a non-root sudo admin account (NOPASSWD, docker group); fail2ban + unattended-upgrades active; 2G swap swappiness=10; docker 29.6 (log-rotation + live-restore) + compose v5.3; caddy 2.11 (own ingress); age host key at [host key path — intent-os ops/host] (recipient [host age recipient — intent-os ops/host/secrets]); borg client; sops 3.9.4; Netdata bound loopback+tailnet only (127.0.0.1:19999 + [tailnet addr — intent-os ops/buzz]:19999, not public). 7/7 services active.","labels":["hosting"],"dependencies":[{"issue_id":"buzz-nry.1","depends_on_id":"buzz-nry","type":"parent-child","created_at":"2026-07-29T10:31:15Z","created_by":"jeremylongshore","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0}
{"_type":"issue","id":"buzz-nry","title":"Stand up the dedicated Buzz production VPS and cut the prod domain over to it","description":"Track D: Buzz production runs on its OWN dedicated VPS (owner topology decision 2026-07-29, fork 000-docs/005) so a fast-moving pre-1.0 stack does not share a failure domain with revenue workloads. The shared-VPS stack becomes permanent STAGING (epic buzz-ocv). Prod = the proven staging artifacts (same digest-pinned compose) with FRESH secrets; staging keys never promote. All go-live gates run against prod before any invite. Concrete host detail (addressing, keys, DNS, deploy specifics) lives ONLY in the private intent-os ops/buzz lane.","notes":"GitHub: intent-solutions-io/buzz#9 — https://github.com/intent-solutions-io/buzz/issues/9. MIRROR RULE: bd-sync handles fan-out — `bd-sync note buzz-nry` and `bd-sync close buzz-nry` mirror to GH and Plane automatically.\n\nPlane: BUZZ-3 — (Plane, internal)\nProd pairing milestone 2026-07-30: mobile device pairing now LIVE on the production host (buzz-prod.intentsolutions.io) — sidecar + Caddy /pair deployed, owner confirmed a real device paired (intent-os PR #291). Prod relay + sidecar both healthy. Remaining under this prod epic: .2 apex DNS cutover off buzz-prod-\u003e buzz., .3 full go-live gate suite against prod.","status":"closed","priority":1,"issue_type":"epic","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-07-29T16:31:08Z","created_by":"jeremylongshore","updated_at":"2026-07-30T07:18:01Z","started_at":"2026-07-29T17:57:57Z","closed_at":"2026-07-30T07:18:01Z","close_reason":"EPIC DONE 2026-07-30. Dedicated Buzz production VPS (intent-ops-buzz, 169.58.95.32) stood up to estate conventions (.1), deployed with fresh secrets serving buzz-prod.intentsolutions.io (.2), and the full go-live gate suite passed against it (.3). Owner decision 2026-07-30: buzz-prod.intentsolutions.io is the PERMANENT production URL — the 'cut the prod domain over' (apex) part of this epic is intentionally NOT done and is retired, not deferred. All three children closed.","labels":["hosting"],"dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"buzz-v2p","title":"Retire the two phantom Buzz repositories and delete the naming-disambiguation rule they forced","description":"The naming record 006 reserved two GitHub repositories that were never created: intent-solutions-io/intent-ops-buzz (Track-C contributor lab) and intent-solutions-io/intent-ops-buzz-plugin (deferred operator plugin). The lab repo was given the same string as the real production VPS, and 006 papered over that collision with a 'never write the bare phrase intent-ops-buzz' rule enforced on every mention.\n\nRetire both phantom repos. With the lab gone there is no collision, so the disambiguation rule is DELETED rather than enforced. Track C is closed as deferred-indefinitely: the contribution practice produced one upstream PR (block/buzz#4722) that needed no lab, and the flagship candidate the lab was designed to verify was dropped (Block fixed the relay half in #4196; the desktop half was a fork-local defect). The parked architecture draft moves into version control at intent-os ops/buzz/PLAN-contrib-lab-architecture.md as DEFERRED.\n\nThe production host name intent-ops-buzz is UNCHANGED — it is a real VPS with DNS, systemd units, compose files, and backup scripts, and ~80 of the 86 references across the estate are to it and are correct.\n\nAlso fixes a currently-red gate: scripts/audit-harness verify exits 2 on committed content (000-INDEX drifted from its pin, 007-AA-AUDR was never pinned) — both landed via PRs #17/#20 without a follow-up re-pin, so pre-push is red for everyone in this repo.","acceptance_criteria":"006 lists four assets that all exist; the disambiguation section is deleted; the flow is three planes; 001 ledger has no ELab row and no phantom repo names; scripts/audit-harness verify exits 0; both fork gates green; the parked draft is in version control under intent-os ops/buzz/; decision-log/048 supersedes D138; stale branch origin/fix/community-member-onboarding deleted.","notes":"GitHub: intent-solutions-io/buzz#23 — https://github.com/intent-solutions-io/buzz/issues/23. MIRROR RULE: bd-sync handles fan-out — `bd-sync note buzz-v2p` and `bd-sync close buzz-v2p` mirror to GH and Plane automatically.\nDeleting stale remote branch `fix/community-member-onboarding` (the reverted PR #16 branch). Tip SHA recorded for recovery: `a991d7c77643a59a76a9239bdc5cea98f24d7388`. Its 6 commits are not ancestors of `main` (PR #16 was squash-merged, then reverted by #18), and each is resolved: the push-gateway CI fix is upstream as `block/buzz#4722` (open) and also lives on `contrib/push-gateway-image-override`, which is KEPT until #4722 closes; the nine RUSTSEC bumps were dropped because upstream carries them; the onboarding change was dropped because the relay half belongs upstream (Block's own `#4196`, open) and the desktop half was a fork-local defect that violated the additive-only contract. Recover with `git fetch origin a991d7c77643a59a76a9239bdc5cea98f24d7388` if ever needed.\nScope addition (owner request mid-flight): added a fork-specific `REVIEW.md` — this repo had NO reviewer guidance, so the PR bot reviewed it as an ordinary repo with no notion that touching an upstream-owned path is the defect that matters most here (exactly how PR #16's breach got through). Registered across all three surfaces that a new root file must appear in, in lockstep: the ALLOW array in check-additive-only.sh, MUST_SURVIVE in check-must-survive.sh (12→13 paths), and FORK.md's table; also hash-pinned (13→14 files) so reviewer instructions cannot be silently weakened. Verified `REVIEW.md` is NOT upstream-owned (`git ls-tree upstream/main` → no match), so it is a true addition, not a third declared divergence. Proved the registration is load-bearing by running the gate with the allowlist entry stripped: 'NON-ADDITIVE CHANGE vs upstream/main: REVIEW.md', exit 1.\n\nAlso addressed the CodeRabbit review on #23: fixed the §3 three-plane ambiguity I introduced (every diagram box now tagged with its plane or SOURCE) and the §5 'internal tooling never enters the fork' contradiction (fork-governance carve-out). Deferred the stale 001 E2d/E3 ledger rows as bead buzz-51i — pre-existing drift in unmodified lines, and reconciling it means asserting prod cutover state that needs verification, not a passing docs edit.\nCI verdict: all checks green on #23 except the Kilo bot (not a required check; it is failing on 'selected model is no longer available', a bot-settings issue, not a finding).\n\n`Desktop Smoke E2E (4)` failed once on `thread-focus-mode.spec.ts` — investigated rather than waved off, and it is a FLAKE. Evidence: (1) the PR's complete diff is 12 files — 000-docs/, CLAUDE.md, FORK.md, REVIEW.md, both gate scripts, .harness-hash*, .beads/ — with nothing under desktop/, crates/, web/, mobile/, or src/, so there is no mechanism by which it breaks a desktop E2E test; (2) the same shard already reported `relay-reconnect.spec.ts` as flaky-passed-on-retry in that very run; (3) `gh run rerun --failed` on the identical commit returned RUN=success with zero code changes.\n\nCorrection worth recording: I nearly reported this as pre-existing drift, but the four earlier pushes on this branch all CANCELLED their CI runs, so this was the first Desktop suite to complete on the branch and there was no prior green to compare against. The re-run is the evidence, not the assumption.\n\nRequired-check status: buzz#23 `fork-contract` PASS; intent-os#392 Gates + Drills + gitleaks all PASS. Both awaiting merge approval.","status":"in_progress","priority":2,"issue_type":"task","owner":"jeremylongshore@users.noreply.github.com","created_at":"2026-08-07T22:52:15Z","created_by":"jeremylongshore","updated_at":"2026-08-07T23:37:30Z","started_at":"2026-08-07T22:52:19Z","dependency_count":0,"dependent_count":0,"comment_count":0}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Correct the upstream issue state.

Line 24 says Block fixed the relay half in #4196. The supplied commit summary says block/buzz#4196 remains open rather than merged. Replace this statement with the verified status before using it to justify Track C deferral.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.beads/issues.jsonl at line 24, Update the description of issue buzz-v2p in
.beads/issues.jsonl so the reference to block/buzz#4196 reflects its verified
open status rather than claiming Block fixed the relay half. Keep the Track C
deferral rationale accurate by stating only the confirmed outcome supported by
that issue’s current state.

Comment thread REVIEW.md
Comment on lines +12 to +13
governance files on top. Read `CLAUDE.md` first, then `FORK.md`, then `AGENTS.md` (upstream-owned and
authoritative for all build, test, and architecture questions).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use the mandatory repository read order.

This sequence starts with CLAUDE.md, places AGENTS.md third, and omits 000-docs/000-INDEX.md. Change it to read AGENTS.md, then FORK.md, then 000-docs/000-INDEX.md. Read CLAUDE.md only after that sequence if it remains necessary.

As per coding guidelines: **/*: Follow the mandatory read order: AGENTS.md, then FORK.md, then 000-docs/000-INDEX.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@REVIEW.md` around lines 12 - 13, Update the repository read-order guidance in
REVIEW.md to require AGENTS.md first, followed by FORK.md and
000-docs/000-INDEX.md. Move CLAUDE.md after this mandatory sequence only if it
remains necessary, and remove the existing order that places it first and
AGENTS.md third.

Source: Coding guidelines

Comment thread REVIEW.md
Comment on lines +26 to +28
The machine form of the contract is the `ALLOW` array in
`scripts/fork-gates/check-additive-only.sh`; its human form is `FORK.md`'s must-survive table. The
two must stay in lockstep — **flag any PR that edits one without the other**.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Reconcile the allowlist and must-survive table.

This new lockstep claim is not true in the supplied files. scripts/fork-gates/check-additive-only.sh allows .gitleaksignore at Line 29, but the FORK.md must-survive table has no .gitleaksignore entry. Add the path to FORK.md and MUST_SURVIVE, or remove it from ALLOW after confirming that it is not a fork-owned path.

As per coding guidelines: FORK.md: Keep FORK.md and scripts/fork-gates/check-additive-only.sh in lockstep; flag any change to one without the other.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@REVIEW.md` around lines 26 - 28, Reconcile the fork-owned path lists by
comparing the ALLOW array in check-additive-only.sh with the must-survive table
in FORK.md. Add .gitleaksignore to both FORK.md and MUST_SURVIVE if it is
fork-owned, or remove it from ALLOW if it is not; ensure future edits to either
list require updating the other.

Source: Coding guidelines

Comment thread REVIEW.md
Comment on lines +120 to +123
Task state lives in beads (prefix `buzz`); `.beads/issues.jsonl` is the tracked portable mirror, and
the authoritative history is the local Dolt database. Change beads through `bd`/`bd-sync`, never by
hand-editing the JSONL. Flag manual JSONL edits, bulk regeneration, or a bead closed in the mirror
with no evidence in its reason.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not list raw bd as an allowed mutation path.

Line 122 says bd and bd-sync are interchangeable. The repository rule rejects raw bd commands. If a maintainer follows this wording, the local beads state can change without synchronizing .beads/issues.jsonl. Name bd-sync as the required synchronization path and explicitly exclude raw bd.

As per coding guidelines: .beads/**/*: Use the buzz prefix for beads task state and synchronize the tracked JSONL mirror with bd-sync, not raw bd commands.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@REVIEW.md` around lines 120 - 123, The task-state instructions in REVIEW.md
should require all beads mutations and synchronization through bd-sync,
explicitly prohibit raw bd commands, and retain the buzz prefix and manual or
bulk JSONL edit restrictions.

Source: Coding guidelines

# human contract; this array is its machine form).
ALLOW=(
"FORK.md"
"REVIEW.md"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Match REVIEW.md as an exact file.

The matcher at Line 51-52 applies "$a"* to every ALLOW entry. The new "REVIEW.md" entry therefore also allows REVIEW.md.bak and REVIEW.md/.... An unregistered path can bypass the additive-only gate. Match file entries exactly and reserve prefix matching for entries that end in /.

Match files exactly and directories by prefix
-  for a in "${ALLOW[@]}" "${CARRIED_PATCHES[@]}"; do
-    case "$path" in "$a"*) ok=1; break;; esac
+  for a in "${ALLOW[@]}" "${CARRIED_PATCHES[@]}"; do
+    if [[ "$a" == */ ]]; then
+      case "$path" in "$a"*) ok=1; break;; esac
+    elif [[ "$path" == "$a" ]]; then
+      ok=1
+      break
+    fi
   done

As per coding guidelines: {FORK.md,scripts/fork-gates/check-additive-only.sh}: Any new root-level or new-prefix file must be added to both the gate allowlist and FORK.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/fork-gates/check-additive-only.sh` at line 25, Update the matcher in
the additive-only gate around the ALLOW-entry loop so entries ending in “/” use
prefix matching, while file entries such as “REVIEW.md” require an exact path
match. Preserve the existing allowlist behavior and ensure any newly added
root-level or prefix file is also documented in FORK.md.

Source: Coding guidelines

… store-restore log line

buzz-2i6: the timer is now ENABLED on both hosts per owner decision (weekly,
Sun 05:30 UTC, randomized 600s). Before enabling, the clean revert case was
finally drilled and it PASSES: a persistent smoke failure on the newly promoted
digest — using a digest-aware fault that defeats the 3-attempt retry which beat
the previous drill — reverts the image to the known-good digest, re-runs the
REAL functional probe against the reverted relay, passes, and latches HOLD.

buzz-2i6.1: filed, then CORRECTED. The drill logged 'STORE-RESTORE FAILED after
revert — MANUAL recovery required' and I first filed that as a broken rollback.
Checking restore.sh showed it is by design: it refuses a live restore without
--in-place because a destructive DB rollback is human-gated per decision-log/038.
The updater calls it without that flag, so it always declines and pages — which
is correct for an unattended weekly job. The bead is now about the WORDING: that
line reads as a malfunction to whoever gets paged on a Sunday morning and will
send them hunting a bug that does not exist.

HOLD left by the drill was cleared on staging; both hosts verified healthy on
4e31b7c7 with no HOLD outstanding.

Signed-off-by: jeremylongshore <jeremylongshore@users.noreply.github.com>
@jeremylongshore

Copy link
Copy Markdown
Author

Superseded by #25. The canonical naming cleanup and reviewer guidance were carried forward onto the current synchronized branch, combined with the AGENTS/source-versus-ops cleanup, and revalidated against upstream/main.

@jeremylongshore
jeremylongshore deleted the chore/retire-phantom-lab-repos branch August 15, 2026 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant