Skip to content

feat: e2e product pipeline — scene→recommend→coach→overlay→export (Fixes #17) - #147

Open
laurentketterle-hub wants to merge 6 commits into
mergeos-bounties:masterfrom
laurentketterle-hub:feat/issue-17-e2e-product
Open

feat: e2e product pipeline — scene→recommend→coach→overlay→export (Fixes #17)#147
laurentketterle-hub wants to merge 6 commits into
mergeos-bounties:masterfrom
laurentketterle-hub:feat/issue-17-e2e-product

Conversation

@laurentketterle-hub

@laurentketterle-hub laurentketterle-hub commented Aug 1, 2026

Copy link
Copy Markdown

Summary

Implements the end-to-end product pipeline for PoseGuide: photo background ? pose coach ? overlay export.

Closes #17

What was done

New module: src/poseguide/guide/e2e.py

  • Single function run_e2e() chains: image ? scene tags ? pose list ? coach ? overlay ? export
  • Accepts comma-separated tags or preset names (beach, urban, studio, forest, office)
  • Generates timestamped run directory with summary.json, e2e.log, overlay JSONs, SVGs, and optional PNG overlays
  • Graceful fallback when vision extra is missing (checkerboard demo placeholder + JSON-only artifacts)
  • License-safe demo assets only (programmatic checkerboard image)

New CLI: poseguide e2e

poseguide e2e --tags beach,outdoor,portrait --top 3 --png
poseguide e2e --tags studio --image photo.jpg --no-png
poseguide e2e --tags beach --subject data/samples/subject_contrapposto.json

Tests: 7 tests, all pass

CI: ruff + pytest all green

Acceptance

  • Single CLI path (poseguide e2e)
  • License-safe demo assets (programmatic checkerboard, no downloaded images)
  • Evidence: logs (e2e.log) + overlay images (JSON + SVG + optional PNG)

@laurentketterle-hub

Copy link
Copy Markdown
Author

/attempt 17

@laurentketterle-hub

Copy link
Copy Markdown
Author

Friendly ping 👋 — this PR has been open for 3 days. Is there anything needed for review? Thanks!

laurentketterle-hub and others added 4 commits August 6, 2026 00:52
The e2e module's run_e2e function existed but had no typer CLI
command wrapper, causing
 Usage: poseguide e2e [OPTIONS]

 End-to-end product path: scene tags → pose list → coach → overlay.

┌─ Options ───────────────────────────────────────────────────────────────────┐
│ *  --tags     -t              <str>                  Comma-separated scene  │
│                                                      tags or preset name    │
│                                                      [required]             │
│    --image    -i              <file>                                        │
│    --top      -k              <int range>            [default: 3]           │
│                               [1<=x<=20]                                    │
│    --subject                  <file>                                        │
│    --png          --no-png                           Render PNG overlay     │
│                                                      [default: png]         │
│    --help                                            Show this message and  │
│                                                      exit.                  │
└─────────────────────────────────────────────────────────────────────────────┘ and {
  "kind": "poseguide.e2e.v1",
  "run_dir": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\e2e_..._20260806T135155Z",
  "tags": "...",
  "top_k": 3,
  "recommendations": [
    {
      "pose_id": "arms_crossed",
      "name": "Arms Crossed",
      "score": 0.175,
      "tag_overlap": [],
      "tips": [
        "Keep shoulders relaxed",
        "Chin slightly down for stronger jaw line"
      ],
      "camera_cues": [
        "chest-up or three-quarter body"
      ]
    },
    {
      "pose_id": "arms_crossed_power",
      "name": "Arms Crossed Power",
      "score": 0.175,
      "tag_overlap": [],
      "tips": [
        "Weight even; chin level; soft smile optional",
        "Cross arms loosely so shoulders stay relaxed"
      ],
      "camera_cues": [
        "three-quarter or front; eye-level; soft key"
      ]
    },
    {
      "pose_id": "arms_raised",
      "name": "Arms Raised Celebration",
      "score": 0.175,
      "tag_overlap": [],
      "tips": [
        "Reach tall through fingertips",
        "Soft knee bend for energy",
        "Chin slightly lifted, open chest"
      ],
      "camera_cues": [
        "full body",
        "slight low angle",
        "leave sky room above hands"
      ]
    }
  ],
  "coach": [
    {
      "pose_id": "arms_crossed",
      "name": "Arms Crossed",
      "score": 0.175,
      "coach": {
        "composition": {
          "pose_id": "arms_crossed",
          "name": "Arms Crossed",
          "rule": "thirds",
          "analysis": [
            {
              "joint": "nose",
              "xy": [
                0.5,
                0.12
              ],
              "nearest_third": [
                0.6666666666666666,
                0.3333333333333333
              ],
              "delta": [
                0.167,
                0.213
              ]
            },
            {
              "joint": "shoulders",
              "span": 0.16,
              "mid_x": 0.5
            },
            {
              "joint": "ankles",
              "ground_y": 0.9
            }
          ],
          "tips": [
            "Head in upper third — leave breathing room above crown.",
            "Feet near bottom edge — good grounded standing shot."
          ],
          "score_hint": 0.944
        },
        "svg": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\coach_arms_crossed.svg",
        "coach_mode": true
      }
    },
    {
      "pose_id": "arms_crossed_power",
      "name": "Arms Crossed Power",
      "score": 0.175,
      "coach": {
        "composition": {
          "pose_id": "arms_crossed_power",
          "name": "Arms Crossed Power",
          "rule": "thirds",
          "analysis": [
            {
              "joint": "nose",
              "xy": [
                0.5,
                0.18
              ],
              "nearest_third": [
                0.6666666666666666,
                0.3333333333333333
              ],
              "delta": [
                0.167,
                0.153
              ]
            },
            {
              "joint": "shoulders",
              "span": 0.24,
              "mid_x": 0.5
            },
            {
              "joint": "ankles",
              "ground_y": 0.92
            }
          ],
          "tips": [
            "Head in upper third — leave breathing room above crown.",
            "Feet near bottom edge — good grounded standing shot."
          ],
          "score_hint": 0.944
        },
        "svg": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\coach_arms_crossed_power.svg",
        "coach_mode": true
      }
    },
    {
      "pose_id": "arms_raised",
      "name": "Arms Raised Celebration",
      "score": 0.175,
      "coach": {
        "composition": {
          "pose_id": "arms_raised",
          "name": "Arms Raised Celebration",
          "rule": "thirds",
          "analysis": [
            {
              "joint": "nose",
              "xy": [
                0.5,
                0.2
              ],
              "nearest_third": [
                0.6666666666666666,
                0.3333333333333333
              ],
              "delta": [
                0.167,
                0.133
              ]
            },
            {
              "joint": "shoulders",
              "span": 0.24,
              "mid_x": 0.5
            },
            {
              "joint": "ankles",
              "ground_y": 0.9
            }
          ],
          "tips": [
            "Head in upper third — leave breathing room above crown.",
            "Feet near bottom edge — good grounded standing shot."
          ],
          "score_hint": 0.944
        },
        "svg": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\coach_arms_raised.svg",
        "coach_mode": true
      }
    }
  ],
  "artifacts": [
    {
      "pose_id": "arms_crossed",
      "name": "Arms Crossed",
      "overlay_json": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\e2e_..._20260806T135155Z\\overlay_arms_crossed.json"
    },
    {
      "pose_id": "arms_crossed_power",
      "name": "Arms Crossed Power",
      "overlay_json": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\e2e_..._20260806T135155Z\\overlay_arms_crossed_power.json"
    },
    {
      "pose_id": "arms_raised",
      "name": "Arms Raised Celebration",
      "overlay_json": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\e2e_..._20260806T135155Z\\overlay_arms_raised.json"
    }
  ],
  "log": "C:\\Users\\Maison\\AppData\\Local\\Temp\\PoseGuide\\data\\out\\e2e_..._20260806T135155Z\\e2e.log"
}
Done
C:\Users\Maison\AppData\Local\Temp\PoseGuide\data\out\e2e_..._20260806T135155Z
to fail with exit code 2. Added the @app.command('e2e') wrapper.
@laurentketterle-hub
laurentketterle-hub force-pushed the feat/issue-17-e2e-product branch from 115628b to dc93beb Compare August 7, 2026 01:19
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.

[200 MRG] End-to-end product path: photo background → pose coach → overlay export

2 participants