Conversation
…tream amendments Folds three ruled changes into this amendment and drops one it originally proposed, so v3 lands as one coherent round instead of a v3 that a v4 would immediately partly delete. Ruled 2026-09-08; discussion on #26, #9 and #22. DROPPED FROM THIS AMENDMENT: the one-week default comment window. The ruling went further than shortening it. THE DECISION DEADLINE GOES. Step 3 of "How a QEP is decided" is struck and the acceptance trigger becomes "no objection is outstanding" rather than a date — lazy consensus with no clock, so a QEP nobody objects to still lands without needing the lead, and nothing is accepted by the mere passage of time. Roles, the Summary's "clear deadline" promise, and the README's Proposing steps all follow. The evidence is recorded under Alternatives considered: on 2026-09-08 none of the four open QEP pull requests had a live deadline — #8 had never set one in 47 days, #13's and #23's had passed, #18's was deliberately deferred — while nothing in CI ever read a PR description. The field was required by this document and checked by nothing. Enforcing it in CI was considered and declined: it would have turned three open PRs red for a rule they predated. THE README INDEX IS GENERATED, post-merge from frontmatter and ordered by number, so a PR carries no row of its own and two QEP PRs cannot collide on one line of one table. The mechanism shipped ahead of this amendment in #30, together with the ordered-list check; Automation now names both, and a stale index is a warning rather than a failure. Numbering states what already happened informally: a number is reserved when its draft PR opens, released if that PR closes unmerged, so index gaps are normal while drafts are open. A DOWNSTREAM QEP CARRIES ITS UPSTREAM AMENDMENTS — #9's sentence, widened by the case it did not anticipate. Where the superseded standard is not itself a QEP, the Adoption section must name the contract, the obligation and a date by which the handover completes: QEP-6 asserts precedence over an external tracker contract with no date on it, and the qe skills depend on that sentence at runtime. Closes #9. Also brings the branch up to date with main, which had moved on by QEP-3's merge (this branch predated it, so it carried neither the file nor its index row). Verified green under both the pre-#30 checks on this branch and #30's new ones, including the ordered-list rule over the rewritten Adoption entry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33
|
Field note: first disclosure ask under this draft — QuantEcon/QuantEcon.py#923, merged 9 Sep. While this QEP is in Draft we tried its disclosure ask informally on a live PR, which is the field test qeps#14 proposes. The PR was a small cleanup removing eight flake8 F841 unused-local findings from four numerical modules. It carried no disclosure and had agent fingerprints in its description, so we asked a neutral question on the thread — was AI involved, and which model or tool — and got a complete answer within the hour, offered in good faith and with an explicit undertaking to follow whatever format we settle on. What was disclosed: the change was produced by a third-party agent runtime operating as an autonomous "OSS sprint assistant" on a cron schedule, with GPT-5.5 as the active model. The agent read the issue and PR context, wrote the patch, ran the local validation, and drafted the PR text. Four things this tells us about the draft as written. 1. Norm 1 is the operative norm here, not norm 2 — and the motivation's central claim is now confirmed rather than inferred. The audit inferred "issue-crawling automation rather than individual experimentation" from fingerprints; this is that pattern, described by the contributor in their own words. Under norm 1 as drafted — "Unattended agents and automated pipelines must not open pull requests or crawl our issue tracker for work" — the contribution is a violation. It is also correct, minimal, in scope, and we merged it. The draft has no way to say that. The enforcement ladder starts at a rectification comment and is built around getting a PR amended; nothing covers "the work is good, the process isn't", which is the case we hit on the very first try. 2. The trailer assumption has a hole. Norm 2 points at 3. Detection by fingerprint is weak; asking works. What flagged this PR was the prose, not the code — a TDD "RED/GREEN" template applied to a lint cleanup where no test was ever red. The diff carried no signal whatsoever: the issue enumerated all eight sites, so a human working from that list produces the same patch. That asymmetry will widen as agents get better at writing descriptions. Against it, one neutral question produced full voluntary disclosure in under an hour. This is direct support for the QEP's central bet — norms plus a visible disclosure path, applied by maintainers reading pull requests — and against any mechanism that depends on identifying agents. 4. A cheap counter-example to norm 3's test carve-out. The issue behind this PR asked for a per-site human decision in terms: in numerical code an assigned-and-discarded matrix is sometimes the residue of an incomplete edit, so each site needs examining rather than blanket deletion, and any site revealing a genuine logic gap gets its own issue. The agent deleted all eight without examining any. The answer happened to be right — a maintainer checked each site and all eight are genuinely dead — but the judgement the issue asked for was supplied after the fact by a reviewer, not by the contributor. Note what the tests contributed: nothing. Removing a dead binding cannot fail a test, so norm 3's "tests can stand in for line-by-line reading" would have been fully satisfied by a change in which no reading occurred. This is a smaller and clearer illustration than the #949 case and belongs in the norm 3 discussion. What to do with this class of case. Three options; I think the middle one is right. Enforce norm 1 literally — close such pull requests on process even when the change is good. Consistent, but it costs us correct work and the goodwill of a contributor who answered openly the moment we asked. Move norm 1 from scheduling to accountability — what matters is not whether a human was present at submission but whether a human owns the change and answers review on it. Keep "don't crawl the tracker for work" as the volume rule, and make the binding test ownership and responsiveness, which is already norm 3's territory. On that reading this pull request is compliant once disclosed, while a pipeline that files and vanishes is not. Keep norm 1 strict and add an explicit accept-once path — merge on the merits, state plainly that future submissions need a human in the loop. This is effectively what we did, and if we want it available it should be written down rather than improvised case by case. One boundary question for norm 5. The suggestion to take the One further data point. The same pipeline has a second pull request open on QuantEcon.py, and it shows the opposite failure mode — scope beyond what the issue asked for, which a reviewer now has to trim back. Under-supplied judgement in one case, over-supplied scope in the other; both land on maintainer attention, which is the cost this QEP is about. |
|
@oyamad suggestions on this QEP, from the 8 Sep review round. No strong opinion on the details, but he likes LLVM's AI Tool Use Policy (https://llvm.org/docs/AIToolPolicy.html, linked from #12), the Four things in that policy bear on the draft. Its Its binding test is a human in the loop, not human attendance — review the output before submitting, and be able to answer questions during review. That is the second of the three options above. It also matches norm 3: passing maintainer feedback to an LLM to generate replies is explicitly discouraged. It recommends an "Extractive contributions" — submissions whose review burden exceeds their value to the project — is a sharper name for the cost argument in our Summary. On process: the 28 Aug deadline lapsed while this PR was a Draft, and there are no comments on it or on #12 from anyone else. Acting on the suggestion means rebasing past QEP-3, marking this ready, putting it to the team, deciding whether to open it to the community, and setting a fresh window for lazy consensus. |
Adds QEP-5 as a Draft: a Code of AI Use for QuantEcon contributions — AI assistance welcome, a human submits and owns the work, and meaningful AI involvement is disclosed with a machine-readable marker rather than a narrative. Policy only, by design. The contributor registry and pull-request gate explored in the discussion (#12) are deliberately out of scope: the norms bind whether or not anyone attests to them, and volume is handled by GitHub's native controls. If a registry proves necessary it is a later amendment or a QEP of its own. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Norm 1 binds a human in the loop rather than human attendance; norm 2 names a hand-added Assisted-by: trailer; norm 3's test carve-out is bounded to changes a test could fail; norm 5 adopts the good-first-issue reservation with the label as the fence; enforcement gains a merge-on-merits path. Motivation records the QuantEcon.py#923 confirmation, Alternatives adds the LLVM, QEMU, and detect-versus-ask entries, and a Disclosure section closes the document. Rebased onto main; the README index row is dropped since the index is now generated after merge. Assisted-by: Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Revised 2026-09-10 — the feedback above is incorporated. Rebased onto main (README row dropped; the index is generated now). What changed, against the two comments above and @oyamad's suggestions:
Kept out of the QEP and put in the PR body instead: the evidence-sample statement from #14 (one PR, one repo; norms 4–6 and the carve-out untested) and the team-wide invitation before a decision. At acceptance, #12 closes with a pointer to the retained registry design in QuantEcon/infrastructure#5. |
There was a problem hiding this comment.
🔵 Needs a closer look
It adopts a binding, org-wide governance policy whose normative substance is a human-judgment decision requiring Core Maintainer review under QEP-1, even though no objective defects were found.
Pull request overview
This PR adds a new Draft proposal, QEP-5: Code of AI Use, as a single Markdown file under qeps/. It establishes an org-wide policy that welcomes AI-assisted contributions while binding every contributor to six norms (human-in-the-loop ownership, disclosure via an Assisted-by: trailer, verified claims, no crawling/duplicating/farming, and rectification of lapses). It frames the problem as maintainer review cost rather than safety, and deliberately scopes out a contributor registry and PR gate in favour of GitHub's native volume controls. The document follows the repo conventions defined in QEP-1 and enforced by qep-checks (unversioned new QEP, no self-added README row, ascending ordered-list markers).
Changes:
- Introduces the six-norm Code of AI Use, an Enforcement ladder, a "What this is not" scoping section, Alternatives considered, and an Adoption section.
- Carves out organisation-operated automation via QEP-2's
automatedlabel and a named-maintainer accountability rule, and reservesgood first issue(QEP-2) for hands-on learning. - Adds a self-referential Disclosure section noting the draft itself was AI-assisted.
File summaries
| File | Description |
|---|---|
qeps/qep-0005-code-of-ai-use.md |
New Draft QEP defining the Code of AI Use policy, its enforcement, scope, alternatives, and adoption obligations; frontmatter, header table, links, and ordered lists all conform to repo/CI conventions. |
Review details
- Files reviewed: 1/1 changed files
- Comments generated: 0
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Hi guys, the following is written by Claude under my direction. My main concern was that this might end up being ignored, so how can we get it out in front of contributors and their AIs. Feel free to ignore, these are pure suggestions. Claude's recommendations:
Something like MicroPython's, where you pick one and the second commits you to owning the code, not just disclosing:
|
|
thanks @jstac these are good comments. I'll work through them tomorrow and update. |
…endment Revised from jstac's comment of 2026-09-10 on the PR. - Add "The Code in brief": six one-sentence imperatives in a marker-fenced, normative block above the full norms, for verbatim reuse in contributor files and agent instructions. The full norms govern where they differ. - Adoption now names three channels, since no single place reaches everyone: the checkbox pair in the pull-request template (MicroPython's form, where the second box attests ownership), the Code in brief in the file agents read from a checkout, and a comment-only neutral ask on pull requests from outside the organisation. The no-automation claim narrows to "nothing that gates or decides". - Norm 2 lets the tool add the trailer, with the responsibility staying human. Alternatives cites Yang, He, and Zhou (2026) on agents ignoring rules they are not handed and never refusing to contribute under a ban. - Add "Amendments to QEP-2": the good-first-issue row's when-to-use cell carries the norm-5 reservation; applied at landing as QEP-2 v1. Assisted-by: Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Revised 2026-09-11 against @jstac's comment above. All four suggestions taken, one of them in a different place than proposed. Per item:
One thing the discussion added beyond the four. The template reaches only the web UI, and agents open pull requests through Commit e1d04b3. This round was drafted with AI assistance, as the Disclosure section says. |
Norm 2 now asks for a single machine-readable line in every pull request: `Assisted-by: <tool> (<model>)` where AI tools meaningfully contributed, or `Assisted-by: none` where they did not. The template carries the empty line with both forms and a fixed attestation sentence beside it; the checkbox pair is gone. The neutral ask on external pull requests fires only where the description carries no such line, and asks for the line plus a reply confirming a human has read the pull request. Assisted-by: Claude Code (Claude Fable 5.1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Follow-up, 2026-09-11 (commit 8824139, then a merge of |
Assisted-by: Claude Code (Claude Fable 5.1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Assisted-by: Claude Code (Claude Fable 5.1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Assisted-by: Claude Code (Claude Fable 5.1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Assisted-by: Claude Code (Claude Fable 5.1) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
thanks @jstac I think we are iterating towards a good end point. The motivation section is still quite large -- do you think we should reduce words? |
|
I think this looks good @mmcky ! Nice work. |
|
thanks @jstac - I will leave this open until Monday, 14th September and then I will merge. |
Adds QEP-5: Code of AI Use as a Draft. Discussion: #12.
AI-assisted contributions are welcome at QuantEcon — our maintainers use these tools daily and in the open. This QEP asks every contributor to accept six norms in exchange: a human is in the loop (chooses the task, reads the result, submits it, answers review), meaningful AI involvement is disclosed with a hand-added
Assisted-by:trailer, the contributor owns and can explain the work, claims about tests and benchmarks are verified before they are made, nobody crawls the tracker, duplicates, or farms pull requests, and a lapse is put right by amending the pull request.It is policy, not infrastructure. The norms bind from acceptance, like the Code of Conduct, without anyone signing anything and without anything being built. The problem it answers is cost, not safety: an unreviewed submission is an extractive contribution — it costs more to review than it returns.
Scope
The discussion issue originally proposed a contributor registry and a pull-request gate alongside the policy. Both are deliberately out of scope, for two reasons set out in What this is not and Alternatives considered: the norms bind whether or not anyone attests to them, so a registry would notify rather than bind; and GitHub's native volume controls (org-level pull-request limits in particular) cover the single-account case for free. The full registry design is retained in QuantEcon/infrastructure#5; two constraints from it are carried into the QEP so they survive. At acceptance, #12 closes with a pointer there and the revival trigger — the native controls proving insufficient — rather than a new discussion issue.
Revised 2026-09-10
Rebased onto main (the hand-added README index row is gone; the index is generated post-merge). The text was revised against the two comments below and @oyamad's suggestions from the 8 Sep review round; the comment of 2026-09-10 on this PR lists what changed. The revision was drafted with AI assistance and the document now carries its own Disclosure section.
Revised 2026-09-11
Revised against @jstac's comment of 10 Sep; the comment of 2026-09-11 on this PR lists what changed. In short: a marker-fenced Code in brief above the full norms, three visibility channels in Adoption (a single
Assisted-by: <tool> (<model>)orAssisted-by: noneline in the template, theAGENTS.mdblock, and a comment-only ask on external PRs that fires only when the line is missing), norm 2 letting the tool add the trailer, the compliance study in Alternatives, and an Amendments to QEP-2 section for thegood first issuereservation. Rollout is tracked on #33, with QuantEcon/cli#50 and QuantEcon/meta#385 for the two mechanisms.Points worth arguing about
Norm 1 binds ownership, not attendance. LLVM's test: a human in the loop, not a human at the keyboard. Consequence: a cron-scheduled pipeline whose operator discloses, owns, and answers review is compliant; one that files and vanishes is not. The draft as first written would have made QuantEcon.py#923 a violation of a change we merged.
Norm 3's test carve-out is now bounded. Tests stand in for line-by-line reading only where a test would fail if the change were wrong. Deletions, behaviour-preserving refactors, and changes the issue asked to be judged site by site must be read — #923 is the counter-example, where dead-code removal satisfied the original carve-out with no reading at all.
Norm 5 adopts LLVM's
good first issueprohibition, with the label as the fence. It is deliberately not widened tobugor audit issues: a maintainer who wants any issue reserved for hands-on learning labels it, and Adoption makes that deliberate. The alternative — a fuzzy "tractable enumerated issue" category — has no boundary a contributor can see.Scope now covers issues, review comments, and proposals, in one sentence after the norms. LLVM covers these and the cost argument is identical. This is the one change with no prior discussion on the thread.
Organisation-operated automation is carved out, applying the accountability rule rather than waiving it: a named maintainer owns the output, the automation is declared in a public register, and it carries QEP-2's
automatedlabel. That register is what QEP-4 (#8) would supply; the two drafts should agree before either is accepted.Field test
Per the practice proposed in #14, the draft's disclosure ask was tried informally on one pull request in one repository (QuantEcon.py#923, merged 9 Sep). That exercised norms 1, 2, and 3 and the enforcement path. Norms 4, 5 (the
good first issuerule), and 6, the organisation-automation carve-out, and the scope beyond pull requests are untested.Process
Draft. #23 (QEP-1 v3) removes the decision deadline and requires acceptance by a Core Maintainer other than the author, with no objection outstanding; this PR follows that rule whether or not #23 has merged first. Before a decision, the draft goes to the whole team, and possibly the community, as @oyamad suggested.
qep-checksparity: new QEP, unversioned (implicitly v0); no README row.🤖 Generated with Claude Code