Repository navigation
PRO-3005: (2/2) local interviews with an in-session UMUX questionnaire - #19
Merged
mrprkr merged 1 commit intoNov 6, 2026
Merged
Conversation
An interview guide in .stuntdouble/interviews/<slug>.json (sections of questions and tasks, usability_scale umux by default) is answered in character in the person's own agent session through four new tools: start_interview, answer_item, rate_usability and finish_interview. Each session is written to interview-runs/<id>/interview.json, out of runs/, with only the ratings stored; the score comes from the cloud's own UMUX code, vendored at src/vendor/usability/. The viewer serves sessions at /api/interview-runs, and open_ui lists the latest. LocalSession now holds a checklist run or an interview, sharing the browser launch, step records, stop and interrupted marking. Part of PRO-3005. Signed-off-by: Claude <noreply@anthropic.com>
4 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes PRO-3005. This is the top of a two-PR stack:
activity.jsonl(targetsmain)This follows the decisions agreed for PRO-3005.
Input.
.stuntdouble/interviews/<slug>.jsonholdsname,actor,url,research_brief,usability_scale(defaultumux, as on the web),sectionsandbrowser_config. Each section has atitle, an optionalintroanditems; an item is aquestionor atask, with apromptand an optionalexpected_evidence. The file is validated strictly, and every field error is named.Tools. Four new tools; the browser tools are shared with checklist runs:
start_interview: opens Chrome, returns the brief and the first item, and supportsresume.answer_item: records the answer to the current item and returns the next one, or the statements after the last item.rate_usability: takes each statement exactly once by id, 1 to 7 with a reason, after the last item.finish_interview: always callable, it closes the browser and returns the score.The person's own agent answers in character, so nothing calls a model (
test/no-model.test.tsstill passes). The actor is never shownresearch_brief, since knowing what is being looked for would colour the answers.Scale.
umux,umux_liteornone.src/vendor/usability/usability.tsis a verbatim copy of the monorepo'spackages/platform/src/interviews/usability.tsat 9212f3a, andtest/usability-parity.test.tsruns that module's own 15 cases against the copy. Ratings are normalised the way the web reads stored rows. The statements name the product from the interview's own URL, never thelocalhostrebase.Output.
interview-runs/<stamp>-<interview>/, notruns/, so older viewers never list it as unreadable.interview.json(stuntdouble.interview/1) holds the guide snapshot, the transcript and theusabilityratings in the web's stored shape. Only the ratings are stored; the score is worked out on reading.activity.jsonlandsteps/are as in PRO-3005: (1/2) record each browser step's page, waits and picture #18./api/interview-runs(summaries with the score) and/api/interview-runs/<id>, and/api/stopstops an interview too.open_uilists the latest interviews.Refactor.
LocalSession's active session is now a union of a checklist run and an interview. The browser launch (openBrowser) and folder naming (newRunDir) are shared, so trusted origins, the third-party guard, profiles, stop and interrupted marking work the same for both. Checklist tools are refused during an interview and the other way round, each with a clear message.Not in this PR
stuntdoubleskill and thestuntdouble-actoragent instunt-double/stuntdouble-mcpneed the four tools. That waits until the version that registers them is on npm, with the pin bump.Could not verify
dist/cli.js.a missing file says what exists, or how to make onetest fails in this container because it runs as root. It fails the same way onmainand passes in CI.Factory-Run: https://factory.stuntdouble.io/runs/01M6PZ03Y77PXA3Q4ME62QDAX3
Checklist
pnpm format:check,pnpm lint,pnpm type-check,pnpm testandpnpm buildpass locally (except the root-only test above)test/interview.test.ts, the e2e interview over MCP in headless Chrome, and the UMUX parity cases)pnpm changeset) if whatstuntdoubledoes changesgit commit -s), per the DCOGenerated by Claude Code