Skip to content

Photoshoot: hands_on and on_model with an optional Identity - #52

Merged
wilsonhj merged 5 commits into
mainfrom
claude/photoshoot-identity-modes
Nov 4, 2026
Merged

wilsonhj merged 5 commits into
mainfrom
claude/photoshoot-identity-modes

Conversation

@wilsonhj

@wilsonhj wilsonhj commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Closes #49.

Adds the hands_on and on_model Product Shoot modes. Each uses an Identity only when one is selected and never requires one.

One commit per step from the issue:

  1. Modes (lib/enhancer/modes.ts): hands_on defaults to 4:5 and on_model to 3:4. Both have identityK: 3 and productRef: "cutout". A new person field (additive on ModeTemplate) fills the {person} prompt slot. With an Identity it reads "the person from images 2-4". Without one, hands_on describes hands with at most part of a face, and on_model describes an archetype model.
  2. Pipeline (lib/photoshoot/pipeline.ts): plan resolves bestRefs(identityId, identityK) and binds the results to Klein image_2..4. The cutout stays in image_1. prepareGraph drops any slot that isn't used. An unknown Identity gives 404 on identityId. An Identity with no consent record, or refs that won't upload, gives 400 on identityId. Both are refused before any job is sent, and the run never quietly falls back to no Identity. When no Identity is selected the run goes ahead with no error and no notice. The "Identity ignored" notice now appears only for modes with identityK: 0.
  3. UI (photoshoot-studio.tsx): the SoulLibrary picker shows only for these two modes, with "No identity" as the default. A recovered run restores the selection.
  4. Tests
    • Unit: plan with and without an Identity for each new mode, the prompt variants, and the notice rules.
    • tests/photoshoot/identity.test.ts runs through the runner on the mock. It checks that the submitted Klein jobs carry the cutout plus the Identity's three ref asset ids, in order, and only the cutout when no Identity is selected. It also covers the 404 and 400 cases, where nothing is submitted.
    • E2E: hands_on and on_model complete with no Identity, and the picker is hidden for packshot. A new identity.spec.ts test seeds a consented Identity into the e2e store and checks that its cached ref asset ids are bound as images 2-4.
    • To let that test write to the store, playwright.config.ts now keeps the throwaway data dir in E2E_DATA_DIR, so test workers share it.
    • The S-R1 test stays fixme: it still needs a face set and Motion identities. Its notes are updated.
  5. Docs: in photoshoot.md §7, the "not built yet" note is gone and the slot table now matches the binding (cutout at node 54, refs at 60/61/62). README, ARCHITECTURE, the demo script and the testing strategy now say seven modes.

Not done: the spec says to append the Identity's style card to the prompt. That isn't built yet, and §7 says so.

Checks (local)

  • pnpm lint, pnpm typecheck: clean
  • pnpm test: 451 pass, 0 fail
  • pnpm test:e2e (mock): 43 pass, 0 fail, 8 skipped

🤖 Generated with Claude Code

wilsonhj and others added 5 commits November 3, 2026 00:06
Both default to 4:5 / 3:4, take identityK 3 refs and the product cutout.
Their prompts name 'the person from images 2-4' when an Identity is
selected, else describe hands or an archetype model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…49)

plan resolves bestRefs(identityId, identityK) and binds them to Klein
image_2..4 after the cutout. An unknown Identity is a 404 on identityId and
one without consent a 400; no Identity never errors. The 'Identity ignored'
notice stays only for modes with identityK 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shown only for modes with identityK > 0; 'No identity' is the default.
A recovered run restores the selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
playwright.config.ts keeps the throwaway data dir in E2E_DATA_DIR so test
workers see the same store; identity.spec.ts seeds a consented Identity
there and checks its refs are bound as images 2-4. S-R1 stays fixme (it
still needs a face set and Motion identities).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
photoshoot.md §7 no longer says Identity is not built, and its slot table
matches the binding (cutout image_1 = node 54, refs image_2..4 = 60/61/62).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 3, 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-11-03T08:17:07.861447Z 82e0198 PR opened
ℹ️ 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.

@wilsonhj
wilsonhj merged commit 439dc0d into main Nov 4, 2026
2 checks passed
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.

Photoshoot: use a selected Identity in hands_on / on_model modes

1 participant