Repository navigation
feat(testing)!: retire map-features and refresh-feature-map for /app-control:map - #10033
Conversation
…control:map /app-control:map now owns the control skill contract, so testing's two feature-map skills, reference/feature-map.md and the feature_map_dir key are removed. /testing:run-e2e reads the app's control skill as its feature map (Ready, driving tool, Attended runs only.) and keeps the per-entry-point report line; a legacy testing-format map draws a warning naming /app-control:map refresh <path>. The scan still skips a leftover feature_map_dir line. The feature-map-upkeep routine becomes control-skill-upkeep. Closes #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Feature-map cases 01 and 02 now state Ready's result, so the expectations grade an outcome rather than a condition; case 05 checks the refresh command is named, not run. The adapter-load comment no longer says nothing reads feature_map_dir: run-e2e's legacy warning does. Refs: #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ment run-e2e maps changed files through the index's sources globs, says how the hub's driving tool becomes the driver, and also stops an unattended run on a hub naming a driver that runs the person's signed-in browser. setup apply now names a dropped feature_map_dir value with the conversion command, stripping control bytes from it. Refs: #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-security-review reviewed Incremental security review of The only change is in one table row, the No security issues found. critical-findings: 0 |
|
claude-review reviewed Incremental review of I checked both against the head files. There is no manifest change, no closing-issue criteria affected, and no cost or security hold. |
|
Reply to the claude-review finding on
No change is pushed for this, since none of the hits can be removed without dropping a required behavior. The disposition goes to the orchestrator: amend #9585's criterion to an allow-list of these hits, or accept the deviation on the issue. |
…tack record The create- and maintain-verification-skill credits move to /app-control:map, and the dead links to the deleted testing skills go. Refs: #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stack record Refs: #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ck record Refs: #9585 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #9585
Summary
Phase 8 (A5) of the app-control plan.
/app-control:map(create, check, refresh) now owns the control skill contract, so testing's/testing:map-features,/testing:refresh-feature-map,reference/feature-map.mdand thefeature_map_dirkey are retired./testing:run-e2ereads the app's control skill as its feature map. Testing takes a major bump; its fragment carries the migration note (D9).Fix
plugins/testing/skills/map-features/,plugins/testing/skills/refresh-feature-map/,plugins/testing/reference/feature-map.md, and the evalsfeature-map-maintainer-confines-editsandfeature-map-writer-refuses-unsafe-location. Their ports already exist asplugins/app-control/evals/map-maintainer-confines-editsandmap-writer-refuses-unsafe-location.feature_map_diris gone from the schema, fromresolve-config.sh e2e(along with its refusal function), and from thesetup.shkeep-list (setup applynow drops a leftover line).adapter-load.awkstill skips the key, so a leftover line never stops a test scan.cant-fail-scan.test.shkeeps its two cases proving that.run-e2e: "Feature map" finds the control skill at.claude/skills/control-<app>/and cites/app-control:map. The hub's## Readyreplaces the doctor, the driving tool replaces the recorded driver, andAttended runs only.replaceschromeattended-only. The per-entry-point report line/verification:confirmrelies on is byte-identical. When a legacy testing-format map is present, the run warns, names/app-control:map refresh <path>and continues. The step 2 key list andcontext/e2e-config.mddrop the key.feature-map-01to05now target the control skill. 05 now covers the legacy warning instead of the removed refusal. 01 and 02 now state Ready's result, so their expectations grade an outcome./app-control:map. Autonomyroutines.md:feature-map-upkeepbecomescontrol-skill-upkeep, running/app-control:map refresh. Docs: config-cascade rows repointed, the invocation-mode grade row marked retired, and the skill cheat sheet regenerated.Step 1 consumers on origin/main (
git grep -c -E 'map-features|refresh-feature-map|feature_map_dir|feature-map\.md' origin/main -- plugins docs .github ':!**/CHANGELOG.md' ':!docs/upstream/**'):Hits that remain after this change, all intended:
plugins/app-control/skills/map/reference/refresh.md:49,240andplugins/app-control/evals/map-legacy-flat-map-migrates/case.yaml:5,30: the D9 conversion of maps afeature_map_dirpointed at.plugins/testing/skills/run-e2e/SKILL.md:240andrun-e2e/evals/evals.json:395: the legacy-map warning reads a leftoverfeature_map_dir:line to name the path.plugins/testing/skills/audit/scripts/adapter-load.awkandcant-fail-scan.test.sh: the scan still skips a leftover line.plugins/testing/scripts/resolve-config.test.sh:490-502: proves a leftover line resolves nothing and warns nothing.plugins/testing/skills/setup/scripts/setup.test.sh:262-264: provessetup applydrops the line.docs/conventions/invocation-mode/README.md:357: the dated grade record, now marked retired.Verification
Phase 8 sanity check:
test -d plugins/app-control/skills/map && test ! -e plugins/testing/skills/map-features && test ! -e plugins/testing/skills/refresh-feature-map && test ! -e plugins/testing/reference/feature-map.mdexits 0.resolve-config.test.sh: 177 checks passed.setup.test.sh: 68 passed.cant-fail-scan.test.sh: 1383 passed.scripts/check-affected.sh --testsreported 13 passed and 1 skipped over 17 changed files, exit 0. It ran on the first commit; the second commit touches onlyevals.jsonand one awk comment.check-changelog-fragments.sh --checkand--check-required origin/mainpass.generate-cheatsheet.mjs --checkpasses.check-evals-quality.shon run-e2e'sevals.jsonpasses with no warnings.Ready-step reviews of the merged head, run locally because neither CI review lane is present. Code review: four findings, three fixed in 5326768 (map changed files through the index
sourcesglobs; say how the hub's driving tool becomes the driver; setup names a droppedfeature_map_dirvalue). The fourth, the stale references indocs/upstream/cursor-pstack.md, is outside this PR's scope and goes back to the orchestrator. Security review: two low findings, both fixed in 5326768 (setup strips control bytes from that value; run-e2e also stops an unattended run when the hub names a driver that runs the person's signed-in browser).setup.test.shgained cases that fail before the fix and pass after (72 checks).Two fresh-context reviews of the repointed run-e2e eval cases against
/testing:test-value. The second, on the final text, graded all five PASS.Run-e2e eval non-inferiority, using the Phase 6 method (#9934 comment). These cases are skill-creator
evals.json, whichclaude plugin evaldoes not run.plugins/testingat the branch base 30d9e0d, which differs from origin/main only inlib/prerequisites.mjs. After is 512430a. Run order was shuffled, and the runs went in two waves because of the session's limit of 20 concurrent subagents.feature_map_dirfalls back to the default; after checks the legacy-map warning.The suite mean is 100 before and 96.67 after. That is within the 5-point margin in skill-criteria step 6, and no case dropped by a third, so the change is non-inferior. The one miss was an after-side run of 03 whose report lines used the status
not knowninstead ofnot driven (<reason>). The five other runs of 03, three of them on the before side, used the contract's words. The report-line text is byte-identical on both sides, so the miss points to executor variance under the benchmark's "result not known" instruction rather than to this change.Known migration notes for a leftover
feature_map_dirline:testing.schema.jsonhasadditionalProperties: false. A leftover line now fails schema validation in an editor, but it never stops a test scan./testing:setup applydrops the line when it rewritesdocs/conventions/testing.yaml, and names the dropped value with/app-control:map refresh <path>on stderr, with control bytes stripped. After that, run-e2e can no longer name a legacy map at a non-default path; it still detects.claude/skills/feature-map/. Convert first.Related
🤖 Generated with Claude Code