@raishin/vanguard-frontier-agentic 2.2.0 → 2.3.0
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/.claude-plugin/plugin.json +11 -1
- package/.cursor-plugin/plugin.json +11 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +44 -27
- package/agents/dotnet/README.md +57 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/AGENT.md +57 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/claude-code.agent.md +41 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/codex.toml +40 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/copilot.agent.md +41 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/cursor.agent.md +41 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/gemini.agent.md +41 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/harnesses/kiro-ide.agent.md +41 -0
- package/agents/dotnet/dotnet-aspire-cloud-native-review-agent/metadata.json +41 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/AGENT.md +56 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/codex.toml +38 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/copilot.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/cursor.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/gemini.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/metadata.json +42 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/AGENT.md +56 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/codex.toml +38 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/copilot.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/cursor.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/gemini.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/dotnet/dotnet-aspnetcore-identity-authz-review-agent/metadata.json +42 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/AGENT.md +56 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/claude-code.agent.md +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/codex.toml +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/copilot.agent.md +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/cursor.agent.md +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/gemini.agent.md +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/kiro-ide.agent.md +39 -0
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/metadata.json +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/AGENT.md +58 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/codex.toml +41 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/copilot.agent.md +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/cursor.agent.md +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/gemini.agent.md +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/metadata.json +42 -0
- package/agents/dotnet/dotnet-maestro-agent/AGENT.md +53 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/claude-code.agent.md +36 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/codex.toml +40 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/copilot.agent.md +36 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/cursor.agent.md +36 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/gemini.agent.md +36 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-maestro-agent/harnesses/kiro-ide.agent.md +36 -0
- package/agents/dotnet/dotnet-maestro-agent/metadata.json +40 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/AGENT.md +57 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/claude-code.agent.md +41 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/codex.toml +40 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/copilot.agent.md +41 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/cursor.agent.md +41 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/gemini.agent.md +41 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/harnesses/kiro-ide.agent.md +41 -0
- package/agents/dotnet/dotnet-observability-otel-review-agent/metadata.json +41 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/AGENT.md +56 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/codex.toml +39 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/copilot.agent.md +40 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/cursor.agent.md +40 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/gemini.agent.md +40 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/dotnet/dotnet-performance-aot-review-agent/metadata.json +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/AGENT.md +57 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/claude-code.agent.md +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/codex.toml +40 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/copilot.agent.md +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/cursor.agent.md +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/gemini.agent.md +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/harnesses/kiro-ide.agent.md +41 -0
- package/agents/dotnet/dotnet-supply-chain-review-agent/metadata.json +42 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/AGENT.md +56 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/codex.toml +39 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/copilot.agent.md +40 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/cursor.agent.md +40 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/gemini.agent.md +40 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/dotnet/dotnet-testing-quality-review-agent/metadata.json +41 -0
- package/agents/hr/hr-analytics-people-data-agent/metadata.json +3 -7
- package/agents/hr/hr-benefits-payroll-agent/metadata.json +3 -7
- package/agents/hr/hr-compensation-equity-agent/metadata.json +3 -7
- package/agents/hr/hr-culture-dei-agent/metadata.json +3 -7
- package/agents/hr/hr-employee-relations-agent/metadata.json +3 -7
- package/agents/hr/hr-hris-process-controls-agent/metadata.json +3 -7
- package/agents/hr/hr-learning-policy-agent/metadata.json +3 -7
- package/agents/hr/hr-leave-accommodation-agent/metadata.json +3 -7
- package/agents/hr/hr-maestro-agent/metadata.json +4 -8
- package/agents/hr/hr-performance-management-agent/metadata.json +3 -7
- package/agents/hr/hr-recruiting-selection-agent/metadata.json +3 -7
- package/agents/hr/hr-risk-triage-review-agent/metadata.json +3 -3
- package/agents/hr/hr-termination-readiness-agent/metadata.json +3 -7
- package/agents/hr/hr-workforce-planning-rif-agent/metadata.json +3 -7
- package/agents/hr/hr-workplace-investigations-agent/metadata.json +3 -7
- package/agents/legal/legal-contract-review-agent/metadata.json +3 -7
- package/agents/legal/legal-counsel-review-agent/metadata.json +3 -3
- package/agents/legal/legal-employment-law-risk-agent/metadata.json +4 -8
- package/agents/legal/legal-ethics-investigations-agent/metadata.json +3 -7
- package/agents/legal/legal-ip-open-source-agent/metadata.json +3 -7
- package/agents/legal/legal-knowledge-management-agent/metadata.json +3 -7
- package/agents/legal/legal-litigation-discovery-hold-agent/metadata.json +3 -7
- package/agents/legal/legal-maestro-agent/metadata.json +4 -8
- package/agents/legal/legal-policy-governance-agent/metadata.json +3 -7
- package/agents/legal/legal-privacy-data-protection-agent/metadata.json +3 -7
- package/agents/legal/legal-public-disclosure-agent/metadata.json +3 -7
- package/agents/legal/legal-regulatory-compliance-agent/metadata.json +3 -7
- package/agents/legal/legal-vendor-procurement-risk-agent/metadata.json +3 -7
- package/catalog/agents.json +292 -28
- package/catalog/asset-integrity.json +726 -96
- package/catalog/install-roles.json +28 -0
- package/catalog/skill-manifest.json +221 -6
- package/catalog/skills.json +276 -2
- package/package.json +1 -1
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/schemas/agent.schema.json +4 -1
- package/schemas/skill.schema.json +4 -1
- package/scripts/export-marketplace-agents.mjs +13 -1
- package/skills/dotnet/dotnet-aspire-cloud-native-review/SKILL.md +53 -0
- package/skills/dotnet/dotnet-aspire-cloud-native-review/metadata.json +27 -0
- package/skills/dotnet/dotnet-aspire-cloud-native-review/references/workflow-and-output.md +115 -0
- package/skills/dotnet/dotnet-aspnetcore-api-review/SKILL.md +53 -0
- package/skills/dotnet/dotnet-aspnetcore-api-review/metadata.json +28 -0
- package/skills/dotnet/dotnet-aspnetcore-api-review/references/workflow-and-output.md +115 -0
- package/skills/dotnet/dotnet-aspnetcore-identity-authz-review/SKILL.md +48 -0
- package/skills/dotnet/dotnet-aspnetcore-identity-authz-review/metadata.json +28 -0
- package/skills/dotnet/dotnet-aspnetcore-identity-authz-review/references/workflow-and-output.md +125 -0
- package/skills/dotnet/dotnet-csharp-runtime-review/SKILL.md +56 -0
- package/skills/dotnet/dotnet-csharp-runtime-review/metadata.json +28 -0
- package/skills/dotnet/dotnet-csharp-runtime-review/references/workflow-and-output.md +141 -0
- package/skills/dotnet/dotnet-efcore-data-access-review/SKILL.md +57 -0
- package/skills/dotnet/dotnet-efcore-data-access-review/metadata.json +28 -0
- package/skills/dotnet/dotnet-efcore-data-access-review/references/workflow-and-output.md +140 -0
- package/skills/dotnet/dotnet-maestro/SKILL.md +106 -0
- package/skills/dotnet/dotnet-maestro/metadata.json +26 -0
- package/skills/dotnet/dotnet-observability-otel-review/SKILL.md +53 -0
- package/skills/dotnet/dotnet-observability-otel-review/metadata.json +27 -0
- package/skills/dotnet/dotnet-observability-otel-review/references/workflow-and-output.md +119 -0
- package/skills/dotnet/dotnet-performance-aot-review/SKILL.md +53 -0
- package/skills/dotnet/dotnet-performance-aot-review/metadata.json +27 -0
- package/skills/dotnet/dotnet-performance-aot-review/references/workflow-and-output.md +123 -0
- package/skills/dotnet/dotnet-supply-chain-review/SKILL.md +55 -0
- package/skills/dotnet/dotnet-supply-chain-review/metadata.json +28 -0
- package/skills/dotnet/dotnet-supply-chain-review/references/workflow-and-output.md +132 -0
- package/skills/dotnet/dotnet-testing-quality-review/SKILL.md +54 -0
- package/skills/dotnet/dotnet-testing-quality-review/metadata.json +27 -0
- package/skills/dotnet/dotnet-testing-quality-review/references/workflow-and-output.md +142 -0
- package/skills/hr/hr-risk-triage-review/metadata.json +9 -2
- package/skills/legal/legal-counsel-review/metadata.json +9 -2
- package/tests/fixtures/dotnet-maestro-routing/expected/01-csharp-runtime.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/02-aspnetcore-api.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/03-identity-authz.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/04-efcore-data.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/05-testing-quality.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/06-supply-chain.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/07-performance-aot.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/08-observability-otel.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/09-aspire-cloud-native.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/10-multi-domain.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/11-ambiguous.json +4 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-ambiguous-near-miss.json +4 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-live-guard-bypass.json +4 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-parallel-saturation.json +9 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/01-csharp-runtime.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/02-aspnetcore-api.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/03-identity-authz.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/04-efcore-data.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/05-testing-quality.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/06-supply-chain.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/07-performance-aot.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/08-observability-otel.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/09-aspire-cloud-native.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/10-multi-domain.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/11-ambiguous.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-ambiguous-near-miss.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-live-guard-bypass.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-parallel-saturation.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/dotnet-maestro-routing/taxonomy.json +99 -0
- package/tests/test-vfa-export-coverage.test.mjs +21 -4
- package/tests/validate-catalog.py +3 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dotnet-testing-quality-review",
|
|
3
|
+
"name": ".NET Testing Quality Review",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"type": "skill",
|
|
6
|
+
"provider": "dotnet",
|
|
7
|
+
"harnesses": [
|
|
8
|
+
"codex",
|
|
9
|
+
"claude-code",
|
|
10
|
+
"cursor",
|
|
11
|
+
"gemini",
|
|
12
|
+
"kiro",
|
|
13
|
+
"other"
|
|
14
|
+
],
|
|
15
|
+
"summary": "Static review of .NET test suites — detects assertion-free and tautological tests, over-mocking, coverage theater, weak isolation, flaky patterns, and missing negative or security tests across xUnit, NUnit, and MSTest. Reads test source only; never runs the suite.",
|
|
16
|
+
"source_type": "original",
|
|
17
|
+
"official_docs": [
|
|
18
|
+
"https://learn.microsoft.com/en-us/dotnet/core/testing/",
|
|
19
|
+
"https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices",
|
|
20
|
+
"https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests",
|
|
21
|
+
"https://learn.microsoft.com/en-us/aspnet/core/test/middleware"
|
|
22
|
+
],
|
|
23
|
+
"security_notes": "Static review only — reads test projects, test source, and coverage configuration; never runs the test suite, a coverage tool, or a test container. Never requests secrets or customer data.",
|
|
24
|
+
"last_verified": "2026-05-19",
|
|
25
|
+
"path": "skills/dotnet/dotnet-testing-quality-review",
|
|
26
|
+
"author": "github: Raishin"
|
|
27
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Workflow and Output Contract
|
|
2
|
+
|
|
3
|
+
## Workflow
|
|
4
|
+
|
|
5
|
+
### Step 1 — Collect inputs
|
|
6
|
+
|
|
7
|
+
Ask the user to provide one or more of the following as sanitized test source (no secrets, no connection strings, no tokens, no tenant identifiers, no customer data — replace with placeholders):
|
|
8
|
+
- The test classes and fixtures under review (xUnit, NUnit, or MSTest).
|
|
9
|
+
- The mock or fake setups (Moq, NSubstitute, FakeItEasy) used by those tests.
|
|
10
|
+
- The integration-test harness: `WebApplicationFactory` setup, Testcontainers configuration, or shared database fixtures.
|
|
11
|
+
- The coverage configuration (`coverlet` settings, `.runsettings`, `ExcludeFromCodeCoverage` usage) and any coverage gate.
|
|
12
|
+
- The solution file or the CI test command, to confirm which test projects actually run.
|
|
13
|
+
|
|
14
|
+
If the solution file or CI test command is not provided, suite-inclusion findings are stated as `assumption (source absent)` — say so and ask for them.
|
|
15
|
+
|
|
16
|
+
### Step 2 — Assertion-quality audit
|
|
17
|
+
|
|
18
|
+
Confirm each test actually asserts behavior.
|
|
19
|
+
|
|
20
|
+
- A test method with no assertion — no `Assert.*`, no FluentAssertions `Should()`, no `mock.Verify`, no `[ExpectedException]` / `Assert.Throws` — → HIGH. It proves nothing and inflates coverage.
|
|
21
|
+
- A test that asserts only a mock's own configured return (set up `mock.Setup(x => x.Get()).Returns(v)` then asserts the result equals `v`, with the real code stubbed away) → HIGH tautological test: it passes regardless of the system under test.
|
|
22
|
+
- A test whose only assertion is `Assert.True(true)` or equivalent → HIGH.
|
|
23
|
+
|
|
24
|
+
### Step 3 — Mocking audit
|
|
25
|
+
|
|
26
|
+
Review what is mocked and what is verified.
|
|
27
|
+
|
|
28
|
+
- Mocking a type the team owns that carries real logic (a domain service, a calculator, a mapper) instead of exercising it → MEDIUM over-mocking: the test verifies a stub.
|
|
29
|
+
- Assertions made only against `mock.Verify(...)` with no assertion on the system's observable output, where output assertions are possible → HIGH (mock-only assertion).
|
|
30
|
+
- Recommend mocking only true external boundaries (clock, network, third-party SDK) and exercising owned logic for real.
|
|
31
|
+
|
|
32
|
+
### Step 4 — Coverage-gate audit
|
|
33
|
+
|
|
34
|
+
Review whether the coverage number reflects tested behavior.
|
|
35
|
+
|
|
36
|
+
- A coverage gate that counts generated code, migrations, or `[ExcludeFromCodeCoverage]`-marked code toward the percentage, or excludes whole assemblies to lift the number → HIGH coverage theater.
|
|
37
|
+
- No coverage gate at all, where the team treats a coverage number as a quality signal → HIGH.
|
|
38
|
+
- Recommend a gate scoped to hand-written production code, with exclusions justified and visible.
|
|
39
|
+
|
|
40
|
+
### Step 5 — Isolation audit
|
|
41
|
+
|
|
42
|
+
Review whether tests are independent.
|
|
43
|
+
|
|
44
|
+
- Integration tests sharing a mutable database with no per-test isolation (no transaction rollback, no respawn/reset, no fresh container per test class) → HIGH: tests pollute each other and pass or fail by run order.
|
|
45
|
+
- Tests sharing static or singleton mutable state across test classes → HIGH.
|
|
46
|
+
- Tests dependent on execution order, or on data left by a prior test → HIGH flaky pattern.
|
|
47
|
+
- `Thread.Sleep`-based waits in async or integration tests → MEDIUM flaky pattern; recommend deterministic waits.
|
|
48
|
+
|
|
49
|
+
### Step 6 — Suite-inclusion audit
|
|
50
|
+
|
|
51
|
+
Confirm every test project runs on the CI test gate.
|
|
52
|
+
|
|
53
|
+
- A test project present in the repo but not referenced by the solution's test run or the CI test command → HIGH: those tests never execute on the merge gate and the coverage they claim is fictional.
|
|
54
|
+
- Recommend including every test project in the CI test run, or removing it.
|
|
55
|
+
|
|
56
|
+
### Step 7 — Negative- and security-test audit
|
|
57
|
+
|
|
58
|
+
Review whether the dangerous paths are tested.
|
|
59
|
+
|
|
60
|
+
- Only happy-path tests, with no tests for unauthorized (401), forbidden (403), invalid-input (400), not-found (404), or concurrency-conflict paths → HIGH: defects hide in the paths nobody asserts.
|
|
61
|
+
- No tests asserting that an unauthenticated or under-privileged caller is rejected on protected endpoints → HIGH security-test gap.
|
|
62
|
+
- Recommend explicit negative tests for each guarded path.
|
|
63
|
+
|
|
64
|
+
### Step 8 — Brittleness audit
|
|
65
|
+
|
|
66
|
+
- Tests asserting on private fields, internal structure, or exact log strings → MEDIUM: they break on safe refactors and train the team to ignore red.
|
|
67
|
+
- Recommend asserting observable behavior through the public surface.
|
|
68
|
+
|
|
69
|
+
### Step 9 — Produce the output
|
|
70
|
+
|
|
71
|
+
Format findings using the Output contract section below.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Evidence checklist
|
|
76
|
+
|
|
77
|
+
Before writing findings, confirm which inputs were actually provided:
|
|
78
|
+
- [ ] Test classes and fixtures
|
|
79
|
+
- [ ] Mock / fake setups
|
|
80
|
+
- [ ] Integration-test harness (WebApplicationFactory, Testcontainers, DB fixtures)
|
|
81
|
+
- [ ] Coverage configuration and gate
|
|
82
|
+
- [ ] Solution file or CI test command
|
|
83
|
+
|
|
84
|
+
Each unchecked item downgrades the related findings to `inference (partial source)` or `assumption (source absent)`.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Findings rubric
|
|
89
|
+
|
|
90
|
+
| Severity | Criteria |
|
|
91
|
+
|----------|----------|
|
|
92
|
+
| critical | Reserved for a confirmed false-confidence pattern that demonstrably ships a known defect class with no test coverage and an explicitly disabled or excluded gate. |
|
|
93
|
+
| high | Assertion-free tests; tautological mock-only tests; coverage theater or no coverage gate; shared-mutable-state integration tests; test projects excluded from the CI run; missing negative and security tests. |
|
|
94
|
+
| medium | Over-mocking owned logic; brittle tests on internal structure; `Thread.Sleep`-based waits. |
|
|
95
|
+
| low | Minor naming, organization, or readability issues in otherwise sound tests. |
|
|
96
|
+
|
|
97
|
+
Every finding carries an evidence-basis label: `confirmed (test source provided)`, `inference (partial source)`, `assumption (source absent)`, or `unknown`.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Output contract
|
|
102
|
+
|
|
103
|
+
Return findings in this structure:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
## Verdict
|
|
107
|
+
<pass | pass-with-conditions | block>
|
|
108
|
+
|
|
109
|
+
## Evidence level
|
|
110
|
+
<full test source provided | partial source | documentation-based | inference>
|
|
111
|
+
|
|
112
|
+
## Findings
|
|
113
|
+
|
|
114
|
+
### CRITICAL
|
|
115
|
+
- [C1] <finding> — <evidence basis> — <description> — <remediation>
|
|
116
|
+
|
|
117
|
+
### HIGH
|
|
118
|
+
- [H1] <finding> — <evidence basis> — <description> — <remediation>
|
|
119
|
+
|
|
120
|
+
### MEDIUM
|
|
121
|
+
- [M1] <finding> — <evidence basis> — <description> — <remediation>
|
|
122
|
+
|
|
123
|
+
### LOW
|
|
124
|
+
- [L1] <finding> — <evidence basis> — <description> — <remediation>
|
|
125
|
+
|
|
126
|
+
## Safe next actions
|
|
127
|
+
1. <action>
|
|
128
|
+
2. <action>
|
|
129
|
+
|
|
130
|
+
## Open questions
|
|
131
|
+
- <question requiring user clarification>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Security notes
|
|
137
|
+
|
|
138
|
+
- Never request or accept secrets, connection strings, tokens, tenant identifiers, or customer data. Ask for test source with placeholders.
|
|
139
|
+
- This is a static review: never run the test suite, a coverage tool, or a test container; never contact live systems.
|
|
140
|
+
- An assertion-free or tautological test is the highest-impact finding possible — the suite looks green and verifies nothing. Lead with it.
|
|
141
|
+
- A test project excluded from the CI run is invisible lost coverage; treat it as HIGH and tell the user the claimed coverage is fictional until the project runs on the gate.
|
|
142
|
+
- Never recommend raising coverage with assertion-free tests; never recommend `[Skip]`/`[Ignore]`/`[Fact(Skip=...)]` on a failing test, or disabling a failing gate, as the fix — that converts a known problem into an invisible one.
|
|
@@ -2,8 +2,15 @@
|
|
|
2
2
|
"id": "hr-risk-triage-review",
|
|
3
3
|
"name": "HR Risk Triage Review",
|
|
4
4
|
"type": "skill",
|
|
5
|
-
"provider": "
|
|
6
|
-
"harnesses": [
|
|
5
|
+
"provider": "hr",
|
|
6
|
+
"harnesses": [
|
|
7
|
+
"codex",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"cursor",
|
|
10
|
+
"gemini",
|
|
11
|
+
"kiro",
|
|
12
|
+
"other"
|
|
13
|
+
],
|
|
7
14
|
"summary": "Adversarial HR and employment-risk triage discipline for terminations, discipline, accommodations, wage/hour, discrimination, harassment, retaliation, layoffs, and HR policy exceptions — surfaces risks, evidence gaps, and escalation paths for employment counsel. Does not give legal or HR advice.",
|
|
8
15
|
"source_type": "original",
|
|
9
16
|
"official_docs": [
|
|
@@ -2,8 +2,15 @@
|
|
|
2
2
|
"id": "legal-counsel-review",
|
|
3
3
|
"name": "Legal Counsel Review",
|
|
4
4
|
"type": "skill",
|
|
5
|
-
"provider": "
|
|
6
|
-
"harnesses": [
|
|
5
|
+
"provider": "legal",
|
|
6
|
+
"harnesses": [
|
|
7
|
+
"codex",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"cursor",
|
|
10
|
+
"gemini",
|
|
11
|
+
"kiro",
|
|
12
|
+
"other"
|
|
13
|
+
],
|
|
7
14
|
"summary": "Adversarial legal-risk review discipline for contracts, privacy, regulatory, litigation, compliance, and policy-exception questions — surfaces risks, evidence gaps, decision options, and escalation paths for qualified counsel. Does not give legal advice.",
|
|
8
15
|
"source_type": "original",
|
|
9
16
|
"official_docs": [
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"provider": "dotnet",
|
|
3
|
+
"domains": {
|
|
4
|
+
"csharp-runtime": {
|
|
5
|
+
"keywords": [
|
|
6
|
+
"async await",
|
|
7
|
+
"sync-over-async",
|
|
8
|
+
"nullable reference type",
|
|
9
|
+
"IDisposable",
|
|
10
|
+
"cancellation token"
|
|
11
|
+
],
|
|
12
|
+
"agent": "dotnet-csharp-runtime-review-agent"
|
|
13
|
+
},
|
|
14
|
+
"aspnetcore-api": {
|
|
15
|
+
"keywords": [
|
|
16
|
+
"middleware order",
|
|
17
|
+
"minimal API",
|
|
18
|
+
"dependency injection lifetime",
|
|
19
|
+
"CORS policy",
|
|
20
|
+
"API versioning"
|
|
21
|
+
],
|
|
22
|
+
"agent": "dotnet-aspnetcore-api-review-agent"
|
|
23
|
+
},
|
|
24
|
+
"identity-authz": {
|
|
25
|
+
"keywords": [
|
|
26
|
+
"JWT bearer",
|
|
27
|
+
"authorization policy",
|
|
28
|
+
"token validation",
|
|
29
|
+
"authentication scheme",
|
|
30
|
+
"tenant isolation"
|
|
31
|
+
],
|
|
32
|
+
"agent": "dotnet-aspnetcore-identity-authz-review-agent"
|
|
33
|
+
},
|
|
34
|
+
"efcore-data": {
|
|
35
|
+
"keywords": [
|
|
36
|
+
"EF Core",
|
|
37
|
+
"DbContext",
|
|
38
|
+
"N+1 query",
|
|
39
|
+
"EF Core migration",
|
|
40
|
+
"global query filter"
|
|
41
|
+
],
|
|
42
|
+
"agent": "dotnet-efcore-data-access-review-agent"
|
|
43
|
+
},
|
|
44
|
+
"testing-quality": {
|
|
45
|
+
"keywords": [
|
|
46
|
+
"xUnit",
|
|
47
|
+
"test coverage",
|
|
48
|
+
"integration test",
|
|
49
|
+
"assertion-free test",
|
|
50
|
+
"over-mocking"
|
|
51
|
+
],
|
|
52
|
+
"agent": "dotnet-testing-quality-review-agent"
|
|
53
|
+
},
|
|
54
|
+
"supply-chain": {
|
|
55
|
+
"keywords": [
|
|
56
|
+
"NuGet",
|
|
57
|
+
"global.json",
|
|
58
|
+
"packages.lock.json",
|
|
59
|
+
"Central Package Management",
|
|
60
|
+
"supply chain"
|
|
61
|
+
],
|
|
62
|
+
"agent": "dotnet-supply-chain-review-agent"
|
|
63
|
+
},
|
|
64
|
+
"performance-aot": {
|
|
65
|
+
"keywords": [
|
|
66
|
+
"Native AOT",
|
|
67
|
+
"trimming",
|
|
68
|
+
"BenchmarkDotNet",
|
|
69
|
+
"hot path allocation",
|
|
70
|
+
"trim warning"
|
|
71
|
+
],
|
|
72
|
+
"agent": "dotnet-performance-aot-review-agent"
|
|
73
|
+
},
|
|
74
|
+
"observability-otel": {
|
|
75
|
+
"keywords": [
|
|
76
|
+
"OpenTelemetry",
|
|
77
|
+
"structured logging",
|
|
78
|
+
"trace context",
|
|
79
|
+
"correlation id",
|
|
80
|
+
"distributed tracing"
|
|
81
|
+
],
|
|
82
|
+
"agent": "dotnet-observability-otel-review-agent"
|
|
83
|
+
},
|
|
84
|
+
"aspire-cloud-native": {
|
|
85
|
+
"keywords": [
|
|
86
|
+
"Aspire",
|
|
87
|
+
"AppHost",
|
|
88
|
+
"service defaults",
|
|
89
|
+
"service discovery",
|
|
90
|
+
"Aspire health check"
|
|
91
|
+
],
|
|
92
|
+
"agent": "dotnet-aspire-cloud-native-review-agent"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"live_guards": [],
|
|
96
|
+
"live_guard_intent": "(destroy|delete|terminate|rollout to prod|rollout to production|approve.*production|promote.*to (?:prod|production)|key destruction|policy change in prod|mutate (?:rbac|iam|policy)|change-set.*apply|live (?:apply|push|deploy)|force[- ]push.*main|drop\\s+(?:table|database)|swap\\s+production\\s+slot|dotnet ef|ef database update|dotnet build|dotnet test|dotnet run|apply.*migration.*to production)",
|
|
97
|
+
"gate_mode": "live-guard-gate",
|
|
98
|
+
"parallel_threshold": 0.8
|
|
99
|
+
}
|
|
@@ -220,13 +220,28 @@ const skillProviderDirs = fs.readdirSync(skillsRoot, { withFileTypes: true })
|
|
|
220
220
|
.filter((d) => d.isDirectory())
|
|
221
221
|
.map((d) => d.name);
|
|
222
222
|
|
|
223
|
-
// Map: skillName →
|
|
223
|
+
// Map: skillName → provider (reads from metadata.json, falls back to directory name)
|
|
224
|
+
// Mirrors the loadSkills() logic in scripts/export-marketplace-agents.mjs
|
|
224
225
|
const skillProviderByName = new Map();
|
|
225
226
|
for (const prov of skillProviderDirs) {
|
|
226
227
|
const provDir = path.join(skillsRoot, prov);
|
|
227
228
|
for (const skill of fs.readdirSync(provDir, { withFileTypes: true })) {
|
|
228
|
-
if (skill.isDirectory()
|
|
229
|
-
|
|
229
|
+
if (!skill.isDirectory()) continue;
|
|
230
|
+
const skillDir = path.join(provDir, skill.name);
|
|
231
|
+
const metaFile = path.join(skillDir, "metadata.json");
|
|
232
|
+
if (fs.existsSync(path.join(skillDir, "SKILL.md"))) {
|
|
233
|
+
let skillProvider = prov; // Default to directory name
|
|
234
|
+
if (fs.existsSync(metaFile)) {
|
|
235
|
+
try {
|
|
236
|
+
const meta = JSON.parse(fs.readFileSync(metaFile, "utf8"));
|
|
237
|
+
if (meta.provider) {
|
|
238
|
+
skillProvider = meta.provider; // Use declared provider if available
|
|
239
|
+
}
|
|
240
|
+
} catch (err) {
|
|
241
|
+
// Fall back to directory name if metadata.json is invalid
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
skillProviderByName.set(skill.name, skillProvider);
|
|
230
245
|
}
|
|
231
246
|
}
|
|
232
247
|
}
|
|
@@ -246,7 +261,9 @@ function findLeakedSkills(skillNames, expectedProvider) {
|
|
|
246
261
|
return skillNames.filter((s) => {
|
|
247
262
|
const prov = skillProviderByName.get(s);
|
|
248
263
|
if (!prov) return false; // unknown/orphan skill — can't classify
|
|
249
|
-
|
|
264
|
+
// Allow export of skills with provider='shared' or provider='generic'.
|
|
265
|
+
// generic is used by language/stack boards (dotnet, legal, hr, marketing).
|
|
266
|
+
return prov !== expectedProvider && prov !== "shared" && prov !== "generic";
|
|
250
267
|
});
|
|
251
268
|
}
|
|
252
269
|
|
|
@@ -50,6 +50,9 @@ ALLOWED_PROVIDERS = {
|
|
|
50
50
|
"nvidia",
|
|
51
51
|
"claude",
|
|
52
52
|
"marketing",
|
|
53
|
+
"dotnet",
|
|
54
|
+
"hr",
|
|
55
|
+
"legal",
|
|
53
56
|
}
|
|
54
57
|
ALLOWED_HARNESSES = {"codex", "copilot", "claude-code", "cursor", "gemini", "kiro", "other"}
|
|
55
58
|
ALLOWED_SOURCE_TYPES = {"original", "adapted", "reference-only"}
|