@danmoisan/drm-copilot-mcp 1.1.26 → 1.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/mcp-server.js +170 -52
- package/package.json +1 -1
- package/resources/claude-customizations/.claude/agents/atomic-executor.md +3 -3
- package/resources/claude-customizations/.claude/agents/atomic-planner.md +2 -2
- package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +7 -7
- package/resources/claude-customizations/.claude/agents/feature-review.md +6 -3
- package/resources/claude-customizations/.claude/agents/orchestrator.md +11 -7
- package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +7 -7
- package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +6 -6
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +16 -1
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-rules.ps1 +50 -16
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorState.psm1 +6 -1
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletion.psm1 +4 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletionChecks.psm1 +51 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateReceipts.psm1 +5 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateRemediationAccounting.psm1 +116 -4
- package/resources/claude-customizations/.claude/rules/csharp.md +8 -8
- package/resources/claude-customizations/.claude/rules/orchestrator-state.md +28 -2
- package/resources/claude-customizations/.claude/rules/powershell.md +2 -2
- package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +14 -15
- package/resources/claude-customizations/.claude/skills/epic-progress-report/SKILL.md +338 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Logic.ps1 +248 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Metrics.ps1 +232 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Render.ps1 +196 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.State.ps1 +286 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 +475 -0
- package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +18 -13
- package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +21 -9
- package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +5 -5
- package/resources/claude-customizations/.claude/skills/invoke-powershell-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/.claude/skills/invoke-python-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +24 -2
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +8 -0
- package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +16 -17
- package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +15 -16
- package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +1 -1
- package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +6 -6
- package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/pack-manifests/core.json +7 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +18 -13
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +5 -1
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +18 -5
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +24 -2
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-state/SKILL.md +16 -1
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +3 -3
- package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +15 -16
- package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +14 -15
- package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +2 -0
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-di-unit-test-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/pytest-unit-test-coding.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-execution-only-typed.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate.ps1 +29 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +51 -4
- package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/pack-manifests/core.json +1 -0
- package/resources/customizations/.github/agents/5.1-Beast-adjusted.agent.md +1 -1
- package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +20 -26
- package/resources/customizations/.github/agents/atomic_executor.agent.md +4 -4
- package/resources/customizations/.github/agents/atomic_planning.agent.md +4 -4
- package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
- package/resources/customizations/.github/agents/commit-steward.agent.md +1 -1
- package/resources/customizations/.github/agents/csharp-atomic-executor.agent.md +14 -14
- package/resources/customizations/.github/agents/csharp-atomic-planning.agent.md +2 -2
- package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +4 -4
- package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +19 -22
- package/resources/customizations/.github/agents/epic-review.agent.md +1 -1
- package/resources/customizations/.github/agents/gpt-5-beast-mode.agent.md +3 -3
- package/resources/customizations/.github/agents/orchestrator.agent.md +8 -8
- package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +12 -12
- package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +4 -4
- package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +6 -6
- package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +21 -24
- package/resources/customizations/.github/agents/pytest-unit-test-coding.agent.md +13 -17
- package/resources/customizations/.github/agents/python-atomic-executor.agent.md +11 -11
- package/resources/customizations/.github/agents/python-atomic-planning.agent.md +2 -2
- package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +14 -17
- package/resources/customizations/.github/agents/python-orchestrator.agent.md +7 -7
- package/resources/customizations/.github/agents/python-typed-engineer.agent.md +17 -20
- package/resources/customizations/.github/agents/staged-review.agent.md +2 -2
- package/resources/customizations/.github/agents/tdd-green.agent.md +1 -1
- package/resources/customizations/.github/agents/tdd-red.agent.md +3 -3
- package/resources/customizations/.github/agents/tdd-refactor.agent.md +2 -2
- package/resources/customizations/.github/agents/typescript-engineer.agent.md +3 -3
- package/resources/customizations/.github/codex/execute-hard-lock.prompt.md +3 -3
- package/resources/customizations/.github/instructions/general-code-change.instructions.md +1 -1
- package/resources/customizations/.github/instructions/powershell-unit-test.instructions.md +1 -1
- package/resources/customizations/.github/instructions/python-code-change.instructions.md +5 -5
- package/resources/customizations/.github/instructions/python-suppressions.instructions.md +3 -3
- package/resources/customizations/.github/instructions/python-unit-test.instructions.md +1 -1
- package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +2 -2
- package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +2 -2
- package/resources/customizations/.github/prompts/remediate-comments.prompt.md +2 -2
- package/resources/customizations/.github/prompts/review-feature.prompt.md +1 -1
- package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/customizations/.github/skills/execution-environment/SKILL.md +18 -13
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +15 -2
- package/resources/feature-templates/bug/plan.yyyy-MM-ddTHH-mm.md +4 -4
- package/resources/feature-templates/feature/plan.yyyy-MM-ddTHH-mm.md +3 -3
- package/resources/feature-templates/refactor/plan.yyyy-MM-ddTHH-mm.md +2 -2
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +2 -2
- package/resources/powershell/PoshQC/PoshQC.psm1 +3 -3
- package/resources/powershell/PoshQC/README.md +8 -8
- package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +2 -2
- package/resources/templates/policy_audit/AGENTS.md +9 -10
- package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +19 -20
|
@@ -32,7 +32,7 @@ Rules:
|
|
|
32
32
|
- **Tool routes are not restated.** Tool routes, launchers, wrapper scripts, command-text restrictions, the batch budget, hook context, and CI shape are owned by the `execution-environment` skill. A plan references that skill instead of restating its content.
|
|
33
33
|
- **Changed existing behavior names its asserting tests.** A task that changes the observable behavior of an existing function, script, fixture, or test stub (its signature, argv, output, exit status, or the files it writes) names every existing test that asserts that behavior and states each test's disposition: unchanged because it is unaffected, or updated, with the reason for the update. The tests are found by searching the test tree for the symbol, the file name, and the asserted output. A test that asserts the current behavior and is outside the task's file set fails once the change lands, and the plan's own acceptance condition then cannot be met. The planner's adversarial self-review includes this search for every task that changes existing behavior.
|
|
34
34
|
- **Size guideline.** A plan stays within 40 canonical tasks and 400 physical lines. A plan that needs more carries a `## Size Justification` section with at least one line stating why the size is necessary (validator rule G13). Files produced by one generator run count as one generator task.
|
|
35
|
-
- **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the
|
|
35
|
+
- **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the parallel gates the plan uses: one `Invoke-PoshQCParallelTest` run, one `pytest -n auto` run, and Jest through its normal parallel workers, each re-run only after a fix. The `Mirror parity` bullet also covers the execution-environment brief: a plan that alters a fact the brief states (for example, it adds or renames a CI job, changes a required status context, a tool route, or a batch-budget rule) includes a task that updates the brief in the same change, in all six byte-identical copies, and the bullet names that task. Without that task the brief states a superseded fact once the change lands, which breaks the brief's own maintenance rule. The planner SubagentStop hook blocks a plan without a complete section.
|
|
36
36
|
- **Final-phase self-review.** The final phase of every plan contains a self-review task that walks the policy-audit, code-review, and feature-audit templates under `docs/features/templates/policy_audit/` against the branch diff from the merge base and writes `<FEATURE>/evidence/qa-gates/self-review.<timestamp>.md` with one PASS, FAIL, or N/A row per checklist item. A FAIL row is fixed and the QA loop is re-run before the self-review is rewritten; the plan does not complete with a FAIL row.
|
|
37
37
|
|
|
38
38
|
This section takes precedence over the literal-quoting rules of `## Wrap-Tolerant Assertion Authoring (Mandatory)`: those rules govern the asserted value of an acceptance condition, not context.
|
|
@@ -43,12 +43,11 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
|
|
|
43
43
|
|
|
44
44
|
1) Baseline capture block
|
|
45
45
|
- policy reads in required order,
|
|
46
|
-
- baseline
|
|
46
|
+
- static baseline capture (format, lint, type check, and analyzer findings) for each language that has explicit baseline command tasks in the plan; no test suite runs in this block.
|
|
47
47
|
- required artifacts:
|
|
48
48
|
- a Phase 0 policy-read evidence artifact in the canonical evidence location defined by `evidence-and-timestamp-conventions`
|
|
49
49
|
- one baseline artifact per baseline command step (no aggregate-only baseline artifact)
|
|
50
50
|
- each baseline step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
|
|
51
|
-
- baseline test-step artifacts for languages with mandatory coverage policy MUST include numeric coverage headline values in `Output Summary:` (baseline percent and, when applicable, targeted module/new-code percent).
|
|
52
51
|
|
|
53
52
|
2) Delegated implementation block
|
|
54
53
|
- explicit handoff task to the small-path implementation engineer,
|
|
@@ -59,7 +58,7 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
|
|
|
59
58
|
- rerun behavior when any step changes files or fails.
|
|
60
59
|
- one final-QC artifact per QC command step (no aggregate-only final-QC artifact)
|
|
61
60
|
- each final-QC step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
|
|
62
|
-
- final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric
|
|
61
|
+
- final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric coverage values from the single gate run in `Output Summary:`.
|
|
63
62
|
- final-QC command tasks that are present in the approved plan MUST execute their stated commands; `SKIPPED` is invalid unless the task text itself explicitly authorizes a skip condition.
|
|
64
63
|
|
|
65
64
|
4) Reduced audit block
|
|
@@ -96,7 +95,7 @@ Branching after Phase 0:
|
|
|
96
95
|
|
|
97
96
|
Phase 0 must include tasks to read policy files in the order defined in `policy-compliance-order`.
|
|
98
97
|
|
|
99
|
-
Phase 0 must also capture
|
|
98
|
+
Phase 0 must also capture static baselines (format, lint, type check, and analyzer findings) for the languages touched, and no test suite runs in it. Baseline artifact conventions (location + required fields) are defined in `evidence-and-timestamp-conventions`.
|
|
100
99
|
|
|
101
100
|
For short-path/minimal-audit plans, Phase 0 evidence is incomplete unless both artifacts exist:
|
|
102
101
|
- `phase0-instructions-read.md` with at least: `Timestamp:`, `Policy Order:`, and explicit list of files read.
|
|
@@ -128,12 +127,9 @@ Plans name evidence artifacts `<name>.<timestamp>.md` and never fix a plan-time
|
|
|
128
127
|
|
|
129
128
|
For any language in scope where repository policy requires coverage validation:
|
|
130
129
|
|
|
131
|
-
- The approved plan MUST include explicit
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
- baseline coverage,
|
|
135
|
-
- post-change coverage,
|
|
136
|
-
- new/changed-code coverage.
|
|
130
|
+
- The approved plan MUST include an explicit final-QC coverage capture task.
|
|
131
|
+
- The final-QC artifact MUST record numeric coverage values (not placeholders such as `UNVERIFIED`).
|
|
132
|
+
- The plan MUST include a threshold task that reports each changed file from the single gate run against the coverage thresholds. New behavior is tested. No earlier figure is compared.
|
|
137
133
|
- If required coverage values are unavailable, the plan outcome MUST be remediation-required and MUST NOT be reported as PASS.
|
|
138
134
|
|
|
139
135
|
## Final QA Loop (Required for Code/Test Changes)
|
|
@@ -275,7 +271,7 @@ When a plan is generated or validated from a feature folder, resolve selected mo
|
|
|
275
271
|
|
|
276
272
|
## Mode-Specific Mandatory Plan Gates
|
|
277
273
|
|
|
278
|
-
- `minor-audit` plans MUST include baseline evidence tasks, targeted verification evidence tasks, and end-state evidence tasks.
|
|
274
|
+
- `minor-audit` plans MUST include static baseline evidence tasks, targeted verification evidence tasks read from the gate run, and end-state evidence tasks.
|
|
279
275
|
- `minor-audit` plans MUST require `${feature-folder}/issue.md` to contain an explicit `## Acceptance Criteria` section; do not infer acceptance criteria from other `issue.md` sections.
|
|
280
276
|
- `minor-audit` plans MUST NOT treat missing `spec.md` or `user-story.md` as automatic blockers.
|
|
281
277
|
- `minor-audit` execution/validation/audit MUST fail closed when `spec.md` or `user-story.md` exists unexpectedly in the active folder, when the explicit `## Acceptance Criteria` section is missing from `issue.md`, when required Phase 0 artifacts are missing, or when checklist state contradicts evidence on disk.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: csharp-qa-gate
|
|
3
|
-
description: Final QA gate for C# changes. Executes the full CSharpier -> .NET Analyzers -> Nullable Analysis ->
|
|
3
|
+
description: Final QA gate for C# changes. Executes the full CSharpier -> .NET Analyzers -> Nullable Analysis -> MSTest toolchain (with architecture tests), compares static tool results against the static baseline, reads test and coverage results from the single gate run, and produces the required reporting block before the agent declares the change complete.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# C# QA Gate
|
|
@@ -12,14 +12,14 @@ Canonical procedure for the Phase D final quality gate that every C# change must
|
|
|
12
12
|
Use this skill when:
|
|
13
13
|
|
|
14
14
|
- `csharp-typed-engineer` is about to declare a change complete.
|
|
15
|
-
- An executor has finished applying a planned batch and must verify
|
|
15
|
+
- An executor has finished applying a planned batch and must verify the static tools against the static baseline recorded in Phase A, and the tests in the single gate run.
|
|
16
16
|
- A reviewer needs to confirm the toolchain was actually run and produced a clean pass.
|
|
17
17
|
|
|
18
18
|
## Required Inputs
|
|
19
19
|
|
|
20
20
|
Before invoking this gate, the agent must have:
|
|
21
21
|
|
|
22
|
-
- a baseline record produced in Phase A, containing analyzer findings
|
|
22
|
+
- a static baseline record produced in Phase A, containing analyzer findings and compiler/nullable diagnostics for the in-scope files,
|
|
23
23
|
- the exact list of touched production and test files,
|
|
24
24
|
- a clean working tree (all planned edits committed to the working copy).
|
|
25
25
|
|
|
@@ -48,36 +48,35 @@ Analyzer settings (`AnalysisLevel`, `AnalysisMode`, `TreatWarningsAsErrors`, `Nu
|
|
|
48
48
|
|
|
49
49
|
If the environment prevents running any tool, stop and report the change as **unverified**. Do not declare completion.
|
|
50
50
|
|
|
51
|
-
##
|
|
51
|
+
## Gate Requirements (Hard Gate)
|
|
52
52
|
|
|
53
|
-
Compare the final results to the Phase A
|
|
53
|
+
Compare the final static tool results to the static baseline recorded in Phase A, and read test and coverage results from the single gate run. All of the following must hold:
|
|
54
54
|
|
|
55
55
|
- **Analyzer delta**: 0 new findings across the repository.
|
|
56
56
|
- **Compiler / nullable delta**: 0 new diagnostics across the repository.
|
|
57
|
-
- **
|
|
58
|
-
- **Architecture
|
|
59
|
-
- **Per-file coverage
|
|
60
|
-
- **Overall coverage delta** (when the repo enforces it): overall coverage is greater than or equal to the baseline.
|
|
57
|
+
- **MSTest gate**: zero failures in the single gate run.
|
|
58
|
+
- **Architecture tests**: zero failures in the `*.ArchitectureTests` project.
|
|
59
|
+
- **Per-file coverage**: every changed file meets the coverage thresholds, read from the single gate run, and new behavior is tested.
|
|
61
60
|
- **New modules, classes, or methods**: coverage >= 90% for each new unit introduced in the batch.
|
|
62
61
|
|
|
63
|
-
If any
|
|
62
|
+
If any check fails, the agent must revert or fix immediately and rerun the full toolchain. Do not proceed to reporting until all checks are clean.
|
|
64
63
|
|
|
65
64
|
## Required Reporting Block
|
|
66
65
|
|
|
67
66
|
Every completion response must include the following sections:
|
|
68
67
|
|
|
69
68
|
1. **Scope** — exact file list touched in this change.
|
|
70
|
-
2. **Baseline** — analyzer
|
|
69
|
+
2. **Baseline** — analyzer and compiler/nullable findings recorded in Phase A.
|
|
71
70
|
3. **Plan** — design and test-strategy summary, referencing the approved plan.
|
|
72
71
|
4. **Diffs** — patch-style or full-file replacements for scoped files only.
|
|
73
|
-
5. **QA Gate Results** — analyzer
|
|
72
|
+
5. **QA Gate Results** — analyzer and compiler/nullable deltas, failures in the single gate run and the architecture tests, and per-file coverage against the thresholds. If any step could not be run, mark the corresponding line **unverified** and state why.
|
|
74
73
|
|
|
75
74
|
## Evidence Storage
|
|
76
75
|
|
|
77
76
|
Persist toolchain output according to `evidence-and-timestamp-conventions`:
|
|
78
77
|
|
|
79
|
-
- store baseline outputs under `<FEATURE>/evidence/baseline/<timestamp>/`,
|
|
80
|
-
- store
|
|
78
|
+
- store static baseline outputs under `<FEATURE>/evidence/baseline/<timestamp>/`,
|
|
79
|
+
- store final gate outputs under `<FEATURE>/evidence/qa-gates/<timestamp>/`,
|
|
81
80
|
- use ISO-8601 UTC timestamps in folder names.
|
|
82
81
|
|
|
83
82
|
This location is canonical per evidence-and-timestamp-conventions and is not overridable.
|
|
@@ -89,4 +88,4 @@ The evidence paths must be referenced in the agent's completion message to satis
|
|
|
89
88
|
|
|
90
89
|
- Do not disable, skip, or narrow any step of the toolchain to reach a clean result.
|
|
91
90
|
- Do not add analyzer suppressions, `#pragma warning disable`, `#nullable disable`, or test `[Ignore]` attributes to suppress new findings introduced by the change.
|
|
92
|
-
- Do not report success based on partial or targeted runs
|
|
91
|
+
- Do not report success based on partial or targeted runs. A focused run of one test file to debug a specific failure is debugging only; it is never a gate or evidence, and the final gate is the single gate run.
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: epic-progress-report
|
|
3
|
+
description: 'Post recurring epic progress reports from the coordinator session: a four-line TL;DR every 10 minutes and an hourly full status update with a push notification. Use when an epic is running and the owner wants scheduled progress, velocity, and time-remaining reports, or when the reports must be started, reset after a pause, moved to a new cadence, stopped, or recreated after a restart.'
|
|
4
|
+
argument-hint: "[epic-folder]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- "Bash(pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 *)"
|
|
9
|
+
- "Bash(cswap list*)"
|
|
10
|
+
- CronCreate
|
|
11
|
+
- CronList
|
|
12
|
+
- CronDelete
|
|
13
|
+
- PushNotification
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Epic Progress Report
|
|
17
|
+
|
|
18
|
+
This skill runs the epic progress report script and schedules two recurring reports in the
|
|
19
|
+
coordinator's main session: a four-line TL;DR and an hourly full status update. The script is
|
|
20
|
+
`.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1`. It reads the epic
|
|
21
|
+
kickoff, the feature plans, the epic checkpoint, the pull-request state, and the weekly quota,
|
|
22
|
+
prints the report, and keeps its samples and baseline in a state file.
|
|
23
|
+
|
|
24
|
+
## When to Use This Skill
|
|
25
|
+
|
|
26
|
+
- An epic is running and the owner wants scheduled progress reports.
|
|
27
|
+
- The reports must be started for an epic, or recreated after the session restarted.
|
|
28
|
+
- Work resumed after a pause or an outage and the velocity baseline must be reset.
|
|
29
|
+
- The TL;DR cadence changes (for example from 5 to 10 minutes).
|
|
30
|
+
- The epic is finished and the reports must be stopped.
|
|
31
|
+
|
|
32
|
+
## Prerequisites
|
|
33
|
+
|
|
34
|
+
- PowerShell 7 and `git`. `gh` and `cswap` are optional: without `gh` the pull-request state
|
|
35
|
+
is empty, and without `cswap` (or without parseable output) the weekly quota prints `n/a`.
|
|
36
|
+
- The epic kickoff at `docs/features/epics/<epic-folder>/epic-kickoff.md` on
|
|
37
|
+
`origin/epic/<epic-folder>-integration`, with a feature-summary table (header first cell
|
|
38
|
+
`issue_num` or `Issue`) and an `Epic issue: #<n>` line. Pass `-EpicIssue` when the line
|
|
39
|
+
is missing.
|
|
40
|
+
- The epic checkpoint `artifacts/orchestration/epic-orchestrator-state.json` under the
|
|
41
|
+
repository root (optional; without it every feature is classified from its plan and PR).
|
|
42
|
+
- Run from the repository root in the coordinator's main session. An agent-isolated worktree
|
|
43
|
+
refuses command text containing `pwsh`, and the scheduled jobs and notifications belong to
|
|
44
|
+
the main session.
|
|
45
|
+
|
|
46
|
+
## Inputs
|
|
47
|
+
|
|
48
|
+
| Parameter | Default | Meaning |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `-EpicFolder` | (mandatory) | Epic folder name under `docs/features/epics/`; also the epic name in the status heading. |
|
|
51
|
+
| `-StartUtc` | stored start | Start of the measurement. Resolution: the passed value, else now with `-ResetBaseline`, else the stored start. With none of these the script stops before any git call with an error naming `-StartUtc` and `-ResetBaseline`. |
|
|
52
|
+
| `-BaselineDone` | stored value, else 0 | Tasks already complete at the start. With `-ResetBaseline` and no passed value, the current done count. |
|
|
53
|
+
| `-BaselineWeeklyPct` | stored value, else 0 | Weekly quota percentage at the start. `-ResetBaseline` does not change it. |
|
|
54
|
+
| `-EpicIssue` | the kickoff's `Epic issue: #<n>` line | Epic issue number printed in the report. |
|
|
55
|
+
| `-IntegrationBranch` | `origin/epic/<epic-folder>-integration` | Branch that holds the kickoff and the plans. |
|
|
56
|
+
| `-KickoffPath` | `docs/features/epics/<epic-folder>/epic-kickoff.md` | Kickoff path on the integration branch. |
|
|
57
|
+
| `-RepositoryRoot` | current location | Repository root in which git runs. |
|
|
58
|
+
| `-CheckpointPath` | `artifacts/orchestration/epic-orchestrator-state.json` | Epic checkpoint under the repository root. |
|
|
59
|
+
| `-StatePath` | `.claude/state/epic-progress-<epic-folder>.json` | State file under the repository root; the directory is created when missing. |
|
|
60
|
+
| `-WaveOverheadHours` | 1.25 | Review and CI hours added per open wave. |
|
|
61
|
+
| `-SampleCap` | 14 | Maximum number of samples kept. |
|
|
62
|
+
| `-Mode` | `Full` | `TLDR` prints the four TL;DR lines; `Full` prints them followed by the full report. |
|
|
63
|
+
| `-ResetBaseline` | off | Discards the stored samples and restarts the baseline now (see the reset section). |
|
|
64
|
+
| `-PairSamples` | off | One-shot: pairs the stored samples for a cadence change (see the cadence section). Cannot be combined with `-ResetBaseline`. |
|
|
65
|
+
|
|
66
|
+
A passed `-StartUtc`, `-BaselineDone`, or `-BaselineWeeklyPct` overrides the stored value and
|
|
67
|
+
is persisted with the next state write.
|
|
68
|
+
|
|
69
|
+
## Report Formats
|
|
70
|
+
|
|
71
|
+
The wording, order, and punctuation below are the script's output and do not change. Values in
|
|
72
|
+
angle brackets are placeholders; the examples use the fictional epic folder `example-epic` and
|
|
73
|
+
epic issue `42`.
|
|
74
|
+
|
|
75
|
+
TL;DR (both modes print these four lines first):
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
**TL;DR:** Epic #<issue> is at <done> of <total> tasks (<pct>%). <done-sentence> <running-sentence>
|
|
79
|
+
**Elapsed:** <H h MM min>, with about <hours> hours left on the wave-parallel estimate. **Weekly** quota is at <weekly>.
|
|
80
|
+
**Avg Velocity:** <avg> tasks / hr. **Recent Velocity:** <recent> tasks / hr since last check-in. (SD of recent velocity: <sd>, from <n> intervals)
|
|
81
|
+
**Estimated time remaining:** <range>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Variants:
|
|
85
|
+
|
|
86
|
+
- done-sentence: `None of the <N> features is done yet.` or `<K> of <N> features are done.`
|
|
87
|
+
- running-sentence: `No feature is running.`, `#<i> is running (<d> of <t>).`, or
|
|
88
|
+
`#<a> (<d> of <t>), #<b> (<d> of <t>) are running.`
|
|
89
|
+
- range: `<HH:MM> hrs (range needs 3 or more check-in intervals)`, `<HH:MM> hrs to <HH:MM> hrs`,
|
|
90
|
+
or `<HH:MM> hrs to no upper bound (average velocity minus 2.05 SD is at or below 0.5 tasks / hr)`.
|
|
91
|
+
- `<pct>`, `<avg>`, `<recent>`, and `<sd>` are rounded to one decimal and `<hours>` to zero
|
|
92
|
+
decimals, with invariant culture and default (to-even) rounding; an integral value prints
|
|
93
|
+
without a decimal (`1`, not `1.0`). `<weekly>` is `<value>%` or `n/a`.
|
|
94
|
+
- Any non-finite value prints `n/a`; no report prints `NaN` or `Infinity`.
|
|
95
|
+
|
|
96
|
+
Example (fictional):
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
**TL;DR:** Epic #42 is at 3 of 10 tasks (30%). 1 of 3 features are done. #12345 is running (1 of 5).
|
|
100
|
+
**Elapsed:** 3 h 00 min, with about 10 hours left on the wave-parallel estimate. **Weekly** quota is at 42.5%.
|
|
101
|
+
**Avg Velocity:** 1 tasks / hr. **Recent Velocity:** 1 tasks / hr since last check-in. (SD of recent velocity: 0, from 3 intervals)
|
|
102
|
+
**Estimated time remaining:** 09:22 hrs to 09:39 hrs
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Full mode prints the TL;DR lines, then these lines:
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
|
|
109
|
+
## Epic #<issue> <epic-folder>: status at <HH:mm> UTC, <MMM d>
|
|
110
|
+
|
|
111
|
+
**Elapsed:** <H h MM min> since <HH:mm> UTC. **Progress:** <done> of <total> tasks complete, **<pct>%**.
|
|
112
|
+
|
|
113
|
+
| State | Features |
|
|
114
|
+
|---|---|
|
|
115
|
+
| Completed | <completed> |
|
|
116
|
+
| Running | #<i> (wave <w>, <band>): <d> of <t> tasks (<share>%).<phase><pr> |
|
|
117
|
+
| Pending, wave <w> | #<i> (<t>), #<j> (<t>) |
|
|
118
|
+
|
|
119
|
+
| Wave | Children | Tasks | Done |
|
|
120
|
+
|---|---|---|---|
|
|
121
|
+
| <w> | <count> | <tasks> | <done> |
|
|
122
|
+
| **Total** | **<features>** | **<total>** | **<done>** |
|
|
123
|
+
|
|
124
|
+
**Velocity:** <avg> tasks per hour (one child's pace). **Remaining:** <remaining> tasks.
|
|
125
|
+
- Straight line, no parallelism: about <H h MM min> (upper bound).
|
|
126
|
+
- Wave-parallel (longest chain <tasks> tasks plus about <overhead> h per open wave for review and CI): about **<H h MM min>**.
|
|
127
|
+
**Weekly quota (active account):** <weekly> used, <delta> points since the epic started. This pool also covers the other runs in this session, so it is not the epic's cost alone.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Full report contents:
|
|
131
|
+
|
|
132
|
+
- `<completed>` is `None yet` or the completed issues as `#<i>` joined with `, `.
|
|
133
|
+
- One `Running` row per running feature. `<phase>` is ` Now at: <phase>.` when a current
|
|
134
|
+
phase exists, else empty; `<pr>` is ` PR <state>.` when a pull request exists, else empty;
|
|
135
|
+
`<share>` is the feature percentage rounded to zero decimals.
|
|
136
|
+
- One `Pending, wave <w>` row per wave that holds pending features, in ascending wave order.
|
|
137
|
+
- One Wave-table row per wave in ascending order, then the bold Total row.
|
|
138
|
+
- `<overhead>` is `-WaveOverheadHours` unrounded. `<delta>` is the weekly percentage minus
|
|
139
|
+
the weekly baseline, with a leading `+` when it is finite and not negative, else `n/a`.
|
|
140
|
+
- Times use invariant culture and UTC.
|
|
141
|
+
|
|
142
|
+
## Calculation Rules
|
|
143
|
+
|
|
144
|
+
- Task counts: plan checkboxes `- [ ] [P#-T#]` and `- [x] [P#-T#]` of each feature, read from
|
|
145
|
+
the feature's worktree when its branch has one, otherwise from the plan on the integration
|
|
146
|
+
branch. The feature list, waves, bands, and plan paths come from the kickoff's
|
|
147
|
+
feature-summary table.
|
|
148
|
+
- Feature state: Completed when the checkpoint's `merge_status` is `merged` or
|
|
149
|
+
`worktree_removed`, or the feature PR is merged; Running when any task is done, the
|
|
150
|
+
checkpoint status is past `not_started`, or a PR exists; otherwise Pending.
|
|
151
|
+
- Elapsed: from the start instant to now, clamped at 0; printed as `H h MM min` from rounded
|
|
152
|
+
total minutes.
|
|
153
|
+
- Average velocity: (done now - baseline done) / elapsed hours; 0 when elapsed is not above 0.
|
|
154
|
+
- Straight-line estimate: remaining tasks / average velocity; `n/a` when the average is not
|
|
155
|
+
above 0.
|
|
156
|
+
- Wave-parallel estimate: the sum, over every wave with a non-completed feature, of the largest
|
|
157
|
+
remaining task count among that wave's non-completed features, divided by the average
|
|
158
|
+
velocity, plus `-WaveOverheadHours` (default 1.25 hours) per open wave; `n/a` when the
|
|
159
|
+
average is not above 0.
|
|
160
|
+
- Samples: a check-in sample (Unix epoch seconds, done count) is added when there is no
|
|
161
|
+
previous sample or the previous one is at least 90 seconds old; the newest `-SampleCap`
|
|
162
|
+
(default 14) samples are kept. Epoch seconds are used because `ConvertFrom-Json` converts ISO
|
|
163
|
+
date strings into local-time values.
|
|
164
|
+
- Interval velocity: max(0, change in done) / change in hours, for consecutive samples at
|
|
165
|
+
least 2 minutes apart; closer pairs are skipped.
|
|
166
|
+
- Recent velocity: the latest interval's value; `n/a` without intervals.
|
|
167
|
+
- SD: the sample standard deviation (n-1 denominator) of the interval velocities; `n/a` below
|
|
168
|
+
3 intervals. The report prints the interval count.
|
|
169
|
+
- Range: below 3 intervals, the wave-parallel estimate followed by
|
|
170
|
+
`(range needs 3 or more check-in intervals)`. With 3 or more intervals the range is the
|
|
171
|
+
average velocity plus and minus 2.05 SD: fast end = critical-path tasks /
|
|
172
|
+
(average + 2.05 x SD) + overhead; slow velocity = average - 2.05 x SD; when the slow
|
|
173
|
+
velocity is above 0.5 tasks per hour the slow end = critical-path tasks / slow velocity +
|
|
174
|
+
overhead, otherwise the slow end prints the no-upper-bound text. Hours print as `HH:MM`.
|
|
175
|
+
- Weekly quota: the seven-day percentage of the active account in `cswap list --json`;
|
|
176
|
+
`n/a` when `cswap` is missing or prints nothing parseable.
|
|
177
|
+
- `n/a`: every printed number passes through a formatter that returns `n/a` for NaN or
|
|
178
|
+
infinity.
|
|
179
|
+
|
|
180
|
+
## Starting the Reports
|
|
181
|
+
|
|
182
|
+
1. Run the script once from the repository root to set the baseline. Either pass the start
|
|
183
|
+
and the tasks already done at that start:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 -EpicFolder example-epic -StartUtc 2026-01-05T09:00:00Z -BaselineDone 40 -Mode TLDR
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
or start the measurement now:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 -EpicFolder example-epic -ResetBaseline
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
The start and baseline are stored in the state file, so later runs need no `-StartUtc`.
|
|
196
|
+
2. Create the two recurring jobs with `CronCreate`, using the prompts below with
|
|
197
|
+
`<epic-folder>` replaced by the epic folder name.
|
|
198
|
+
3. Confirm both jobs with `CronList`.
|
|
199
|
+
|
|
200
|
+
## Scheduling Prompts
|
|
201
|
+
|
|
202
|
+
TL;DR job: cron `*/10 * * * *`, recurring.
|
|
203
|
+
|
|
204
|
+
```text
|
|
205
|
+
Run `pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 -EpicFolder <epic-folder> -Mode TLDR` from the repository root and post its output verbatim as the TL;DR epic update (no push notification). Do not add commentary unless a run is blocked or a child has finished and needs relaying.
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Hourly job: cron `7 * * * *`, recurring.
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
Run `pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 -EpicFolder <epic-folder>` (full mode) from the repository root and post its output as the hourly epic update, then send a PushNotification with the TL;DR line (under 200 characters). Check `cswap list` for the weekly pool; stop and commit at 93%.
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Notes on the prompts:
|
|
215
|
+
|
|
216
|
+
- Push-notification text: the first TL;DR output line with every `**` removed. When that text
|
|
217
|
+
is 200 characters or longer, drop the running-features sentence; the remaining text (prefix,
|
|
218
|
+
task counts, percentage, and done-sentence) is well under 200 characters.
|
|
219
|
+
- The prompts omit `-StartUtc`, `-BaselineDone`, `-ResetBaseline`, and `-PairSamples`. The
|
|
220
|
+
baseline is read from the state file, so a later reset is never overridden by a stale
|
|
221
|
+
scheduled argument, and pairing is never repeated by a recurring job.
|
|
222
|
+
- Cron times are local time, not UTC.
|
|
223
|
+
- Jitter: a 10-minute job fires up to 5 minutes late and an hourly job up to 30 minutes late,
|
|
224
|
+
by a constant delay per job.
|
|
225
|
+
|
|
226
|
+
## Resetting the Baseline After a Pause
|
|
227
|
+
|
|
228
|
+
Whenever work resumes after a pause or an outage, run the script once with `-ResetBaseline`:
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
pwsh -NoProfile -File .claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 -EpicFolder example-epic -ResetBaseline
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
- The stored samples are discarded, the start becomes now, and the baseline done count becomes
|
|
235
|
+
the current done count. Pass `-StartUtc` and `-BaselineDone` with `-ResetBaseline` when the
|
|
236
|
+
resume instant is in the past.
|
|
237
|
+
- The weekly-quota baseline is kept, so the Full report's points since the epic started stay
|
|
238
|
+
accurate.
|
|
239
|
+
- The scheduled prompts are not changed.
|
|
240
|
+
- The first reports after a reset show `0 h 00 min` elapsed and `n/a` estimates, and the
|
|
241
|
+
estimates are unreliable for about two hours.
|
|
242
|
+
- Reason: earlier measures include the paused time. A 9-hour outage once distorted the averages
|
|
243
|
+
until the baseline was reset.
|
|
244
|
+
|
|
245
|
+
## Changing the Cadence
|
|
246
|
+
|
|
247
|
+
To move the TL;DR job to a new interval (for example from 5 to 10 minutes):
|
|
248
|
+
|
|
249
|
+
1. Run the script once with `-PairSamples`. It keeps the newest sample and every second older
|
|
250
|
+
sample, so the stored intervals match the doubled cadence. 14 samples become 7.
|
|
251
|
+
2. Delete the TL;DR job with `CronDelete` and create it again with `CronCreate` at the new
|
|
252
|
+
interval.
|
|
253
|
+
|
|
254
|
+
`-PairSamples` is a one-shot command: each run halves the samples again. Never put it in a
|
|
255
|
+
scheduled prompt.
|
|
256
|
+
|
|
257
|
+
Worked example from recorded samples: thirteen 5-minute intervals gave mean 26.2 and SD 31.4
|
|
258
|
+
tasks per hour; after pairing, six 10-minute intervals give mean 27.3 and SD 23.2. The
|
|
259
|
+
conversation that defined the reports quoted 31.5 for the 5-minute SD; the recorded samples
|
|
260
|
+
give 31.4 (unrounded 31.4495).
|
|
261
|
+
|
|
262
|
+
## Stopping the Reports
|
|
263
|
+
|
|
264
|
+
1. Run `CronList` and note the IDs of the TL;DR and hourly jobs.
|
|
265
|
+
2. Run `CronDelete` for each report job ID.
|
|
266
|
+
3. Keep the state file for a later restart of the reports, or delete it.
|
|
267
|
+
|
|
268
|
+
## After a Restart
|
|
269
|
+
|
|
270
|
+
- `CronCreate` jobs are session-only: they fire only while the session runs and is idle, and a
|
|
271
|
+
missed run fires once when the session becomes idle again.
|
|
272
|
+
- `claude --resume` or `claude --continue` restores jobs that have not expired.
|
|
273
|
+
- Recurring jobs expire 7 days after creation; recreate both before the 7-day expiry.
|
|
274
|
+
- Run `CronList` and recreate only the missing jobs with the prompts above.
|
|
275
|
+
- If work paused during the restart, reset the baseline first.
|
|
276
|
+
- The state file survives under `.claude/state/` wherever the checkout persists, so the
|
|
277
|
+
baseline and samples are kept.
|
|
278
|
+
|
|
279
|
+
## State File
|
|
280
|
+
|
|
281
|
+
- Location: `.claude/state/epic-progress-<epic-folder>.json` under the repository root.
|
|
282
|
+
`-StatePath` overrides it.
|
|
283
|
+
- The state is never committed: `.claude/state/` is gitignored in this repository and the
|
|
284
|
+
push-down adds it to a destination's `.gitignore`.
|
|
285
|
+
- The state is per checkout: a different worktree or `-RepositoryRoot` starts a separate
|
|
286
|
+
history. Run from the same root, or pass `-StatePath`.
|
|
287
|
+
- `git clean -fdX` deletes it.
|
|
288
|
+
- A state file under the system temporary directory, written by an earlier version, is not
|
|
289
|
+
migrated: pass its path once with `-StatePath`, or reset the baseline.
|
|
290
|
+
- The legacy format (a JSON array of samples) is still read. The current document is:
|
|
291
|
+
|
|
292
|
+
```json
|
|
293
|
+
{
|
|
294
|
+
"version": 1,
|
|
295
|
+
"startUnixSeconds": 1767603600,
|
|
296
|
+
"baselineDone": 0,
|
|
297
|
+
"baselineWeeklyPct": 0,
|
|
298
|
+
"samples": [ { "ts": 1767614400, "done": 3 } ]
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
- Blank text, unparseable text, or a version other than 1 is read as empty state; a missing
|
|
303
|
+
field is absent.
|
|
304
|
+
- The state is written when a sample is added, or when `-ResetBaseline` or `-PairSamples` is
|
|
305
|
+
given. A run within 90 seconds of the last sample with neither switch writes nothing.
|
|
306
|
+
|
|
307
|
+
## Known Behaviors and Measured Rates
|
|
308
|
+
|
|
309
|
+
- Plan checkboxes tick at batch boundaries, so 5-minute interval velocity is bursty: 0 to
|
|
310
|
+
about 150 tasks per hour, with an SD of about 30 to 45 around a mean near 26.
|
|
311
|
+
- Aggregate throughput with three or four features in parallel is about 25 to 30 tasks per
|
|
312
|
+
hour. Per-feature pace is about 9 to 13 tasks per hour; a lone feature, including its review
|
|
313
|
+
and PR tail, about 4.
|
|
314
|
+
- The wave-parallel estimate is unreliable for about two hours after a baseline: it swung
|
|
315
|
+
between 35 and 110 hours in the first hour, and once estimated 26 to 30 hours for about 10
|
|
316
|
+
active hours.
|
|
317
|
+
- Task totals drift when planners revise plans, so read the percentage against the live total.
|
|
318
|
+
- Flat stretches of 20 to 60 minutes are normal during review, PR, CI, and merge.
|
|
319
|
+
- The tail from plan complete to merge is 0.8 to 4 hours per feature, and each remediation
|
|
320
|
+
cycle adds 45 to 90 minutes.
|
|
321
|
+
- Weekly quota burn is 3 to 7 points per hour (4.3 to 7.6 tasks per point).
|
|
322
|
+
- The hourly Full run also records a sample when it runs more than 90 seconds after the
|
|
323
|
+
previous one. This adds a shorter interval about once an hour and raises the SD.
|
|
324
|
+
- A negative average (done below the baseline after a plan revision) makes the straight-line
|
|
325
|
+
and wave-parallel estimates `n/a`, while the range can print negative or very large values.
|
|
326
|
+
- Integral velocities print without a decimal (`1`, not `1.0`).
|
|
327
|
+
|
|
328
|
+
## Notes
|
|
329
|
+
|
|
330
|
+
- Delivery: the push-down serves the installed extension payload, so this skill reaches a
|
|
331
|
+
destination repository only after the extension is rebuilt and reinstalled.
|
|
332
|
+
- Quota: the 93% stop in the hourly prompt is coordinator policy. The commit-before-the-wall
|
|
333
|
+
procedure is governed by `.claude/skills/quota-throttling/SKILL.md`.
|
|
334
|
+
- The script is read-only toward git and GitHub: it runs only `git fetch`, `git show`,
|
|
335
|
+
`git worktree list`, `gh pr list`, and `cswap list --json`, and the only file it writes is
|
|
336
|
+
the state file.
|
|
337
|
+
- In this repository, `scripts/dev-tools/Get-EpicProgressReport.ps1` forwards every argument
|
|
338
|
+
to the canonical script; the skill always invokes the canonical script.
|