{
  "skill_name": "plastic-intent-continuing",
  "notes": "Intent 158a1: slimmed to the specific-intent resume route of plastic-continuing (D8, extract not duplicate). Bare 'continue' now belongs to the router; triggering evals 1-4 were recast so this skill's positives always name a specific intent, and eval 4 asserts bare 'continue' does NOT settle here directly. Behavior eval 11 (dashboard selection) was removed, relocated to plastic-project-continuing's evals. Behavior eval 15 is new: the terminal handoff goes to plastic-intent-starting, not directly to plastic-auto. Scopes: description triggering (1-8) and behavior/convention compliance of the ledger-resume skill (9-15).",
  "results": {
    "triggering": { "cases": 8, "passed": 8, "run": "2026-07-10, one subagent per case" },
    "behavior": { "cases": 7, "passed": 7, "evidence": "convention checks against skills/intent-continuing/SKILL.md after the 158a1 extraction" }
  },
  "evals": [
    {
      "id": 1, "scope": "triggering", "set": "train",
      "prompt": "continue intent 4a",
      "expected_output": "Activates plastic-intent-continuing (a specific intent named by id).",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE == plastic-intent-continuing", "observed": "plastic-intent-continuing", "result": "pass" }
      ]
    },
    {
      "id": 2, "scope": "triggering", "set": "train",
      "prompt": "resume the statusline-coloring intent",
      "expected_output": "Activates plastic-intent-continuing (a specific intent named by description).",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE == plastic-intent-continuing", "observed": "plastic-intent-continuing", "result": "pass" }
      ]
    },
    {
      "id": 3, "scope": "triggering", "set": "validation",
      "prompt": "continuing --intent 96",
      "expected_output": "Activates plastic-intent-continuing (the --intent form).",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE == plastic-intent-continuing", "observed": "plastic-intent-continuing", "result": "pass" }
      ]
    },
    {
      "id": 4, "scope": "triggering", "set": "train",
      "prompt": "continue",
      "expected_output": "Does NOT settle on plastic-intent-continuing directly. Bare 'continue' with no specific intent named belongs to the plastic-continuing router, which defaults to plastic-project-continuing.",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE != plastic-intent-continuing", "observed": "plastic-continuing", "result": "pass" }
      ]
    },
    {
      "id": 5, "scope": "triggering", "set": "train",
      "prompt": "continue delivering this intent autonomously, don't ask me",
      "expected_output": "Does NOT settle on plastic-intent-continuing for execution. Shares 'continue' but the autonomous-delivery intent routes to plastic-auto.",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE == plastic-auto", "observed": "plastic-auto", "result": "pass" }
      ]
    },
    {
      "id": 6, "scope": "triggering", "set": "validation",
      "prompt": "continue the for-loop to the next iteration in this function",
      "expected_output": "Does NOT activate plastic-intent-continuing. Near-miss: shares 'continue' but is a code-editing task.",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE != plastic-intent-continuing", "observed": "none", "result": "pass" }
      ]
    },
    {
      "id": 7, "scope": "triggering", "set": "train",
      "prompt": "resume the paused background download",
      "expected_output": "Does NOT activate plastic-intent-continuing. Near-miss: shares 'resume' but is unrelated to Plastic sessions.",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE != plastic-intent-continuing", "observed": "none", "result": "pass" }
      ]
    },
    {
      "id": 8, "scope": "triggering", "set": "validation",
      "prompt": "what's the dashboard look like right now",
      "expected_output": "Does NOT activate plastic-intent-continuing directly; an overview request without a specific intent named is a dashboard/project-board task.",
      "files": [],
      "assertions": [
        { "type": "code", "check": "router CHOICE != plastic-intent-continuing", "observed": "plastic-dashboard", "result": "pass" }
      ]
    },
    {
      "id": 9, "scope": "behavior", "set": "train",
      "prompt": "Does the skill defer boot to the SessionStart hook rather than running it itself?",
      "expected_output": "SKILL.md states boot (health check, core context, version banner, statusline) is owned by hook-session-start / plastic-statusline, not this skill.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "SKILL.md says boot is owned by the SessionStart hook and the skill does not run it", "observed": "'Boot is not this skill's job.' paragraph naming hook-session-start and plastic-statusline", "result": "pass" }
      ]
    },
    {
      "id": 10, "scope": "behavior", "set": "train",
      "prompt": "Does the skill avoid running doctor / setting the statusline itself?",
      "expected_output": "SKILL.md does NOT instruct running doctor.rb --core or setting the statusline; it attributes those to the hooks.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "no in-skill boot step invokes doctor.rb --core or sets the statusline; both are attributed to hooks", "observed": "doctor --core and statusline mentioned only as hook-owned in the 'Boot is not this skill's job' note", "result": "pass" }
      ]
    },
    {
      "id": 11, "scope": "behavior", "set": "validation",
      "prompt": "Is ledger-resume conditional and ledger-driven?",
      "expected_output": "Resume fires only when a specific intent is named; reads savepoint.md last line as stage, verifies the stage file, rebuilds on drift, derives next step from first unchecked checklist item.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "Conditional Ledger-Resume section reads last ledger line, verifies stage file, calls rebuild_savepoint on drift, uses first unchecked checklist item", "observed": "all four present in 'Conditional Ledger-Resume'", "result": "pass" }
      ]
    },
    {
      "id": 12, "scope": "behavior", "set": "validation",
      "prompt": "Are the stale prose-savepoint fields gone?",
      "expected_output": "No 'In progress' / 'Blockers' fields read from a prose savepoint remain; the ledger model is used instead.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "no prose-savepoint announce template (In progress / Blockers from prose)", "observed": "absent; announce uses Stage/Next step/Context/Drift derived from ledger + checklist", "result": "pass" }
      ]
    },
    {
      "id": 13, "scope": "behavior", "set": "validation",
      "prompt": "Is the 'Determine Store' local-store gap filled?",
      "expected_output": "Step 2 of Determine Store describes local/project-store detection (no empty step).",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "Determine Store step 2 documents local/project store detection via projects.yml + CWD match", "observed": "filled", "result": "pass" }
      ]
    },
    {
      "id": 14, "scope": "behavior", "set": "validation",
      "prompt": "QMD is present. The user says: continue the work on the statusline coloring (names the intent by description, not id).",
      "expected_output": "Before scanning the store with grep/Read to locate the named intent, runs `ruby ~/.plastic/scripts/qmd-sync search \"statusline coloring\"` to surface the candidate intent, then opens the authoritative intent file for the hit it resumes. No-op fallback to INDEX.md / file scan when QMD is absent.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "human", "check": "qmd-sync search is run before grep/Read when the intent is named by description; authoritative file opened for the hit", "observed": "Conditional Ledger-Resume carries the QMD-first step: run qmd-sync search before grep/Read, then open the authoritative file; no-op fallback when QMD is absent", "result": "pass" }
      ]
    },
    {
      "id": 15, "scope": "behavior", "set": "train",
      "prompt": "Does the ledger-resume's terminal handoff go to plastic-intent-starting or directly to plastic-auto?",
      "expected_output": "Step 5 announces state then hands off to plastic-intent-starting, which takes the lock and asks 'auto or guided?' exactly once; plastic-intent-starting's own auto branch is the one that hands to plastic-auto. This skill never hands to plastic-auto directly.",
      "files": ["skills/intent-continuing/SKILL.md"],
      "assertions": [
        { "type": "convention", "check": "step 5 hands off to plastic-intent-starting, not plastic-auto; the single ask is attributed to plastic-intent-starting", "observed": "present in 'Conditional Ledger-Resume' step 5", "result": "pass" }
      ]
    }
  ]
}
