Skip to content

feat(testing)!: retire map-features and refresh-feature-map for /app-control:map - #10033

Merged
kyle-sexton merged 7 commits into
mainfrom
feat/9585-retire-feature-map
Oct 25, 2026
Merged

kyle-sexton merged 7 commits into
mainfrom
feat/9585-retire-feature-map

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

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.md and the feature_map_dir key are retired. /testing:run-e2e reads the app's control skill as its feature map. Testing takes a major bump; its fragment carries the migration note (D9).

Fix

  • Deleted plugins/testing/skills/map-features/, plugins/testing/skills/refresh-feature-map/, plugins/testing/reference/feature-map.md, and the evals feature-map-maintainer-confines-edits and feature-map-writer-refuses-unsafe-location. Their ports already exist as plugins/app-control/evals/map-maintainer-confines-edits and map-writer-refuses-unsafe-location.
  • feature_map_dir is gone from the schema, from resolve-config.sh e2e (along with its refusal function), and from the setup.sh keep-list (setup apply now drops a leftover line). adapter-load.awk still skips the key, so a leftover line never stops a test scan. cant-fail-scan.test.sh keeps 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 ## Ready replaces the doctor, the driving tool replaces the recorded driver, and Attended runs only. replaces chrome attended-only. The per-entry-point report line /verification:confirm relies 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 and context/e2e-config.md drop the key.
  • The run-e2e evals feature-map-01 to 05 now 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.
  • Testing README: two rows removed, the count goes from twelve to ten, and one line points at /app-control:map. Autonomy routines.md: feature-map-upkeep becomes control-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.
  • Fragments: testing major (with the migration note), autonomy patch.

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/**'):

docs/conventions/config-cascade/README.md:2
docs/conventions/invocation-mode/README.md:1
docs/skill-cheat-sheet.md:2
plugins/app-control/evals/map-legacy-flat-map-migrates/case.yaml:2
plugins/app-control/skills/map/reference/refresh.md:2
plugins/autonomy/reference/routines.md:1
plugins/testing/README.md:3
plugins/testing/evals/feature-map-maintainer-confines-edits/case.yaml:2
plugins/testing/evals/feature-map-writer-refuses-unsafe-location/case.yaml:2
plugins/testing/reference/feature-map.md:6
plugins/testing/schemas/testing.schema.json:2
plugins/testing/scripts/resolve-config.sh:5
plugins/testing/scripts/resolve-config.test.sh:33
plugins/testing/skills/audit/scripts/adapter-load.awk:2
plugins/testing/skills/audit/scripts/cant-fail-scan.test.sh:4
plugins/testing/skills/map-features/SKILL.md:8
plugins/testing/skills/map-features/evals/evals.json:23
plugins/testing/skills/refresh-feature-map/SKILL.md:12
plugins/testing/skills/refresh-feature-map/evals/evals.json:15
plugins/testing/skills/run-e2e/SKILL.md:5
plugins/testing/skills/run-e2e/context/e2e-config.md:8
plugins/testing/skills/run-e2e/evals/evals.json:3
plugins/testing/skills/setup/scripts/setup.sh:1
plugins/testing/skills/setup/scripts/setup.test.sh:2

Hits that remain after this change, all intended:

  • plugins/app-control/skills/map/reference/refresh.md:49,240 and plugins/app-control/evals/map-legacy-flat-map-migrates/case.yaml:5,30: the D9 conversion of maps a feature_map_dir pointed at.
  • plugins/testing/skills/run-e2e/SKILL.md:240 and run-e2e/evals/evals.json:395: the legacy-map warning reads a leftover feature_map_dir: line to name the path.
  • plugins/testing/skills/audit/scripts/adapter-load.awk and cant-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: proves setup apply drops 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.md exits 0.

  • resolve-config.test.sh: 177 checks passed. setup.test.sh: 68 passed. cant-fail-scan.test.sh: 1383 passed.

  • scripts/check-affected.sh --tests reported 13 passed and 1 skipped over 17 changed files, exit 0. It ran on the first commit; the second commit touches only evals.json and one awk comment.

  • check-changelog-fragments.sh --check and --check-required origin/main pass. generate-cheatsheet.mjs --check passes. check-evals-quality.sh on run-e2e's evals.json passes 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 sources globs; say how the hub's driving tool becomes the driver; setup names a dropped feature_map_dir value). The fourth, the stale references in docs/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.sh gained 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, which claude plugin eval does not run.

    • Runs: feature-map-01 to 05, 3 runs per case per side, 30 executors, all on opus, with no shell. Before is plugins/testing at the branch base 30d9e0d, which differs from origin/main only in lib/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.
    • Grading: each reply was graded by a blind fresh-context grader that was not told which side produced it. Cases 01 to 04 used one shared set of expectations on both sides: the final, post-commit-2 expectations, with the vocabulary mapped (Ready or doctor, hub or index). The before side's 01 and 02 prompts got the same facts commit 2 added, phrased as doctor. Case 05 tests a replaced behavior, so each side was graded on its own expectations: before checks that the refused feature_map_dir falls back to the default; after checks the legacy-map warning.
    Case Before % After %
    feature-map-01 Ready/doctor before first drive 100 100
    feature-map-02 Ready/doctor after failed step 100 100
    feature-map-03 every entry point of touched feature 100 83.3
    feature-map-04 recorded driver wins over e2e_driver 100 100
    feature-map-05 (before: refused dir; after: legacy warning) 100 100

    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 known instead of not 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_dir line:

  • testing.schema.json has additionalProperties: false. A leftover line now fails schema validation in an editor, but it never stops a test scan.
  • /testing:setup apply drops the line when it rewrites docs/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

  • Plan: Phase 8 (A5), decisions D8, D9, D17, D20. Ports landed in Phases 4 and 6.
  • poteto's B1 rebases onto this PR (D17).

🤖 Generated with Claude Code

kyle-sexton and others added 4 commits October 25, 2026 11:04
…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>
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 25, 2026 15:39
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-25T15:41:06.441974Z 5326768 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 2db666854223a6c7ae320fd1f6caa618902c21c8: 0 finding(s), 0 as inline comments.

Incremental security review of docs/upstream/cursor-pstack.md since 3017a43.

The only change is in one table row, the create-verification-skill / maintain-verification-skill / principle-prove-it-works row. It repoints two line-number citations: testing:run-e2e from SKILL.md:204-215 to :220-236, and verification:confirm from SKILL.md:163 to :166. This is documentation prose only. It deletes no standing instruction, guardrail, hook or allowlist, and it touches no manifest, trusted path, workflow or code. I did not check whether the new line numbers match the cited files, because that is a documentation-accuracy question rather than a security one.

No security issues found.

critical-findings: 0

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 2db666854223a6c7ae320fd1f6caa618902c21c8: 0 finding(s), 0 as inline comments.

Incremental review of docs/upstream/cursor-pstack.md (changes since 3017a43). The only change is in the create-verification-skill row. It repoints two citations: plugins/testing/skills/run-e2e/SKILL.md:204-215 becomes :220-236, and plugins/verification/skills/confirm/SKILL.md:163 becomes :166.

I checked both against the head files. run-e2e/SKILL.md lines 222–236 hold the control-skill/feature-map section, including the "drives every entry point" step (228) and the one-line-per-entry-point report (235–236), so the range 220–236 covers the claim. confirm/SKILL.md:166 is the line that holds the verdict below CONFIRMED when an entry point is missing from the report. No findings.

There is no manifest change, no closing-issue criteria affected, and no cost or security hold.

@kyle-sexton

Copy link
Copy Markdown
Member Author

Reply to the claude-review finding on 53267681f:

# Finding Classification Evidence
1 #9585's "Done when" asks for an empty consumer rg, and that rg still matches VALID, not a code defect: the criterion contradicts the issue's other bullets. Left for a maintainer to settle. The remaining hits are the D9 handling the issue and plan ask for. The run-e2e legacy warning, the setup.sh drop note and the adapter-load.awk skip all need the key name. refresh.md and its eval convert a legacy map. The invocation-mode row is a dated grade record. Each hit is listed with its reason in this PR's body under "Hits that remain after this change".

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>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on 3017a43f637b6703ec1ec7c862dffd564935f4e4; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread docs/upstream/cursor-pstack.md Outdated
…ck record

Refs: #9585

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(testing): retire map-features and refresh-feature-map for /app-control:map

1 participant