feat: trim the node skill to its unique runtime subjects #34

Merged
jercik merged 9 commits from feat/trim-node-skill into main 2026-08-05 10:21:12 +00:00
Owner

Skills-triage batch 1 (second half): trims node from 18 files / 3,268 lines to the seven subjects the rule corpus does not cover — streams and backpressure, caching, Pino logging, profiling, graceful shutdown (with its runnable assets), flaky tests, and stuck processes. The dropped files taught what the corpus already owns or contradicts it: type stripping framed around Node 22 (with a false Node 20 claim), barrel-file guidance the module-exports rule forbids, env-schema over Zod against parse-don't-validate, an npm-flavored node_modules layout the global virtual store removed, plus generic async/error/performance material. Rewrites the SKILL.md description around the surviving subjects, converts the one npm install command to pnpm, and moves profiling.md's five ad-hoc npx invocations to pnpx.

Skills-triage batch 1 (second half): trims `node` from 18 files / 3,268 lines to the seven subjects the rule corpus does not cover — streams and backpressure, caching, Pino logging, profiling, graceful shutdown (with its runnable assets), flaky tests, and stuck processes. The dropped files taught what the corpus already owns or contradicts it: type stripping framed around Node 22 (with a false Node 20 claim), barrel-file guidance the module-exports rule forbids, env-schema over Zod against parse-don't-validate, an npm-flavored node_modules layout the global virtual store removed, plus generic async/error/performance material. Rewrites the SKILL.md description around the surviving subjects, converts the one npm install command to pnpm, and moves profiling.md's five ad-hoc `npx` invocations to `pnpx`.
feat: trim the node skill to its unique runtime subjects
Some checks failed
Node tests / node:test (pull_request) Successful in 20s
commit-msg / commitlint (pull_request) Successful in 29s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m45s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 49s
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Failing after 50s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Failing after 50s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Successful in 2m37s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m4s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m24s
c52ea847fe
forgejo-actions left a comment

Approach review: The trim is the right shape. Deleting whole rule files rather than editing them down keeps the skill's boundary crisp — the SKILL.md now states the split ("TypeScript execution, module style, test shape, and environment parsing are owned by the always-on rule corpus") rather than leaving readers to infer it, and the surviving seven subjects are exactly the ones the index still links. The rewritten description follows this repo's own documented pattern from skills/ai-facing-writing-style/SKILL.md (what it does → situations → literal triggers, one per situation), and dropping the metadata: tags block matches the dominant convention: only 2 of 29 skills carry one.

One leftover: skills/node/rules/stuck-processes-and-tests.md still links [testing.md](testing.md) under "Related rules", and that file is deleted here. SKILL.md's own links are all clean, so the gap is only in rule-to-rule cross-references — a sweep over surviving files for links to deleted paths would close it, and is worth folding into the later triage batches too.

Two observations, neither blocking. skills/fastify-zod-reference/rules/typescript.md still teaches type stripping and --experimental-strip-types, so the material this PR removes as corpus-owned survives in a sibling skill; that reads like a later batch, but the dedupe is incomplete until it lands. And rules/assets/graceful-server.ts / graceful-server.test.ts are reachable from no file — pre-existing, not caused by this diff, but since the index section was rewritten anyway it was a cheap place to point at them.

Approach review by Claude Code Opus (opus)

**Approach review:** The trim is the right shape. Deleting whole rule files rather than editing them down keeps the skill's boundary crisp — the SKILL.md now states the split ("TypeScript execution, module style, test shape, and environment parsing are owned by the always-on rule corpus") rather than leaving readers to infer it, and the surviving seven subjects are exactly the ones the index still links. The rewritten `description` follows this repo's own documented pattern from `skills/ai-facing-writing-style/SKILL.md` (what it does → situations → literal triggers, one per situation), and dropping the `metadata: tags` block matches the dominant convention: only 2 of 29 skills carry one. One leftover: `skills/node/rules/stuck-processes-and-tests.md` still links `[testing.md](testing.md)` under "Related rules", and that file is deleted here. SKILL.md's own links are all clean, so the gap is only in rule-to-rule cross-references — a sweep over surviving files for links to deleted paths would close it, and is worth folding into the later triage batches too. Two observations, neither blocking. `skills/fastify-zod-reference/rules/typescript.md` still teaches type stripping and `--experimental-strip-types`, so the material this PR removes as corpus-owned survives in a sibling skill; that reads like a later batch, but the dedupe is incomplete until it lands. And `rules/assets/graceful-server.ts` / `graceful-server.test.ts` are reachable from no file — pre-existing, not caused by this diff, but since the index section was rewritten anyway it was a cheap place to point at them. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImM1MmVhODQ3ZmUwODk1NTdlOTliZDg2NDAxOTA1YWE2MmUxMTk3OTQiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxNjcxNiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJkN2U0MjkwMC1jY2YyLTRiZTgtOGJhMS1lYmE0OThkOWE2ZjIifQ== -->
@ -52,3 +52,2 @@
- ESM / modern Node: `npm i -D why-is-node-running`
- older CommonJS projects: `npm i -D why-is-node-running@v2`
- ESM / modern Node: `pnpm add -D why-is-node-running`

This file survives the trim, but its "Related rules" section at the bottom still links [testing.md](testing.md), which this PR deletes. An agent following the pointer spends a read on a missing path. Consider making a sweep for links into deleted rule files part of each triage batch — SKILL.md's index was updated correctly, so only rule-to-rule cross-references were missed.

This file survives the trim, but its "Related rules" section at the bottom still links `[testing.md](testing.md)`, which this PR deletes. An agent following the pointer spends a read on a missing path. Consider making a sweep for links into deleted rule files part of each triage batch — SKILL.md's index was updated correctly, so only rule-to-rule cross-references were missed.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 1 medium issue.

The trim is coherent: SKILL.md no longer links any removed rule, the surviving seven rules cross-reference only files that still exist (except the one flagged below), the rewritten description covers exactly the surviving subjects, and dropping the metadata: block matches the 27-of-29 skills that have none. The npm i -Dpnpm add -D conversion is correct, including why-is-node-running@v2: v2 parses as the semver range >=2.0.0 <3.0.0-0 and resolves to the published 2.3.0, so the older-CommonJS install still works. No other file in the repo references the eight deleted rules (the error-handling.md/testing.md/performance.md/typescript.md hits elsewhere are fastify-zod-reference's own files).

Code review by Claude Code Opus (opus)

**Summary:** Found 1 medium issue. The trim is coherent: `SKILL.md` no longer links any removed rule, the surviving seven rules cross-reference only files that still exist (except the one flagged below), the rewritten `description` covers exactly the surviving subjects, and dropping the `metadata:` block matches the 27-of-29 skills that have none. The `npm i -D` → `pnpm add -D` conversion is correct, including `why-is-node-running@v2`: `v2` parses as the semver range `>=2.0.0 <3.0.0-0` and resolves to the published 2.3.0, so the older-CommonJS install still works. No other file in the repo references the eight deleted rules (the `error-handling.md`/`testing.md`/`performance.md`/`typescript.md` hits elsewhere are `fastify-zod-reference`'s own files). _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImM1MmVhODQ3ZmUwODk1NTdlOTliZDg2NDAxOTA1YWE2MmUxMTk3OTQiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2NzE2Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImEyMDA1NGM2LWQyMGItNGRhYS1iNWExLWQ5MWNiOWRjODYzYyJ9 -->
@ -1,218 +0,0 @@
---

🟡 Medium: Deleting this file leaves a dangling link behind. skills/node/rules/stuck-processes-and-tests.md:123 still lists - [testing.md](testing.md) under its "Related rules" section, and that file is retained by this PR (it is edited two hunks earlier for the pnpm change). An agent following the stuck-process rule will try to read a rule file that no longer ships, wasting a tool call and losing the pointer entirely.

Drop that line from the "Related rules" list, leaving flaky-tests.md and graceful-shutdown.md, which both still exist.

🟡 **Medium:** Deleting this file leaves a dangling link behind. `skills/node/rules/stuck-processes-and-tests.md:123` still lists `- [testing.md](testing.md)` under its "Related rules" section, and that file is retained by this PR (it is edited two hunks earlier for the pnpm change). An agent following the stuck-process rule will try to read a rule file that no longer ships, wasting a tool call and losing the pointer entirely. Drop that line from the "Related rules" list, leaving `flaky-tests.md` and `graceful-shutdown.md`, which both still exist.
jercik marked this conversation as resolved
fix: drop the dangling testing.md cross-reference
Some checks failed
Node tests / node:test (pull_request) Successful in 7s
commit-msg / commitlint (pull_request) Successful in 13s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 3m4s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 1m5s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m41s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m58s
2fd49d79a8
Author
Owner

Adjudication for review findings 41983 and 41988 (both slots converged on the same defect):

Accepted and fixed in 2fd49d7 — the - [testing.md](testing.md) line is dropped from the "Related rules" list in skills/node/rules/stuck-processes-and-tests.md; flaky-tests.md and graceful-shutdown.md remain.

The suggested sweep ran over every surviving skills/node/ file against all eight deleted rule paths: line 123 was the only reference. That sweep is now part of the standing checklist for each triage batch.

Two non-blocking observations from the approach review, recorded rather than actioned here: the type-stripping duplication in fastify-zod-reference is deleted by PR #33 in this same batch, and the unreferenced rules/assets/graceful-server.* pair is pre-existing (and pinned by the node-test.yml staleness contract) — left for the estate triage rather than a drive-by edit.

Adjudication for review findings 41983 and 41988 (both slots converged on the same defect): **Accepted and fixed in `2fd49d7`** — the `- [testing.md](testing.md)` line is dropped from the "Related rules" list in `skills/node/rules/stuck-processes-and-tests.md`; `flaky-tests.md` and `graceful-shutdown.md` remain. The suggested sweep ran over every surviving `skills/node/` file against all eight deleted rule paths: line 123 was the only reference. That sweep is now part of the standing checklist for each triage batch. Two non-blocking observations from the approach review, recorded rather than actioned here: the type-stripping duplication in `fastify-zod-reference` is deleted by PR #33 in this same batch, and the unreferenced `rules/assets/graceful-server.*` pair is pre-existing (and pinned by the `node-test.yml` staleness contract) — left for the estate triage rather than a drive-by edit.
forgejo-actions left a comment

Summary: No actionable issues found; 1 informational note.

This is a documentation-only trim of the node skill: eight rule files deleted, SKILL.md frontmatter/description rewritten around the seven surviving subjects, and one install command converted to pnpm.

What I verified in the working tree:

  • No dangling links. Every rules/*.md link left in SKILL.md (streams, caching, logging, profiling, graceful-shutdown, flaky-tests, stuck-processes-and-tests) resolves to a file that still exists. Grepping the whole repo for the eight deleted filenames finds only skills/fastify-zod-reference, which has its own same-named rules — no cross-skill breakage. The only in-repo cross-reference to a deleted file (testing.md in stuck-processes-and-tests.md) is removed by the follow-up commit, and no prose-style references ("see the X rule") remain.
  • Frontmatter stays valid. name + description are present; the new description is 600 characters, well under the 1024-character skill-description limit. Dropping metadata.tags matches the repo majority — only fastify-zod-reference and typescript-magician carry a metadata block.
  • The pnpm change works. pnpm add -D why-is-node-running@v2 resolves (^2.3.0) — the leading v is accepted as a semver range, so the version pin for CommonJS projects is preserved.
  • CI assets are unaffected. skills/node/rules/assets/graceful-server.test.ts (the file the node-test workflow selects) still passes under Node 26.5.0: 4/4 tests green.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found; 1 informational note. This is a documentation-only trim of the `node` skill: eight rule files deleted, `SKILL.md` frontmatter/description rewritten around the seven surviving subjects, and one install command converted to pnpm. What I verified in the working tree: - **No dangling links.** Every `rules/*.md` link left in `SKILL.md` (streams, caching, logging, profiling, graceful-shutdown, flaky-tests, stuck-processes-and-tests) resolves to a file that still exists. Grepping the whole repo for the eight deleted filenames finds only `skills/fastify-zod-reference`, which has its own same-named rules — no cross-skill breakage. The only in-repo cross-reference to a deleted file (`testing.md` in `stuck-processes-and-tests.md`) is removed by the follow-up commit, and no prose-style references ("see the X rule") remain. - **Frontmatter stays valid.** `name` + `description` are present; the new description is 600 characters, well under the 1024-character skill-description limit. Dropping `metadata.tags` matches the repo majority — only `fastify-zod-reference` and `typescript-magician` carry a `metadata` block. - **The pnpm change works.** `pnpm add -D why-is-node-running@v2` resolves (`^2.3.0`) — the leading `v` is accepted as a semver range, so the version pin for CommonJS projects is preserved. - **CI assets are unaffected.** `skills/node/rules/assets/graceful-server.test.ts` (the file the `node-test` workflow selects) still passes under Node 26.5.0: 4/4 tests green. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6IjJmZDQ5ZDc5YTg4MzY5N2NmNzhkOTEyNGRkZDk1ZDA3OGI3NjQ3YjkiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2NzUyIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjU2MDY5NTBlLTMxNGEtNDI4ZS1hYmEyLTQ3MThmMDNjMGRkNyJ9 -->
@ -35,3 +8,1 @@
```
See [rules/typescript.md](rules/typescript.md) for complete configuration and examples.
Use this skill for Node.js runtime work in the subjects below. TypeScript execution, module style, test shape, and environment parsing are owned by the always-on rule corpus; this skill covers what the corpus does not.

ℹ️ Info: This sentence makes the skill's completeness depend on an "always-on rule corpus" that this repository does not ship — the README states the source has no rules/ directory, and the module-exports rule cited in the PR description is not in this repo's AGENTS.md either. Delivery-wise that is fine (the corpus comes from the agent's global rules), but a consumer who selects node in a workspace without that corpus now gets neither the TypeScript-execution/module/test/env guidance nor a pointer to where it lives. Naming the corpus source in this sentence would make the dependency recoverable; no change needed if every target agent is guaranteed to load it.

ℹ️ **Info:** This sentence makes the skill's completeness depend on an "always-on rule corpus" that this repository does not ship — the README states the source has no `rules/` directory, and the module-exports rule cited in the PR description is not in this repo's `AGENTS.md` either. Delivery-wise that is fine (the corpus comes from the agent's global rules), but a consumer who selects `node` in a workspace without that corpus now gets neither the TypeScript-execution/module/test/env guidance nor a pointer to where it lives. Naming the corpus source in this sentence would make the dependency recoverable; no change needed if every target agent is guaranteed to load it.
jercik marked this conversation as resolved
Author
Owner

Adjudication for review finding 42012 (Info):

Declined, with the rationale the finding itself anticipates. The "always-on rule corpus" is the estate's generated agent instructions (rendered into every target's global rule files), so every agent this estate deploys is guaranteed to load it — the finding's own no-change condition. Naming the source in the sentence would not make the dependency recoverable for an outside consumer either: the corpus lives in a private repository, so a pointer would name something unreachable. For such a consumer the skill remains self-contained for its seven subjects; the sentence only explains why the adjacent topics are absent, it defers no guidance a reader here needs.

The cycle also independently confirmed the 41988 fix — no dangling or prose-style references to the deleted rule files survive at this head.

Adjudication for review finding 42012 (Info): **Declined, with the rationale the finding itself anticipates.** The "always-on rule corpus" is the estate's generated agent instructions (rendered into every target's global rule files), so every agent this estate deploys is guaranteed to load it — the finding's own no-change condition. Naming the source in the sentence would not make the dependency recoverable for an outside consumer either: the corpus lives in a private repository, so a pointer would name something unreachable. For such a consumer the skill remains self-contained for its seven subjects; the sentence only explains why the adjacent topics are absent, it defers no guidance a reader here needs. The cycle also independently confirmed the 41988 fix — no dangling or prose-style references to the deleted rule files survive at this head.
Merge branch 'main' into feat/trim-node-skill
Some checks failed
Node tests / node:test (pull_request) Successful in 10s
commit-msg / commitlint (pull_request) Successful in 13s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m42s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 42s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m11s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m33s
985eca16a7
forgejo-actions left a comment

Summary: No actionable issues found.

Reviewed the trim of skills/node (8 rule files deleted, SKILL.md rewritten, one install note converted to pnpm) against the working tree:

  • No dangling links. Every relative link left in the skill resolves: SKILL.md now points only at streams.md, caching.md, logging.md, profiling.md, graceful-shutdown.md, flaky-tests.md, and stuck-processes-and-tests.md, all of which exist. A repo-wide grep for the deleted names (typescript.md, async-patterns.md, error-handling.md, modules.md, node-modules-exploration.md, performance.md, environment.md, testing.md) returns nothing, and the surviving stuck-processes-and-tests.md "Related rules" list correctly drops testing.md while keeping the two links that still resolve.
  • Frontmatter stays valid. The remaining block is two plain scalars; the description contains node:test (colon not followed by a space) and embedded double quotes mid-scalar, neither of which breaks YAML plain-scalar parsing. At 600 characters it is well inside the 1,024-character skill description budget, and dropping metadata.tags matches every other skill in skills/, none of which sets it.
  • pnpm conversion is faithful. pnpm add -D is the direct equivalent of npm i -D, and why-is-node-running@v2 still resolves the 2.x line under pnpm's semver range handling (a leading v is accepted in a range). The only other package-manager invocations left in the skill are npx runs in profiling.md, not installs, so the body's "one npm install command" claim holds.

One pre-existing observation, unrelated to these changes: skills/node/rules/assets/graceful-server.ts and graceful-server.test.ts are not referenced from graceful-shutdown.md or any other rule file, and were not referenced by any of the deleted files either — so this PR did not orphan them, they were already unlinked.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Reviewed the trim of `skills/node` (8 rule files deleted, `SKILL.md` rewritten, one install note converted to pnpm) against the working tree: - **No dangling links.** Every relative link left in the skill resolves: `SKILL.md` now points only at `streams.md`, `caching.md`, `logging.md`, `profiling.md`, `graceful-shutdown.md`, `flaky-tests.md`, and `stuck-processes-and-tests.md`, all of which exist. A repo-wide grep for the deleted names (`typescript.md`, `async-patterns.md`, `error-handling.md`, `modules.md`, `node-modules-exploration.md`, `performance.md`, `environment.md`, `testing.md`) returns nothing, and the surviving `stuck-processes-and-tests.md` "Related rules" list correctly drops `testing.md` while keeping the two links that still resolve. - **Frontmatter stays valid.** The remaining block is two plain scalars; the description contains `node:test` (colon not followed by a space) and embedded double quotes mid-scalar, neither of which breaks YAML plain-scalar parsing. At 600 characters it is well inside the 1,024-character skill description budget, and dropping `metadata.tags` matches every other skill in `skills/`, none of which sets it. - **pnpm conversion is faithful.** `pnpm add -D` is the direct equivalent of `npm i -D`, and `why-is-node-running@v2` still resolves the 2.x line under pnpm's semver range handling (a leading `v` is accepted in a range). The only other package-manager invocations left in the skill are `npx` runs in `profiling.md`, not installs, so the body's "one npm install command" claim holds. One pre-existing observation, unrelated to these changes: `skills/node/rules/assets/graceful-server.ts` and `graceful-server.test.ts` are not referenced from `graceful-shutdown.md` or any other rule file, and were not referenced by any of the deleted files either — so this PR did not orphan them, they were already unlinked. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6Ijk4NWVjYTE2YTdhNzIwMWFiNTNhOTdjYmJjOGM2MGEzMDcxOTM4MzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2ODI1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjAwODA1ODhmLWIxNjYtNGE5MC1hNjRiLWY5OWI3ZmM3Y2ZjNyJ9 -->
feat: route irreducible CPU-bound hotspots to piscina
Some checks failed
Node tests / node:test (pull_request) Successful in 14s
commit-msg / commitlint (pull_request) Successful in 27s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m22s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 45s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m42s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m59s
e380aeb3ec
forgejo-actions left a comment

Summary: Found 2 low-severity documentation issues; no correctness or security defects.

Verified against the working tree: no markdown link in the repository still points at any of the eight deleted rule files, every remaining link in skills/node resolves, no surviving rule file depends on symbols or prose defined in the removed ones, and the new frontmatter parses (plain YAML scalar, no : in the value, 600 chars) and matches the name/description-only shape every other skill here uses. The .forgejo/workflows/node-test.yml candidate-file expectation is unaffected — the deletions are all .md, and the one tracked test (skills/node/rules/assets/graceful-server.test.ts) is retained.

Minor observation, not attached as a comment because the lines are unchanged: rules/profiling.md still invokes tools via npx (lines 15, 25, 56, 59, 62) while this PR moves install commands to pnpm, so the file is now mixed between the two package managers.

Code review by Claude Code Opus (opus)

**Summary:** Found 2 low-severity documentation issues; no correctness or security defects. Verified against the working tree: no markdown link in the repository still points at any of the eight deleted rule files, every remaining link in `skills/node` resolves, no surviving rule file depends on symbols or prose defined in the removed ones, and the new frontmatter parses (plain YAML scalar, no `: ` in the value, 600 chars) and matches the `name`/`description`-only shape every other skill here uses. The `.forgejo/workflows/node-test.yml` candidate-file expectation is unaffected — the deletions are all `.md`, and the one tracked test (`skills/node/rules/assets/graceful-server.test.ts`) is retained. Minor observation, not attached as a comment because the lines are unchanged: `rules/profiling.md` still invokes tools via `npx` (lines 15, 25, 56, 59, 62) while this PR moves install commands to pnpm, so the file is now mixed between the two package managers. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImUzODBhZWIzZWMxNDEzMjI5NWNiM2U5NTA1YTEwODllM2E3MmI0NTkiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2OTEwIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImVhNjdiZDk2LTBlMzMtNDFlMi1iYWUzLTZiY2NiMmRjYjVhOCJ9 -->
@ -35,3 +8,1 @@
```
See [rules/typescript.md](rules/typescript.md) for complete configuration and examples.
Use this skill for Node.js runtime work in the subjects below. TypeScript execution, module style, test shape, and environment parsing are owned by the always-on rule corpus; this skill covers what the corpus does not.

🟢 Low: This defers four subjects to an "always-on rule corpus" that does not travel with the skill. This repository ships skills only (no rules/ tree, per the README), so an agent that receives just this skill — the normal axskills delivery for an external consumer — reads an explicit statement that TypeScript execution, module style, test shape, and environment parsing are covered elsewhere, and then gets no coverage at all. That is the failure mode skills/ai-facing-writing-style/SKILL.md:126 warns about: "Keep every pointer target inside the skill directory: the directory is the unit that travels, so an outside target may not exist where the skill runs."

Stating the scope positively avoids the dangling claim, e.g. "Covers Node.js runtime work in the subjects below; other Node.js and TypeScript conventions come from the project's own rules."

🟢 **Low:** This defers four subjects to an "always-on rule corpus" that does not travel with the skill. This repository ships skills only (no `rules/` tree, per the README), so an agent that receives just this skill — the normal `axskills` delivery for an external consumer — reads an explicit statement that TypeScript execution, module style, test shape, and environment parsing are covered elsewhere, and then gets no coverage at all. That is the failure mode `skills/ai-facing-writing-style/SKILL.md:126` warns about: "Keep every pointer target inside the skill directory: the directory is the unit that travels, so an outside target may not exist where the skill runs." Stating the scope positively avoids the dangling claim, e.g. "Covers Node.js runtime work in the subjects below; other Node.js and TypeScript conventions come from the project's own rules."
jercik marked this conversation as resolved
@ -170,3 +170,3 @@
1. **Establish baseline** - Run autocannon to get initial metrics
2. **Profile** - Use @platformatic/flame to identify hotspots
3. **Optimize** - Fix the identified bottlenecks
3. **Optimize** - Fix the identified bottlenecks; offload a hot function that is CPU-bound and cannot be made cheaper to a worker pool (`piscina`), never a hand-rolled `node:worker_threads` pool

🟢 Low: piscina is named here and in the SKILL.md profiling workflow, but this clause is the only mention anywhere in the skill — no install command, no pool sizing, and no teardown. Teardown is the concrete risk: a Piscina instance keeps its worker threads alive until destroy() is awaited, which produces exactly the "process did not exit" / open-handle symptom that rules/stuck-processes-and-tests.md:63 lists as a hang cause. Following this step and then debugging the resulting hang sends a reader between two rules in the same skill, neither of which connects them.

A short example alongside the clause (construct the pool once, await pool.destroy() in the shutdown path) would close the gap, or link graceful-shutdown.md from this step.

🟢 **Low:** `piscina` is named here and in the `SKILL.md` profiling workflow, but this clause is the only mention anywhere in the skill — no install command, no pool sizing, and no teardown. Teardown is the concrete risk: a `Piscina` instance keeps its worker threads alive until `destroy()` is awaited, which produces exactly the "process did not exit" / open-handle symptom that `rules/stuck-processes-and-tests.md:63` lists as a hang cause. Following this step and then debugging the resulting hang sends a reader between two rules in the same skill, neither of which connects them. A short example alongside the clause (construct the pool once, `await pool.destroy()` in the shutdown path) would close the gap, or link `graceful-shutdown.md` from this step.
jercik marked this conversation as resolved
fix: state the skill scope positively, add piscina teardown, and use pnpx
Some checks failed
Node tests / node:test (pull_request) Successful in 17s
commit-msg / commitlint (pull_request) Successful in 28s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m31s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 34s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 5m5s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 5m19s
ecd29a40e2
Author
Owner

Adjudication for review findings 42241 and 42242, both accepted and fixed in ecd29a4:

  • 42241 (Low) — accepted on the re-raise. The earlier decline (42012) rejected naming the corpus source, and this finding's fix needs no name: the scope sentence now states the boundary positively ("TypeScript execution, module style, test shape, and environment parsing are deliberately out of scope; they follow the project's own rules"), which satisfies the portability rule at ai-facing-writing-style/SKILL.md:126 without pointing anywhere that doesn't travel with the skill.
  • 42242 (Low) — accepted; the teardown gap was real and self-inflicted by the routing clause. The Optimize step now says to construct the pool once and await pool.destroy() in the shutdown path, links graceful-shutdown.md, and names the open-handle consequence.

The summary's unattached observation is also applied: profiling.md's five npx invocations are now pnpx, matching the pnpm conversion this PR already made.

Adjudication for review findings 42241 and 42242, both accepted and fixed in `ecd29a4`: - **42241 (Low)** — accepted on the re-raise. The earlier decline (42012) rejected naming the corpus source, and this finding's fix needs no name: the scope sentence now states the boundary positively ("TypeScript execution, module style, test shape, and environment parsing are deliberately out of scope; they follow the project's own rules"), which satisfies the portability rule at `ai-facing-writing-style/SKILL.md:126` without pointing anywhere that doesn't travel with the skill. - **42242 (Low)** — accepted; the teardown gap was real and self-inflicted by the routing clause. The Optimize step now says to construct the pool once and `await pool.destroy()` in the shutdown path, links `graceful-shutdown.md`, and names the open-handle consequence. The summary's unattached observation is also applied: `profiling.md`'s five `npx` invocations are now `pnpx`, matching the pnpm conversion this PR already made.
forgejo-actions left a comment

Summary: Found 1 medium issue and 1 informational note. The trim itself is clean — every surviving cross-link in skills/node resolves, no file elsewhere in the repository references a deleted rule, dropping the metadata: block matches every other SKILL.md here, and the 600-character description stays well inside the frontmatter budget.

The one real defect is the new piscina sentence in rules/profiling.md: the claim that a live pool keeps the process from exiting is false (verified against piscina 5.3.0 and 4.9.3 on Node 26 — piscina unrefs its workers and ports), and destroy() aborts in-flight tasks where the linked graceful-shutdown workflow wants them drained via close().

Code review by Claude Code Opus (opus)

**Summary:** Found 1 medium issue and 1 informational note. The trim itself is clean — every surviving cross-link in `skills/node` resolves, no file elsewhere in the repository references a deleted rule, dropping the `metadata:` block matches every other `SKILL.md` here, and the 600-character description stays well inside the frontmatter budget. The one real defect is the new piscina sentence in `rules/profiling.md`: the claim that a live pool keeps the process from exiting is false (verified against piscina 5.3.0 and 4.9.3 on Node 26 — piscina unrefs its workers and ports), and `destroy()` aborts in-flight tasks where the linked graceful-shutdown workflow wants them drained via `close()`. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImVjZDI5YTQwZTI2ZGVmMTRmZWY3MmQ4NTc2MmRkOTQ2ODM0MTI3OWQiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2OTM3Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImYxYmJmMzliLTEwZjMtNDllOS1hNjUyLWIzMjY1OWZlNzM1NiJ9 -->
@ -54,3 +54,3 @@
```bash
# Basic benchmark
npx autocannon http://localhost:3000
pnpx autocannon http://localhost:3000

ℹ️ Info: pnpx is still shipped by pnpm (v11 maps the pnpx bin to pnpm dlx, and flame/autocannon resolve fine), so these commands work. Two behavioural notes, no action required unless you want the corpus uniform: pnpm dlx always fetches from the registry and never prefers a locally installed binary the way npx does, so pnpx autocannon re-downloads even when autocannon is a devDependency; and the rest of this repository's skills (verify-readme, verify-unixy-cli, canonicalize-tailwind) prescribe npx -y for runnable examples.

ℹ️ **Info:** `pnpx` is still shipped by pnpm (v11 maps the `pnpx` bin to `pnpm dlx`, and `flame`/`autocannon` resolve fine), so these commands work. Two behavioural notes, no action required unless you want the corpus uniform: `pnpm dlx` always fetches from the registry and never prefers a locally installed binary the way `npx` does, so `pnpx autocannon` re-downloads even when autocannon is a devDependency; and the rest of this repository's skills (`verify-readme`, `verify-unixy-cli`, `canonicalize-tailwind`) prescribe `npx -y` for runnable examples.
jercik marked this conversation as resolved
@ -170,3 +170,3 @@
1. **Establish baseline** - Run autocannon to get initial metrics
2. **Profile** - Use @platformatic/flame to identify hotspots
3. **Optimize** - Fix the identified bottlenecks
3. **Optimize** - Fix the identified bottlenecks; offload a hot function that is CPU-bound and cannot be made cheaper to a worker pool (`piscina`), never a hand-rolled `node:worker_threads` pool. Construct the pool once and `await pool.destroy()` in the shutdown path (see [graceful-shutdown.md](graceful-shutdown.md)) — a live pool's worker threads keep the process from exiting

🟡 Medium: The stated reason for the teardown is wrong, and the chosen method contradicts the shutdown rule it links to.

Piscina unrefs both the worker and its MessagePort while idle (src/worker_pool/index.ts: workerInfo.init(...).workerUnref(), and _handleResponse unrefs the port once taskInfos.size === 0, with the comment "No more tasks running on this Worker means it should not keep the process running"). I verified this on piscina 5.3.0 and 4.9.3 under Node 26: a script that constructs a pool, awaits a task, and never calls destroy() exits with status 0; so does one that constructs a pool with minThreads: 4 and never runs anything. So "a live pool's worker threads keep the process from exiting" is false, and it directly misleads the sibling stuck-processes-and-tests.md workflow into blaming a live pool for a hang it cannot cause.

Second, destroy() "stops all Workers and rejects all Promises for pending tasks" — it aborts in-flight work, which is the opposite of the drain step in graceful-shutdown.md. close() (present in piscina 4 and 5) waits for started tasks to finish.

Suggested fix:

3. **Optimize** - Fix the identified bottlenecks; offload a hot function that is CPU-bound and cannot be made cheaper to a worker pool (`piscina`), never a hand-rolled `node:worker_threads` pool. Construct the pool once and `await pool.close()` in the shutdown path (see [graceful-shutdown.md](graceful-shutdown.md)) so in-flight tasks drain instead of being aborted by `destroy()`
🟡 **Medium:** The stated reason for the teardown is wrong, and the chosen method contradicts the shutdown rule it links to. Piscina unrefs both the worker and its `MessagePort` while idle (`src/worker_pool/index.ts`: `workerInfo.init(...).workerUnref()`, and `_handleResponse` unrefs the port once `taskInfos.size === 0`, with the comment "No more tasks running on this Worker means it should not keep the process running"). I verified this on piscina 5.3.0 and 4.9.3 under Node 26: a script that constructs a pool, awaits a task, and never calls `destroy()` exits with status 0; so does one that constructs a pool with `minThreads: 4` and never runs anything. So "a live pool's worker threads keep the process from exiting" is false, and it directly misleads the sibling [stuck-processes-and-tests.md](stuck-processes-and-tests.md) workflow into blaming a live pool for a hang it cannot cause. Second, `destroy()` "stops all Workers and rejects all `Promise`s for pending tasks" — it aborts in-flight work, which is the opposite of the drain step in [graceful-shutdown.md](graceful-shutdown.md). `close()` (present in piscina 4 and 5) waits for started tasks to finish. Suggested fix: ``` 3. **Optimize** - Fix the identified bottlenecks; offload a hot function that is CPU-bound and cannot be made cheaper to a worker pool (`piscina`), never a hand-rolled `node:worker_threads` pool. Construct the pool once and `await pool.close()` in the shutdown path (see [graceful-shutdown.md](graceful-shutdown.md)) so in-flight tasks drain instead of being aborted by `destroy()` ```
jercik marked this conversation as resolved
fix: drain the piscina pool with close() instead of destroy()
Some checks failed
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Successful in 18s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m35s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 41s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 5m30s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 5m50s
42d92f6574
Author
Owner

Disposition for review 9813 (head ecd29a4):

  • 42280 (Medium — piscina teardown): accepted, fixed in 42d92f6 with the suggested line verbatim. Verified the load-bearing claim independently in a fresh sandbox: piscina 5.3.0, minThreads: 4, one completed task, no close()/destroy() — the process exits with status 0, so "a live pool keeps the process from exiting" was false, and close() is the drain-shaped call the linked graceful-shutdown workflow wants.
  • 42281 (Info — pnpx vs npx -y): declined, no change. pnpx is deliberate on a pnpm-standard fleet, and the dlx cache keeps repeat fetches cheap. The npx -y prescriptions in verify-readme, verify-unixy-cli, and canonicalize-tailwind are queued for their own triage batches — corpus uniformity is better settled there than by flipping this file back now.
Disposition for review 9813 (head ecd29a4): - **42280 (Medium — piscina teardown)**: accepted, fixed in 42d92f6 with the suggested line verbatim. Verified the load-bearing claim independently in a fresh sandbox: piscina 5.3.0, `minThreads: 4`, one completed task, no `close()`/`destroy()` — the process exits with status 0, so "a live pool keeps the process from exiting" was false, and `close()` is the drain-shaped call the linked graceful-shutdown workflow wants. - **42281 (Info — `pnpx` vs `npx -y`)**: declined, no change. `pnpx` is deliberate on a pnpm-standard fleet, and the dlx cache keeps repeat fetches cheap. The `npx -y` prescriptions in `verify-readme`, `verify-unixy-cli`, and `canonicalize-tailwind` are queued for their own triage batches — corpus uniformity is better settled there than by flipping this file back now.
forgejo-actions left a comment

Summary: Docs-only trim of the node skill. I checked the surviving tree for fallout from the eight deleted rule files: no markdown link in skills/node (or anywhere else in the repo) still points at typescript.md, error-handling.md, async-patterns.md, modules.md, testing.md, environment.md, performance.md, or node-modules-exploration.md, and dropping the metadata: block from SKILL.md matches every other skill in skills/ (none carry one). The new piscina guidance is accurate against piscina 5.3.0: close() waits for started tasks while destroy() rejects pending ones. Two smaller points below: one shutdown-timing mismatch in the new piscina sentence, and one note on the npx -> pnpx conversions.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only trim of the `node` skill. I checked the surviving tree for fallout from the eight deleted rule files: no markdown link in `skills/node` (or anywhere else in the repo) still points at `typescript.md`, `error-handling.md`, `async-patterns.md`, `modules.md`, `testing.md`, `environment.md`, `performance.md`, or `node-modules-exploration.md`, and dropping the `metadata:` block from `SKILL.md` matches every other skill in `skills/` (none carry one). The new piscina guidance is accurate against piscina 5.3.0: `close()` waits for started tasks while `destroy()` rejects pending ones. Two smaller points below: one shutdown-timing mismatch in the new piscina sentence, and one note on the `npx` -> `pnpx` conversions. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6IjQyZDkyZjY1NzQ0MzQ4YzAwOWRlOTY5NjBkNWFjMGE0YjFkMzgyZTkiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE2OTcyIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjczZWE0NTNmLTA4YmUtNGZhYS1hOTQzLTZkNjUxNGE2ZGFlOCJ9 -->
@ -13,3 +13,3 @@
```bash
npx @platformatic/flame app.ts
pnpx @platformatic/flame app.ts

ℹ️ Info: The PR description says it "converts the one npm install command to pnpm", but this file also converts five npx invocations to pnpx. pnpx is still shipped by pnpm (it is in the bin map of pnpm 11.20.0) and aliases pnpm dlx, so the commands work — but pnpm dlx always fetches from the registry, whereas npx prefers a binary already in the project's node_modules/.bin. For a project that pins autocannon or @platformatic/flame as a devDependency, these lines now silently benchmark against a freshly resolved version instead of the pinned one, and they require pnpm to be installed. Every other skill in this repo (and AGENTS.md) uses npx -y.

ℹ️ **Info:** The PR description says it "converts the one npm install command to pnpm", but this file also converts five `npx` invocations to `pnpx`. `pnpx` is still shipped by pnpm (it is in the `bin` map of pnpm 11.20.0) and aliases `pnpm dlx`, so the commands work — but `pnpm dlx` always fetches from the registry, whereas `npx` prefers a binary already in the project's `node_modules/.bin`. For a project that pins `autocannon` or `@platformatic/flame` as a devDependency, these lines now silently benchmark against a freshly resolved version instead of the pinned one, and they require pnpm to be installed. Every other skill in this repo (and `AGENTS.md`) uses `npx -y`.
jercik marked this conversation as resolved
@ -170,3 +170,3 @@
1. **Establish baseline** - Run autocannon to get initial metrics
2. **Profile** - Use @platformatic/flame to identify hotspots
3. **Optimize** - Fix the identified bottlenecks
3. **Optimize** - Fix the identified bottlenecks; offload a hot function that is CPU-bound and cannot be made cheaper to a worker pool (`piscina`), never a hand-rolled `node:worker_threads` pool. Construct the pool once and `await pool.close()` in the shutdown path (see [graceful-shutdown.md](graceful-shutdown.md)) so in-flight tasks drain instead of being aborted by `destroy()`

🟡 Medium: This points a reader at graceful-shutdown.md for the pool teardown, but that file has no worker-pool section at all, and its two close-with-grace examples use delay: 10000. Piscina's closeTimeout defaults to 30000 ms (piscina 5.3.0 README: "An optional time (in milliseconds) to wait for the pool to complete all in-flight tasks when close() is called. The default is 30000"), so an await pool.close() placed inside that 10 s handler can still be waiting when close-with-grace force-exits the process — the in-flight tasks are killed anyway, which is exactly the outcome this sentence says close() avoids.

Either construct the pool with a closeTimeout below the shutdown delay (e.g. new Piscina({ filename, closeTimeout: 8000 }) under delay: 10000), or say the delay must exceed closeTimeout. Adding the pool-close step to graceful-shutdown.md would also make the cross-reference land on something.

🟡 **Medium:** This points a reader at `graceful-shutdown.md` for the pool teardown, but that file has no worker-pool section at all, and its two `close-with-grace` examples use `delay: 10000`. Piscina's `closeTimeout` defaults to 30000 ms (piscina 5.3.0 README: "An optional time (in milliseconds) to wait for the pool to complete all in-flight tasks when `close()` is called. The default is 30000"), so an `await pool.close()` placed inside that 10 s handler can still be waiting when close-with-grace force-exits the process — the in-flight tasks are killed anyway, which is exactly the outcome this sentence says `close()` avoids. Either construct the pool with a `closeTimeout` below the shutdown delay (e.g. `new Piscina({ filename, closeTimeout: 8000 })` under `delay: 10000`), or say the delay must exceed `closeTimeout`. Adding the pool-close step to `graceful-shutdown.md` would also make the cross-reference land on something.
jercik marked this conversation as resolved
fix: keep the pool drain inside the shutdown delay
Some checks failed
Node tests / node:test (pull_request) Successful in 15s
commit-msg / commitlint (pull_request) Successful in 21s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m59s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 35s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 5m44s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 6m0s
ae3ebd8135
Author
Owner

Disposition for review 9821 (head 42d92f6):

  • 42355 (Medium — closeTimeout vs shutdown delay): accepted, fixed in ae3ebd8. Verified both numbers independently: piscina's dist hardcodes closeTimeout: 30000, and graceful-shutdown.md's primary examples use delay: 10000. Took the state-the-constraint remedy — the sentence now requires closeTimeout below the shutdown handler's force-exit delay, so the constraint travels with the guidance. Deliberately did not add a pool section to graceful-shutdown.md: the cross-reference points at the shutdown ordering (drain before exit), and growing that file is out of scope for a trim PR.
  • 42356 (Info — pnpx description and uniformity): split. The description inaccuracy is accepted — the PR body now names the five npxpnpx conversions alongside the install command. The flip back to npx -y stays declined for the reasons in the 42337 disposition; the cross-skill uniformity question is flagged for the triage batches covering verify-readme, verify-unixy-cli, and canonicalize-tailwind.
Disposition for review 9821 (head 42d92f6): - **42355 (Medium — closeTimeout vs shutdown delay)**: accepted, fixed in ae3ebd8. Verified both numbers independently: piscina's dist hardcodes `closeTimeout: 30000`, and graceful-shutdown.md's primary examples use `delay: 10000`. Took the state-the-constraint remedy — the sentence now requires `closeTimeout` below the shutdown handler's force-exit delay, so the constraint travels with the guidance. Deliberately did not add a pool section to graceful-shutdown.md: the cross-reference points at the shutdown ordering (drain before exit), and growing that file is out of scope for a trim PR. - **42356 (Info — pnpx description and uniformity)**: split. The description inaccuracy is accepted — the PR body now names the five `npx` → `pnpx` conversions alongside the install command. The flip back to `npx -y` stays declined for the reasons in the 42337 disposition; the cross-skill uniformity question is flagged for the triage batches covering `verify-readme`, `verify-unixy-cli`, and `canonicalize-tailwind`.
forgejo-actions left a comment

Summary: No actionable defects found; 1 informational note.

Verified against the working tree and upstream sources:

  • Link integrity: every relative link in the trimmed skill resolves. The seven deleted rule files (typescript.md, async-patterns.md, error-handling.md, modules.md, node-modules-exploration.md, performance.md, testing.md) are no longer referenced from SKILL.md, the surviving rules, any other skill in the repo, or .forgejo/workflows/node-test.yml (which only runs skills/node/rules/assets/graceful-server.test.ts, untouched here).
  • Frontmatter: dropping the metadata.tags block matches every other skills/*/SKILL.md in this repo, and the new 613-char description stays within the usual limits.
  • piscina guidance in profiling.md: checked against piscina 5.3.0's README — close() waits for started tasks while destroy() rejects pending ones, and closeTimeout does default to 30000. The warning to keep it below the force-exit delay is consistent with graceful-shutdown.md, whose examples use 10 s / 25 s budgets.
  • npxpnpx: confirmed pnpx still ships in current pnpm (bin present in pnpm 11.20.0, delegating to dlx) and that pnpm dlx stops option parsing at the command name, so pnpx autocannon -c 100 -d 30 -p 10 ... passes -c through to autocannon rather than consuming it as --shell-mode. Bin names flame and autocannon resolve from their package names.

One pre-existing observation outside this diff: rules/assets/graceful-server.ts and graceful-server.test.ts are not linked from graceful-shutdown.md or SKILL.md, so nothing routes a reader to the runnable assets the PR description highlights as retained.

Code review by Claude Code Opus (opus)

**Summary:** No actionable defects found; 1 informational note. Verified against the working tree and upstream sources: - **Link integrity:** every relative link in the trimmed skill resolves. The seven deleted rule files (`typescript.md`, `async-patterns.md`, `error-handling.md`, `modules.md`, `node-modules-exploration.md`, `performance.md`, `testing.md`) are no longer referenced from `SKILL.md`, the surviving rules, any other skill in the repo, or `.forgejo/workflows/node-test.yml` (which only runs `skills/node/rules/assets/graceful-server.test.ts`, untouched here). - **Frontmatter:** dropping the `metadata.tags` block matches every other `skills/*/SKILL.md` in this repo, and the new 613-char description stays within the usual limits. - **piscina guidance in `profiling.md`:** checked against piscina 5.3.0's README — `close()` waits for started tasks while `destroy()` rejects pending ones, and `closeTimeout` does default to `30000`. The warning to keep it below the force-exit delay is consistent with `graceful-shutdown.md`, whose examples use 10 s / 25 s budgets. - **`npx` → `pnpx`:** confirmed `pnpx` still ships in current pnpm (bin present in pnpm 11.20.0, delegating to `dlx`) and that `pnpm dlx` stops option parsing at the command name, so `pnpx autocannon -c 100 -d 30 -p 10 ...` passes `-c` through to autocannon rather than consuming it as `--shell-mode`. Bin names `flame` and `autocannon` resolve from their package names. One pre-existing observation outside this diff: `rules/assets/graceful-server.ts` and `graceful-server.test.ts` are not linked from `graceful-shutdown.md` or `SKILL.md`, so nothing routes a reader to the runnable assets the PR description highlights as retained. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImFlM2ViZDgxMzUxOTg1ZWFjZmI2ZTFhZDU1ZjUyMDgwNzM5MWY0YzAiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3MDEyIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjU1NjE4OTc0LTE3MTAtNDk1ZS04YThmLWY2ZDhlODNjOGM1NiJ9 -->
@ -13,3 +13,3 @@
```bash
npx @platformatic/flame app.ts
pnpx @platformatic/flame app.ts

ℹ️ Info: pnpx is a thin alias that rewrites argv to pnpm dlx, so these examples always resolve the package from the registry into a temporary store and never reuse a locally installed copy — unlike npx, which prefers node_modules/.bin. That is the right behaviour for one-off profiling tools, so no change is needed; just note it diverges from the rest of the corpus, where verify-readme and verify-unixy-cli prescribe npx -y <tool> for documented invocations.

ℹ️ **Info:** `pnpx` is a thin alias that rewrites `argv` to `pnpm dlx`, so these examples always resolve the package from the registry into a temporary store and never reuse a locally installed copy — unlike `npx`, which prefers `node_modules/.bin`. That is the right behaviour for one-off profiling tools, so no change is needed; just note it diverges from the rest of the corpus, where `verify-readme` and `verify-unixy-cli` prescribe `npx -y <tool>` for documented invocations.
jercik marked this conversation as resolved
docs: route readers to the runnable graceful-shutdown assets
Some checks failed
Node tests / node:test (pull_request) Successful in 8s
commit-msg / commitlint (pull_request) Successful in 16s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m26s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 45s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m50s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 5m9s
c6b081e4f0
Author
Owner

Disposition for review 9828 (head ae3ebd8):

  • 42428 (Info — pnpx registry-fetch behavior): declined as before (42337, 42388) — and this round's review itself concludes the registry-fetch behavior is right for one-off profiling tools, so there is nothing left to change here. The corpus-uniformity note stays flagged for the verify-readme/verify-unixy-cli triage batches.
  • Unattached observation (unlinked runnable assets): accepted, fixed in c6b081egraceful-shutdown.md now closes with a "Runnable example" section routing readers to assets/graceful-server.ts and its CI-run test, so the assets the PR retains are discoverable instead of dead weight.
Disposition for review 9828 (head ae3ebd8): - **42428 (Info — pnpx registry-fetch behavior)**: declined as before (42337, 42388) — and this round's review itself concludes the registry-fetch behavior is right for one-off profiling tools, so there is nothing left to change here. The corpus-uniformity note stays flagged for the `verify-readme`/`verify-unixy-cli` triage batches. - **Unattached observation (unlinked runnable assets)**: accepted, fixed in c6b081e — `graceful-shutdown.md` now closes with a "Runnable example" section routing readers to `assets/graceful-server.ts` and its CI-run test, so the assets the PR retains are discoverable instead of dead weight.
forgejo-actions left a comment

Summary: No actionable issues found; 1 informational note.

This is a documentation-only trim of the node skill (8 rule files deleted, SKILL.md rewritten, 3 rule files touched). I checked the things a deletion-heavy change usually breaks:

  • No dangling links. Every remaining rules/*.md link in skills/node/SKILL.md resolves to a file that still exists, and no file anywhere in the repo (or in the other 24 skills) references the deleted typescript.md, error-handling.md, async-patterns.md, environment.md, modules.md, node-modules-exploration.md, performance.md, or testing.md. The testing.md entry was correctly dropped from the "Related rules" list in stuck-processes-and-tests.md.
  • Frontmatter is valid. The rewritten SKILL.md frontmatter parses cleanly as YAML into exactly name + description (600 bytes, well inside the 1,024-char skill description limit). Dropping the metadata.tags block matches the other 24 skills, none of which carry one.
  • New claims check out. graceful-shutdown.md's added "Runnable example" paragraph is accurate: assets/graceful-server.ts does flip /health to 503 and set Connection: close while shutting down, and .forgejo/workflows/node-test.yml does select skills/node/rules/assets/graceful-server.test.ts (base64 entry decoded and confirmed), so "which CI runs" holds. No deleted file matched the workflow's tracked-test or package.json globs, so the stale-candidate guard won't trip.
  • Piscina guidance is correct. Verified against piscina 5.3.0's README: close() waits for started tasks while destroy() aborts them, and closeTimeout does default to 30000 ms, so the added advice in profiling.md step 3 is factually right.
  • pnpx is real. pnpm 11.20.0 still ships a pnpx bin; its bin/pnpx.mjs rewrites argv to dlx and delegates to pnpm.mjs, so the five converted invocations work.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found; 1 informational note. This is a documentation-only trim of the `node` skill (8 rule files deleted, `SKILL.md` rewritten, 3 rule files touched). I checked the things a deletion-heavy change usually breaks: - **No dangling links.** Every remaining `rules/*.md` link in `skills/node/SKILL.md` resolves to a file that still exists, and no file anywhere in the repo (or in the other 24 skills) references the deleted `typescript.md`, `error-handling.md`, `async-patterns.md`, `environment.md`, `modules.md`, `node-modules-exploration.md`, `performance.md`, or `testing.md`. The `testing.md` entry was correctly dropped from the "Related rules" list in `stuck-processes-and-tests.md`. - **Frontmatter is valid.** The rewritten `SKILL.md` frontmatter parses cleanly as YAML into exactly `name` + `description` (600 bytes, well inside the 1,024-char skill description limit). Dropping the `metadata.tags` block matches the other 24 skills, none of which carry one. - **New claims check out.** `graceful-shutdown.md`'s added "Runnable example" paragraph is accurate: `assets/graceful-server.ts` does flip `/health` to 503 and set `Connection: close` while shutting down, and `.forgejo/workflows/node-test.yml` does select `skills/node/rules/assets/graceful-server.test.ts` (base64 entry decoded and confirmed), so "which CI runs" holds. No deleted file matched the workflow's tracked-test or `package.json` globs, so the stale-candidate guard won't trip. - **Piscina guidance is correct.** Verified against piscina 5.3.0's README: `close()` waits for started tasks while `destroy()` aborts them, and `closeTimeout` does default to `30000` ms, so the added advice in `profiling.md` step 3 is factually right. - **`pnpx` is real.** pnpm 11.20.0 still ships a `pnpx` bin; its `bin/pnpx.mjs` rewrites argv to `dlx` and delegates to `pnpm.mjs`, so the five converted invocations work. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjM0IiwiaGVhZFNoYSI6ImM2YjA4MWU0ZjBiODg5YTMwMGQ1MjUxNDI4MmNjZWRhZjQ0ODBlOWMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3MDQyIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjdmZDUzZDBjLTQ5YzAtNGEyNS1hOWU4LWYzZWI4MzMzNDY5NSJ9 -->
@ -13,3 +13,3 @@
```bash
npx @platformatic/flame app.ts
pnpx @platformatic/flame app.ts

ℹ️ Info: pnpx resolves differently from the npx it replaces — pnpm's bin/pnpx.mjs simply rewrites argv to dlx, and pnpm dlx always fetches the package into a temporary store, whereas npx prefers a matching binary already installed in the project. For one-off tools like @platformatic/flame and autocannon that is the intended behavior, so no change is needed; just note that a project pinning @platformatic/flame as a devDependency will profile with whatever version the registry resolves instead of the pinned one.

ℹ️ **Info:** `pnpx` resolves differently from the `npx` it replaces — pnpm's `bin/pnpx.mjs` simply rewrites argv to `dlx`, and `pnpm dlx` always fetches the package into a temporary store, whereas `npx` prefers a matching binary already installed in the project. For one-off tools like `@platformatic/flame` and `autocannon` that is the intended behavior, so no change is needed; just note that a project pinning `@platformatic/flame` as a devDependency will profile with whatever version the registry resolves instead of the pinned one.
jercik marked this conversation as resolved
Author
Owner

Disposition for review 9834 (head c6b081e):

  • 42466 (Info — pnpx registry resolution): declined, fourth raise (42337, 42388, 42452), and like the last two the finding itself concludes no change is needed for one-off profiling tools. Standing rationale unchanged; corpus uniformity stays flagged for the batches covering the npx -y skills.

No other findings — second consecutive clean review, and the Runnable example claims were verified against the assets and the CI workflow.

Disposition for review 9834 (head c6b081e): - **42466 (Info — pnpx registry resolution)**: declined, fourth raise (42337, 42388, 42452), and like the last two the finding itself concludes no change is needed for one-off profiling tools. Standing rationale unchanged; corpus uniformity stays flagged for the batches covering the `npx -y` skills. No other findings — second consecutive clean review, and the Runnable example claims were verified against the assets and the CI workflow.
Merge branch 'main' into feat/trim-node-skill
Some checks failed
Node tests / node:test (pull_request) Successful in 11s
commit-msg / commitlint (pull_request) Successful in 19s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m33s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 34s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 5m39s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 5m45s
5a7e43e130
jercik merged commit 0a22664bc7 into main 2026-08-05 10:21:12 +00:00
jercik deleted branch feat/trim-node-skill 2026-08-05 10:21:13 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
j4k-oss/agent-skills!34
No description provided.