@danmoisan/drm-copilot-mcp 1.1.1 → 1.1.3

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.
Files changed (34) hide show
  1. package/out/mcp-server.js +110 -5
  2. package/package.json +1 -1
  3. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +16 -0
  4. package/resources/claude-customizations/.claude/settings.json +4 -9
  5. package/resources/claude-customizations/config/orchestration-routing.json +1 -1
  6. package/resources/codex-and-agents-customizations/.agents/skills/architecture-boundaries/SKILL.md +0 -3
  7. package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +0 -3
  8. package/resources/codex-and-agents-customizations/.agents/skills/csharp-change-budget-router/SKILL.md +1 -1
  9. package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +1 -1
  10. package/resources/codex-and-agents-customizations/.agents/skills/epic-plan/SKILL.md +1 -1
  11. package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +2 -1
  12. package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +0 -2
  13. package/resources/codex-and-agents-customizations/.agents/skills/general-unit-test/SKILL.md +0 -2
  14. package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +1 -1
  15. package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +1 -1
  16. package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +1 -1
  17. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +3 -2
  18. package/resources/codex-and-agents-customizations/.agents/skills/policy-audit-template-usage/SKILL.md +1 -1
  19. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +0 -4
  20. package/resources/codex-and-agents-customizations/.agents/skills/powershell-change-budget-router/SKILL.md +1 -1
  21. package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +1 -1
  22. package/resources/codex-and-agents-customizations/.agents/skills/python/SKILL.md +0 -2
  23. package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +1 -1
  24. package/resources/codex-and-agents-customizations/.agents/skills/python-suppressions/SKILL.md +0 -2
  25. package/resources/codex-and-agents-customizations/.agents/skills/quality-tiers/SKILL.md +0 -2
  26. package/resources/codex-and-agents-customizations/.agents/skills/research-issue/SKILL.md +4 -3
  27. package/resources/codex-and-agents-customizations/.agents/skills/self-explanatory-code-commenting/SKILL.md +0 -2
  28. package/resources/codex-and-agents-customizations/.agents/skills/tonality/SKILL.md +0 -2
  29. package/resources/codex-and-agents-customizations/.agents/skills/translate-claude-to-codex/SKILL.md +3 -3
  30. package/resources/codex-and-agents-customizations/.agents/skills/translate-copilot-to-claude/SKILL.md +1 -1
  31. package/resources/codex-and-agents-customizations/.agents/skills/typescript/SKILL.md +0 -2
  32. package/resources/codex-and-agents-customizations/.agents/skills/typescript-suppressions/SKILL.md +0 -2
  33. package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
  34. package/resources/config/orchestration-routing.json +1 -1
package/out/mcp-server.js CHANGED
@@ -17261,6 +17261,7 @@ function toMcpToolResult(result) {
17261
17261
  ...result.bundledSourcePath === void 0 ? {} : { bundled_source_path: result.bundledSourcePath },
17262
17262
  ...result.destinationPath === void 0 ? {} : { destination_path: result.destinationPath },
17263
17263
  ...result.renderedTree === void 0 ? {} : { rendered_tree: result.renderedTree },
17264
+ ...result.targetRepository === void 0 ? {} : { target_repository: result.targetRepository },
17264
17265
  ...result.warnings === void 0 ? {} : { warnings: result.warnings }
17265
17266
  };
17266
17267
  }
@@ -23470,6 +23471,9 @@ function validateModelReceipt(feature, prefix, delegation, expectedExecutionCont
23470
23471
  }
23471
23472
  return errors;
23472
23473
  }
23474
+ function featureCarriesLaunchPath(feature) {
23475
+ return "launch_receipt_path" in feature || "launch_status_path" in feature;
23476
+ }
23473
23477
  function validateLaunchBindings(features, context) {
23474
23478
  const errors = [];
23475
23479
  const seenBranches = /* @__PURE__ */ new Set();
@@ -23481,6 +23485,9 @@ function validateLaunchBindings(features, context) {
23481
23485
  if (context.skipNotStarted && item["merge_status"] === "not_started") {
23482
23486
  return;
23483
23487
  }
23488
+ if (context.requireLaunchPaths && !featureCarriesLaunchPath(item)) {
23489
+ return;
23490
+ }
23484
23491
  const prefix = context.planner ? `Epic planner checkpoint features[${index}] launch binding` : featurePrefix(item);
23485
23492
  errors.push(...validateBranchAndPaths(item, prefix, seenBranches));
23486
23493
  const delegation = validateDelegationReceipt(
@@ -23506,7 +23513,8 @@ function validateEpicPlannerChildLaunchBindings(features) {
23506
23513
  expectedExecutionContext: "epic_preparation_child",
23507
23514
  planner: true,
23508
23515
  requireGeneratedOrchestrator: true,
23509
- skipNotStarted: false
23516
+ skipNotStarted: false,
23517
+ requireLaunchPaths: false
23510
23518
  });
23511
23519
  }
23512
23520
  function validateEpicChildLaunchBindings(state, options = {}) {
@@ -23521,7 +23529,8 @@ function validateEpicChildLaunchBindings(state, options = {}) {
23521
23529
  expectedExecutionContext: "epic_execution_child",
23522
23530
  planner: false,
23523
23531
  requireGeneratedOrchestrator: false,
23524
- skipNotStarted: options.requireComplete !== true
23532
+ skipNotStarted: options.requireComplete !== true,
23533
+ requireLaunchPaths: options.requireCodexModelRouting !== true && options.requireCodexTopology !== true
23525
23534
  });
23526
23535
  }
23527
23536
 
@@ -31715,12 +31724,17 @@ function splitCombinedOutput(combined) {
31715
31724
  var RealGhClient = class {
31716
31725
  ghPath;
31717
31726
  runner;
31727
+ repo;
31718
31728
  /**
31719
31729
  * Construct a client, resolving and validating the `gh` executable.
31720
31730
  *
31721
31731
  * @param options Optional injected `runner` (defaults to
31722
- * {@link SpawnSyncGhCommandRunner}) and `ghPathLookup` (defaults to
31723
- * {@link defaultGhPathLookup}) so tests never touch the real PATH.
31732
+ * {@link SpawnSyncGhCommandRunner}), `ghPathLookup` (defaults to
31733
+ * {@link defaultGhPathLookup}) so tests never touch the real PATH, and
31734
+ * `repo` — an explicit `owner/name` target repository. When `repo` is
31735
+ * supplied, every repository-scoped invocation names it explicitly so the
31736
+ * process working directory cannot influence repository selection; when it
31737
+ * is omitted the argument vectors are unchanged.
31724
31738
  * @throws Error With {@link GH_NOT_FOUND_MESSAGE} when `gh` cannot be resolved.
31725
31739
  */
31726
31740
  constructor(options) {
@@ -31731,6 +31745,16 @@ var RealGhClient = class {
31731
31745
  }
31732
31746
  this.ghPath = resolved;
31733
31747
  this.runner = options?.runner ?? new SpawnSyncGhCommandRunner();
31748
+ this.repo = options?.repo;
31749
+ }
31750
+ /**
31751
+ * Repository selector fragment spliced after the subcommand words.
31752
+ *
31753
+ * @returns `["--repo", "<owner/name>"]` when bound, otherwise an empty vector
31754
+ * so an unbound client keeps its pre-change argument vectors exactly.
31755
+ */
31756
+ repoSelector() {
31757
+ return this.repo === void 0 ? [] : ["--repo", this.repo];
31734
31758
  }
31735
31759
  /**
31736
31760
  * Run a `gh` invocation and build a {@link GhResult} from combined output.
@@ -31763,6 +31787,7 @@ var RealGhClient = class {
31763
31787
  const args = [
31764
31788
  "issue",
31765
31789
  "create",
31790
+ ...this.repoSelector(),
31766
31791
  "--title",
31767
31792
  title,
31768
31793
  "--body-file",
@@ -31782,6 +31807,7 @@ var RealGhClient = class {
31782
31807
  const args = [
31783
31808
  "label",
31784
31809
  "create",
31810
+ ...this.repoSelector(),
31785
31811
  label,
31786
31812
  "--color",
31787
31813
  FEATURE_LABEL_COLOR,
@@ -31800,6 +31826,7 @@ var RealGhClient = class {
31800
31826
  const args = [
31801
31827
  "issue",
31802
31828
  "view",
31829
+ ...this.repoSelector(),
31803
31830
  issueNumber,
31804
31831
  "--json",
31805
31832
  "number,title,url,author,updatedAt"
@@ -32233,6 +32260,78 @@ function promotePotential(options) {
32233
32260
  return { exitCode: 0, messages, destination: destPath };
32234
32261
  }
32235
32262
 
32263
+ // ../../extensions/drm-copilot/src/lib/potential-to-issue/repo-slug.ts
32264
+ var REPO_SLUG_UNRESOLVED_PREFIX = "Unable to resolve the target repository from workspace root";
32265
+ var REPO_VIEW_ARGS = [
32266
+ "repo",
32267
+ "view",
32268
+ "--json",
32269
+ "nameWithOwner"
32270
+ ];
32271
+ var NAME_WITH_OWNER_FIELD = "nameWithOwner";
32272
+ function defaultGhProgramName() {
32273
+ return "gh";
32274
+ }
32275
+ function unresolved(workspaceRoot, reason) {
32276
+ return new Error(
32277
+ `${REPO_SLUG_UNRESOLVED_PREFIX} ${workspaceRoot}: ${reason}`
32278
+ );
32279
+ }
32280
+ function extractSlug(stdout, workspaceRoot) {
32281
+ let payload;
32282
+ try {
32283
+ payload = JSON.parse(stdout);
32284
+ } catch (error2) {
32285
+ throw unresolved(
32286
+ workspaceRoot,
32287
+ `the resolution command produced unparseable output (${String(error2)})`
32288
+ );
32289
+ }
32290
+ if (typeof payload !== "object" || payload === null) {
32291
+ throw unresolved(
32292
+ workspaceRoot,
32293
+ "the resolution output is parseable but is not an object"
32294
+ );
32295
+ }
32296
+ if (!(NAME_WITH_OWNER_FIELD in payload)) {
32297
+ throw unresolved(
32298
+ workspaceRoot,
32299
+ `the resolution output carries no ${NAME_WITH_OWNER_FIELD} field`
32300
+ );
32301
+ }
32302
+ const slug = payload[NAME_WITH_OWNER_FIELD];
32303
+ if (typeof slug !== "string") {
32304
+ throw unresolved(
32305
+ workspaceRoot,
32306
+ `the ${NAME_WITH_OWNER_FIELD} field is not a string`
32307
+ );
32308
+ }
32309
+ return slug;
32310
+ }
32311
+ function resolveRepoSlug(input) {
32312
+ const { runner, workspaceRoot } = input;
32313
+ const ghPath = (input.ghPathLookup ?? defaultGhProgramName)();
32314
+ const result = runner.run([ghPath, ...REPO_VIEW_ARGS], {
32315
+ cwd: workspaceRoot,
32316
+ allowError: true
32317
+ });
32318
+ if (result.code !== 0) {
32319
+ const detail = result.stderr.trim();
32320
+ throw unresolved(
32321
+ workspaceRoot,
32322
+ `the resolution command exited ${String(result.code)}${detail === "" ? "" : `: ${detail}`}`
32323
+ );
32324
+ }
32325
+ const stdout = result.stdout.trim();
32326
+ if (stdout === "") {
32327
+ throw unresolved(
32328
+ workspaceRoot,
32329
+ "the resolution command produced empty output"
32330
+ );
32331
+ }
32332
+ return extractSlug(stdout, workspaceRoot);
32333
+ }
32334
+
32236
32335
  // ../../extensions/drm-copilot/src/lib/potential-to-issue/potential-to-issue-service-call.ts
32237
32336
  var CommandRunnerGhAdapter = class {
32238
32337
  constructor(runner) {
@@ -32257,7 +32356,12 @@ var CommandRunnerGhAdapter = class {
32257
32356
  }
32258
32357
  };
32259
32358
  function potentialToIssueServiceCall(input) {
32260
- const ghClient = input.gh ?? new RealGhClient({ runner: new CommandRunnerGhAdapter(input.runner) });
32359
+ const resolveSlug = input.repoSlugResolver ?? ((workspaceRoot) => resolveRepoSlug({ runner: input.runner, workspaceRoot }));
32360
+ const targetRepository = resolveSlug(input.workspaceRoot);
32361
+ const ghClient = input.gh ?? new RealGhClient({
32362
+ runner: new CommandRunnerGhAdapter(input.runner),
32363
+ repo: targetRepository
32364
+ });
32261
32365
  const fileSystem = input.fileSystem ?? new RealPotentialFileSystem();
32262
32366
  const outcome = promotePotential({
32263
32367
  potentialPath: input.potentialPath,
@@ -32284,6 +32388,7 @@ ${outcome.messages.join("\n")}` : "";
32284
32388
  tool: "potential_to_issue",
32285
32389
  workspaceRoot: input.workspaceRoot,
32286
32390
  summary,
32391
+ targetRepository,
32287
32392
  ...outcome.destination === void 0 ? {} : { destinationPath: normalizeGeneratedPath(outcome.destination) },
32288
32393
  ...issueUrl === null ? {} : { artifacts: [issueUrl] }
32289
32394
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danmoisan/drm-copilot-mcp",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "Stdio MCP server exposing drm-copilot repo-automation tools.",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -82,6 +82,22 @@ These invariants apply only when a caller passes `require_model_routing=True` an
82
82
 
83
83
  The completion hook (`.claude/hooks/validate-orchestrator-output.ps1`) passes `--require-model-routing` alongside `--require-complete` and surfaces a gate failure as the `MODEL_ROUTING_BLOCKED:` block reason. The PreToolUse deterrent (`.claude/hooks/enforce-model-routing-receipt.ps1`) performs presence-only gating before a delegation. The MCP TypeScript surface performs the existence check only (delegated-agent set ⊆ routing-receipt-agent set); the Python validator remains authoritative for per-receipt correctness.
84
84
 
85
+ ## Epic Launch-Binding Activation Scope
86
+
87
+ This section governs when the epic child launch-binding gate runs. It exists because the gate admitted the generic `require_complete` flag into an otherwise Codex-specific activation set, which made Codex-only launch evidence a universal completion requirement (issue #524).
88
+
89
+ The evidence the gate demands — `launch_receipt_path`, `launch_status_path`, `delegation_receipt`, and `model_routing_receipt` on each feature — has exactly one production writer, `.codex/scripts/launch-epic-child-wave.ps1`, on the Codex runtime. No Claude-runtime producer writes it, so an epic executed on the Claude runtime could never satisfy an unconditional gate.
90
+
91
+ 1. **Unconditional under the two Codex enforcement flags.** When a caller passes `require_codex_model_routing` or `require_codex_topology`, launch-binding validation runs for every feature exactly as before, including the existing `skip_not_started` filter. Behaviour under either Codex flag is unchanged.
92
+
93
+ 2. **Key-gated per feature under `require_complete` alone.** When `require_complete` is the only flag passed, the gate validates a feature only when that feature carries `launch_receipt_path` or `launch_status_path`. A feature carrying neither key is skipped and contributes zero errors.
94
+
95
+ 3. **The presence test is deliberately either-key, so a partial binding still fails.** Presence means key membership, not value truthiness: a key present with an empty or null value still arms the gate. A feature carrying one launch path key and not the other is therefore validated, and the absent key produces its error. The test is never "both keys"; that spelling would let a half-written binding pass unexamined, and the partial-binding failure is the property that distinguishes this scope rule from deleting the gate.
96
+
97
+ The rest of the completion gate is unchanged. An epic whose feature is not merged, or whose `epic_merge_pr.merge_commit_sha` is missing or empty, still fails under `require_complete`.
98
+
99
+ Enforcement is validator logic plus this prose, never an imported JSON Schema. The activation scope lives in `scripts/dev_tools/_epic_orchestrator_state_launch_binding.py`, and the TypeScript parity port at `extensions/drm-copilot/src/lib/validate/epic-orchestrator-state-launch-binding.ts` reproduces it with byte-identical error strings. No schema file is authored, imported, or read for it.
100
+
85
101
  ## Enforcement
86
102
 
87
103
  - `scripts/dev_tools/validate_orchestrator_state.py` appends one error per violated invariant when a `remediation_loop` is present, using the existing validator message style (literal, checkpoint-context prefixed). The validator returns a list of error strings and does not mutate its input.
@@ -9,9 +9,8 @@
9
9
  "Bash(bash .claude/lib/bash/compute-concurrency-batches.sh*)",
10
10
  "Bash(bash .claude/lib/bash/validate-parallel-manifest.sh*)",
11
11
  "Read",
12
- "Edit(/docs/**)",
13
- "Write(/docs/**)",
14
- "Write(/artifacts/**)",
12
+ "Edit(docs/**)",
13
+ "Edit(artifacts/**)",
15
14
  "mcp__drm-copilot__run_poshqc_format",
16
15
  "mcp__drm-copilot__run_poshqc_analyze",
17
16
  "mcp__drm-copilot__run_poshqc_test",
@@ -64,17 +63,13 @@
64
63
  "Skill(execute-hard-lock *)",
65
64
  "Skill(identify-session-id *)",
66
65
  "Skill(show-my-agent-tree *)",
67
- "Skill(mermaid-diagram *)",
68
- "Edit(/.claude/skills/execute-hard-lock/**)",
69
- "Edit(/.claude/skills/feature-review-workflow/**)",
70
- "Edit(/.claude/skills/csharp-qa-gate/**)"
66
+ "Skill(mermaid-diagram *)"
71
67
  ],
72
68
  "deny": [
73
69
  "Read(./.env)",
74
70
  "Read(./.env.*)",
75
71
  "Read(./secrets/**)",
76
- "Edit(./secrets/**)",
77
- "Write(./secrets/**)"
72
+ "Edit(./secrets/**)"
78
73
  ],
79
74
  "additionalDirectories": [
80
75
  "c:\\Users\\DanMoisan\\repos\\drm-copilot\\.claude\\skills\\execute-hard-lock"
@@ -210,7 +210,7 @@
210
210
  },
211
211
  "model_budget": {
212
212
  "description": "Session-level model budget. fable_policy is a three-way switch controlling whether the fable tier is disabled (removed and clamped to opus), available (used as-is), or preferred (applies the preferred_overlay).",
213
- "fable_policy": "preferred"
213
+ "fable_policy": "available"
214
214
  },
215
215
  "codex_topology_policy": {
216
216
  "description": "Codex-native production-file-count routing. This axis selects the initial implementation topology independently from C1-C4 model selection.",
@@ -1,9 +1,6 @@
1
1
  ---
2
2
  name: architecture-boundaries
3
3
  description: Architecture boundary enforcement rules for the No-COM architecture.
4
- paths:
5
- - "**/*.ts"
6
- - "**/*.cs"
7
4
  ---
8
5
 
9
6
  # Converted rule
@@ -1,8 +1,5 @@
1
1
  ---
2
2
  name: csharp
3
- paths:
4
- - "**/*.cs"
5
- - "**/*.csproj"
6
3
  description: C#-specific toolchain and coding standards.
7
4
  ---
8
5
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: csharp-change-budget-router
3
- description: Budget-first routing contract for C# work: estimate production-file scope, choose small vs large path, enforce orchestration-first routing for larger changes, and use the VS Code extension command surface for promotion lifecycle steps when available.
3
+ description: 'Budget-first routing contract for C# work: estimate production-file scope, choose small vs large path, enforce orchestration-first routing for larger changes, and use the VS Code extension command surface for promotion lifecycle steps when available.'
4
4
  ---
5
5
 
6
6
  # C# Change Budget Router
@@ -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 -> MSTest toolchain, compares against a captured baseline, enforces zero-regression deltas, and produces the required reporting block before the agent declares the change complete.
3
+ description: Final QA gate for C# changes. Runs CSharpier, .NET analyzers, nullable analysis, and MSTest; compares a captured baseline, enforces zero-regression deltas, and produces the required reporting block before completion.
4
4
  ---
5
5
 
6
6
  # C# QA Gate
@@ -161,7 +161,7 @@ As each preparation finishes:
161
161
  3. Backfill `issue_num` and `feature_folder` in `epic.md`.
162
162
  4. Record `preparation_status: "prepared"`, `research_path`, `plan_path`,
163
163
  `preflight_evidence_path`, and `preflight_status: "PREFLIGHT: ALL CLEAR"` in the planner
164
- checkpoint. `research_path` must be under `artifacts/research/` or inside the feature folder.
164
+ checkpoint. `research_path` must be under `docs/features/<feature>/research/` inside the feature folder.
165
165
  Each child references its immutable receipt and the shared `wave.<wave_id>.status.json` path.
166
166
  5. Remove the worktree only after its preparation branch is merged.
167
167
 
@@ -31,7 +31,8 @@ The following sub-paths under `artifacts/` are FORBIDDEN for evidence output:
31
31
 
32
32
  Allowed `artifacts/` sub-paths (non-evidence orchestration use only):
33
33
  - `artifacts/orchestration/`
34
- - `artifacts/research/`
34
+
35
+ Research output is not an `artifacts/` sub-path. Use `docs/features/<feature>/research/` for feature-associated research or `docs/research/` for one-off research.
35
36
 
36
37
  No delegation prompt, plan task, or upstream agent instruction may override this scheme. If a caller supplies a non-canonical path, the receiving agent MUST reject it, substitute the canonical path, and record `EVIDENCE_LOCATION_OVERRIDE_REJECTED: <supplied path> replaced with <canonical path>`.
37
38
 
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: general-code-change
3
3
  description: Cross-language code change policy for all files.
4
- paths:
5
- - "**"
6
4
  ---
7
5
 
8
6
  # Converted rule
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: general-unit-test
3
3
  description: Cross-language unit test policy for all files.
4
- paths:
5
- - "**"
6
4
  ---
7
5
 
8
6
  # Converted rule
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: invoke-csharp-engineer
3
- description: Invoke the csharp-typed-engineer worker to design, implement, and verify C# changes within typed repository boundaries. Applies CSharpier -> .NET Analyzers -> Nullable Analysis -> MSTest toolchain, the 1-3 production-file small-path budget, and zero-regression quality gates.
3
+ description: Invoke the csharp-typed-engineer worker to design, implement, and verify C# changes within typed repository boundaries. Applies CSharpier, .NET analyzers, nullable analysis, and MSTest with the one-to-three production-file small-path budget and zero-regression quality gates.
4
4
  ---
5
5
 
6
6
  # Implement C# Skill
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: invoke-powershell-engineer
3
- description: Invoke the powershell-typed-engineer worker to design, implement, and verify PowerShell changes within typed repository boundaries. Applies PoshQC format -> analyze -> test toolchain, the 1-2 production-file direct-mode budget, the 3-production + 3-test per-batch cap, and zero-regression quality gates.
3
+ description: Invoke the powershell-typed-engineer worker to design, implement, and verify PowerShell changes within typed repository boundaries. Applies PoshQC formatting, analysis, and testing with a one-to-two production-file direct-mode budget, a three-production plus three-test batch cap, and zero-regression quality gates.
4
4
  ---
5
5
 
6
6
  # Implement PowerShell Skill
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: invoke-python-engineer
3
- description: Invoke the python-typed-engineer worker to design, implement, and verify Python changes within typed repository boundaries. Applies Black -> Ruff -> Pyright -> Pytest toolchain, the 3-production + 3-test per-batch budget, and zero-regression quality gates.
3
+ description: Invoke the python-typed-engineer worker to design, implement, and verify Python changes within typed repository boundaries. Applies Black, Ruff, Pyright, and Pytest with a three-production plus three-test per-batch budget and zero-regression quality gates.
4
4
  ---
5
5
 
6
6
  # Implement Python Skill
@@ -284,7 +284,7 @@ After reading `artifacts/orchestration/orchestrator-state.json`, the main sessio
284
284
  - `atomic-executor` — executes approved plans task-by-task
285
285
  - `feature-reviewer` — produces policy, code, and feature audit artifacts by
286
286
  applying the `feature-review` workflow skill
287
- - `task-researcher` — performs deep research and writes findings to `artifacts/research/`
287
+ - `task-researcher` — performs deep research and writes findings to the applicable feature-associated `docs/features/<feature>/research/` or one-off `docs/research/` root
288
288
  - `prd-feature` — produces issue, specification, and user-story artifacts when required by the selected workflow
289
289
  - `staged-review` — reviews staged changes when a pre-commit review is required
290
290
  - `epic-review` — reviews epic-level artifacts when the work item is an epic
@@ -326,7 +326,6 @@ All evidence artifacts produced during orchestration MUST comply with the canoni
326
326
 
327
327
  Permitted `artifacts/`-rooted sub-paths (non-evidence orchestration use only):
328
328
  - `artifacts/orchestration/` — orchestrator state and checkpoints
329
- - `artifacts/research/` — research outputs from task-researcher
330
329
  - `artifacts/pr_context` — PR context artifacts
331
330
  - `artifacts/reviews/` — review staging artifacts
332
331
  - `artifacts/status/` — status update artifacts
@@ -334,6 +333,8 @@ Permitted `artifacts/`-rooted sub-paths (non-evidence orchestration use only):
334
333
  - `artifacts/pester/` — Pester coverage outputs
335
334
  - `artifacts/csharp/` — C# coverage outputs
336
335
 
336
+ Research outputs from `task-researcher` are written to `docs/features/<feature>/research/` for feature-associated work or `docs/research/` for one-off work.
337
+
337
338
  All other `artifacts/` sub-paths (e.g., `artifacts/baselines/`, `artifacts/qa/`, `artifacts/coverage/`, `artifacts/evidence/`) are FORBIDDEN for evidence output and will be blocked by the `enforce-evidence-locations.ps1` PreToolUse hook.
338
339
 
339
340
  ## Completion Requirements
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: policy-audit-template-usage
3
- description: 'Policy audit template usage and output requirements. Use when creating policy-audit.<timestamp>.md artifacts from the repo templates.'
3
+ description: Policy audit template usage and output requirements. Use when creating timestamped policy-audit artifacts from the repository templates.
4
4
  ---
5
5
 
6
6
  # Policy Audit Template Usage
@@ -1,9 +1,5 @@
1
1
  ---
2
2
  name: powershell
3
- paths:
4
- - "**/*.ps1"
5
- - "**/*.psm1"
6
- - "**/*.psd1"
7
3
  description: PowerShell-specific toolchain and coding standards.
8
4
  ---
9
5
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: powershell-change-budget-router
3
- description: Budget-first routing contract for PowerShell work: estimate production-file scope, choose small vs large path, enforce direct-mode escalation to orchestrator, and use the VS Code extension command surface for promotion lifecycle steps when available.
3
+ description: 'Budget-first routing contract for PowerShell work: estimate production-file scope, choose small vs large path, enforce direct-mode escalation to orchestrator, and use the VS Code extension command surface for promotion lifecycle steps when available.'
4
4
  ---
5
5
 
6
6
  # PowerShell Change Budget Router
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: powershell-qa-gate
3
- description: Final QA gate for PowerShell changes. Executes the full PoshQC format -> analyze -> test toolchain (with coverage where enforced), compares against a captured baseline, enforces zero-regression deltas, and produces the required reporting block before the agent declares the change complete.
3
+ description: Final QA gate for PowerShell changes. Runs PoshQC formatting, analysis, and testing with coverage where enforced; compares a captured baseline, enforces zero-regression deltas, and produces the required reporting block before completion.
4
4
  ---
5
5
 
6
6
  # PowerShell QA Gate
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  name: python
3
- paths:
4
- - "**/*.py"
5
3
  description: Python-specific toolchain and coding standards.
6
4
  ---
7
5
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: python-qa-gate
3
- description: Final QA gate for Python changes. Executes the full Black -> Ruff -> Pyright -> Pytest toolchain, compares against a captured baseline, enforces zero-regression deltas, and produces the required reporting block before the agent declares the change complete.
3
+ description: Final QA gate for Python changes. Runs Black, Ruff, Pyright, and Pytest; compares a captured baseline, enforces zero-regression deltas, and produces the required reporting block before completion.
4
4
  ---
5
5
 
6
6
  # Python QA Gate
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  name: python-suppressions
3
- paths:
4
- - "**/*.py"
5
3
  description: Python suppression policy for linting and type-checking exceptions.
6
4
  ---
7
5
 
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: quality-tiers
3
3
  description: Module rigor tier system and uniform coverage thresholds.
4
- paths:
5
- - "**"
6
4
  ---
7
5
 
8
6
  # Converted rule
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: research-issue
3
- description: Investigate the best implementation approach for a feature or bug by analyzing the codebase and external references, then writing structured findings to artifacts/research/.
3
+ description: Investigate the best implementation approach for a feature or bug by analyzing the codebase and external references, then writing structured findings to the applicable tracked research folder.
4
4
  ---
5
5
 
6
6
  # Research Issue Skill
@@ -17,9 +17,10 @@ Accept one or more feature documents as context:
17
17
 
18
18
  ## Output
19
19
 
20
- Create or update a single research file:
20
+ Create or update a single research file in the applicable tracked research root:
21
21
 
22
- - Path: `artifacts/research/<timestamp>-<short-name>-research.md`
22
+ - Feature-associated path: `docs/features/<feature>/research/<timestamp>-<short-name>-research.md`
23
+ - One-off path: `docs/research/<timestamp>-<short-name>-research.md`
23
24
  - Use the Task Researcher template from the repository exactly.
24
25
  - Place rejected-alternatives summaries inside `## Recommended Approach`, not as a separate top-level header.
25
26
 
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  name: self-explanatory-code-commenting
3
- paths:
4
- - "**/*.py"
5
3
  description: Intent-first docstring and commenting standards.
6
4
  ---
7
5
 
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  name: tonality
3
3
  description: Required communication tone policy for all files and responses.
4
- paths:
5
- - "**"
6
4
  ---
7
5
 
8
6
  # Converted rule
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: translate-claude-to-codex
3
- description: Translate the native Claude Code runtime (CLAUDE.md, .claude/rules/*.md, .claude/skills/<name>/SKILL.md, .claude/agents/*.md, .claude/hooks/*.ps1, .claude/settings.json) into the native Codex ecosystem (AGENTS.md, .codex/config.toml, .codex/agents/*.toml, .agents/skills/<name>/SKILL.md, .codex/hooks.json). Classify each Claude surface into its Codex-native equivalent, preserve mechanical enforceability of every hardening element, diff against existing Codex state, produce a translation plan with an enforceability-preservation ledger for user approval, then apply.
3
+ description: Translate the native Claude Code runtime, including Claude rules, skills, agents, hooks, and settings, into the native Codex ecosystem. Preserve mechanical enforceability, diff against existing Codex state, produce an approval plan with an enforceability ledger, then apply it.
4
4
  ---
5
5
 
6
6
  # Translate Claude to Codex
@@ -21,7 +21,7 @@ Use this skill when:
21
21
 
22
22
  ## Authoritative Inputs
23
23
 
24
- This skill consumes the Codex ecosystem mapping recorded in `artifacts/research/codex-native-ecosystem.2026-06-16T13-32.md`. That artifact is the source of truth for Codex primitive behavior, discovery order, and enforceability. Do not restate Codex documentation from memory; cite the research artifact.
24
+ This skill consumes the Codex ecosystem mapping recorded in `docs/research/20260616-codex-native-ecosystem.2026-06-16T13-32.md`. That artifact is the source of truth for Codex primitive behavior, discovery order, and enforceability. Do not restate Codex documentation from memory; cite the research artifact.
25
25
 
26
26
  Required source paths under `.claude/` (one or more). Accepted types:
27
27
 
@@ -172,7 +172,7 @@ Plan structure:
172
172
 
173
173
  Generated: <timestamp>
174
174
  Mode: <plan-only | apply>
175
- Research basis: artifacts/research/codex-native-ecosystem.2026-06-16T13-32.md
175
+ Research basis: docs/research/20260616-codex-native-ecosystem.2026-06-16T13-32.md
176
176
 
177
177
  ## Inputs
178
178
  - <source path 1>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: translate-copilot-to-claude
3
- description: Translate one or more GitHub Copilot native files (AGENTS.md, .agents/skills/*.instructions.md, .codex/agents/*.agent.md, .agents/skills/*.prompt.md, .agents/skills/<name>/SKILL.md) into the native Claude runtime. Classify each section into agent/rule/skill/hook surfaces, diff against existing .claude/ state, produce a translation plan for user approval, and then apply the plan.
3
+ description: Translate GitHub Copilot native files, including instructions, agents, prompts, and skills, into the native Claude runtime. Classify each section, diff against existing Claude state, produce a translation plan for approval, then apply it.
4
4
  ---
5
5
 
6
6
  # Translate Copilot to Claude
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  name: typescript
3
- paths:
4
- - "**/*.ts"
5
3
  description: TypeScript-specific toolchain and coding standards.
6
4
  ---
7
5
 
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  name: typescript-suppressions
3
- paths:
4
- - "**/*.ts"
5
3
  description: TypeScript suppression policy for linting and type-checking exceptions.
6
4
  ---
7
5
 
@@ -2,7 +2,7 @@ default_permissions = ":danger-full-access"
2
2
 
3
3
  [mcp_servers.drm-copilot]
4
4
  command = "npx"
5
- args = ["-y", "@danmoisan/drm-copilot-mcp@1.1.1"]
5
+ args = ["-y", "@danmoisan/drm-copilot-mcp@1.1.3"]
6
6
  required = true
7
7
  enabled_tools = [
8
8
  "collect_commit_context",
@@ -210,7 +210,7 @@
210
210
  },
211
211
  "model_budget": {
212
212
  "description": "Session-level model budget. fable_policy is a three-way switch controlling whether the fable tier is disabled (removed and clamped to opus), available (used as-is), or preferred (applies the preferred_overlay).",
213
- "fable_policy": "preferred"
213
+ "fable_policy": "available"
214
214
  },
215
215
  "codex_topology_policy": {
216
216
  "description": "Codex-native production-file-count routing. This axis selects the initial implementation topology independently from C1-C4 model selection.",