MEMORY
memory/localmode-1060dea9-0dc3-42b4-958d-2a6f7a6c0c58/g-review-adopted-practices.md
sha256 25844e4b25888acc · 5824 bytes ·
original held in the private archive
---
name: g-review-adopted-practices
description: "⭐ The G blind workflow review (GPT-5.6 Sol + Gemini 3.1 Pro + DeepSeek, blind; + Dispatch's own findings) ran 2026-07-22. Its verified findings + the Dispatch practices adopted from it. All three externals converged on the CONTROL PLANE around the work (not the build loop, which they judged already strong). Claim-ledger: planning/audits/G_workflow_review/CLAIM_LEDGER.md (archive-synced, NOT public — critiques internal orchestration)."
metadata:
node_type: feedback
type: feedback
originSessionId: 1060dea9-0dc3-42b4-958d-2a6f7a6c0c58
modified: 2026-07-23T12:57:54.912Z
---
**The G review (2026-07-22):** three external models, blind to each other, plus Dispatch's own findings. Sources verbatim/captured in `planning/audits/G_workflow_review/sources/{gpt,gemini,deepseek,claude}.md`; the verified claim-ledger is `planning/audits/G_workflow_review/CLAIM_LEDGER.md`. Owner instruction: hold synthesis until all three were in; then "go with recs on all of it," implement the worthwhile ones.
## THE HIGH-CONFIDENCE CONVERGENCE (all three, independently)
1. **Worktree isolation is asserted, not enforced — `eslint .` (whole working dir, incl. untracked) in the pre-push gate is the concurrency-collision root cause.** Fix = scope the push-gate lint to tracked/committed files (or run from a clean detached worktree at the candidate commit). Cheap, kills the class. THE #1 fix.
2. **Protocol 41 junk-sweep is concurrency-unsafe** — never delete files this session didn't create.
3. **Dissent-burial (§15) isn't solved by a ledger alone** because Dispatch controls what enters it. Structural fix: source-owned finding IDs + a disposition for EVERY id + dissent copied verbatim → burial becomes detectable.
4. **"Dispatch proposals are hypotheses" should be a RULE, enforced at the EDGE** (the repo-aware planning/implementation session validates each Dispatch-origin assumption against the code and records accept/change/reject) — NOT Dispatch policing itself. Cheapest high-value governance change.
5. **No-completion-event is a real, unfixable tooling constraint** — proactive notification is impossible. Mitigation = a generated run-registry so live state survives Dispatch's turn ending + reconcile-on-resume.
## THE SHARP DISSENT (kept, not averaged) — the spare laptop
GEM + DS: adopt the spare laptop to fix concurrency + add async "done" pings. **GPT + Dispatch DISSENT and this is the accepted position:** *"the concurrency incident does not justify new hardware — it demonstrates incorrect workspace ownership."* Fix isolation in SOFTWARE first (one-line lint scoping); the laptop's only unique value is async completion pings, a bounded nice-to-have, NEVER the authoritative gate. **DEFERRED** (owner nodded). Do not re-propose the laptop as a concurrency fix.
## GPT-ONLY, ADOPTED
- **Spec receipt** on every task brief: separate (verbatim owner words) / (binding decisions) / (Dispatch assumptions-hypotheses) / (deferred) / (acceptance criteria), so the owner can catch a MIS-CONSOLIDATED spec before four stages execute the wrong thing perfectly. Extra-load-bearing here because [[dispatch-midflight-messages-unreliable]] means a bad brief = a wasted run (can't patch mid-flight).
- **Release receipt**: "pushed" ≠ "live." Prove served-hash matches the commit + SW actually updated + a real save survived. (Our worst-ever bug was a silent SW update failure.) → being built.
- **"Orchestrator memory is a locator, never evidence of current repo state"** — resolve paths/casing/queue-status/hashes/"live" deterministically before reporting. (Matches [[time-and-work-attribution]] + the stale-museum-path incident.)
- **One outbound + one inbound per external model per review; don't relay models back and forth** ("produces rhetorical convergence, not repository evidence"). One round was right for G; no follow-up prompts sent.
## GEMINI-ONLY, being actioned
- **Orchestrator-memory DR**: can a FRESH Dispatch rehydrate memory + queue from the archive? Verify the sync captures both + a restore path. → being verified/built.
## DISPATCH PRACTICES NOW ADOPTED (behavioral — no build)
- Write briefs in the spec-receipt shape (above).
- Own every run I launch until terminal; reconcile live runs on resume before starting new work; never launch a duplicate while the original is running/unknown (ties to [[dispatch-session-launch-discipline]] + [[dispatch-task-kind-network-isolation]]).
- Resolve repo facts deterministically, never from memory, before reporting.
- ⭐ **REPORT CADENCE (owner "go with recs", 2026-07-22):** immediate proactive SendUserMessage for **completions, decisions-needed, and anomalies**; **routine all-green intermediate landings BATCH into the owner's next check-in** instead of firing standalone. ⚠ **BATCHED ≠ DROPPED** — every landing is still reported IN FULL when surfaced, never summarized-down (that's the "compress until owner can't steer" failure from [[session-reporting-standard]], which still governs). To be codified into CLAUDE.md Protocol 8 (reporting).
## WHAT THEY SAID NOT TO TOUCH (the build loop is already strong)
Do NOT add more branches, models, CI legs, broad checklists, or generic review stages. Do NOT cut without contrary measured evidence: diff-first independent audit, real UI rendering, offline+save-survival tests, release tags, push hash-verify, the two-layer rulebook + retirement rule, "reports are claims not evidence." The weaknesses are the CONTROL PLANE (select/launch/summarize/declare-done), not the core workflow.
Related: [[dispatch-midflight-messages-unreliable]], [[dispatch-task-kind-network-isolation]], [[dispatch-session-launch-discipline]], [[session-reporting-standard]], [[external-ai-prompt-delivery]], [[self-improving-code]].
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).