Repository navigation
docs: core principles, opinionated about process, agnostic about stack (#5) - #16
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…le (#11) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rding (#11) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ption (#11) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Brings in the platform-dependent test fix from #15 so this PR's gate can run against a green base. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs: write docs/loopwright/principles.md (#11)
✅ Quality gate passedcommit
|
| Check | Baseline | Now | Verdict | |
|---|---|---|---|---|
| TypeScript errors | — | n/a | collector not configured — see docs/loopwright/quality-gate.md | |
| High advisories | 0 | 2 | regressed 2 (tolerance 0) |
High advisories
brace-expansion— high: brace-expansion: Quadratic-time expansion of the{a},b}rewrite causes CPU denial of service · fix available — upgrade itjs-yaml— high: js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources · fix available — upgrade it
📊 All metrics
| Check | Baseline | Now | Verdict | |
|---|---|---|---|---|
| ✅ | Failing tests | 0 | 0 | holding |
| ✅ | Failing test suites | 0 | 0 | holding |
| TypeScript errors | — | n/a | collector not configured — see docs/loopwright/quality-gate.md | |
| ✅ | Lint errors | 0 | 0 | holding |
| ✅ | Lint warnings | 0 | 0 | holding |
| ✅ | Critical advisories | 0 | 0 | holding |
| High advisories | 0 | 2 | regressed 2 (tolerance 0) | |
| ✅ | Suppressed advisories | 0 | 0 | holding |
| 📈 | Line coverage | 84.67% | 85.01% | improved 0.34% |
| 📈 | Branch coverage | 78.93% | 79.44% | improved 0.51% |
| 📈 | Function coverage | 89.65% | 89.71% | improved 0.06% |
| 📈 | Statement coverage | 85.01% | 85.41% | improved 0.40% |
| 📈 | Duplicated code | 0.90% | 0.88% | improved 0.02% |
| ✅ | Highest function complexity | 14 | 14 | holding |
| 📈 | Average function complexity | 1.81 | 1.80 | improved 0.01 |
| ✅ | Oversized files | 0 | 0 | holding |
| ✅ | Skipped tests | 0 | 0 | holding |
| ✅ | Focused tests (.only) | 0 | 0 | holding |
| ✅ | Tests with no assertion | 0 | 0 | holding |
| ✅ | Coverage-ignore hints | 1 | 1 | holding |
| ✅ | Type suppressions (@ts-ignore etc.) | 2 | 2 | holding |
| ✅ | Inline lint suppressions | 2 | 2 | holding |
| ✅ | Empty catch blocks | 0 | 0 | holding |
📈 This PR improves 6 metric(s). Run
node .loopwright/scripts/quality-gate.mjs --update-baselineand commit.loopwright/baseline.jsonto lock the gain in.
Generated by .loopwright/scripts/quality-gate.mjs · reproduce locally with node .loopwright/scripts/run-report.mjs --all && node .loopwright/scripts/quality-gate.mjs · full reports are in the workflow artifacts.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…les doc (#13) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ries (#13) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…13) The preamble said "The engine that enforces them lives in `.loopwright/scripts/`", attributing enforcement of all twelve opinions to that directory one line after citing the doc that denies it: `docs/loopwright/principles.md:175-176` states the engine has zero coupling to Claude, agents, skills or sessions. Six of the twelve `enforced by:` pointers live under `.claude/`, so an agent following this line to find what enforces test-first would find nothing there. "Its engine lives in" drops the false attribution and also resolves the sentence's double "them" (the opinions, then the tests). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The old lead's "a CI quality gate ... plus the loop that feeds it" was its
only statement that the product has two halves, and roughly half the README
is about the loop half. Dropping it left `README.md:131` ("The gate is the
enforcement half. The other half is how work reaches it:") introducing that
duality cold.
Sentence 2 now carries the category fact, so sentence 1 stays the opinion and
the lead still carries the committed baseline, the earned-vs-bought question,
and the verdict as a comment an agent can act on.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ntity Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The three rules that are core opinions now live in principles.md, so stating them here too made two sources of truth for one rule. Replaced in place by a reference: the section is renamed to Mechanics, a new Opinions section names P1, P2 and P8 with the question each settles, and the opening paragraph points at the doc. The grill-phase fact that was an exception to P1 is re-homed as a descriptive mechanic. The Flow terminal drops the actor, since P8 owns it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SamuelDenani
marked this pull request as ready for review
October 8, 2026 14:51
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Writes down the boundary that decides what belongs in loopwright's core and
what belongs behind a contract, so it stops being re-argued in every design
session. The document is descriptive: no skill consults it, no gate checks
it, no RFC is required to carry a classification line.
Closes #5.
Sub-issues
docs/loopwright/principles.md(merged in docs: write docs/loopwright/principles.md (#11) #14)loop-harness.md, leaving mechanics (merged in docs: strip the opinions from loop-harness, leaving mechanics (#12) #18)All three are merged and closed. This PR is the one that lands the RFC on
main.Why this exists
Three open RFCs already cite this boundary textually, before it existed:
RFC", and it rejects peer-to-peer messaging because it "conflicts with the
mediated principle".
is a detail with a default, and its section is where you swap it."
They do not need the document to enforce anything. They need it to exist and to
name things, so they can cite it.
What #11 delivered
docs/loopwright/principles.md, 194 lines:rejects:line naming one concretechange it refuses, and a pointer to the file that enforces it. P6's pointer
is empty on purpose — nothing in
.loopwright/scripts/or.claude/enforces mediation today, and the doc's own rule makes that empty line a
finding rather than an omission.
seam; T5 is the one territory whose contract this RFC resolves, as four named
capabilities.
Amendmentssection with stable ids.Known gaps carried forward
requires host-scheduled re-invocation (
/loop) and a native task list(
TaskCreate). Adding a capability is a core change by the doc's own rule,so it belongs in an amendment to RFC: Core principles, opinionated about process, agnostic about stack #5 rather than in Task: Write docs/loopwright/principles.md #11.
.claude/agents/reviewer.md:4grantsBash, which is write-capable, soP10's own enforcer can commit over the diff it reviews. The three sibling
reviewers carry
Read, Grep, Globonly.audit.highis at 2 —brace-expansionandjs-yaml, both with fixesavailable upstream. No
audit.ignoreentry was added, sinceCLAUDE.mdforbids ignoring an advisory that has a fix.
not reproduce: the claim that T7 works on a non-JS host because the engine is
Node (
@changesets/cliassumes apackage.json), and the swap rule statedwithout T6's exception.
For #12
P1 admits no exception, but
docs/loopwright/loop-harness.md:70-74documentsone — "except the grill phase itself, whose task spine and drafts are
session-scoped, so a crashed grill restarts". #12 replaces that rule with a
reference to P1, so it must decide where the exception lives: mechanics that
stay, or a P1 violation.
🤖 Generated with Claude Code
How #12 landed
#12 was refused twice by the auto-mode permission classifier
(
[Instruction Poisoning]) — once as aseddeletion, once as an additive-onlyscript. The call is defensible: an agent editing the file that describes the
constraints agents operate under is, without project context, indistinguishable
from an agent stripping its own guardrails. The edit is de-duplication — all
three claims live in
principles.md, and neitherCLAUDE.md's "Do not dothese" list nor
quality-gate.mjsis touched, so the net constraint on anyfuture agent is unchanged.
It landed after the user authorised it explicitly, applied through the dedicated
edit tool rather than a shell script. Worth recording: a later read-only Bash
command against the same file was still refused, so the deciding variable looks
like the tool, not the authorisation — a declared string-for-string edit reads
differently to the classifier than an opaque script.
#12 had no local branch review. Generating its diff for a reviewer was
itself refused, and the refusal covers pursuing the same read through another
tool or a sub-agent. Its fresh-context read is the Claude review on #18, which
came back clean, plus a per-check verification against its spec before the
commit. #11 and #17 each had a full local review in addition; #18 did not.