Skip to content

docs(skills): promote the 2026-08 run's lessons into the skills that own them - #318

Merged
JArmandoAnaya merged 1 commit into
mainfrom
docs/promote-run-ledger
Aug 5, 2026
Merged

docs(skills): promote the 2026-08 run's lessons into the skills that own them#318
JArmandoAnaya merged 1 commit into
mainfrom
docs/promote-run-ledger

Conversation

@JArmandoAnaya

Copy link
Copy Markdown
Contributor

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.

# Lesson Skill Section
3 A declaration is a cached answer — invalidate the resource's own query, not just its counts ui-capabilities Required patterns
1 check.sh runs no browser suite; the real-server cycle run was 3× the only detector refactor-protocol Testing requirements
2 reuseExistingServer: !CI — always CI=1 locally refactor-protocol Testing requirements (folded into the same rule)
6 Gates read git ls-files; untracked files are invisible refactor-protocol Testing requirements
8 Test doubles must not encode invisible-order or frozen-state semantics refactor-protocol Testing requirements
5 tsconfig.build.json excludes tests — a green build is not a green typecheck nodejs-setup Before you say it works
4 A new wire field is not additive: three mirrors move together annotator-core new section, before the boundary gates
7 A method named after a builtin shadows it for later annotations python-setup Typing

Frontmatter, auto_invoke and allowed-tools untouched 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 #NNN only 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

Issue Action
#281 Reopened (auto-closed in error), commented, milestoned 0.1.0. edit_membership is now the last declared capability with no wire surface — the shape F24 had. Recommended as the next implementation task, with the suggested route shape.
#314 Newcheck.sh runs no browser suite; proposal to run all three or announce loudly when skipping, plus documenting CI=1. Labels: tooling, ci. Milestone 0.1.0.
#315 New — G5 trunk supersession, stated in T8's vocabulary ("which annotation does the trunk project?"), with T10's concrete trigger (a correction batch starts unannotated) and F14 named as the adjacent policy. Labels: deferred-needs-input, kernel.
#316 New — Dataset screen has no remove-asset control though DELETE /datasets/{id}/assets/{id} exists. Labels: ui-core, frontend. Milestone 0.1.0.
#317 NewIngestFailure.name leaks a full server path for directory ingests. Labels: kernel, api. Milestone 0.1.0.

A tooling label 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.md and repost-2.tmp.md, from the working tree only (both gitignored — not a commit). repost-2.tmp.md was 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:

Nothing durable existed only in the ledger.

Found, not fixed

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:scripts33 pass, 0 fail (the node gates over tests/scripts/, which include the design-token and boundary checks that read tracked files).
  • bash scripts/check.sh generatedgreen (openapi drift, generated-client drift, MCP tool reference drift, version sync — all unchanged, as expected for a docs change).
  • Full CI on this PR covers the rest.

…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
JArmandoAnaya enabled auto-merge (squash) August 5, 2026 00:17
@JArmandoAnaya
JArmandoAnaya merged commit 63341b6 into main Aug 5, 2026
26 of 27 checks passed
@JArmandoAnaya
JArmandoAnaya deleted the docs/promote-run-ledger branch August 5, 2026 00:26
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.
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.

api: batch membership editing is not on the wire, and the gallery is now the caller #29 was waiting for

1 participant