Use when the user asks for a project health audit, a maintenance sweep, or a multi-category lead-engineer scan followed by interactive issue-by-issue resolution. Not for routine lint/test runs, single-file cleanups, or plain check-project requests.
62
78%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./plugins/flowai/skills/maintenance/SKILL.mdExecute a rigorous multi-category maintenance sweep, then walk the user through each finding interactively. The process has two distinct phases:
Categories checked (full sub-check detail is embedded in the 5 self-contained maintenance-scan-* subagents — see the Category index in Step 2):
[x] FRs, SRS↔SDS / index drift.Binds on EVERY question you ask — the "how to proceed" prompt in Step 5 and the per-finding Apply / Skip / Edit verdict in Step 6 alike:
1., 2., …), not a heading, a bold-only line, or a paragraph.**Essence:** line under it says what would be done, to what, and what the reader gets. A short reply option with no analysis of its own (Apply / Skip / Edit) has no Essence line, and its title says it alone. Inside an option, name things in words, never by a report's ids. Every line of the option — title, Essence, Pros, Cons, Risks, Best for — is read without the report, and ids slip in most often in Pros, Cons and Risks. Write what the thing is instead of its label: "the checkout errand on the shop site", not E4; "the search box ignoring the first keystroke", not N3. A label in parentheses after a general phrase — "the two most expensive errands (E4, E3)" — is still a bare label: name each item. A number taken from a report keeps what it measures in the same sentence: a percentage names the whole it is a share of ("page text takes about 40% of the cost", not "a 40% share"), and a sum says whose cost it is. Any phrase that stands for a group is a pointer: a count ("the four slow pages", "the same three errands"), a category ("the anomalies", "the issues found"), a rank or superlative ("the costliest runs"), "these", "as above", "the current round" — and so is a partial list, a count followed by a few examples or a "such as". Replace it with every member of the group, named in words, in that option — even when the list is long, even when the report above already lists them; if the whole set does not fit, drop the group from the option. Test: with the report deleted, could the reader name every member from this option alone? A word coined in this session gets a short explanation in the option. An explanation elsewhere in the reply does not count — not in the report above the question, not in another option. Before sending, read each option alone, line by line, and list every label (letters plus digits such as E4 or N3), number, group phrase (a count, a category, a superlative, "the same", "these") and coined term in it; replace each with words or remove it.AskUserQuestion and the like) already offers a free-text answer of its own, so such an option adds a line and no choice. An option that names a concrete alternative is a real option, even when its title starts with "Other".agent's choice — on a multi-select where the user delegates with agent's choice (or its language equivalent), pick the subset yourself, justify the pick in one line, and proceed without re-asking for confirmation.The findings list stays ABOVE the Step 5 question: it is a report the answer filters, not a set of alternatives, so it is not the question's options. The self-containment rule then carries the weight — the question restates the counts it refers to.
<step_by_step>
Collect findings into an internal list. Each: category, site, problem, proposed fix, severity (Critical | High | Medium | Low per references/severity-rubric.md; ties → lower).
Initialize & Plan
todo_write, todowrite) to create a plan covering all scan categories below.maintenance-scan-* subagents (one per bucket — names in the Category index below). Each agent is SELF-CONTAINED: its full check detail is embedded in its body — spawn it with just the project context, no payload. Workers return raw leads, no severity; the Verify gate (Step 3), severity calibration, and Resolution (Steps 4–6) stay parent-only over the union.Run the 16 Category Checks (partitioned into 5 thematic buckets W1–W5)
maintenance-scan-* agent bodies — the single source. SKILL.md carries only the index below, not the executable detail.maintenance-scan-hygiene) — 1 Structural Integrity · 2 Code Hygiene · 3 Complexity & Hotspots · 4 Technical Debtmaintenance-scan-dependencies) — 10 Architectural Integrity · 11 Conceptual Duplication · 16 Public-Surface Qualitymaintenance-scan-contracts) — 12 API Contract Review · 13 Cross-Implementation Symmetry · 14 Defensive-Programming Smellmaintenance-scan-docs) — 5 Consistency (Docs vs Code) · 7 Instruction Coherence · 9 Documentation Healthmaintenance-scan-coverage) — 6 Documentation Coverage · 8 Tooling Relevance · 15 Invariant ↔ Test Pairingmaintenance-scan-* agent (named in the index above) via the IDE's subagent tool (Task / Agent / background task). The agents are self-contained — pass only the project root and a one-line ask ("scan this project, return leads"); no category payload. Workers return raw leads, no severity.Not scanned: W<n> (<category names>) — <reason> after the closing total. Never silently shrink coverage.Verify Findings + Severity (mandatory gate)
[verified false] <site>: <original claim> — actually <observed> so the user can see the gate ran and what it caught. [verified false] lines do NOT receive a severity tag — they are dropped findings, not graded ones.severity-rubric.md#cat-14-silent-swallow). If you cannot point at the anchor, drop one tier (anti-inflation tie-breaker) or refine the finding so it matches a row.Present Summary
# headings). Skip empty categories.Structural Integrity, Code Hygiene, Complexity & Hotspots, Technical Debt, Consistency (Docs vs Code), Documentation Coverage, Instruction Coherence, Tooling Relevance, Documentation Health, then Cats 10–16 per their Context names). In non-English reports every label MUST be a unique tag for that category — do not collapse two categories to one word and do not omit Documentation Health (FR-DOC-LINT: required dedicated header whenever the Documentation Health check (Cat 9) produced any finding; DOC-to-DOC integrity, distinct from #5 and #6). When in doubt, keep the English label.- [N] [Severity] <file/symbol>: <problem>. (Fix: <proposed fix>). Grammar: severity is one of the four literal English strings [Critical], [High], [Medium], [Low] (stays English regardless of report language), placed IMMEDIATELY after the bracketed number and BEFORE the site path; never in the category header. [verified false] drop lines from the gate are emitted WITHOUT a severity tag.Total: N findings — Critical: a, High: b, Medium: c, Low: d (per category: <Cat>: x, <Cat>: y, …). If any bucket ended NOT SCANNED (Step 2 loud failure), append on the next line: Not scanned: W<n> (<category names>) — <reason>.Structural Integrity
- [1] [Medium] src/oldfile.ts: in root, should be in src/utils/. (Fix: move)
Code Hygiene
- [2] [Medium] utils.ts: unused export `myFunc`. (Fix: delete)
Documentation Health
- [3] [High] FR-AUTH marked [x] in SRS, acceptance test path does not exist. (Fix: create the test file or revert to [ ])
Total: 3 findings — Critical: 0, High: 1, Medium: 2, Low: 0 (per category: Structural Integrity: 1, Code Hygiene: 1, Documentation Health: 1).Ask User How to Proceed
Total: line of the report above already states them. The repetition is deliberate, not redundancy to be optimised away: the question has to be answerable on its own, and a reader who skimmed past the list must not scroll back to learn how many findings there are. Writing the counts once in a Total: line and then asking a bare "Which findings should I resolve?" is exactly the defect this rule exists to prevent. Shape it like "Which of the 12 findings should I fix — 2 Critical, 3 High, 5 Medium, 2 Low?". Accepted reply modes:
1, 3, 4) — only those findingsHygiene) — that categorycritical, high, medium, low — case-insensitive) — that tiercritical+high) — union of listed tiersall — every finding one by oneagent's choice — pick the most impactful subset yourself with a one-line justification, proceed without re-askingdone — stop, no fixesInteractive Resolution Loop
</step_by_step>
korchasa/flowai-plugins
240d92b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.