Skip to content

E2E certification: one complete user journey in a throwaway Claude config #36

Description

@jeremymanning

Every piece of the loop has been proven in isolation. Nothing has proven the loop.

Why this is still open

notes/OPEN-THREADS.md:343-351, under "Still wanted: end-to-end testing the way a user
meets it", already asks for it and says what is missing:

Partly addressed by edc2f60 ("Test the package as a user meets it, and fix what that
found") and by the live routing probes, but not finished; this is issue #10. The remaining
gap: install the package into a throwaway config directory, run real claude -p sessions
against it, and watch the state files, the ledger and the weekly queue while they run,
evaluating the outputs critically rather than checking exit codes. Never against the real
~/.claude.

Since that was written the package gained three tiers, a promotion path, a PreCompact arm
and a doctor, and the pieces were each measured on their own: tier 0 read back 3/3, tier 1
UserPromptSubmit 3/3 (#20, #21). What no run has produced is one candidate travelling the
whole way from capture to a recorded outcome.

The scenario

Eleven steps, in order, in a throwaway CLAUDE_CONFIG_DIR, never against the real
~/.claude:

  1. Fresh install into the throwaway config. skillforge doctor passes.
  2. An ordinary session runs against it and completes with no interference from any hook.
  3. A note is created with skillnote add, and a later session reads it back.
  4. A reminder fires on each of its three match kinds: a prompt keyword, a tool path, a
    command signature.
  5. A candidate is captured at Stop, and a second at PreCompact.
  6. That candidate is promoted with skillinsight promote.
  7. A narrow skill is forged from it, inside the target time.
  8. The skill routes in a fresh session, from a prompt that names neither the skill nor the
    package.
  9. The skill is applied to the original problem.
  10. The apply, use and verdict rows for it all appear in bin/skillreport.
  11. Uninstall restores the config: settings.json byte-identical apart from our own
    entries, the status line back to whatever it was, runtime state intact.

What makes this different from the tests

run_tests.sh runs each piece against a temp state root with a pinned clock. This runs the
installed package against a live CLI and reads the artifacts as a user would, which is what
found the two bin/skillnote bugs on #20 after every unit test was green.

Acceptance

  • A script under scripts/, so the run is repeatable rather than described.
  • Every step either passes with the artifact quoted, or fails with what it produced instead.
  • The run refuses to start against a CLAUDE_CONFIG_DIR that is the real one.
  • The result is recorded with the CLI version, since a routing reading is a reading at a
    moment and not a property.

Related: #10, #14, #15, and the reading #34 asks for at step 7.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions