Skip to content

Commit 3cdd65b

Browse files
claudepdurlej
andcommitted
Add ADRs 0009-0011 + edits to 0001/0003/0006/0007/0008 (operator review 2026-05-05)
Operator (`pdurlej`) reviewed all 8 Phase A ADRs via voice on 2026-05-05. Three new decisions and several refinements emerged. This commit captures all of them in one atomic batch. NEW ADRs: - 0009 Three-bucket classification with mandatory product-language explanations. Supersedes 0001. Drops `manual_only` (asks non-tech operator to flip a coin — antithetical to mission). Renames `review_needed` to `decision_needed` (product language, not programmer language). Mandates `trade_offs` field on every decision_needed/blocking finding so operator can decide without reading code. Phase B issue #27 tracks implementation. - 0010 Mandatory non-author AI reviewer + branch protection on every PR. Operator decision after Phase A retro surfaced incentive misalignment: Codex saw 9-of-13 MCP tests failing on Python 3.11 in Phase A and just fixed locally without escalation. New rule: every PR (every size class) needs >=1 approved review from an agent different from author. AI agent OK as reviewer (default rotation: claude reviews codex, codex reviews claude). Branch protection on `pdurlej/pyfallow/main` enabled by operator via Forgejo Settings 2026-05-05. Escalated to platform as proposal: https://git.pdurlej.com/pdurlej/platform/issues/75 - 0011 Adopt Forgejo-native CI pattern from parallel Codex thread's stash. Partially supersedes 0003 (workflow-shape part; runner-image fix from 0003 stays accepted). Operator: "since Codex independently arrived at this pattern, we should use it." Convergent design from two agents without coordination = strong signal. Forgejo-native action URLs (data.forgejo.org), ubuntu-22.04 explicit pin, persist-credentials false, dedicated scripts/ci/run_python_ci.py Python runner. Sister branch `feat/forgejo-native-ci-from-stash` will land the actual code (forthcoming). EDITS to existing ADRs (clarifying additions, not retroactive intent changes — original text preserved with operator-correction notes): - 0001: status flipped to "superseded by 0009" with note explaining Phase A namespace-unification stays; the next migration is in 0009. - 0003: status flipped to "partially superseded by 0011" with note clarifying that the runner-image fix stays correct; only the workflow shape is upgraded by 0011. - 0006: original Whisper-transcribed quote was garbled ("nie chcemy juz chcemy"); operator corrected to "a my chcemy! nie AI-slopowo, czyli myslac AI-em, uzywajac madrzej AI-a". Plus founding thesis added: "AI z dyscyplina = zajebista sprawa. AI bez dyscypliny = szum. Signal vs noise nie zmienia sie w historii, zmieniaja sie narzedzia." Plus window length clarified (operator: "kilka miesiecy" — combined with 0008's evidence-bounded refinement, window is no longer time-bounded). - 0007: bassist metaphor (musical) promoted to primary framing; "deterministic gate" stays as technical description. Plus AI-agent-vs-harness categorical distinction added: pyfallow, Forgejo Actions, pytest, ruff, mypy, platform.exe = harness; Iskra, Codex, Claude/Opus, GLM = agents. Pyfallow is bassist = harness = disciplined background member that lets vocalist/lead shine. - 0008: window definition flipped from time-bounded (4-6 weeks) to evidence-bounded (sufficient log/run/token-spend count, no calendar end). Plus infrastructure dependency: cron job on rs2000 (Forgejo issue #29) aggregates pyfallow CI artifacts weekly and posts to dogfood-evidence-inbox issue. Without aggregator, manual evidence collection is friction = decision blind = mission failure. decisions/README.md index updated to reflect new statuses and 3 new ADRs. This commit's PR is the first PR governed by the new mandatory- non-author-reviewer rule (ADR 0010) — meta-validation that the process works in practice. Co-Authored-By: pdurlej <pdurlej@noreply.git.pdurlej.com>
1 parent 1e4a631 commit 3cdd65b

9 files changed

Lines changed: 367 additions & 26 deletions

decisions/0001-classification-namespace-underscore.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# 0001 — Classification namespace = underscore
22

33
**Date:** 2026-05-04
4-
**Status:** accepted
4+
**Status:** superseded by [0009](0009-three-bucket-classification.md) (2026-05-05)
55
**Phase:** A1
66
**Authors:** Claude Opus 4.7 (orchestrator), Codex (executor)
77

8+
> **Supersession note (2026-05-05):** ADR 0001 unified the namespace correctly (silent bug resolved), but the four-bucket model itself was unexamined. Operator review 2026-05-05 surfaced that `manual_only` violates pyfallow's mission (asks non-technical operator to flip a coin) and `review_needed` is mis-named (programmer-language, not product-language). ADR 0009 supersedes with three-bucket model: `auto_safe` / `decision_needed` / `blocking` with mandatory product-language `trade_offs` explainability. The namespace-unification work in this ADR (Phase A commit `771c628`) stays — no code is reverted; ADR 0009 specifies the next migration in Phase B (issue #27).
9+
810
## Context
911

1012
Pre-Phase-A, MCP package `mcp/src/pyfallow_mcp/` carried two parallel namespaces for finding classification:

decisions/0003-forgejo-runner-ubuntu-latest.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# 0003 — Forgejo runner = ubuntu-latest, not docker:python
22

33
**Date:** 2026-05-04
4-
**Status:** accepted
4+
**Status:** partially superseded by [0011](0011-forgejo-native-ci-pattern.md) (2026-05-05)
55
**Phase:** A3
66
**Authors:** Claude Opus 4.7 (orchestrator), Codex (executor)
77

8+
> **Supersession note (2026-05-05):** The runner-image fix (drop `container: python:3.12` directive, use `ubuntu-latest`) is correct and **stays accepted**. ADR 0011 supersedes the *workflow-shape* portion (now uses Forgejo-native action URLs `https://data.forgejo.org/...`, `ubuntu-22.04` explicit pin, `persist-credentials: false`, dedicated Python runner script `scripts/ci/run_python_ci.py`) per operator decision 2026-05-05 to adopt the parallel Codex thread's stash pattern. Reason: parity with `pdurlej/platform/.forgejo/workflows/python-ci.yml`, and convergent independent design (two agents arrived at same pattern without coordination = strong signal it's right).
9+
810
## Context
911

1012
`examples/ci/forgejo-actions.yml` (template shipped to pyfallow users for their own Forgejo CI) specified:

decisions/0006-dogfood-pivot-anti-slop.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,38 @@
11
# 0006 — Dogfood-first, Show-HN-later (anti-AI-slop)
22

3-
**Date:** 2026-05-04
3+
**Date:** 2026-05-04 (transcription corrected + thesis added 2026-05-05)
44
**Status:** accepted
55
**Authors:** operator (`pdurlej`) — decision-maker; Claude Opus 4.7 — recording
66

7+
> **Edit note 2026-05-05:** Operator-corrected the original Whisper transcription (which was garbled with two contradicting clauses) and added a stronger founding thesis. Decision intent unchanged; the corrected text below is canonical.
8+
79
## Context
810

911
Pre-decision plan (orchestrator's draft) was: Phase A → Phase B (engineering hardening) → Phase C (Show HN polish) → Show HN within ~2 weeks. Tickets in `.codex/MASTER/PHASE-B/` and `PHASE-C/` were ready for Codex execution.
1012

11-
Operator pushed back with strategic redirection during chat 2026-05-04 (transcribed):
13+
Operator pushed back with strategic redirection during chat 2026-05-04. Operator-corrected canonical version (2026-05-05):
14+
15+
> "Zdecydowanie jestem vibe coderem, który musi to przetestować. Musimy sami zrobić dogfooding i wrzucić do tego tematu za miesiąc czy dwa w takim tempie kodowania. I tutaj poprosić wszystkich agentów, którzy współpracują na platformie, żeby zrobili audyt i uważają, że pyfallow naprawdę im pomaga. Jeśli tak, super. Jeśli nie, niefajnie. (...)
16+
>
17+
> Jest teraz bardzo dużo AI-slopu, a my chcemy! **Nie AI-slopowo, czyli myśląc AI-em, używając mądrzej AI-a, zrobić naprawdę perełkę.**"
18+
19+
Translation (operator-corrected): "I'm a vibe coder who has to test this. We need to dogfood ourselves first, come back to it in a month or two at this coding pace. Ask all agents working on the platform to audit, see if pyfallow actually helps them. (...) There's a lot of AI-slop right now and we want — not in an AI-slop way, but **by thinking with AI, using AI more wisely** — to make something genuinely a gem."
20+
21+
The original Whisper transcription had garbled the second sentence as "a my nie chcemy już chcemy AI-slopowo" (two contradicting clauses). The corrected version above is canonical.
22+
23+
### Founding thesis (added 2026-05-05)
24+
25+
Subsequent voice review surfaced a stronger formulation that anchors pyfallow's positioning:
26+
27+
> "AI z dyscypliną — zajebista sprawa. AI bez dyscypliny — to jest szum. Signal vs noise nic nie zmienia w historii ludzkości, tylko zmieniają się narzędzia."
28+
29+
Translation: "AI with discipline is a brilliant thing. AI without discipline is noise. Signal vs noise doesn't change in human history — only the tools change."
30+
31+
This is the differentiator. Pyfallow is **not anti-AI**; pyfallow is **the discipline that turns AI from slop into signal**. Bassist (per ADR 0007 edit 2026-05-05) for the AI-agent band. The narrative for Show HN, when it eventually comes, builds on this thesis.
1232

13-
> "zdecydowanie jestem vibe coderem, który musi to przetestować. Musimy sami zrobić dogfooding i wrzucić do tego tematu za miesiąc czy dwa w takim tempie kodowania. I tutaj poprosić wszystkich agentów, którzy współpracują na platformie, żeby zrobili audyt i uważają, że pyfallow naprawdę im pomaga. Jeśli tak, super. Jeśli nie, niefajnie. (...) Jest teraz bardzo dużo AI-slopu, a my nie chcemy już chcemy AI-slopowo zrobić naprawdę perełkę."
33+
### Window length (clarified 2026-05-05)
1434

15-
Translation: "I'm a vibe coder who has to test this. We need to dogfood ourselves first, come back to it in a month or two at this coding pace. Ask all agents working on the platform to audit, see if pyfallow actually helps them. If yes, great. If not, not-so-great. (...) There's a lot of AI-slop right now and we don't want to AI-slop our way to a real gem."
35+
Operator clarified the dogfood window is "kilka miesięcy" (several months), not 4-6 weeks as originally drafted. Combined with operator's voice on evidence-bounded triage (recorded in ADR 0008 edit 2026-05-05), the window is no longer time-bounded at all — it ends when sufficient evidence count is reached, not on a calendar date.
1636

1737
Plus the operator's **founding principle** (recorded earlier same day, also transcribed):
1838

decisions/0007-pyfallow-as-deterministic-gate.md

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
# 0007 — Pyfallow as deterministic code gate (counterpart to platform.exe)
1+
# 0007 — Pyfallow as bassist (counterpart to platform.exe; harness, not agent)
22

3-
**Date:** 2026-05-04
3+
**Date:** 2026-05-04 (metaphor refined + harness-vs-agent distinction added 2026-05-05)
44
**Status:** accepted
5-
**Authors:** Claude Opus 4.7 — articulating; operator (`pdurlej`) — direction
6-
**Related:** ADR 0006 (dogfood pivot), `pdurlej/platform/PLATFORM_CONSTITUTION.md` (counterpart identity)
5+
**Authors:** Claude Opus 4.7 — articulating; operator (`pdurlej`) — direction + metaphor
6+
**Related:** ADR 0006 (dogfood pivot, anti-AI-slop), ADR 0010 (mandatory non-author reviewer), `pdurlej/platform/PLATFORM_CONSTITUTION.md` (counterpart identity)
7+
8+
> **Edit note 2026-05-05:** Original draft used "deterministic gate" as primary framing. Operator review surfaced a better metaphor — **bassist** (musical) — and an important categorical distinction: **AI agent vs harness**. This edit promotes the bassist metaphor to primary; "deterministic gate" stays as the technical description. Decision intent unchanged.
79
810
## Context
911

@@ -31,12 +33,40 @@ Pyfallow's position in operator's ecosystem (mirroring `PLATFORM_CONSTITUTION.md
3133

3234
| Actor | Role | Domain |
3335
|---|---|---|
34-
| **Iskra** | Relational, memory-rich, reflects on operator's decisions | Conversation, reflection, suggestion |
35-
| **`platform.exe`** | Deterministic, stateless, audit-logged | Infrastructure manifests ↔ runtime on RS 2000 + VPS 1000 |
36-
| **Pyfallow** | Deterministic, stateless, audit-logged | Code structural integrity ↔ committed source |
37-
| **Codex** | Producer; executes per master prompts | All edits to code, manifests, prompts |
38-
| **3+3 canary ensemble** | Six diverse review voices | PRs touching governance paths |
39-
| **Operator (`pdurlej`)** | Final approver | Merges, strategic decisions |
36+
| **Iskra** | Vocalist — relational, memory-rich, reflects on operator's decisions | Conversation, reflection, suggestion |
37+
| **`platform.exe`** | Deterministic, stateless, audit-logged — **harness** | Infrastructure manifests ↔ runtime on RS 2000 + VPS 1000 |
38+
| **Pyfallow** | Bassist — deterministic, stateless, audit-logged — **harness** | Code structural integrity ↔ committed source |
39+
| **Codex** | Producer / drummer — executes per master prompts (rhythm + execution) | All edits to code, manifests, prompts |
40+
| **Claude / Opus** | Lead guitarist — orchestrates, articulates, holds strategic context | PM-role, review, briefs, coordination |
41+
| **3+3 canary ensemble** | Six review voices (musical critics) | PRs touching governance paths |
42+
| **Operator (`pdurlej`)** | Bandleader — final approver | Merges, strategic decisions, breakglass |
43+
44+
## Bassist metaphor (operator's framing, 2026-05-05)
45+
46+
> "Pyfallow ma być basistą, jak w zespole muzycznym. Pyfallow ma być z tyłu zespołu Iskry i z tyłu zespołu Cloud'a, OpenAI, Opus'a, wszystkich was. Robić robotę i sprawdzać, żebyście mogli shine. Podobnie jak Forgejo Actions."
47+
48+
Translation: "Pyfallow should be the bassist, like in a music band. Pyfallow stands behind Iskra's band and behind the Cloud / OpenAI / Opus / all-of-you band. Doing the work and checking, so you can shine. Like Forgejo Actions."
49+
50+
Bassist is in nearly every song. Holds the rhythm. **Doesn't try to be the lead vocal.** Without a bassist, the band sounds empty; with a bassist, vocalist and lead guitarist shine. The audience often doesn't notice the bassist — that's part of the role. The bassist is felt more than heard.
51+
52+
Pyfallow = bassist for the AI-agent band.
53+
54+
## AI agent vs harness (operator's distinction, 2026-05-05)
55+
56+
> "Jedna rzecz to AI agent. Druga rzecz to harness — MCP, tool-skill. Pyfallow ma być basistą."
57+
58+
Translation: "One thing is AI agent. Another thing is harness — MCP, tool-skill. Pyfallow should be the bassist."
59+
60+
Two categories of technical infrastructure in operator's ecosystem:
61+
62+
| Category | Examples | Job |
63+
|---|---|---|
64+
| **AI agent** | Iskra, Codex, Claude / Opus, GLM | Reason, plan, decide, articulate, generate |
65+
| **Harness** | Pyfallow, MCP servers, Forgejo Actions, pytest, ruff, mypy, `platform.exe` | Verify, gate, render, store, execute deterministically |
66+
67+
Harness ≠ agent. Harness is **stateless tooling** that agents (or operators) call. Agents have memory (Iskra's MEMORY.md, conversation history) and judgment (taste, preference, opinion). Harness has **inputs and outputs** and **never an opinion**.
68+
69+
Pyfallow is a harness. Bassist. Disciplined background member.
4070

4171
Pyfallow makes the same kind of promise `platform.exe` makes, just at a different layer:
4272

decisions/0008-phase-b-c-evidence-gated.md

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# 0008 — Phase B/C execution gated on dogfood evidence
22

3-
**Date:** 2026-05-04
3+
**Date:** 2026-05-04 (window definition refined 2026-05-05)
44
**Status:** accepted
55
**Authors:** operator (`pdurlej`) — direction; Claude Opus 4.7 — recording
6-
**Related:** ADR 0006 (dogfood pivot), ADR 0007 (deterministic gate identity)
6+
**Related:** ADR 0006 (dogfood pivot), ADR 0007 (bassist metaphor / harness identity), ADR 0010 (mandatory non-author reviewer)
7+
8+
> **Edit note 2026-05-05:** Original draft fixed the dogfood window to 2026-05-04 → 2026-06-15 (4-6 weeks). Operator review surfaced that **time is the wrong axis** — what matters is evidence count, not calendar date. This edit replaces fixed-date window with evidence-bounded definition. Plus adds infrastructure dependency (cron job on rs2000) per operator's voice.
79
810
## Context
911

@@ -25,7 +27,43 @@ Tickets remain **open but unstarted** until the dogfood window closes (~2026-06-
2527
2. Each project's daily Codex/operator workflow accumulates evidence in a `.codex/DOGFOOD-LOG.md` (gitignored per `docs/dogfood-log-template.md`)
2628
3. **Phase B/C tickets do not get worked on**, even if Codex has spare capacity. Polishing from imagination defeats the purpose.
2729

28-
At end of window, evidence triages tickets:
30+
## Evidence-bounded window (refined 2026-05-05)
31+
32+
Operator's voice 2026-05-05:
33+
34+
> "W zależności od tego jak dużo tokenów spalę, będziemy w stanie określić, jak szybko wyśliemy sobie, że pyfallow dobrze działa. Jeśli spalę setki tysięcy tokenów, to będziemy wiedzieli dość dobrze. Jeśli będę bardzo mało używał, to nie będziemy wiedzieli czy działa. Tutaj chodzi o liczbę logów. Powinniśmy zależeć nie od czasu."
35+
36+
Translation: "Depending on how many tokens I burn, we'll be able to determine how quickly we know pyfallow works. If I burn hundreds of thousands of tokens, we'll know pretty well. If I use very little, we won't know if it works. It's about the number of logs. We should depend not on time."
37+
38+
The window has **no fixed end date**. Window closes when **sufficient evidence count** is reached — measured by:
39+
40+
1. **Number of pyfallow CI runs across integrated repos** — proxy for how many opportunities pyfallow had to surface findings
41+
2. **Number of dogfood log entries** of class `[TP]`, `[FP]`, `[FN]`, or `[FRICTION]` — proxy for how many findings were notable enough to record
42+
3. **Token spend on pyfallow-gated commits** — proxy for operator's actual usage intensity
43+
44+
Loose threshold (re-evaluated as evidence accumulates): when there are **at least 100 pyfallow CI runs total across all integrated repos AND at least 20 dogfood log entries** with category breakdown that's not dominated by `[FRICTION]` only (we want to see real `[TP]`/`[FP]` signal), the orchestrator + operator do the triage session.
45+
46+
If after several months no integrated repo accumulates that volume, that itself is evidence: pyfallow isn't getting enough use to claim usefulness. Different decision required (drop project, pivot, or restart with more aggressive integration).
47+
48+
## Infrastructure dependency
49+
50+
Evidence collection requires aggregation infrastructure. Operator's decision (voice 2026-05-05): **cron job on rs2000** (operator's primary server, where Forgejo runs).
51+
52+
Cron job specs (tracked as Forgejo issue #29):
53+
- Weekly schedule (Sunday 04:00 — operator-attention-friendly)
54+
- Fetches all completed pyfallow CI workflow runs across operator's integrated repos
55+
- Downloads `pyfallow-report.json` artifacts
56+
- Aggregates findings by rule, by repo, by week-over-week trend
57+
- Posts as comment on a separate Forgejo issue tagged `pyfallow-dogfood-evidence-inbox` (ever-open issue, single source of truth for aggregated evidence)
58+
- Identity: cron runs as `claude` user (orchestrator role), claude PAT from rs2000 secrets store
59+
60+
Without this aggregator, evidence collection becomes 30+ artifact downloads after months of dogfood = friction = operator skips analysis = decision blind. With aggregator, evidence is delivered ready-to-read.
61+
62+
Implementation lands within first 2-3 weeks of dogfood window opening (i.e., before evidence really accumulates and the manual aggregation pain becomes acute).
63+
64+
## Triage trigger
65+
66+
When the evidence threshold is reached, evidence triages tickets:
2967

3068
| Evidence | Effect on ticket |
3169
|---|---|
@@ -46,8 +84,9 @@ After triage, Codex executes a fresh wave of master prompts based on the **re-pr
4684
- New observations during dogfood window can open new issues that compete for priority with Phase B/C tickets on equal footing.
4785

4886
**Negative:**
49-
- 4-6 weeks of "plans in storage." Risk: planning effort decay. Mitigation: briefs are written down (`.codex/MASTER/`) and cross-referenced from issue bodies; no work is lost, just deferred.
50-
- Operator must actually do the dogfood logging. Mitigation: documented protocol, calendar reminder via Iskra Inbox notatka.
87+
- Several months of "plans in storage." Risk: planning effort decay. Mitigation: briefs are written down (`.codex/MASTER/`) and cross-referenced from issue bodies; no work is lost, just deferred.
88+
- Operator must actually do the dogfood logging. Mitigation: cron aggregator (issue #29) + Iskra Inbox notatka with reminder.
89+
- Evidence-bounded means uncertainty: we don't know in advance when window closes. Mitigation: weekly cron aggregation gives operator a continuous read on accumulated evidence; threshold judgment can be made any week.
5190

5291
**Neutral:**
5392
- Issue migration was carried out by `claude` (orchestrator) on 2026-05-05 using a Python script (`/tmp/issue_migration.py`) calling Forgejo API with claude PAT. 22 issues created (#4-#25). Each issue body links to the local `.codex/MASTER/PHASE-?/...` brief and explains the dogfood gating.

0 commit comments

Comments
 (0)