Skip to content

feat(testing): make run-e2e consume affected and write e2e-summary.json #11388

Description

@kyle-sexton

Parent

Refs #8651. Evidence-verification plan: Brief and acceptance criteria at #11364 (comment); Design and Plan comments are on #11364.

Depends on

Outcome

/testing:run-e2e takes its touched features from /app-control:drive affected, falls back with a stated line when app-control is absent, and writes e2e-summary.json in unattended mode.

Demo: run /skill-quality:check validate-evals run-e2e; the drive-route, app-control-absent and nothing-affected cases pass.

Plan (phase S2a)

Satisfies: AC2, AC3, AC4, AC5
Size Medium. Depends on: S1 (#11384). Plugin: testing. Design: Module layout (testing), Contracts C4.

  • plugins/testing/skills/run-e2e/SKILL.md: Step 1 detects a control skill via affected; Step 2 Entry points and Step 4 touched features call /app-control:drive affected when it resolves (remove the glob parsing at plugins/testing/skills/run-e2e/SKILL.md:118-121 and :193-196); fallback line when app-control is absent; app=/base= arguments passed to drive with --unattended and --trusted-root; write e2e-summary.json, scanned with drive's literal values and patterns before it joins the publishable set.
  • Evals: drive route with affected stub output; app-control absent → touched features not matched (app-control not installed); unattended with nothing affected → capture: not-applicable.
  • Sanity Check: grep -n "sources. globs" plugins/testing/skills/run-e2e/SKILL.md returns no matching-logic line; /skill-quality:check run-e2e PASS; /skill-quality:check validate-evals run-e2e PASS.
  • Run budget: at most 2 runs per eval case, 1 rerun after a fix; stop on the first usage-limit error.

Design excerpt

  • testing / run-e2e: calls affected instead of parsing control skills; takes app=/base=;
    passes --unattended --trusted-root through; writes e2e-summary.json.
components:
  schemas:
    AffectedJson:            # C1, written by /app-control:drive affected
      type: object
      required: [app, control_skill, source, base, head, features, unmatched_files]
      properties:
        app: {type: string}
        control_skill: {type: [string, "null"]}      # full name + source, as report.json
        source: {enum: [project, plugin, none]}
        trusted_root: {type: [string, "null"]}
        base: {type: string}
        head: {type: string}
        features:
          type: array
          items:
            type: object
            required: [id, title, entry_points, matched_files]
            properties:
              id: {type: string}                     # features/<id>/README.md
              title: {type: string}
              entry_points:
                type: array
                items: {type: object, properties: {text: {type: string}, driven: {type: boolean}, reason: {type: [string, "null"]}}}
              matched_files: {type: array, items: {type: string}}
        unmatched_files: {type: array, items: {type: string}}
        note: {type: [string, "null"]}               # e.g. "No control skill: nothing matched"
    E2eSummary:              # C4, run-e2e unattended output read by the pr-verify judge
      type: object
      required: [route, app, capture, entry_points, publishable]
      properties:
        route: {type: string}                        # "drive" | "own driving (<reason>)"
        app: {type: [string, "null"]}
        affected: {type: array, items: {type: string}}
        capture:
          type: object
          required: [status]
          properties:
            status: {enum: [ran, skipped, blocked, not-applicable]}
            reason: {type: [string, "null"]}
            count: {type: integer}
        entry_points:
          type: array
          items: {type: string}                      # "<feature> | <entry point> | passed|failed|not driven (<reason>)"
        publishable: {type: array, items: {type: string}}
  • /testing:run-e2e unattended app=<app> base=<ref> [scenario] → e2e-summary.json.

Acceptance criteria

Brief criteria this slice satisfies:

  • AC2: The same chain (confirm → run-e2e → drive) runs attended locally and unattended in CI.
  • AC3: Diff-to-feature matching lives only in app-control; confirm and run-e2e call it instead of parsing control skills.
  • AC4: With the app's control skill not installed, drive falls back to the generic recipe and the report says so; nothing errors.
  • AC5: If a capture cannot run (blocked, or no usable driver), the verdict records why and does not fail the PR.

Done when:

  • Sanity Check passes: grep -n "sources. globs" plugins/testing/skills/run-e2e/SKILL.md returns no matching-logic line; /skill-quality:check run-e2e PASS; /skill-quality:check validate-evals run-e2e PASS.
  • The two glob-parsing copies in run-e2e are removed (dead-code removal is folded into this slice)
  • e2e-summary.json is scanned with drive's literal values and patterns before it joins the publishable set
  • The plugin's version and CHANGELOG are bumped per the repository's release convention
  • ci-status is green on the PR head

🤖 Generated with Claude Code

https://claude.ai/code/session_01UJUn7KoThXoYQoxfvdCVi7

Activity

  1. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    on Oct 30, 2026
  2. github-actions commented on Oct 30, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: the remaining work on run-e2e is the publishable scan that the earlier change deferred. The recorded decision replaces the body's scan criterion with the four items below.

    Decision recorded.

    #11421 delivered the affected route, the fallback line, the glob removal and the CHANGELOG entry (plugins/testing/CHANGELOG.md:10). What is left is the scan it deferred: plugins/testing/skills/run-e2e/SKILL.md:268-271 scans with literal values "drive's reports give", but #11419 landed drive holding those values in memory and writing none to any file, so publishable can only stay []. This record replaces the body's criterion "e2e-summary.json is scanned with drive's literal values and patterns before it joins the publishable set" with the two scan lines below. Agents decided this on evidence under standing direction §1.

    Done when

    • plugins/testing/skills/run-e2e/SKILL.md takes publishable from the publishable list in each drive run's report.json, in place of a scan with values the reports never hold.
    • e2e-summary.json is scanned before it joins the publishable set, with the same sources /app-control:drive's "Mask post-check" uses: the hub's ## Mask values: and the generic credential pattern, cited by the skill name, never by path. A hit or an unresolved value source keeps it out.
    • A run-e2e eval case covers a scan hit keeping e2e-summary.json out of publishable, case affected-01 in plugins/testing/skills/run-e2e/evals/evals.json no longer gives "no values or patterns were given to scan it with" as the reason, and plugins/skill-quality/scripts/check-evals-quality.sh passes for run-e2e.
    • A .changes/testing/ fragment exists and scripts/check-changelog-fragments.sh --check passes.

    #11388 (comment)

    This decision settles the open questions. No duplicates found.

    Automated triage, applied by the lanes App.

  3. melodic-automation-lanes commented on Oct 30, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: merged pull request #11421 names it with Refs: after its newest decision or refinement comment, so its work may already be done: close the issue if it is, or post a comment whose first line is **Decision recorded.** saying what is left, which sends it back through intake. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  4. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  5. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  6. melodic-automation-lanes commented on Oct 31, 2026

    @melodic-automation-lanes
    Contributor

    The lanes App's pull request #11421 merged with Refs:, so this issue stays open and nothing starts the lane on it again. work-unblock removed status: ready and agent-ready, so the hourly triage sweep sends it back to intake triage. Admission then parks it at status: confirmed for a check of what that pull request left, until a **Decision recorded.** comment says what is left or someone closes it.

  7. removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 31, 2026
  8. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  9. 4 remaining items

  10. kyle-sexton commented on Oct 31, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded.

    #11421 delivered the affected route, the fallback line, the glob removal and the CHANGELOG entry (plugins/testing/CHANGELOG.md:10). What is left is the scan it deferred: plugins/testing/skills/run-e2e/SKILL.md:268-271 scans with literal values "drive's reports give", but #11419 landed drive holding those values in memory and writing none to any file, so publishable can only stay []. This record replaces the body's criterion "e2e-summary.json is scanned with drive's literal values and patterns before it joins the publishable set" with the two scan lines below. Agents decided this on evidence under standing direction §1.

    Done when

    • plugins/testing/skills/run-e2e/SKILL.md takes publishable from the publishable list in each drive run's report.json, in place of a scan with values the reports never hold.
    • e2e-summary.json is scanned before it joins the publishable set, with the same sources /app-control:drive's "Mask post-check" uses: the hub's ## Mask values: and the generic credential pattern, cited by the skill name, never by path. A hit or an unresolved value source keeps it out.
    • A run-e2e eval case covers a scan hit keeping e2e-summary.json out of publishable, case affected-01 in plugins/testing/skills/run-e2e/evals/evals.json no longer gives "no values or patterns were given to scan it with" as the reason, and plugins/skill-quality/scripts/check-evals-quality.sh passes for run-e2e.
    • A .changes/testing/ fragment exists and scripts/check-changelog-fragments.sh --check passes.
  11. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 31, 2026
  12. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Oct 31, 2026
  13. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  14. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  15. melodic-automation-lanes commented on Oct 31, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue run that agent-ready started failed or was cancelled before it reported, or it stopped or the token broker refused it because its workflow files differ from main's. work-unblock removed and added agent-ready back to start a fresh run on main's workflow files. If this run ends the same way, it re-fires the issue again, waiting longer each time.

  16. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 31, 2026
  17. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions