docs(skills): promote the 2026-08 run's lessons into the skills that own them - #318
Merged
Conversation
…own them The run ledger was a gitignored local file — the wrong home for anything that should outlive one session. Its eight lessons move to the five skills that already own the rules they belong to; the ledger and the audit report are deleted, and the open work they carried is now issues (#281 reopened and commented, #314–#317 filed). Each lesson lands in exactly one skill, in that skill's own voice, tagged with the task it came from. Nothing is pasted verbatim — a policy document is not a changelog, so each is distilled to the rule and its one load-bearing reason. - **ui-capabilities** — a declaration is a cached answer. Every mutation that could change what a resource may be asked to do invalidates that resource's query, not only its counts. A stale `allowed_actions` is the cache-side twin of the hand-mirror this skill already bans. - **refactor-protocol** (testing) — three suites, all of them, before every push: `check.sh` runs **no browser suite**, and the real-server cycle run was three separate times the only detector. Plus `CI=1` always (`reuseExistingServer`), `git add` before trusting a local run (gates read `git ls-files`), and the generalized stub rule: no invisible-order or frozen-state semantics in a test double. - **refactor-protocol** (PR & CI) — one clause beyond the listed eight, because it is a live defect rather than a lesson: GitHub reads a closing keyword anywhere in a squashed commit message, *including inside a sentence denying it*. "Nothing here closes #281" closed #281 on #312's merge. It is reopened. - **nodejs-setup** — a green build is not a green typecheck: `tsconfig.build.json` excludes tests, and tests are where fixtures live. - **annotator-core** — a new wire field is not additive for this client. The three mirror locations are named, because `parseAnnotation` refuses an undeclared key rather than ignoring it. - **python-setup** — a method named after a builtin shadows it for every annotation declared after it; mypy's "not valid as a type" is the tell. No application code, no skill frontmatter, no auto-invoke wiring touched.
JArmandoAnaya
enabled auto-merge (squash)
August 5, 2026 00:17
JArmandoAnaya
added a commit
that referenced
this pull request
Aug 21, 2026
…own them (#318) The run ledger was a gitignored local file — the wrong home for anything that should outlive one session. Its eight lessons move to the five skills that already own the rules they belong to; the ledger and the audit report are deleted, and the open work they carried is now issues (#281 reopened and commented, #314–#317 filed). Each lesson lands in exactly one skill, in that skill's own voice, tagged with the task it came from. Nothing is pasted verbatim — a policy document is not a changelog, so each is distilled to the rule and its one load-bearing reason. - **ui-capabilities** — a declaration is a cached answer. Every mutation that could change what a resource may be asked to do invalidates that resource's query, not only its counts. A stale `allowed_actions` is the cache-side twin of the hand-mirror this skill already bans. - **refactor-protocol** (testing) — three suites, all of them, before every push: `check.sh` runs **no browser suite**, and the real-server cycle run was three separate times the only detector. Plus `CI=1` always (`reuseExistingServer`), `git add` before trusting a local run (gates read `git ls-files`), and the generalized stub rule: no invisible-order or frozen-state semantics in a test double. - **refactor-protocol** (PR & CI) — one clause beyond the listed eight, because it is a live defect rather than a lesson: GitHub reads a closing keyword anywhere in a squashed commit message, *including inside a sentence denying it*. "Nothing here closes #281" closed #281 on #312's merge. It is reopened. - **nodejs-setup** — a green build is not a green typecheck: `tsconfig.build.json` excludes tests, and tests are where fixtures live. - **annotator-core** — a new wire field is not additive for this client. The three mirror locations are named, because `parseAnnotation` refuses an undeclared key rather than ignoring it. - **python-setup** — a method named after a builtin shadows it for every annotation declared after it; mypy's "not valid as a type" is the tell. No application code, no skill frontmatter, no auto-invoke wiring touched.
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.
The 2026-08 audit remediation run (T1–T10, PRs #304–#313) accumulated eight lessons and a "found, not fixed" list in
run-log.tmp.md— a gitignored, local-only file. This moves the durable knowledge to its strategic homes and deletes the ephemeral reports. Docs and issues only; no application code.The three durable homes: skills for rules, issues for open work, git history / PR bodies for what happened (already there — each of #304–#313 carries its findings, decisions and test plan).
Lessons → skills
Each lands in exactly one skill, distilled to the rule, in that skill's voice, provenance-tagged.
ui-capabilitiescheck.shruns no browser suite; the real-server cycle run was 3× the only detectorrefactor-protocolreuseExistingServer: !CI— alwaysCI=1locallyrefactor-protocolgit ls-files; untracked files are invisiblerefactor-protocolrefactor-protocoltsconfig.build.jsonexcludes tests — a green build is not a green typechecknodejs-setupannotator-corepython-setupFrontmatter,
auto_invokeandallowed-toolsuntouched in all five files; additions only (+46 lines, 0 deletions).One clause beyond the eight, and why
While filing Part C I found that #281 had been auto-closed in error. #312's squash commit message contained the sentence "Nothing here closes #281" — GitHub parses a closing keyword regardless of the words around it. Nothing about #281 was implemented.
I reopened it, said so in the comment, and added a one-clause extension to
refactor-protocol's existing "Closes #NNNonly for issues actually and fully closed" rule. That rule already existed; what was missing is that its negation also fires it. Flagging it here because it is a ninth item on a task that specified eight — it is an extension of a rule already in the skill, and a live defect I caused rather than a lesson I chose.Issues touched and created
edit_membershipis now the last declared capability with no wire surface — the shape F24 had. Recommended as the next implementation task, with the suggested route shape.check.shruns no browser suite; proposal to run all three or announce loudly when skipping, plus documentingCI=1. Labels:tooling,ci. Milestone 0.1.0.deferred-needs-input,kernel.DELETE /datasets/{id}/assets/{id}exists. Labels:ui-core,frontend. Milestone 0.1.0.IngestFailure.nameleaks a full server path for directory ingests. Labels:kernel,api. Milestone 0.1.0.A
toolinglabel was created (it did not exist); everything else used existing labels.Each issue body is self-contained — the ledger and the audit report are gone, so none of them depends on a dead file.
Deleted
run-log.tmp.mdandrepost-2.tmp.md, from the working tree only (both gitignored — not a commit).repost-2.tmp.mdwas already absent before this task began.No archive document created. No
docs/audits/, no copied report. Before deleting I cross-checked the ledger's two remaining sections:hasReleasesdeviation (IA restructure: Dataset is a tab, Schema history nests, Overview is a dashboard #310), T3's Accept gate (The annotator opens as a viewer when nothing can be written (F2, F23) #306), T8'sjob_idon update (Correction-batch prerequisites: batch lineage and annotation provenance (G3, G4) #311), T10's dropped filtered-set scope (Correction-batch UI: the end of the forward-only story (G6) #313), T9 not closing api: batch membership editing is not on the wire, and the gallery is now the caller #29 was waiting for #281 (Correction-batch surfaces: creation, corrections, and asset→batches (G1, G2, G7) #312).edit_membership→ api: batch membership editing is not on the wire, and the gallery is now the caller #29 was waiting for #281; G5 and its correction-batch trigger → kernel: trunk supersession — which annotation does the dataset project when a correction re-annotates a promoted asset? (G5) #315; remove-asset control → ui-core: the Dataset screen cannot remove an asset from the trunk, though the route exists #316;IngestFailure.name→ kernel: IngestFailure.name leaks a full server path for a directory ingest #317; F14 → named inside kernel: trunk supersession — which annotation does the dataset project when a correction re-annotates a promoted asset? (G5) #315; the rail/dataset-entry note → deliberately dropped per the task, since the IA rule ("≤1 click from any project tab") is satisfied by the tab IA restructure: Dataset is a tab, Schema history nests, Overview is a dashboard #310 added.Nothing durable existed only in the ledger.
Found, not fixed
closedevent across the run.Test plan
Docs-only, so the browser suites are not applicable under the rule this PR itself adds ("mandatory for anything touching state, gating, or progress" — this touches none):
pnpm test:scripts— 33 pass, 0 fail (the node gates overtests/scripts/, which include the design-token and boundary checks that read tracked files).bash scripts/check.sh generated— green (openapi drift, generated-client drift, MCP tool reference drift, version sync — all unchanged, as expected for a docs change).