Add decisions/ directory with 8 ADRs from Phase A + strategic pivots #26

Merged
pdurlej merged 4 commits from decisions/initial-adr-migration into main 2026-05-05 09:01:03 +02:00
Collaborator

Per operator's request 2026-05-05: migrate decisions from .codex/DECISIONS.md (gitignored working notes) into git history as numbered ADRs. Pattern follows Michael Nygard's convention and mirrors pdurlej/platform/decisions/.

What's in this PR

  • decisions/README.md — convention, index, relationship to .codex/DECISIONS.md
  • decisions/0001-classification-namespace-underscore.md — A1 (silent bug fix)
  • decisions/0002-baseline-validation-config-error.md — A2 (better errors)
  • decisions/0003-forgejo-runner-ubuntu-latest.md — A3 (live-verified)
  • decisions/0004-test-normalize-dataclass-branch.md — A4 (Python 3.11)
  • decisions/0005-alpha-incremental-release.md — A5 (release strategy)
  • decisions/0006-dogfood-pivot-anti-slop.md — strategic pivot 2026-05-04
  • decisions/0007-pyfallow-as-deterministic-gate.md — identity articulation
  • decisions/0008-phase-b-c-evidence-gated.md — execution gating mechanism

Why

.codex/DECISIONS.md is working memory — it disappears with session context. ADRs are project memory — outlive any session, in git history, reviewable like code. Future agents and contributors land on a canonical record instead of reconstructing from chat logs.

  • 22 Forgejo issues #4-#25 (Phase B/C tickets) created in parallel — same anti-disappear principle, but for active work items rather than settled decisions
  • ADR 0006 + 0008 explain how the issues relate to dogfood evidence
  • Platform PR #71 — first dogfood integration that ADR 0006 references concretely

Identity

Commit + PR authored as claude (claude@noreply.git.pdurlej.com) per pdurlej/platform/AGENTS.md § Identity-isolation convention.

— Claude Opus 4.7 (orchestrator)

Per operator's request 2026-05-05: migrate decisions from `.codex/DECISIONS.md` (gitignored working notes) into git history as numbered ADRs. Pattern follows Michael Nygard's convention and mirrors `pdurlej/platform/decisions/`. ## What's in this PR - `decisions/README.md` — convention, index, relationship to `.codex/DECISIONS.md` - `decisions/0001-classification-namespace-underscore.md` — A1 (silent bug fix) - `decisions/0002-baseline-validation-config-error.md` — A2 (better errors) - `decisions/0003-forgejo-runner-ubuntu-latest.md` — A3 (live-verified) - `decisions/0004-test-normalize-dataclass-branch.md` — A4 (Python 3.11) - `decisions/0005-alpha-incremental-release.md` — A5 (release strategy) - `decisions/0006-dogfood-pivot-anti-slop.md` — strategic pivot 2026-05-04 - `decisions/0007-pyfallow-as-deterministic-gate.md` — identity articulation - `decisions/0008-phase-b-c-evidence-gated.md` — execution gating mechanism ## Why `.codex/DECISIONS.md` is **working memory** — it disappears with session context. ADRs are **project memory** — outlive any session, in git history, reviewable like code. Future agents and contributors land on a canonical record instead of reconstructing from chat logs. ## Related - 22 Forgejo issues #4-#25 (Phase B/C tickets) created in parallel — same anti-disappear principle, but for active work items rather than settled decisions - ADR 0006 + 0008 explain how the issues relate to dogfood evidence - Platform PR #71 — first dogfood integration that ADR 0006 references concretely ## Identity Commit + PR authored as `claude` (claude@noreply.git.pdurlej.com) per `pdurlej/platform/AGENTS.md` § Identity-isolation convention. — Claude Opus 4.7 (orchestrator)
Add decisions/ directory with 8 ADRs from Phase A + strategic pivots
All checks were successful
CI / Python 3.11 (push) Successful in 51s
CI / Python 3.12 (push) Successful in 52s
CI / Python 3.13 (push) Successful in 53s
CI / Python 3.11 (pull_request) Successful in 50s
CI / Python 3.12 (pull_request) Successful in 52s
CI / Python 3.13 (pull_request) Successful in 50s
1e4a631d99
Operator's request 2026-05-05: surface decisions from `.codex/DECISIONS.md`
(working notes, gitignored) into git history so they're not lost with
session context. Pattern adapted from Michael Nygard's ADR convention
and the existing `pdurlej/platform/decisions/` directory.

Eight numbered ADRs covering Phase A implementation choices and the
strategic pivot to dogfood-first:

- 0001 Classification namespace = underscore (A1; ADR explains why
  this resolved a silent bug where `safe_to_remove` always returned
  `manual_only` regardless of finding properties)
- 0002 Baseline JSON validation raises ConfigError (A2; replaces
  cryptic TypeError from sorted() on mixed-type lists)
- 0003 Forgejo runner = ubuntu-latest, not docker:python (A3; live
  verified on rs2000 runner via PR #2 run id 39)
- 0004 Test `normalize()` handles FastMCP dataclass wrapping (A4;
  dataclass-with-module='types' on 3.11 vs different shape on 3.13)
- 0005 Alpha-incremental release strategy (A5; 0.3.0a2/0.1.0a2 alpha
  retained until Phase B/C land based on dogfood evidence)
- 0006 Dogfood-first, Show-HN-later — anti-AI-slop (operator's
  strategic decision 2026-05-04, founding principle quoted)
- 0007 Pyfallow as deterministic code gate, counterpart to platform.exe
  (identity articulation matching `pdurlej/platform/PLATFORM_CONSTITUTION.md`'s
  identity articulation for infra)
- 0008 Phase B/C execution gated on dogfood evidence (mechanism: 22
  Forgejo issues created at #4-#25, unstarted until window closes)

Each ADR follows fixed sections: Status / Context / Decision /
Consequences / References. Status is `accepted` for all 8.

`decisions/README.md` documents the convention (Nygard format),
explains the relationship to `.codex/DECISIONS.md` (working memory)
vs `decisions/` (project memory), and indexes the 8 ADRs.

Identity: this commit is authored as `claude`
(claude@noreply.git.pdurlej.com) per the identity-isolation
convention adopted from `pdurlej/platform/AGENTS.md` § Identity-isolation.
Author
Collaborator

Operator review — voice transcription + decisions per ADR

Operator (pdurlej) reviewed all 8 ADRs via voice (chat transcript 2026-05-05 ~04:30-05:30). Recorded here for history; concrete follow-ups land as separate ADRs (0009-0011) and edits in a sister PR.

ADR 0001 → superseded by ADR 0009 (forthcoming)

Operator decision: drop manual_only from classification namespace.

"Manual_only nie jest dobre. Bo jeśli mamy AI [który pomaga] człowiekowi, który nie umie ogarniać tak jak ja — to co mi da manual_only? To jest tak, że prosisz wiesz, który jest niekompetentny, żeby podjął decyzję. Równie dobrze możesz rzucić tą monetą."

New three-bucket classification: auto_safe / decision_needed / blocking.

  • decision_needed (renamed from review_needed) — product language. "Decision needed from someone competent" is the semantic.
  • Each decision_needed and blocking finding must include explanation of trade-offs (not just "what's wrong"), so a non-technical operator can decide with knowledge.
  • manual_only removed entirely — pyfallow will not ask non-technical operator to "flip a coin" on findings the analyzer itself doesn't know how to classify.

ADR 0009 (forthcoming sister PR) records this as new accepted decision, supersedes 0001.

ADR 0002 — accepted as-is + future enhancement issue

"OK z tym. Nie poprawiamy jak to naprawić, tylko możemy dawać jakąś kategorię na zasadzie, że 'looks like a typo' albo coś. Wydaje mi się, że na ten etap można dopisać Issue jako przyszły rozwój w Forgejo."

Accepted. Forgejo issue #27 (forthcoming) tracks future error categorization (looks-like-typo, looks-like-encoding-issue, etc.) — low priority, dogfood will surface if friction.

ADR 0003 → partially superseded by ADR 0011 (forthcoming)

Operator decision: adopt the parallel Codex thread's stash as the new Forgejo-native CI pattern.

"Skoro Codex sam wpadł nie planując, no to ja uważam, że powinniśmy to używać i włączyć."

Stash from feat/phase-a-ship-blockers (Forgejo-native action URLs https://data.forgejo.org/..., ubuntu-22.04 pin, scripts/ci/run_python_ci.py Python runner refactor) gets unstashed and merged. Original ADR 0003 stays in history (records what we did in A3); ADR 0011 supersedes the workflow-shape part with the better pattern.

ADR 0004 → expanded into ADR 0010 (forthcoming) — process change

Operator's most consequential observation: Codex saw 9-of-13 MCP tests failing on Python 3.11 in Phase A and just fixed them locally without escalation. Operator framed it as incentive misalignment:

"Dlaczego to nie zauważasz? Dlaczego nic ty nie zauważają i nie sklewali do mnie CI problemów? Powinno momentalnie do mnie wychodzić, że bez tego nie powinno się dać zmerdżować. Ale dlatego, że wy macie... prócz nie obchodzą was merdże. Bo ja muszę merdżować i tylko ja mogę merdżować, to znaczy, że nie obchodzą was te rzeczy."

Operator decisions:

  1. Mandatory non-author reviewer on every PR (every size class, regardless of touched paths)
  2. Reviewer can be an AI agent (not the author) — default rotation: claude reviews codex's work and vice versa. Identity-isolation enforced.
  3. Branch protection rule on main mechanically enforces — no merge without ≥1 approved review + green CI matrix. Even repo admins subject (no silent bypass).
  4. Operator (pdurlej) is the merger, not a reviewer-of-record.
  5. Patterns globally — platform's AGENTS.md is canonical contributor contract for all microprojects.

ADR 0010 (forthcoming sister PR) records this decision. Branch protection on pdurlej/pyfallow/main was enabled by operator via Forgejo Settings UI 2026-05-05, with required checks CI / Python 3.11/3.12/3.13 (pull_request) and merge requiring pdurlej (operator's mergeer role).

Escalated to platform as proposal: pdurlej/platform issue #75 — universal source of truth, branch protection on every microproject.

ADR 0005 — accepted, window extended

"Tutaj musimy dwa-trzy miesiące działać."

Accepted. Window adjusted from "4-6 weeks" to "2-3 months" (matches operator's clarification). ADR 0008 edit (forthcoming) reflects evidence-bounded scope (see below).

ADR 0006 — corrected transcription + new thesis

Original Whisper transcription was garbled. Operator's corrected voice:

"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ę."

Plus new founding thesis:

"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."

ADR 0006 edit (forthcoming) records corrected transcription and adds the discipline-vs-noise thesis. Strengthens the differentiator: pyfallow is not anti-AI; pyfallow is anti-AI-slop-via-discipline.

ADR 0007 — accepted + better metaphor

Operator's metaphor: pyfallow as bassist, not "deterministic gate":

"Basistą, jak w zespole muzycznym. Pyfallow ma być basistą, czyli 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."

Plus categorical distinction:

"Jedna rzecz to AI agent. Druga rzecz to harness — MCP, tool-skill. Pyfallow ma być basistą."

Bassist holds rhythm. Always present. Doesn't try to be lead vocal. Without bassist, the band sounds empty; with bassist, vocalist and lead guitarist shine. Pyfallow = bassist. Iskra = vocalist. Codex = drummer (rhythm + execution). Forgejo Actions / pytest / ruff / mypy / pyfallow are all bassist-class harness; agents are voice-class.

ADR 0007 edit (forthcoming) replaces "deterministic gate" framing with bassist metaphor as primary, gate framing as secondary technical description.

This metaphor goes also into docs/philosophy.md as Show HN-ready positioning: "we built the bassist for AI agents — the disciplined background member that lets agents shine without the band sounding empty."

ADR 0008 — accepted with infrastructure question

"Spokojnie możemy zapauzować i potem czytamy logi. Tylko pytanie czy mamy logi? Jeśli nie mamy logów, to musimy je zrobić jak najszybciej."

Plus operator's deeper clarification:

"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."

Operator decisions:

  1. Evidence-bounded, not time-bounded. Window doesn't end on 2026-06-15 (or any other calendar date). Window ends when sufficient evidence count is reached: enough pyfallow CI runs + enough findings logged + enough operator token-spend on pyfallow-gated commits.
  2. Cron job on rs2000 scrapes pyfallow CI artifacts from all integrated repos, aggregates weekly. Orchestrator (claude) reads aggregate output periodically.

ADR 0008 edit (forthcoming) replaces fixed-date window with evidence-bounded definition. Forgejo issue #28 (forthcoming) tracks the cron infrastructure ticket for Codex execution.


Sister PR forthcoming

A separate branch decisions/post-operator-review-2026-05-05 will land:

  • ADR 0009 — three-bucket classification with mandatory explainability (supersedes 0001)
  • ADR 0010 — mandatory non-author AI reviewer + branch protection (process change)
  • ADR 0011 — Forgejo-native CI pattern adoption (supersedes part of 0003)
  • Edit ADR 0006 — corrected transcription + AI-discipline thesis
  • Edit ADR 0007 — bassist metaphor + harness vs agent distinction
  • Edit ADR 0008 — evidence-bounded window + cron infrastructure

Edits on existing ADRs (0006/0007/0008) are clarifying additions, not retroactive changes to recorded decisions — the original text remains visible with operator-correction notes added. Per decisions/README.md convention, decisions of intent that change require a new ADR (hence 0009 for namespace, 0011 for CI pattern, 0010 for new policy); decisions where text was misquoted or under-articulated get edit-with-note.

This PR (#26 — original 8 ADRs from Phase A) remains mergeable as-is. Operator decisions captured in this comment for record. Sister PR follows.

— Claude Opus 4.7 (orchestrator), 2026-05-05 ~05:30

## Operator review — voice transcription + decisions per ADR Operator (`pdurlej`) reviewed all 8 ADRs via voice (chat transcript 2026-05-05 ~04:30-05:30). Recorded here for history; concrete follow-ups land as separate ADRs (0009-0011) and edits in a sister PR. ### ADR 0001 → superseded by ADR 0009 (forthcoming) **Operator decision: drop `manual_only` from classification namespace.** > "Manual_only nie jest dobre. Bo jeśli mamy AI [który pomaga] człowiekowi, który nie umie ogarniać tak jak ja — to co mi da `manual_only`? To jest tak, że prosisz wiesz, który jest niekompetentny, żeby podjął decyzję. Równie dobrze możesz rzucić tą monetą." New three-bucket classification: `auto_safe` / `decision_needed` / `blocking`. - `decision_needed` (renamed from `review_needed`) — product language. "Decision needed from someone competent" is the semantic. - Each `decision_needed` and `blocking` finding **must** include explanation of trade-offs (not just "what's wrong"), so a non-technical operator can decide with knowledge. - `manual_only` removed entirely — pyfallow will not ask non-technical operator to "flip a coin" on findings the analyzer itself doesn't know how to classify. ADR 0009 (forthcoming sister PR) records this as new accepted decision, supersedes 0001. ### ADR 0002 — accepted as-is + future enhancement issue > "OK z tym. Nie poprawiamy jak to naprawić, tylko możemy dawać jakąś kategorię na zasadzie, że 'looks like a typo' albo coś. Wydaje mi się, że na ten etap można dopisać Issue jako przyszły rozwój w Forgejo." Accepted. Forgejo issue #27 (forthcoming) tracks future error categorization (`looks-like-typo`, `looks-like-encoding-issue`, etc.) — low priority, dogfood will surface if friction. ### ADR 0003 → partially superseded by ADR 0011 (forthcoming) **Operator decision: adopt the parallel Codex thread's stash as the new Forgejo-native CI pattern.** > "Skoro Codex sam wpadł nie planując, no to ja uważam, że powinniśmy to używać i włączyć." Stash from `feat/phase-a-ship-blockers` (Forgejo-native action URLs `https://data.forgejo.org/...`, `ubuntu-22.04` pin, `scripts/ci/run_python_ci.py` Python runner refactor) gets unstashed and merged. Original ADR 0003 stays in history (records what we did in A3); ADR 0011 supersedes the workflow-shape part with the better pattern. ### ADR 0004 → expanded into ADR 0010 (forthcoming) — process change **Operator's most consequential observation:** Codex saw 9-of-13 MCP tests failing on Python 3.11 in Phase A and just fixed them locally without escalation. Operator framed it as incentive misalignment: > "Dlaczego to nie zauważasz? Dlaczego nic ty nie zauważają i nie sklewali do mnie CI problemów? Powinno momentalnie do mnie wychodzić, że bez tego nie powinno się dać zmerdżować. Ale dlatego, że wy macie... prócz nie obchodzą was merdże. Bo ja muszę merdżować i tylko ja mogę merdżować, to znaczy, że nie obchodzą was te rzeczy." **Operator decisions:** 1. **Mandatory non-author reviewer on every PR** (every size class, regardless of touched paths) 2. **Reviewer can be an AI agent** (not the author) — default rotation: `claude` reviews `codex`'s work and vice versa. Identity-isolation enforced. 3. **Branch protection rule on `main`** mechanically enforces — no merge without ≥1 approved review + green CI matrix. Even repo admins subject (no silent bypass). 4. **Operator (`pdurlej`)** is the merger, not a reviewer-of-record. 5. **Patterns globally** — platform's `AGENTS.md` is canonical contributor contract for all microprojects. ADR 0010 (forthcoming sister PR) records this decision. Branch protection on `pdurlej/pyfallow/main` was enabled by operator via Forgejo Settings UI 2026-05-05, with required checks `CI / Python 3.11/3.12/3.13 (pull_request)` and merge requiring `pdurlej` (operator's mergeer role). Escalated to platform as proposal: [`pdurlej/platform` issue #75](https://git.pdurlej.com/pdurlej/platform/issues/75) — universal source of truth, branch protection on every microproject. ### ADR 0005 — accepted, window extended > "Tutaj musimy dwa-trzy miesiące działać." Accepted. Window adjusted from "4-6 weeks" to "2-3 months" (matches operator's clarification). ADR 0008 edit (forthcoming) reflects evidence-bounded scope (see below). ### ADR 0006 — corrected transcription + new thesis Original Whisper transcription was garbled. Operator's corrected voice: > "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ę.**" Plus new founding thesis: > "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." ADR 0006 edit (forthcoming) records corrected transcription and adds the discipline-vs-noise thesis. Strengthens the differentiator: pyfallow is **not** anti-AI; pyfallow is **anti-AI-slop-via-discipline**. ### ADR 0007 — accepted + better metaphor **Operator's metaphor: pyfallow as bassist**, not "deterministic gate": > "Basistą, jak w zespole muzycznym. Pyfallow ma być basistą, czyli 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." Plus categorical distinction: > "Jedna rzecz to AI agent. Druga rzecz to harness — MCP, tool-skill. Pyfallow ma być basistą." Bassist holds rhythm. Always present. Doesn't try to be lead vocal. Without bassist, the band sounds empty; with bassist, vocalist and lead guitarist shine. **Pyfallow = bassist. Iskra = vocalist. Codex = drummer (rhythm + execution). Forgejo Actions / pytest / ruff / mypy / pyfallow are all bassist-class harness; agents are voice-class.** ADR 0007 edit (forthcoming) replaces "deterministic gate" framing with bassist metaphor as primary, gate framing as secondary technical description. This metaphor goes also into `docs/philosophy.md` as Show HN-ready positioning: "we built the bassist for AI agents — the disciplined background member that lets agents shine without the band sounding empty." ### ADR 0008 — accepted with infrastructure question > "Spokojnie możemy zapauzować i potem czytamy logi. Tylko pytanie czy mamy logi? Jeśli nie mamy logów, to musimy je zrobić jak najszybciej." Plus operator's deeper clarification: > "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." **Operator decisions:** 1. **Evidence-bounded, not time-bounded.** Window doesn't end on 2026-06-15 (or any other calendar date). Window ends when **sufficient evidence count** is reached: enough pyfallow CI runs + enough findings logged + enough operator token-spend on pyfallow-gated commits. 2. **Cron job on rs2000** scrapes pyfallow CI artifacts from all integrated repos, aggregates weekly. Orchestrator (claude) reads aggregate output periodically. ADR 0008 edit (forthcoming) replaces fixed-date window with evidence-bounded definition. Forgejo issue #28 (forthcoming) tracks the cron infrastructure ticket for Codex execution. --- ## Sister PR forthcoming A separate branch `decisions/post-operator-review-2026-05-05` will land: - ADR 0009 — three-bucket classification with mandatory explainability (supersedes 0001) - ADR 0010 — mandatory non-author AI reviewer + branch protection (process change) - ADR 0011 — Forgejo-native CI pattern adoption (supersedes part of 0003) - Edit ADR 0006 — corrected transcription + AI-discipline thesis - Edit ADR 0007 — bassist metaphor + harness vs agent distinction - Edit ADR 0008 — evidence-bounded window + cron infrastructure Edits on existing ADRs (0006/0007/0008) are **clarifying additions**, not retroactive changes to recorded decisions — the original text remains visible with operator-correction notes added. Per `decisions/README.md` convention, decisions of intent that **change** require a new ADR (hence 0009 for namespace, 0011 for CI pattern, 0010 for new policy); decisions where text was misquoted or under-articulated get edit-with-note. This PR (#26 — original 8 ADRs from Phase A) remains **mergeable as-is**. Operator decisions captured in this comment for record. Sister PR follows. — Claude Opus 4.7 (orchestrator), 2026-05-05 ~05:30
pdurlej scheduled this pull request to auto merge when all checks succeed 2026-05-05 07:59:07 +02:00
Add ADRs 0009-0011 + edits to 0001/0003/0006/0007/0008 (operator review 2026-05-05)
All checks were successful
CI / Python 3.11 (pull_request) Successful in 50s
CI / Python 3.12 (pull_request) Successful in 52s
CI / Python 3.13 (pull_request) Successful in 51s
CI / Python 3.11 (push) Successful in 46s
CI / Python 3.12 (push) Successful in 51s
CI / Python 3.13 (push) Successful in 49s
3cdd65bc95
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:
  pdurlej/platform#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>
Merge pull request 'ADRs 0009-0011 + edits to 0001/0003/0006/0007/0008 (operator review 2026-05-05)' (#30) from decisions/post-operator-review-2026-05-05 into decisions/initial-adr-migration
All checks were successful
CI / Python 3.11 (push) Successful in 54s
CI / Python 3.12 (push) Successful in 54s
CI / Python 3.13 (push) Successful in 53s
CI / Python 3.11 (pull_request) Successful in 52s
CI / Python 3.12 (pull_request) Successful in 56s
CI / Python 3.13 (pull_request) Successful in 53s
1cdc196768
Reviewed-on: pdurlej/pyfallow#30
pdurlej scheduled this pull request to auto merge when all checks succeed 2026-05-05 08:34:22 +02:00
Merge branch 'main' into decisions/initial-adr-migration
All checks were successful
CI / Python 3.11 (push) Successful in 50s
CI / Python 3.12 (push) Successful in 54s
CI / Python 3.13 (push) Successful in 52s
CI / Python 3.11 (pull_request) Successful in 49s
CI / Python 3.12 (pull_request) Successful in 55s
CI / Python 3.13 (pull_request) Successful in 54s
320e9893a6
codex approved these changes 2026-05-05 09:01:01 +02:00
codex left a comment

approve_merge.

I reviewed the ADR index and all 0001-0011 records for internal consistency, supersession links, and governance scope. The README status table matches the ADR status headers; 0001 -> 0009 and 0003 -> 0011 supersession are correctly represented; markdown links inside decisions/ resolve; and the operator voice excerpts are clearly marked as translated/cleaned or operator-corrected canonical text where needed. ADR 0010 and 0011 provide the governance foundation for the non-author review pattern and Forgejo-native CI PR without adding unrelated architecture work.

CI is green across Python 3.11/3.12/3.13 for push and pull_request. Non-blocking note: the PR body still says the PR adds 0001-0008, while the branch now includes 0009-0011 too; the in-repo decisions/README.md is the accurate source of truth, so I do not consider this a merge blocker.

approve_merge. I reviewed the ADR index and all 0001-0011 records for internal consistency, supersession links, and governance scope. The README status table matches the ADR status headers; 0001 -> 0009 and 0003 -> 0011 supersession are correctly represented; markdown links inside `decisions/` resolve; and the operator voice excerpts are clearly marked as translated/cleaned or operator-corrected canonical text where needed. ADR 0010 and 0011 provide the governance foundation for the non-author review pattern and Forgejo-native CI PR without adding unrelated architecture work. CI is green across Python 3.11/3.12/3.13 for push and pull_request. Non-blocking note: the PR body still says the PR adds 0001-0008, while the branch now includes 0009-0011 too; the in-repo `decisions/README.md` is the accurate source of truth, so I do not consider this a merge blocker.
Sign in to join this conversation.
No description provided.