Skip to content

QEP-3: Repository Naming and Types - #7

Open
mmcky wants to merge 9 commits into
mainfrom
qep-0003
Open

QEP-3: Repository Naming and Types#7
mmcky wants to merge 9 commits into
mainfrom
qep-0003

Conversation

@mmcky

@mmcky mmcky commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Makes the org's repository namespace a decided standard — exactly parallel to QEP-2 for the label namespace. Prompted by a live placement question (where should the translation-progress dashboard live?) and a survey of the full org: of ~245 non-archived repositories only ~40% follow a documented convention, and the largest family (teaching events, ~55 repos) has no convention at all.

Full text: qep-0003-repository-naming-and-types.md

What it decides

  • Grammar — a dash prefix encodes a repo's type (status-translations); a dot suffix encodes a variant of the same content (.notebooks, .zh-cn, .public). Dots are reserved for variants; new members of the dotted legacy families (audit., benchmark., project.) use dash forms. Name tokens pass the reversal test (compliance-lecture-style → "lecture-style compliance").
  • Type registry — content types (lecture-, book-, quantecon-book-); six operational types, five of them named for the actor's effect: project-* decides · workspace-* operates · status-* measures · reporter-* narrates · task-* executes · compliance-* assesses, with boundary rules (numbers vs narrative; read vs write automation; observed facts vs adjudicated findings; the audit is the event, the compliance repo is the ledger); supporting types (test-, template-, tool-, contractor-, audit-, benchmark-).
  • Teaching events — the missing convention for the org's largest family: workshop-{name}-{yyyy}, course-{name}-{yyyy}, conference-{name}-{yyyy}; frozen and archived after the event.
  • Published packages — take their ecosystem name, unprefixed (QuantEcon.py, GameTheory.jl, textstrata); forks keep the upstream name (mystmd); deployed sites are named by domain (atlas.quantecon.org). tool-* covers internal, unpublished tooling.
  • Migration & archival — new repos must comply; no bulk renames (opportunistic only, riding on active maintenance); renames fix names and never transmute types — an outgrown repo is succeeded and archived; rename proposals are adjudicated against the published record; concluded events are archived, not renamed.
  • First instances (Rollout) — the meta#333/meta#334 lecture renames; reports-activityreporter-activity; workflow-backupstask-backups; compliance-lecture-style succeeds audit.2026-05.style-guide; an annual event-archival sweep (itself a task-* candidate).

Review status

The draft was field-tested against live placement and rename decisions during the first comment window; the findings are folded into the amended text (5922608, landing note). Input is most useful on the four points that changed:

  1. reporter-*/task-* (read vs write) replacing workflow-*
  2. workspace-* retained — removal was landed in 5922608 on the ground that the family had zero members, then reversed in f4dcbfc when workspace-lectures turned out to be one; the goal-vs-fleet boundary rule is back, and the prefix name is settled in fa0e6b7 (kept, with the names considered recorded and the place-vs-effect asymmetry stated as deliberate)
  3. compliance-{domain} as a fifth operational type, distinct from status-*
  4. The published-package rule and the tool-* row

Unchallenged in the first window and unchanged since: the event three-way split, dash normalization of the dotted families, the reserved-names list (§4), and the archival sweep.

Comment window / decision deadline: to be announced.

The team manual's repository-conventions page remains the operational how-to — anatomies, worked examples, decision guide — and will cite QEP-3 as the naming authority on acceptance.

🤖 Generated with Claude Code

Proposes the org repository namespace as a decided standard: naming
grammar (dash prefix = type, dot suffix = variant), a normative type
registry, an ecosystem-name exemption for published packages and forks,
a teaching-events convention (workshop-/course-/conference-{name}-{yyyy})
for the largest unnamed family (~55 repos), and a migration + archival
policy (new repos comply; opportunistic renames; concluded events
archived). Records the taxonomy developed in the team manual and the
boundary rules for project-*/status-*/workspace-*.

Related proposals: QuantEcon/meta#333 and QuantEcon/meta#334 proceed as
first instances of the rename policy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 10, 2026 10:30
@mmcky
mmcky marked this pull request as draft July 10, 2026 10:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request introduces QEP-3, a new draft QuantEcon Enhancement Proposal that standardizes repository naming grammar, defines a type-prefix registry, and documents exemptions plus a migration/archival policy; it also registers the new QEP in the repository’s README index.

Changes:

  • Add draft QEP document: Repository Naming and Types (QEP-3).
  • Update the README index to include QEP-3 with Type: standard, Status: Draft, Version: –.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
README.md Adds QEP-3 to the QEP index table.
qeps/qep-0003-repository-naming-and-types.md New draft QEP defining repo naming grammar, type registry, exemptions, and rollout policy.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread qeps/qep-0003-repository-naming-and-types.md Outdated
Comment thread qeps/qep-0003-repository-naming-and-types.md Outdated
Comment thread qeps/qep-0003-repository-naming-and-types.md Outdated
Comment thread qeps/qep-0003-repository-naming-and-types.md Outdated
Two amendments earned by applying the draft to a live placement decision
(where the translation program's command bench should live):

- The project-{name} registry row said flatly "no production code",
  contradicting the boundary rule below that allows a minimal command
  bench; a reader consulting only the table gets the wrong answer. The
  row now points at the boundary rules.
- The bench boundary rule now names the graduation triggers (shared
  across initiatives, or grown beyond minimal to serve routine fleet
  operations) and records that for a long-running program the
  bench-in-project arrangement can be durable, not merely transitional
  - locality of decisions, bench and clones under one root is a
  feature, not a smell.

Context: QuantEcon/project-translation applied the rule 2026-07-14 and
kept its bench in-project after weighing a workspace-translations split.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mmcky

mmcky commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

Field report from applying the draft. The translation program used QEP-3 this week to settle a live placement question — where its cross-repo command bench should live (QuantEcon/project-translation, decision register 2026-07-14). The goal-vs-fleet boundary rule decided it cleanly, and the exercise surfaced two text gaps now amended in 8150620: the project-{name} registry row said flatly "no production code", contradicting the bench allowance in the boundary rule below it (the row now points at the boundary rules), and the bench rule now names its graduation triggers and records that for a long-running program the bench-in-project arrangement can be durable rather than transitional.

For the record — two pre-existing editions don't parse under the §1 grammar. Not an objection to the draft: §5's migration policy (no bulk renames; opportunistic renames riding on active maintenance) is exactly how these resolve once the QEP is accepted. Documenting them here so they're known instances when the meta#333/meta#334 rename batch picks them up:

  • lecture-intro.zh-cn — base lecture-intro does not exist; the synced source is lecture-python-intro (→ lecture-python-intro.zh-cn if renamed).
  • lecture-python.zh-cn — base lecture-python is the legacy repo; the synced source is lecture-python.myst, so this edition follows whatever meta#334 resolves for its source.

One sequencing note for whoever handles them: both editions are the Phase 0 sync-automation targets (action-translation#74). A rename is nearly free before that wiring lands and fiddly after (Pages URLs under github.io don't redirect; target-repo: workflow inputs hardcode names) — so if the rename path is taken, it is cheapest sequenced ahead of Phase 0 execution.

@mmcky

mmcky commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

Field test: a live placement decision run against this draft (+ a proposal to restructure the automation types)

I ran a real placement decision against the draft as a test case — the kind of question the Motivation section says should stop being re-litigated. Two findings: the standard resolved the placement decision cleanly (validation, no text change needed), and pulling on one loose thread (reports-activity) led to a concrete proposal to restructure the automation-type registry while the QEP is still open. (This comment has been edited in place as the analysis developed; it supersedes earlier versions.)

The test case

The reporting/measurement program (QuantEcon/meta#332 — the status/analytics/activity planes, plus the benchmarking programme QuantEcon/meta#335 on the build side) needs a family-level coordination home: the plane taxonomy, the shared reference architecture, the cross-plane result/environment schema, and cross-plane research notes. Two research PRs recently landed in project-analytics (#2, #3) only because no such home exists — one of them says in its own body that it should move if the build plane gets a research home. The candidate names were workspace-reporting vs project-reporting.

Finding 1 — the boundary rules decided it without interpretation

The goal-vs-fleet rule in §2 answers directly: the reporting family is heterogeneous (project-analytics, reports-activity, benchmarks, dashboard), has no manifest + runner, and has no recurring mechanical cross-repo tasks — it fails workspace-readiness on every criterion. It is organized around a goal (one coherent measurement architecture). The "initiative or program" wording and the "programs run long" lifecycle note also did real work here, since this is a program rather than a bounded initiative. Verdict: project-reporting, dash form per §1.4. I'm recording this as evidence the boundary rules are usable in anger; no amendment proposed.

Two smaller items from the same test are repo-README material rather than QEP material, noted for completeness: (a) the project-reportingdashboard boundary should be written down in the repo README (project decides, the reserved singleton presents), and (b) the shared schema spec is a decision record and can live in the project repo, but per "no production code" its validators/collectors belong in cli/actions/skills.

Finding 2 — the automation types need restructuring: reports- is unregistered and workflow-* is weak

reports-activity is the only repository in the org under a reports- prefix, and the prefix appears nowhere in the §2 registry. Inspecting it shows why it ended up with a bespoke name — it is a hybrid of three registered types:

Contents Registered type it matches
action.yml (reusable Action) action-*
six scheduled workflows (weekly-report, monthly-report, news-weekly, news-watch, …) workflow-* (scheduled automation that acts)
reports/ directory of generated outputs closest to status-*'s data role, though narrative documents rather than a latest.json contract

The obvious fix was to rename it into workflow-* — but examining the incumbent shows it has the same disease. workflow-* has exactly one member (workflow-backups), and it names the mechanism rather than the role: every repository in the org has .github/workflows/, so "contains workflows" distinguishes nothing, and it pollutes org search. (Anecdotal but telling: in one working session both names were misremembered — report-activity for reports-activity, workflow-backup for workflow-backups. Prefixes that carry no role signal are hard to recall even for their creator.)

Proposal: replace workflow-* with a two-family automation taxonomy, named for the actor and its effect.

  • reporter-* — observes and narrates. Read-only automation that reads org/web state and writes reports, digests, or dashboard-adjacent narrative. Members and pipeline: reporter-activity (rename of reports-activity), a future reporter-news (the news-watch function), and the weekly read-only routines piloted in Org maintenance automation: weekly Claude Code routines (read-only reporting first) meta#331.
  • task-* — executes. Automation with write access to org resources, executing recurring org chores (the registry wording matters: "executes recurring org chores with write access" — a task-* repo is the machinery that does a chore, not a task tracker; work tracking stays in GitHub Projects per this QEP's architecture). Members and pipeline: task-backups (rename of workflow-backups, writes to S3), the annual event-archival sweep from Rollout §3 (archives repos).

Design rationale, in registry terms:

  • Name the actor and its effect, not the mechanism or the trigger. Mechanism (workflow-) and trigger (scheduled-, cron-) are implementation details visible inside .github/workflows/; trigger-naming also fails structurally, since both families are typically scheduled and either may be event-driven. Effect — observes vs acts — is the durable, governance-relevant property.
  • The split is the read/write permission boundary. reporter-* repos need read scopes plus issue/PR comment; task-* repos need write access to org resources. The org's automation estate becomes triage-able for security review directly from the repo list — the same property that made the meta#331 pilots deliberately read-only.
  • A closed two-way split, not open-ended agent nouns. This parallels the QEP's own workshop-/course-/conference- over event- decision: more reader signal at no grammar cost, without opening the door to a per-role noun zoo (archiver-, syncer-, …) of single-member families.
  • Domain vocabulary is off-limits for type prefixes — the mirror image of §3's ecosystem-name exemption: just as registry names are load-bearing outside the org, mathematical/economic vocabulary is load-bearing inside it. This filter removed the otherwise-attractive agent nouns: operator- (Bellman/transition/linear operators saturate the lectures), agent- (economic agents; plus the AI-agent overload), actor- (actor-critic methods). task- passes precisely because it carries no domain meaning.
  • Verbs framing extends cleanly: project-* decides / workspace-* operates / status-* measures / reporter-* narrates / task-* executes.

Other names considered and rejected on the way, recorded QEP-style so the choices read as decided: routine- (implies cadence; excludes event-driven members), automation-/automate- (verb form is off-pattern; noun form is long and sits confusably next to action-*), bot- (connotes an interactive actor), scheduled-/cron- (name the trigger both families share), job- (echoes Actions' own "jobs"), and registering reports-* as-is (legitimizes a single-member family).

Concretely, if agreed: in §2, remove the workflow-* row and add the reporter-* and task-* rows with the read/write boundary stated; in Rollout, add reports-activityreporter-activity and workflow-backupstask-backups as rename candidates under the §5 opportunistic policy (both repos are actively maintained, so the rename-rides-on-maintenance condition is satisfied), parallel to the existing continuous_time_mcs call-out; in Alternatives, note that reports- and workflow- are deliberately absent from the registry.

@mmcky mmcky mentioned this pull request Aug 8, 2026
mmcky added a commit that referenced this pull request Aug 8, 2026
QEP-2 merged in #2 while its status still read **Draft**, so `main`
currently holds an in-effect standard that its own record describes as a
draft. This PR completes step 5 of QEP-1's decision process, which was
skipped at merge time.

The flip is applied in the three places
[AGENTS.md](https://github.com/QuantEcon/qeps/blob/main/AGENTS.md) keeps
in sync: the YAML frontmatter, the in-document header table, and the
README index row. CI parity passed before this PR only because all three
agreed on the wrong value.

**No version bump.** A newly accepted QEP carries no `version` —
implicitly v0 until first substantively amended — so the README
`Version` column stays at the em dash. QEP-4 will be the thing that
moves QEP-2 to v1, when its acceptance PR re-applies the registry hooks
it parked per the convention in #9.

The decision itself is not reopened here: @jstac approved the label set
and the labelling policy on #2, and @mmcky confirmed the merge. Only the
bookkeeping is outstanding.

## Changes

| Location | Was | Now |
|---|---|---|
| `qeps/qep-0002-standard-github-labels.md` frontmatter | `status:
Draft` | `status: Accepted` |
| `qeps/qep-0002-standard-github-labels.md` header table | Draft |
Accepted |
| `README.md` index row | Draft | Accepted |

Nothing else changes — no normative content is touched, so this is an
editorial commit under AGENTS.md's substantive/editorial split.

## Downstream

Merging this changes the README row QEP-3 (#7) and QEP-4 (#8) must
carry. Both branches are already stale against `main` (they predate
QEP-1 v2 and QEP-2's merge, and neither has the QEP-2 row at all), so
each will be brought up to date in its own revision round.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…P-2 landed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@mmcky

mmcky commented Aug 14, 2026

Copy link
Copy Markdown
Contributor Author

Update (2026-08-14). Housekeeping while this PR is under revision:

  • Merge conflict resolved — merged main into qep-0003 (0b6dccb). The conflict was only the README index table: the QEP-3 row is re-slotted after QEP-1 (now v2) and QEP-2, both of which landed on main after this PR opened. No change to the QEP text itself.
  • PR body updated — the lapsed decision deadline (2026-07-24) is removed and the PR is marked under revision; a fresh comment window and deadline will be set when the amended draft is ready.
  • Next — the amendment incorporating the field-test findings from this thread is being drafted: replace workflow-* with reporter-*/task-* in the §2 registry with the read/write boundary stated, note the deliberate absences in Alternatives, and add the two renames as §5 opportunistic candidates. The broader process idea — field testing any QEP while in Draft — is now proposed in Process idea: field testing a QEP while in Draft #14.

…a example

Addresses two Copilot review comments on #7.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@mmcky

mmcky commented Aug 14, 2026

Copy link
Copy Markdown
Contributor Author
  • @mmcky to think through just using project- for both short and long term project workspaces and remove workspace- entirely as a repo concept. I think this is the better way to go.

@mmcky mmcky self-assigned this Aug 14, 2026
@mmcky

mmcky commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Suggestion from the translation program — a registry entry for published software tools. Today's naming grammar covers lecture content, programs and operations, events, and the support types, but not the family QuantEcon has always had: software packages whose identity is their ecosystem name — sphinx-exercise, sphinx-tojupyter, sphinx-proof, quantecon-book-theme, QuantEcon.py. Those are unprefixed by necessity (the PyPI/npm/registry name and the repository name should agree), and the draft only mentions tool-* as a "future family visible in the long tail", which leaves the next tool with no rule to follow.

We hit exactly this on 2026-08-21 naming the git-metrics tool that came out of project-translation#49: a general Python package, published to PyPI, consumed by status-translations. It landed as QuantEcon/textstrata — unprefixed, on the precedent above — but that was reasoning from examples, not from the QEP.

Proposed addition to §1 (grammar) and the registry, one row and one rule:

Prefix Meaning Visibility Lifecycle
(none — the package name) published software package or tool whose name is registered in an ecosystem (PyPI, npm, Julia General, GitHub Actions marketplace is already action-*); the repository name equals the package name public living, with releases

Rule: published packages take their ecosystem name unprefixed; tool-* is reserved for internal, unpublished tooling (scripts and benches that are not installable and not meant to be). That keeps the dash-prefix grammar for everything that is ours to name and concedes the one case where an external registry names the thing for us. action-* stays as it is — it is the same idea for the Actions marketplace, where the uses: path is the identity.

Worked example for the anatomy page: textstrata (package) ↔ status-translations (consumer) ↔ project-translation (decides). If the panel would rather keep the registry purely prefix-based, the alternative is to list "ecosystem-named packages" explicitly as an exception in §1 point 3, which is where the reserved ecosystem names already live.

@mmcky

mmcky commented Aug 25, 2026

Copy link
Copy Markdown
Contributor Author

Field test: a rename proposal the registry can't express — the audit- lifecycle row

Another live decision run against the draft, in the spirit of #14. Finding 1 is validation: §1.4 decides the dash form without interpretation. Finding 2 is a real gap — the sole member of the audit- family is arguing it is not the thing its registry row describes, and the reason it gives is, almost word for word, the status-* graduation rule from §2's boundary rules.

The test case

audit.2026-05.style-guide publishes a style-guide compliance audit of the lecture corpus (5 series, 292 lectures) as a Pages site. It was created under the dated audit.YYYY-MM.{topic} convention, on the assumption that each audit is a disposable snapshot: publish, archive when stale, let the date signal freshness. The repo now proposes renaming itself to audit-lectures-style-guide — dash form, date removed — on the grounds that lectures/data/history.csv and rule_reach_history.csv accumulate one row per pass and the cross-period trend chart is the asset. Proposal and reasoning: QuantEcon/audit.2026-05.style-guide#2.

Finding 1 — §1.4 decides the dash form cleanly (validation, no amendment)

The grammar answers the easy half directly: dots are the variant marker, type prefixes take a dash, existing dotted names are grandfathered, new members use the dash form. So the compliant rename of this repo is audit-2026-05-style-guide. No interpretation needed, and the Alternatives entry ("the families are small and rarely minted, so the switch costs nothing") holds up — this is the first mint since the QEP opened. Recording it as evidence; nothing to change.

Finding 2 — the decision is really in the audit- row's lifecycle field

The proposal does not want the dash form of a dated name. It wants an undated, durable name, and the registry has no way to say that:

What the proposal asserts What the registry row says
topic + scope, no date audit-{yyyy-mm}-{topic}
durable home, re-run each period in place frozen once published
the cross-period series is the deliverable a point-in-time audit is the deliverable

The justification given is the graduation rule restated: the same checks re-run on a cadence, writing versioned data, rendered as a Pages site. That is the status-{domain} anatomy in §2 — collector + versioned data + Pages site — not "dated point-in-time audit, frozen once published". The repo is a hybrid, in the same way reports-activity was in the automation-types finding above:

Contents Registered type it matches
lectures/data/*history*.csv and the charts page, regenerated each pass status-{domain}
per-pass prose findings, and the four contributed issue bodies audit-{yyyy-mm}-{topic}
UPDATE.md — the documented procedure for re-running a pass the collector half of status-*

Two readings are available, and the QEP should pick one rather than leave the next audit to argue it out in its own repo:

  • It is a status-* repo that began life as an audit. The numbers are collected on a cadence, so they graduate; the repo is renamed for the domain it measures, alongside status-lectures and status-translations; the narrative half stays with project-style-guide, which is already this program's home of record.
  • It is an audit- repo and the series is a by-product. Then the date stays — audit-2026-05-style-guide — a new dated repo is minted per pass, and cross-period history is the status plane's job, not the audit's.

I lean to the first. The boundary rule's own test is whether collection is automated on a cadence, and UPDATE.md plus two pinned corpus snapshots means it already is; and the second reading requires copying lectures/data/ forward by hand every pass, which is the manual step the rule exists to prevent.

Concretely, if agreed:

  1. In §2, widen the "numbers graduate" boundary rule beyond project-* incubation. It currently opens "A dashboard may incubate as hand-maintained tables inside a project repo", which reads as project-specific and is why this case fell through — the trigger should be any repo accumulating cadence-collected numbers, whatever prefix it started under.
  2. Add one clause to the audit- row's lifecycle: frozen once published — an audit whose checks are re-run on a cadence, and whose cross-period series is the deliverable, graduates to status-{domain}.

On scope: this is not a case for declining audit- registration the way reports- was declined. Single-member supporting families are normal in that table (template- has one member, the benchmark. family one), and the prefix carries real role signal. The finding is about the lifecycle field, not the prefix.

One process note, and some mechanics worth keeping

The rename was about to be decided in the audit repo itself; the QEP is not cited anywhere in the issue, and its "Still open" section defers instead to project-style-guide as the home of record for naming. That repo is the right authority for the program's cadence, but the namespace is this QEP's — a second data point for #14, and an argument that acceptance should include a pointer from the operational homes back to the registry.

Independent of which name wins, the migration mechanics in that issue are accurate and worth not re-deriving: GitHub redirects repository URLs after a rename but github.io Pages URLs are not redirected (16 references in-repo would 404), and the four contributed issue bodies mirrored under contributions/issues/ carry Pages links, so editing them locally is only half the job — the live QuantEcon/action-style-guide issues need re-syncing too.

Copy link
Copy Markdown
Collaborator

Field test, part 2: the audit- lifecycle gap resolves into a compliance-{domain} plane — amendment proposed

Follow-up to the field test above (#7 (comment)). The rename decision in QuantEcon/audit.2026-05.style-guide#2 has now landed — on neither of the two readings offered there. Working the case to the end surfaced a missing type and a cleaner set of invariants than the amendments floated there. Proposing them here while the QEP is in revision.

Finding 3 — the registry adjudicates the published record

Before deciding, the proposal's premise was checked against the repo. On main (18716da) none of it existed: no lectures/data/*history*.csv, no cross-period trend chart (the charts page renders four static figures from an inline block and marks data/scores.csv as future work), no 2026-08 snapshot — one audit pass, published 2026-05, untouched since. The artifacts turned out to be real but in flight on an unmerged working branch (claude/project-review-lecture-updates-6o9a2f, the 2026-08 pass in progress), which the issue had described as the current published state. The field-test comment above carried those claims forward — including "two pinned corpus snapshots means it already is [collected on a cadence]" — unchecked.

The lesson is small and sharp, and worth a sentence in §5: a rename proposal states the facts its target row's lifecycle turns on, and the registry adjudicates them against the published record — in-flight work is cited as in-flight, not as state. A repo planning a series is not yet a repo having one.

Finding 4 — neither reading was right; the missing type is the ledger

  • Not status-*. The repo's numbers are rubric scores produced by agents, with calibration drift as a managed risk — adjudications, not observations. status-{domain}'s promise is re-run the collector, get the same number; putting judgment behind that prefix launders opinion as fact.
  • Not a de-dated audit-*. An audit is an event, even when recurring — financial audits recur annually and stay audits. The living thing is not the audit; it is the record the audits update.

The missing type is the standing conformance ledger.

Proposed amendment

(a) §2 Programs and operations — a fifth verb and row. project-* decides, workspace-* operates, workflow-* automates, status-* measures, compliance-* assesses.

Prefix Meaning Visibility Lifecycle
compliance-{domain} standing record of a domain's conformance with a named standard: rubric + runbook (typically a skill), findings and scores re-measured in place per pass; versioned history seeded from each absorbed audit public (typically) standard-scoped — durable while the standard is enforced

(b) §2 boundary rules — add two.

  • status-* reports what machines observe; compliance-* records what a rubric adjudicates. Shared anatomy (collector + versioned data + Pages site) does not decide the type; the epistemic mode does. Containment is asymmetric: a compliance ledger may embed machine-collected facts as evidence, but adjudicated numbers never appear on a status dashboard. Litmus tests: a script with no prompt could produce the number → status-; publication requires reviewing findings → compliance-; the repo recommends anything → compliance- (status has no opinions). Both may exist for one domain: the ledger keeps its mechanical evidence inside until that plane has consumers of its own — at which point the evidence (never the judgment) graduates to status-{domain}.
  • The audit is the event; the compliance repo is the ledger. A one-off examination publishes as audit-{yyyy-mm}-{topic} and freezes. When examinations acquire a cadence, an owner, and a runbook, the standing record is a compliance-* repo assembled from one or more audits; absorbed audit repos are archived — content and Pages stay public and citable — and never renamed. Routine passes post to the ledger directly; dated audit repos remain available as citable freezes of a specific pass.

(c) §2 Supporting — the audit- row's lifecycle becomes: frozen once published; archived once absorbed into a compliance-* ledger.

(d) §5 — the invariant underneath all of this: renames fix names; they never transmute types. A repo that outgrows its type is succeeded by a new repo of the right type and archived — the same shape as "concluded events are archived, not renamed", stated generally.

(e) §1 — grammar note (the reversal test). Choose name tokens so the name reads as natural English when expanded: attributive singulars inside compounds (compliance-lecture-style → "lecture-style compliance", like house style, user guide), standalone plurals for whole-domain tokens (status-translations). This settles singular/plural choices mechanically.

This supersedes the two amendments floated in the field-test comment above (the widened incubation trigger and the audit-row graduation clause): under (b)'s second rule the audit row needs no graduation language at all, and the existing graduation rule gets its correct scope from (b)'s first — evidence graduates, judgment doesn't.

Applied to the test case

audit.2026-05.style-guide keeps its grandfathered dotted name for life. QuantEcon/compliance-lecture-style is assembled from main plus the in-flight branch — which, tellingly, already has the ledger's anatomy: lectures/data/history.csv seeded with the 2026-05 rows, rule_reach_history.csv carrying the 2026-08 pass, snapshot.json pinning the corpus, a deterministic tools/qestyle_*.py checker suite (the embedded evidence layer, and the eventual status- graduation candidate), and per-lecture reviews (the adjudication layer). The audit repo then archives with its Pages site and all posted issue links intact — zero breakage, versus 17 dead Pages links (10 inside live action-style-guide issue bodies) under any rename. The repo's own ROADMAP §2.3 had leaned exactly this way in May ("Option β … cleaner conceptually; the disposable repo really is a snapshot"); the registry now has the type it was missing. Decision recorded in QuantEcon/audit.2026-05.style-guide#2; execution tracked in QuantEcon/audit.2026-05.style-guide#7.

Two tidy consequences for earlier findings: reports- stays on its way out (nothing here revives it — the ledger is an assessment plane, not a "reports" family), and the hypothesized sibling lands cleanly as compliance-lecture-accessibility.


Generated by Claude Code

Folds the amendments queued on the discussion PR into one coherent text:

- Replace workflow-* with the effect-named reporter-*/task-* pair; the
  boundary is read vs write access, not trigger or mechanism
- Add compliance-{domain} (assesses): the standing conformance ledger,
  with the status/compliance epistemic boundary rule and the
  audit-is-the-event rule; audit-* lifecycle gains the absorption clause
- Remove workspace-* (zero members; both field-tested placements
  resolved into project-*); the bench allowance folds into the
  project-* boundary rule, re-registrable by amendment (Rollout 6)
- 3: published packages take their ecosystem name unprefixed, stated as
  a forward rule; register tool-* for internal unpublished tooling
- 5: renames fix names, never transmute types (succession + archive);
  rename proposals are adjudicated against the published record
- 1: add the reversal test for name tokens; fix the machine-parse claim
  in Alternatives (candidate type, validated against the registry)
- Rollout: automation renames, the compliance-lecture-style succession,
  non-parsing translated editions ride the meta#333/334 batch, event
  sweep noted as a task-* candidate; tool-* leaves the future-families
  list; verbs line updated (decides/measures/narrates/executes/assesses)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LrLuqmKVPh2zDyz8JSyyPD

Copy link
Copy Markdown
Collaborator

Amended draft landed (5922608). Everything queued in this thread is now in the text, reconciled into one registry: the reporter-*/task-* pair replaces workflow-* (read/write boundary rule), compliance-{domain} is added with the two epistemic boundary rules and the audit-* absorption clause, workspace-* is removed per the checklist above (bench allowance folded into the project-* boundary rule; recorded in Alternatives), the published-package rule is stated forward in §3 with tool-* registered, and §5 gains the succession invariant plus the published-record adjudication rule. Rollout picks up the automation renames, the compliance-lecture-style succession, and the non-parsing translated editions.

Also fixed while in there: the machine-parse claim in Alternatives (split on first dash gives a candidate type, validated against the registry — sphinx-tojupyter and friends don't parse and aren't meant to), and §1 gains the reversal test.

The PR body is updated to describe the amended draft, with the four deltas listed as the points where input is most useful. The four Copilot threads (all addressed in 67ea43a or overtaken when QEP-2 merged) are resolved. Remaining before decision: @mmcky to announce the fresh comment window and deadline.


Generated by Claude Code

@quantecon-services

Copy link
Copy Markdown
Collaborator
  • @mmcky to read and edit QEP-3 and then mark for review

Copy link
Copy Markdown
Collaborator

Field note — test-{name}, from a live placement decision (2026-08-27).

We nominated QuantEcon/test-cli as the integration testbed for the qe CLI (QuantEcon/cli#24) and used the draft's supporting-type registry to name it. Two observations, one confirming and one small.

Worked without special pleading. The test-{name} row — "disposable test double / CI target for tooling" — matched the need exactly, and test-cli reads correctly as "test double for cli". The §4 interaction is also clean: cli is a reserved singleton, but test-cli sits inside the prefix system, so there is no collision and no ambiguity about which rule governs. That distinction wasn't obvious to us until we checked, and the draft handled it correctly as written — worth recording as evidence for the reserved-names list, which the PR notes went unchallenged in the first window.

One wording observation. The lifecycle column reads "archive when the pilot ends". This instance has no pilot: it is a standing CI target that should live exactly as long as the tool it tests. The row may want "archive when the tooling it targets is retired", or an explicit acknowledgement that test-* spans both pilot-scoped doubles and standing targets.

Not one of the four points flagged as most wanting input, so treat it accordingly — raising it only because it surfaced from an actual naming decision rather than a reading.


Generated by Claude Code

The consolidated revision removed the workspace-* type on the grounds that
the family had zero members. It has one: QuantEcon/workspace-lectures, private
and standing since January 2025 (named `lectures` until July 2026), carrying
the manifest, runner and clone root for the lecture family and serving several
concurrent initiatives at once.

That is the same condition the project-* boundary rule names as the evidence
for registering a fleet-bench type, so the removal was self-undermining; and
folding the incumbent into project-* would have run into §5, which forbids
renaming a repo into a different type and would have demanded that a live bench
be succeeded and archived instead.

Restores the registry row, the goal-vs-fleet boundary rule and the
workspace-ready test, and rewrites the Alternatives entry to record the removal
proposal and why it was reversed. The prefix name itself is left open for a
future amendment: workspace- names the place rather than the actor's effect,
unlike the other five operational types.

Discussion in #7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mmcky

mmcky commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

workspace-* is restored (f4dcbfc). The consolidated revision removed it on the ground that "the family had zero members", which is not right: QuantEcon/workspace-lectures is one — private, standing since January 2025 under the name lectures and renamed in July 2026, carrying the manifest, the runner and the clone root for the lecture family, and serving several concurrent initiatives at once (the datasets migration, the CI migration, the maintenance program, the jax pin) while outliving each of them.

That is the same condition the retained project-* boundary rule names as the evidence that would justify registering a fleet-bench type, so the removal argument was self-undermining. The second problem was §5: folding the incumbent into project-* would have required either a rename into a different type, which §5 forbids, or succeeding-and-archiving a live bench, which is not a sane outcome for a naming standard. The draft had a rule for a repo that outgrows its type and no rule for a type retired out from under a conforming repo.

What changed in the text

Section Change
§2 registry workspace-{collection} row back — cross-repo operating bench for a repo family (manifest + runner, never vendors content), private, fleet-scoped
§2 intro six operational types; workspace-* operates rejoins the verbs line, with the human-authored / machine-written cut made explicit
§2 boundary rules goal-vs-fleet restored, with the graduation rule (a project's minimal bench graduates once shared across initiatives) and the workspace-ready test
Alternatives the entry now records the removal proposal and why it was reversed, rather than asserting an empty family
Summary operate added to the effect verbs

Left open deliberately. The prefix name. workspace- names the place, while the other five operational types name the actor's effect — decide, measure, narrate, execute, assess. Nothing in the org's issue history reviews candidate prefixes for this type (searched org-wide: issues in 87 active repos, plus full comment streams for qeps, meta, QuantEcon.manual, the project-*/status-* set and the lecture workspaces), unlike the reporter-/task- pair, which has a full rejected-names record earlier in this thread. A better-named replacement would be an amendment carrying its incumbents with it, not a new QEP.

A second member is proposed: QuantEcon/meta#381workspace-books, a fleet bench for the seven live book repos. Per §5's adjudication rule it is cited here as in-flight, not as state, so the QEP still names one member; the Alternatives entry gains a line once that repo exists.

The team manual's repository-conventions page already documents workspace-{collection} with the goal-vs-fleet guide, so Rollout §1's alignment work shrinks back to the reporter-/task-/compliance-/tool- rows.


Generated by Claude Code

mmcky and others added 2 commits August 27, 2026 19:09
…ered

The restored Alternatives entry left the prefix name open. It is now decided:
workspace- stays, and the asymmetry with the effect-named machine types is
recorded as deliberate — machines have no location, a fleet bench is the one
operational repo humans work in.

Adds the rejected-names record the entry was missing, in the same shape as the
reporter-/task- entry: maintenance-, ops-, fleet-, bench-, estate-, the agent
nouns, the verb forms and the place synonyms, each with its objection. The
workshop-/workspace- proximity is recorded as a knowingly accepted cost.

Discussion in #7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two loose ends found reviewing the draft ahead of the comment window.

The test-* row read "archive when the pilot ends", which does not describe
test-cli — a standing CI target that should live as long as the tool it tests.
The row now spans both pilot-scoped doubles and standing targets, as the
2026-08-27 field note on the discussion thread proposed.

Rollout item 3 said the event archival sweep was "proposed and tracked in meta"
without a reference, and no such issue exists. It now points at the open
inventory in QuantEcon/meta#267 and states the difference this QEP makes to it:
that issue archives on two years of inactivity, while the QEP makes the event's
conclusion the trigger.

Discussion in #7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mmcky

mmcky commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

Draft complete for review — three commits since the consolidated revision, closing everything queued in this thread.

Commit Change
f4dcbfc workspace-* restored (detailed in the note above)
fa0e6b7 The prefix name is decided, with the names considered recorded
cbc82f0 test-* lifecycle widened; the Rollout §3 tracker named

fa0e6b7workspace- stays, and the asymmetry is deliberate. The restored entry left the prefix name open on the objection that it names the place while the other five operational types name the actor's effect. That is now answered rather than deferred: the machine-written types are named for effects because machines have no location, whereas a fleet bench is the one operational repo humans work in rather than a process that runs — a place is the accurate thing to name it after. The entry now carries the rejected-names record the reporter-/task- entry has: maintenance- (the strongest challenger — effect-named and passes every filter, but no better at saying what the repo is), ops- (abbreviations are off-pattern; operations research is domain vocabulary), fleet- (names the object, and makes the boundary rule tautological), bench- (collides with the registered benchmark-{topic}, itself domain vocabulary), estate- (names the object; domain vocabulary), the agent nouns steward-/curator-/keeper- (in this registry agent nouns are the machine types, so a human-operated bench would misfile as automation), the verb forms maintain-/operate- (every registered prefix is a noun), and the place synonyms garage-/depot-/yard-/hub-. One cost is accepted knowingly and written down: workspace- and workshop- differ by two characters and share a registry, so the manual's worked examples need to keep them apart.

cbc82f0 — the two loose ends. The test-{name} row read "archive when the pilot ends", which does not describe test-cli; it now spans pilot-scoped doubles and standing targets, with a lifecycle for each, as the 2026-08-27 field note proposed. Rollout §3 claimed the event archival sweep was "proposed and tracked in meta" with no reference, and no such issue existed — it now points at the open inventory in QuantEcon/meta#267 and states the delta: that issue archives on two years of inactivity, while this QEP makes the event's conclusion the trigger, so its scope widens on acceptance.

Consistency pass over the current text: six operational types stated and six rows present, 19 prefixes each defined exactly once, no surviving reference to the removed type or to a Rollout §6 fleet-bench amendment. The PR body is in sync.

Sequencing note for anyone reading the workspace-* decision. A second member is proposed in QuantEcon/meta#381 (workspace-books, for the seven live book repos). It is cited as in-flight, not as state, so §2 still describes one member — but it does bound the naming question: renaming the prefix later would be a two-repo campaign, which §5 disallows, so the decision above is effectively the last cheap moment to make it.

Remaining before the decision: @mmcky's read-through, then the comment window and deadline.


Generated by Claude Code

Simplify the Summary and Motivation, compress the boundary rules and
Alternatives entries to their core distinctions, drop drafting-history
narration, and convert Rollout into an Adoption section of obligations.
The detailed execution items now live on their trackers: QuantEcon/meta#382
(continuous_time_mcs rename), QuantEcon/meta#383 (automation renames), and
a scope note on QuantEcon/meta#267 (event-concluded archival trigger).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@mmcky

mmcky commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

76fe865 is a document-wide tightening pass to match the QEP-1/QEP-2 house style: simpler Summary and single-paragraph Motivation, boundary rules and Alternatives compressed to their core distinctions, drafting-history narration removed, and Rollout converted to an Adoption section of obligations (per the QEP-2 convention). The execution detail that came out now lives on trackers: QuantEcon/meta#382 (continuous_time_mcs rename), QuantEcon/meta#383 (automation renames), and a scope note on QuantEcon/meta#267 (event-concluded archival trigger). No normative rule changed — final read-through to follow before this moves out of Draft.

@mmcky

mmcky commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

@mmcky to review

The three things worth a second look while you read: the compressed §2 boundary rules (the biggest cut — confirm no distinction you rely on went missing), the shortened workspace-* alternatives entries, and the new Adoption section's bullet linking meta#382/#383.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants