portfolio-inflight-triage
Skill0 starsChanged 3 months agoMITView on GitHub
Runs the read-only periodic in-flight audit across nolte/* per `spec/portfolio/portfolio-inflight-management/`. Dispatches `portfolio-inflight-collector` for the four data sources (open issues, open PRs incl. drafts, branches without active PR, unresolved review threads + Discussions), applies spec stalling thresholds with optional `project/inflight.yml` overrides, classifies findings via the four-axis matrix into `Critical`/`Warning`/`Suggestion`/`Info`, attaches a specialist slug per finding, and writes a dated Findings-Report under `.audits/portfolio-inflight/`. Invoke when the user asks to \"audit the portfolio in-flight\", \"run the in-flight triage\", \"check stalled PRs / issues / branches\", or equivalent German-language requests. Don't use to merge / close / delete / resolve anything (operator dispatches), for per-repo CI triage (use `workflow-health-triage`), or for capability allocation (`portfolio-audit`). Supports resume on re-invocation per `spec/claude/resumable-work/`.
In this repository36 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- audience-identifySkill
- backlog-delivery-orchestrateSkill
- backstage-catalog-generateSkill
- blog-authorSkill
- blog-author-triggerSkill
- cicd-pipeline-designSkill
- continuous-improvement-triageSkill
- cookiecutter-template-manageSkill
- docs-audience-tracks-applySkill
- docs-dry-refactorSkill
- github-issue-templates-applySkill
- issue-backlog-partitionSkill
- issue-batch-orchestrateSkill
- issue-orchestrateSkill
- lektorat-applySkill
- lektorat-auto-reviseSkill
- mermaid-diagrams-applySkill
- mkdocs-structure-applySkill
- permission-allowlist-maintainSkill
- portfolio-auditSkill
- project-structure-applySkill
- pull-request-createSkill
- pull-request-mergeSkill
- pull-request-runner-sweepSkill
- readme-structure-applySkill
- release-notes-curateSkill
- release-publish-triggerSkill
- requirements-elicitSkill
- spec-drift-auditSkill
- specSkill
- tech-stack-captureSkill
- vocab-drift-auditSkill
- workflow-health-triageSkill
- working-copy-startSkill
- yaml-json-schemaSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
22 rules. About 0 are common, 3 are distinctive, and 19 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
19
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 46
When invoked inside any other Portfolio-Member repository (the typical adopter), stop and route the operator to claude-shared for the audit …
- Very specific: line 73
Match the catalog: Read every description line across all catalog roots (skills/*/SKILL.md, agents/*.md, plugins/*/skills/*/SKILL.md, …
- Very specific: line 75
Slash-command verbatim: When the recommended action targets a specific PR / branch / issue, include the slash-command invocation verbatim …
- Very specific: line 76
Roster-gap recording: When no matching specialist exists, record a Suggestion-grade finding tagged with a stable lowercase snake-case …
- Very specific: line 79
Pre-write confirmation — gate (three): Before any file write, present the per-severity finding counts (Critical: <n>, Warning: <n>, …
- Distinctive: line 95
When the spec disagrees with this skill, the spec wins.
- Very specific: line 99
Read examples/01-stalled-pr-with-red-checks.md when a PR's only driver is a red required check (the workflow-health-triage exclusivity …
- Very specific: line 100
Read examples/02-release-blocker-detection.md when a PR carries a release-blocker label or its head SHA appears in an open release-drafter …
- Very specific: line 101
Read examples/03-roster-gap-3-recurrence.md when a roster-gap class crosses the recurrence threshold against the prior audit artefact (the …
- Very specific: line 102
Read examples/04-security-relevance-lifts-to-critical.md when the security_relevance axis lifts a finding to Critical.
- Very specific: line 103
Read examples/05-cross-repo-blocking-lifts-to-critical.md when a project/roadmap.md / project/sprints/*.md cross-reference lifts an item to …
- Very specific: line 104
Read examples/06-zero-findings-run.md when the in-flight surface is empty and the run still writes a zero-findings report.
- Distinctive: line 119
Never close any GitHub issue, merge any PR, delete any branch, mark any review comment resolved, or close any Discussion.
- Very specific: line 120
Never invoke gh api with -X POST, -X PATCH, or -X DELETE against any repository — including claude-shared.
- Very specific: line 121
Never modify any file in any Portfolio-Member repository other than claude-shared.
- Very specific: line 122
Never dispatch the recommended specialist automatically.
- Very specific: line 123
Never use a severity outside the canonical four (Critical / Warning / Suggestion / Info).
- Very specific: line 124
Never invent matrix-axis values without the detection signals named in §Classification and prioritisation.
- Very specific: line 125
Never scan repositories outside the resolved Portfolio-Member set, even when the operator names another nolte/<other> repository, per …
- Very specific: line 126
Never include raw issue / PR / branch / review-comment / discussion bodies in the Findings-Report per §Findings-Report shape MUST NOT.
- Distinctive: line 127
Never bypass the three user-confirmation gates: threshold-override honour (step 3), roster-gap 3-recurrence escalation (step 7), and …
- Very specific: line 129
When spec/portfolio/portfolio-inflight-management/ disagrees with this skill, the spec wins.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Portfolio In-Flight Triage
Implements the audit half of spec/portfolio/portfolio-inflight-management/ as a Claude Code skill in the nolte-shared plugin. Single operation: periodic, on-demand cross-repository inspection that surfaces stalled in-flight work (open issues, open PRs, branches without active PR, unresolved review-comment threads, open Discussions) across every nolte Portfolio-Member repository, classifies each finding through the four-axis severity matrix, attaches a recommended specialist (skill or agent slug) per finding, and persists a dispatch-ready Findings-Report under .audits/portfolio-inflight/<YYYY-MM-DD>.md.
Why this is a skill, not an agent
- Mid-flow user confirmation on threshold overrides and roster-gap escalations. Two interactive checkpoints are load-bearing: honouring a Portfolio-Member's
project/inflight.ymlthreshold override over the spec default (operator sees both side-by-side), and escalating a roster-gap finding to "author a new specialist" once the recurrence threshold incontinuous-improvement§Portfolio gap closure triggers. An agent's fire-and-forget shape would lose both. - Persistent on-disk artefact as deliverable. The audit writes
.audits/portfolio-inflight/<YYYY-MM-DD>.mdinclaude-shared. Skills own persistent write paths; agents return structured reports into the caller's context. - Context-window-protective data collection via agent. Raw per-repository collection is delegated to
portfolio-inflight-collector, which returns a pre-reduced structured summary, so raw issue / PR / branch / review-comment / discussion bodies never enter the orchestrating conversation — the §Findings-Report shapeMUST NOTon raw-body inclusion. - Skill-orchestrates-agent-executes is the explicit spec rule. §Audit operation requires
MUST be implemented as a dedicated skill … MUST NOT be implemented as a Claude AgentandMUST dispatch a read-only specialist agent portfolio-inflight-collector. The spec pins the hybrid pattern; this skill is the orchestrator half. - Counter-dimension considered: a tool-restricted agent could perform classification and matrix-axis derivation cleanly, since the collector already absorbs the data volume. The decisive counter is the mid-flow user-confirmation gates plus the persistent write target — both skill-side per
spec/claude/skill-vs-agent/.
Follows the same orchestrator pattern as portfolio-audit (which dispatches portfolio-manifest-collector).
User-language policy
Detect the user's language and respond in it. The Findings-Report under .audits/portfolio-inflight/ follows the conventions of spec/claude/review-plan/: section headings (## Scope, ## Summary, ## Findings, ## Processing log) stay English so downstream tooling can grep them deterministically; the body may be written in the user's language. Finding identifiers (<repo>/<source>/<id>), matrix-axis names (security_relevance, release_blocking, age_multiplier, cross_repo_blocking), severities (Critical / Warning / Suggestion / Info), and bracketed spec citations ([portfolio-inflight-management §...]) stay English verbatim regardless of conversation language.
Detection: am I in the right repository?
This skill writes its single output artefact (.audits/portfolio-inflight/<YYYY-MM-DD>.md) inside the claude-shared repository, the same repository that hosts .audits/portfolio/ for portfolio-audit. Detection: presence of .claude-plugin/plugin.json AND a spec/portfolio/portfolio-inflight-management/ directory.
When invoked inside any other Portfolio-Member repository (the typical adopter), stop and route the operator to claude-shared for the audit — the Findings-Report write path lives there, matching the §Audit operation SHOULD and mirroring portfolio-audit's detection rule.
Operations
1. Run
Runs the cross-repository in-flight audit per spec/portfolio/portfolio-inflight-management/ §Audit operation. End-to-end produces one Findings-Report under .audits/portfolio-inflight/<YYYY-MM-DD>.md.
- Detect Portfolio-Member set per §Portfolio scope
MUST— reuse theportfolio-managementresolution. Either dispatchportfolio-manifest-collector(Agent) when the active conversation hasn't already collected the set, or instructportfolio-inflight-collectorto resolve fresh viagh api orgs/nolte/repos --paginate(it applies the samearchived: false/private: false/portfolio: excludedfilters). Recordportfolio: excludedand per-sourceinflight: skip-<source>markers asInfo-grade entries so omissions stay inspectable. - Dispatch the collector — invoke
portfolio-inflight-collector(Agent) with the resolved list, all four data sources enabled, andrelease-drafterdraft collection enabled (needed for therelease_blockingmatrix axis). Wait for its structured collection report. Per §Findings-Report shapeMUST NOT, raw issue / PR / branch / review-comment / discussion bodies never enter this conversation — the agent reduces to a structured summary and discards bodies before returning. From the same report, derive the consumer-measured-finding count for the repository that holds the portfolio-wide specs: the open issues whosenamesOtherPortfolioMemberorhasSpecFindingLabelflag isyes(a union, not an intersection — each half alone under-counts). - Fetch overrides and confirm — gate (one). For every repository whose collector report carries
inflight.yml override present: yes, parse the verbatim YAML frominflight.yml raw content. Present the spec defaults (Issue 30d, PR 7d/14d/14d/conflict, Branch 30d, Review-comment 7d, Discussion 30d) and the per-repo override side-by-side; ask the operator whether to honour the override for this run. Record the decision in## Processing log. Repositories without overrides use the spec defaults silently. - Apply stalling thresholds per §Stalling thresholds using the per-repository thresholds confirmed in step 3:
- Issue: open longer than
issue.maxAge(default 30 days), no priority label, no assignee, no maintainer comment inissue.maxQuietWindow(default 30 days). Per §Stalling thresholdsMUST NOT, first drop any issue whose collectorauthorisrenovate[bot],dependabot[bot], orgithub-actions[bot]from theissue/stalled-issue-no-triageclass (permanent bot dashboards, not triage signal);branch/stalled-branch-no-prstays in scope regardless of authorship. - Pull request: open longer than
pr.maxAgeRedChecks(default 7d) with red required checks, ORpr.maxAgeDraft(default 14d) as draft, ORpr.maxAgeNoReview(default 14d) with no reviewer activity, ORmergeable: CONFLICTINGagainstdevelop(no threshold for the conflict driver — conflicts block merge regardless of age, per §Stalling thresholdsMUST). - Branch without active PR:
daysSinceLastPush > branch.maxAge(default 30d). - Unresolved review comment:
daysSinceLastComment > reviewComment.maxAge(default 7d) with no maintainer reply. - Discussion:
daysOpen > discussion.maxAge(default 30d) withdaysSinceLastMaintainerReply == "never"or beyond the same window. Sub-threshold items are excluded per §Stalling thresholdsMUST NOT. ACriticalfinding may still surface a sub-threshold item when another matrix axis demands it per §Stalling thresholdsSHOULD.
- Issue: open longer than
- Derive the four matrix axes per §Classification and prioritisation for every stalled item. Read
references/matrix-axes-and-report.mdwhen running this step — it carries the detection MUSTs for all four axes. - Classify into the canonical four severities (
Critical/Warning/Suggestion/Info) per §Classification and prioritisation andspec/claude/review-plan/§Severity scale. Readreferences/matrix-axes-and-report.mdwhen running this step — it carries the per-severity mapping and the higher-severity tie-break. - Attach a recommended specialist per §Specialist recommendation to every finding:
- Match the catalog. Read every
descriptionline across all catalog roots (skills/*/SKILL.md,agents/*.md,plugins/*/skills/*/SKILL.md,plugins/*/agents/*.md); name the matching slug verbatim (for exampledependency-audit,workflow-health-triage,pull-request-merge). - Red-check exclusivity. When a PR finding's only driver is a red required check (
requiredChecksState: FAILURE), nameworkflow-health-triage; MUST NOT route the same red-check driver to any other specialist. Other drivers of the same PR (stale draft, unresolved review comments, conflicts) MAY produce additional findings with their own specialists; the exclusivity is per-driver, not per-PR. - Slash-command verbatim. When the recommended action targets a specific PR / branch / issue, include the slash-command invocation verbatim plus the target identifier (for example
/nolte-shared:pull-request-merge against PR #142). Operator dispatches by copy-paste; the skill never auto-dispatches. - Roster-gap recording. When no matching specialist exists, record a
Suggestion-grade finding tagged with a stable lowercase snake-case<finding-class-token>(the unmatched specialist slug when one would naturally apply, otherwise a descriptive token likediscussion_no_maintainer_reply). - Recurrence counting and gate (two). For every roster-gap finding,
Globthe prior.audits/portfolio-inflight/*.mdandReadthe lexicographically last one. Count occurrences of<data-source>/<finding-class-token>across that prior artefact plus the current run. When the count reaches 3 (perspec/project/continuous-improvement/§Portfolio gap closure), trigger User-confirmation gate (two): ask whether to escalate the recommendation to "author a new specialist<proposed-slug>". Record the decision in## Processing log. When no prior artefact exists, recurrence is the in-run count only.
- Match the catalog. Read every
- Pre-write confirmation — gate (three). Before any file write, present the per-severity finding counts (
Critical: <n>, Warning: <n>, Suggestion: <n>, Info: <n>) plus the per-repository counts (top 5 + total). AskWrite Findings-Report to .audits/portfolio-inflight/<YYYY-MM-DD>.md with these counts? [yes / show-findings / abort]. Onshow-findings, render the full per-severity list inline and re-ask. Onabort, stop. Onyes, proceed. - Write the Findings-Report at
.audits/portfolio-inflight/<YYYY-MM-DD>.mdin theclaude-sharedrepository, conforming tospec/claude/review-plan/. Readreferences/matrix-axes-and-report.mdwhen running this step — it carries the frontmatter, the four required sections, the structure rules, and the per-finding format. - Confirm in the user's language — the path of the new Findings-Report, the per-severity counts, the count of roster-gap findings (if any), the consumer-measured-finding count from step 2 — flagged as a portfolio gap when it reaches the threshold
spec/project/continuous-improvement/§Portfolio gap closure states, naming the action that section names (schedule anissue-batch-orchestraterun over the counted findings) while the decision to start it stays with the operator — and the next step (open the report and triageCriticalitems first via the recommended slash commands; route roster-gap escalations throughcontinuous-improvement-triage).
The Run operation is observational per §Operator authority: it never mutates any Portfolio-Member and writes only .audits/portfolio-inflight/<YYYY-MM-DD>.md in claude-shared (see Hard rules).
Reference: spec anchors
This skill implements spec/portfolio/portfolio-inflight-management/; read it when in doubt. Sections touched:
- §Portfolio scope, §Data sources, §Stalling thresholds, §Classification and prioritisation, §Specialist recommendation, §Audit operation, §Findings-Report shape, §Integration with continuous-improvement, §Operator authority.
Also touches spec/claude/review-plan/ (the artefact frame) and spec/project/continuous-improvement/ (§Specialist dispatch, §Portfolio gap closure — the matching pattern and recurrence rule in step 7, and the consumer-measured-finding threshold plus its issue-batch-orchestrate action reported in steps 2 and 10).
When the spec disagrees with this skill, the spec wins. Propose a skill update rather than silently diverging.
Examples
- Read
examples/01-stalled-pr-with-red-checks.mdwhen a PR's only driver is a red required check (theworkflow-health-triageexclusivity routing applies). - Read
examples/02-release-blocker-detection.mdwhen a PR carries arelease-blockerlabel or its head SHA appears in an openrelease-drafterdraft (therelease_blockingdetection MUSTs apply). - Read
examples/03-roster-gap-3-recurrence.mdwhen a roster-gap class crosses the recurrence threshold against the prior audit artefact (the "author a new specialist" gate applies). - Read
examples/04-security-relevance-lifts-to-critical.mdwhen thesecurity_relevanceaxis lifts a finding to Critical. - Read
examples/05-cross-repo-blocking-lifts-to-critical.mdwhen aproject/roadmap.md/project/sprints/*.mdcross-reference lifts an item to Critical viacross_repo_blocking. - Read
examples/06-zero-findings-run.mdwhen the in-flight surface is empty and the run still writes a zero-findings report.
Gotchas
- The Findings-Report write path lives in
claude-shared, not in the calling repo. Writing.audits/portfolio-inflight/from a non-claude-sharedworking directory is a structural error; confirmcwdresolves to theclaude-sharedcheckout (see §Detection) before any write in step 9. cross_repo_blockingdetection is exact-string only. Theproject/roadmap.md/project/sprints/*.mdscan looks for the literal short cross-reference (nolte/<repo>#<number>) or the full GitHub URL. Don't infer from titles, branch names, or partial SHAs — per §Classification and prioritisationMUSTthe scan is exact text matching, no fuzzy matching.release-drafter-draft head-SHA membership requires the collector's draft list. When the collector report lacks theOpen release-drafter draftsblock, only therelease-blockerlabel signal applies forrelease_blocking— don't fetch drafts inline; the collector owns everygh apicall per §Audit operation.- Threshold-override confirmation happens once per audit, not per-finding. Step 3 surfaces each repository's
project/inflight.ymloverride once; the confirmed thresholds apply to every finding from that repository in step 4. - Recurrence counts the most recent prior
.audits/portfolio-inflight/*.mdplus the current run. The step-7 3-recurrence escalation walks only the immediately previous artefact, not older ones; with no prior artefact, recurrence is the in-run count only per §Specialist recommendationMUST. - Bot-authored dashboards are out of the stalled-issue class. Per §Stalling thresholds
MUST NOTand the 2026-07-24 audit's gate-2 decision (#445 / #468), step 4 dropsrenovate[bot]/dependabot[bot]/github-actions[bot]issues fromissue/stalled-issue-no-triage;branch/stalled-branch-no-pris unaffected. gh apirate limits scale with N repos × M open PRs. The collector prechecks headroom (its §Preconditions step 2), but a full run still eats a non-trivial slice of the hourly budget; checkgh api rate_limitbefore back-to-back audits. Tooling (optional GitHub MCP): the collector's data-source reads are MCP-preferred with aghfallback (spec/claude/mcp-tool-preference/);gh api rate_limititself staysgh.- An empty in-flight surface still produces a Findings-Report. Per the spec's S-7 acceptance criterion, zero stalled items across the portfolio produces a valid Findings-Report with zero findings under each severity rather than no report at all. Step 9 always writes, never short-circuits on emptiness.
Hard rules
- Never close any GitHub issue, merge any PR, delete any branch, mark any review comment resolved, or close any Discussion. The audit is observational only per §Operator authority.
- Never invoke
gh apiwith-X POST,-X PATCH, or-X DELETEagainst any repository — includingclaude-shared. The underlying agent enforces this at the harness level; the skill also doesn't issue such calls per §Operator authority. - Never modify any file in any Portfolio-Member repository other than
claude-shared. The single write path is.audits/portfolio-inflight/<YYYY-MM-DD>.mdper §Operator authority. - Never dispatch the recommended specialist automatically. Emit the slash-command invocation verbatim in the report; the operator dispatches by copy-paste per §Specialist recommendation
MUST NOTand §Operator authorityMUST. - Never use a severity outside the canonical four (
Critical/Warning/Suggestion/Info). ALL-CAPS variants and extra levels (HIGH,P0, …) are forbidden perspec/claude/review-plan/§Severity scale and §Classification and prioritisationMUST NOT. - Never invent matrix-axis values without the detection signals named in §Classification and prioritisation.
release_blockingrequires the label or therelease-drafter-draft head-SHA membership;cross_repo_blockingrequires the exact-string cross-reference scan;security_relevancerequires a CVE / supply-chain / leaked-credential indicator. No inference or fuzzy matching. - Never scan repositories outside the resolved Portfolio-Member set, even when the operator names another
nolte/<other>repository, per §Portfolio scopeMUST NOT. Scope expansion happens viaportfolio-management, never ad-hoc. - Never include raw issue / PR / branch / review-comment / discussion bodies in the Findings-Report per §Findings-Report shape
MUST NOT. The audit reduces every finding to a structured summary; verbatim source bodies stay in GitHub, reachable via the finding identifier. - Never bypass the three user-confirmation gates: threshold-override honour (step 3), roster-gap 3-recurrence escalation (step 7), and pre-write per-severity-counts confirmation (step 8). The interactive checkpoints are the spec's reason this is a skill rather than an agent; bypassing them undermines
spec/claude/skill-vs-agent/. - Never invoke the Skill tool from this skill's body during the data-collection or classification phase — the collector dispatch is an Agent invocation, not a Skill invocation. Calling another skill sequentially (for example
continuous-improvement-triageto route the report) is allowed and matches thespec/claude/skill-vs-agent/hybrid-patternSHOULDon chaining. - When
spec/portfolio/portfolio-inflight-management/disagrees with this skill, the spec wins. Propose updating this skill rather than silently diverging.
Resumability
Per spec/claude/resumable-work/, this skill is resumable: true. State is persisted to .resume/portfolio-inflight-triage/<run-id>.yml after every successful user-approval gate (threshold-override honour in step 3, roster-gap escalation in step 7, pre-write confirmation in step 8) and after each named phase boundary (collector dispatch complete, classification complete). On re-invocation, scan that directory for files with status: in_progress whose inputs: snapshot matches the current invocation; if one matches, prompt the operator with Resume run <run_id> from phase <phase> (last checkpoint <last_checkpoint_at>)? [resume / start-new / discard]. The state-file envelope (schema_version, run_id, inputs, phase, decisions[], status, …) and the fail-closed semantics on schema or YAML errors are load-bearing in the spec; don't duplicate those rules here.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

