Skip to content

docs(agents): move issue tracking to GitHub and resync AGENTS.md with the repo - #132

Merged
cdwilson merged 6 commits into
mainfrom
docs/agents-issue-workflow
Aug 13, 2026
Merged

cdwilson merged 6 commits into
mainfrom
docs/agents-issue-workflow

Conversation

@cdwilson

@cdwilson cdwilson commented Aug 13, 2026 •

Copy link
Copy Markdown
Collaborator

Moves issue tracking to GitHub, then resyncs AGENTS.md with what the repo actually does. Five commits, each independently reviewable.

1. Track findings as GitHub issues (1d56f82)

Findings lived in markdown reports under untracked/, which cannot be assigned, linked to a PR, or closed by merging one. The 2026-08-06 review had accumulated three re-verification passes stamped inline and was still wrong: 13 of its 25 findings had been fixed by commits that landed after the last pass — including H5, which that pass called "the largest open item in the review".

The still-valid findings are now #120–#130. New ## Issues and reviews section records: search open and closed issues before filing, re-verify against the tree with dated evidence, the label taxonomy (performance / api-design / polish created alongside), closing keywords, and relationships instead of restated context.

New ### Upstream dependencies subsection replaces the one-line untracked/upstream/ rule:

  • The prohibition widens from "file issues" to every write GitHub offers — comments, edits, closes, reopens, reactions, reviews, PRs — and states that approval is neither durable nor implied.
  • Reading upstream is called out as unrestricted, so an over-broad rule does not get quietly ignored.
  • The upstream-labelled issue is a drafting workspace and a context anchor for dependents, not a permanent mirror.
  • "Do not manufacture work for upstream maintainers" — a maintainer drives every upstream interaction.

2. Resync the rest of the file (ca286a6)

Audited every remaining instruction against the tree. Most held; four did not.

Claim Reality
npm ci installs prettier It did not — package.json had cspell-cli and markdownlint-cli2 only, and npx silently fell back to the registry. Fixed for real in commit 4
poe check is the gate It is lint + sbom-check + spell-check + types — no tests. Listed beside test without saying so, it invites "check passed" as a completeness claim
Tests run parallel --numprocesses auto and --reruns 2 are passed in ci.yaml, not in addopts. Local runs are serial, so a process-sensitive test passes locally and fails in CI
project-words.txt is case-insensitive sorted True, but poe update-project-words appends a sorted batch rather than merging, so the file needs a re-sort afterwards

Also split the docs gate: mkdocs --strict catches broken internal links; external ones are linkchecker via poe docs-check.

3. AI attribution (1601042)

Adopts the kernel's Assisted-by: convention plus an ai-assisted label. Three details the format invites getting wrong are spelled out: the brackets in AGENT_NAME:MODEL_VERSION [TOOL1] [TOOL2] mark optionality and are not typed; tools are named analysis utilities that produced evidence, so an ad-hoc repro script does not qualify; and a bracketed context-window suffix must come off the model id, since claude-opus-5[1m] would read as the tool syntax.

Agents must not add Signed-off-by anywhere — only a human can certify the DCO — and an agent-filed issue must say what it could not do.

4. Install prettier, require test-matrix, require upstream issues (956eba8)

  • Prettier is now a dev dependency, pinned exactly to the version its pre-commit hook uses. Adds .prettierignore: prettier does not read .gitignore, so without it the newly-local binary reports 30 failures in agent scratch that nothing else checks.
  • poe test-matrix before pushing a PR. poe test proves one interpreter; CI runs 3.10–3.14 across three operating systems.
  • The upstream tracking issue is mandatory, not implied. The Conventions bullet read as though recording friction on the limitations page was the whole obligation. Rewritten to name both artifacts: the issue is the unit of work, the page is the durable explanation, and a registry row without a linked issue is incomplete. Required even when the decision is to carry the workaround indefinitely.

5. Backfill the tracking issues (a0c60af)

The limitations page documented friction with no issue behind it — stating a rule its own entries did not satisfy. #133–#140 now cover the seven limitation sections plus the one private-API use with no section of its own.

Granularity follows the friction, not the table rows: QueryInstance._hash belongs to the id-condition limitation that forces it, and Table._update_table to the update_many() gap, so neither private-API row gets its own issue.

The issues are deliberately thin — they link to the docs section rather than restating it. The page is what ships (versioned with mike, gated by --strict, written to be read standalone by an upstream maintainer, so it doubles as the ready-to-send proposal); an issue body is none of those and nothing reviews it when the code moves. The issues carry what a page cannot: status, priority, relationships, and the decision about whether anything reaches upstream.


Verified: poe test-matrix (3868 tests × Python 3.10–3.14), poe check (cspell 0, mypy clean, pyright 0 errors), poe docs-build --strict.

Note: #131 (mkdocstrings friction) is deliberately not referenced by any closing keyword here — it is under maintainer review and this PR makes no decision about it.

🤖 Generated with Claude Code

Findings lived in markdown reports under untracked/, which cannot be
assigned, linked to a PR, or closed by merging one. The 2026-08-06
review had accumulated three re-verification passes stamped inline
and was still wrong: 13 of its 25 findings had been fixed by commits
that landed after the last pass, including the one that pass called
the largest open item.

Records the workflow instead — search before filing, re-verify
against the tree with dated evidence, label taxonomy, closing
keywords, relationships over restated context.

Upstream work moves from untracked/upstream/ drafts to issues with
the upstream label. The prohibition on writing to external repos is
widened from "file issues" to every write GitHub offers, and made
explicit that approval is neither durable nor implied. The issue is
a drafting workspace and a context anchor for dependents, not a
permanent mirror: once filed upstream it is closed unless something
here is still being iterated on.

Assisted-by: Claude:claude-opus-5
Audited every instruction against the tree. Four were wrong or
imprecise enough to mislead:

npm ci does not install prettier. package.json carries cspell-cli
and markdownlint-cli2 only; prettier comes from its own pre-commit
hook, which manages a separate node environment. An agent reading
the old line would expect npx to resolve prettier locally, and it
only ever worked because npx falls back to the registry.

poe check does not run tests — it is lint, sbom-check, spell-check
and types. Listing it beside test without saying so invites
"check passed" as a completeness claim.

Parallelism is a CI-only flag. pytest-randomly shuffles everywhere,
but --numprocesses auto and --reruns 2 are passed in ci.yaml, not in
addopts, so local runs are serial and a process-sensitive test
passes locally and fails in CI.

project-words.txt must stay globally sorted, but
poe update-project-words appends a sorted batch to the end rather
than merging, so the file needs a re-sort after running it.

Also splits the docs gate in two: mkdocs --strict catches broken
internal links, while external ones are linkchecker via
poe docs-check.

Assisted-by: Claude:claude-opus-5
@netlify

netlify Bot commented Aug 13, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for tinydantic-preview ready!

Name Link
🔨 Latest commit a6b0a16
🔍 Latest deploy log https://app.netlify.com/projects/tinydantic-preview/deploys/6a7df5bb66c9050008b6fff4
😎 Deploy Preview https://deploy-preview-132--tinydantic-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 92
Accessibility: 98
Best Practices: 83
SEO: 97
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

Adopts the kernel's Assisted-by: convention
(https://docs.kernel.org/process/coding-assistants.html) plus an
ai-assisted label, so a reader can tell at a glance which findings
came from an agent and which model produced them.

Three details the format invites getting wrong, spelled out because
both were live here: the brackets in
AGENT_NAME:MODEL_VERSION [TOOL1] [TOOL2] mark optionality and are
not typed; tools are named analysis utilities that produced evidence
in the body, so an ad-hoc repro script does not qualify and most
issues carry none; and a bracketed context-window suffix has to come
off the model id, since claude-opus-5[1m] would read as the tool
syntax.

Also carries over the two rules that make the convention mean
something. Agents must not add Signed-off-by anywhere — only a human
can certify the DCO. And an agent-filed issue must say what it could
not do: whether the repro was run, whether a fix was built or
tested, what is still unverified. A report that reads as verified
but is not costs a maintainer more than no report.

Applied retroactively to #120-#131.

Assisted-by: Claude:claude-opus-5
Prettier was the one formatter npm ci did not provide, so npx
resolved it from the registry on every call and AGENTS.md had to
explain the exception. It is now a dev dependency pinned exactly to
the version its pre-commit hook uses — if that hook's rev moves,
package.json moves with it, or the two disagree about formatting.

Adds .prettierignore, which the repo never needed while prettier
only ran from pre-commit on staged files. A bare npx prettier .
walks everything, and prettier does not read .gitignore, so without
it the newly-local binary reports 30 failures in agent scratch that
nothing else in the toolchain checks.

Requires poe test-matrix before pushing a PR. poe test proves one
interpreter; CI runs 3.10 through 3.14 across three operating
systems, and a version-specific break is much cheaper to find
locally than in a red PR.

Makes the upstream tracking issue mandatory rather than implied. The
Conventions bullet read as though recording friction on the
limitations page was the whole obligation, so it is rewritten to
name both artifacts explicitly: the issue is the unit of work, the
page is the durable explanation, and a registry row without a linked
issue is incomplete. The requirement holds even when the decision is
to carry the workaround indefinitely — whether anything ever reaches
upstream is a separate maintainer call, so the "do not manufacture
work for upstream maintainers" restraint no longer exempts friction
we have chosen to work around.

The limitations page said proposals are drafted in untracked/upstream/,
which was retired earlier in this branch.

Assisted-by: Claude:claude-opus-5
Backfills the requirement this branch introduced. The limitations
page documented friction that had no issue behind it, so the page
stated a rule its own entries did not satisfy.

Eight issues now cover the seven limitation sections plus the one
private-API use with no section of its own (no public export for
ModelMetaclass). Granularity follows the friction, not the table
rows: QueryInstance._hash belongs to the id-condition limitation
that forces it, and Table._update_table to the update_many() gap, so
neither private-API row gets an issue of its own.

The issues are deliberately thin. They link to the docs section
rather than restating it, because the page is the artifact that
ships — versioned with mike, checked by strict mode, and written to
be read standalone by an upstream maintainer, which makes it the
ready-to-send proposal already. An issue body cannot be any of
those, and nothing reviews it when the code it describes moves. What
the issues carry instead is the part a page cannot: status,
priority, relationships, and the decision about whether anything
reaches upstream.

Assisted-by: Claude:claude-opus-5
@cdwilson
cdwilson force-pushed the docs/agents-issue-workflow branch from a30e1e0 to a0c60af Compare August 13, 2026 16:36
An at-mention in an issue, comment, PR body, or commit message sends
a real notification, and quoting does not suppress it: a draft
inside a block quote still pulls the person in, and so does one
under a heading that says "do not post". Draft collateral that sat
inert in a git-ignored file for weeks became live the moment it was
pasted into an issue, and notified an upstream maintainer about a
reply nobody had approved sending.

That is the same harm the upstream rules exist to prevent, reached
by a route those rules did not cover — they governed writing to
other repositories, not writing about other people in this one.

The mitigation is to write the name without the at sign, or wrap
the token in a code span, since GitHub does not create mentions
inside code.

Also records the milder neighbour, verified rather than assumed:
referencing an upstream issue posts a visible cross-reference on
their tracker. That is worth it for a genuine tracking link and this
repo has always done it, so the guidance is to keep such references
where they belong rather than to avoid them.

And tightens the closing-keyword rule. A keyword fires on merge and
will close an issue that someone has deliberately reopened, so it
belongs only on issues the merge genuinely resolves.

Assisted-by: Claude:claude-opus-5
@cdwilson
cdwilson merged commit 4d373d1 into main Aug 13, 2026
27 checks passed
@cdwilson
cdwilson deleted the docs/agents-issue-workflow branch August 13, 2026 16:56
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.

1 participant