feat: add normal camera atlas maintenance tooling
This commit is contained in:
+285
-5
@@ -104,12 +104,12 @@ Current variant inventory:
|
||||
|
||||
| Metric | Count |
|
||||
| --- | ---: |
|
||||
| Curated variants | 86 |
|
||||
| Pre-A/B candidates | 35 |
|
||||
| Needs samples | 51 |
|
||||
| Curated variants | 131 |
|
||||
| Pre-A/B candidates | 55 |
|
||||
| Needs samples | 76 |
|
||||
| Hold | 0 |
|
||||
| Covered non-empty source folders | 76 |
|
||||
| Uncovered non-empty source folders | 25 |
|
||||
| Covered non-empty source folders | 101 |
|
||||
| Uncovered non-empty source folders | 0 |
|
||||
|
||||
Catalog review notes:
|
||||
|
||||
@@ -155,11 +155,291 @@ Catalog review notes:
|
||||
609, 608, 0011, 0006, and 0002_2 were split out as
|
||||
`normal_penis_worship_laying_partner_vertical_side_view`. These remain
|
||||
`needs_samples` until the folder is more fully sorted by camera orientation.
|
||||
- 2026-07-02 penis-worship residual review: generated review artifacts now
|
||||
preserve the foreground-close source-pool anchor plus the existing top,
|
||||
side, and laying-partner side-view anchors. The 29 unselected images remain
|
||||
mixed across foreground-heavy, front, and near-POV framing, so no additional
|
||||
references or prompt-ready subvariant were promoted.
|
||||
- 2026-07-02 reverse-cowgirl unused-pool tranche: the uncovered
|
||||
`reverse cowgirl` folder with 240 JPGs was added as
|
||||
`normal_reverse_cowgirl_mixed_camera_folder_pool`. It is a no-generation
|
||||
cue-expansion pool, not a prompt-ready route; selected-reference subvariants
|
||||
should be added only after paged contact-sheet evidence shows repeated
|
||||
non-POV camera geometry. The first promoted selected-reference splits are
|
||||
`normal_reverse_cowgirl_front_view`, a 12-image front-view subset,
|
||||
`normal_reverse_cowgirl_front_three_quarter`, a 12-image front-offset subset,
|
||||
and `normal_reverse_cowgirl_low_close_front_view`, a 12-image low-close
|
||||
front-view subset from the paged and residual contact-sheet review.
|
||||
- 2026-07-02 doggy all-fours rear three-quarter expansion: residual
|
||||
contact-sheet review of `doggy on all four - back view - 3-4 angle` expanded
|
||||
`normal_doggy_all_fours_back_three_quarter` from 3 to 15 reviewed references.
|
||||
The route key and prompt cues remain stable; low, front-drifting, and
|
||||
tight-crop outliers remain outside the selected subset.
|
||||
- 2026-07-02 doggy all-fours side-view residual review: residual contact-sheet
|
||||
review of `doggy on all four - side view` kept
|
||||
`normal_doggy_all_fours_side_view` at its existing 14 reviewed references.
|
||||
Remaining images mix standing, bed, chair, close, and front-drifting frames,
|
||||
so no additional references were promoted in this pass.
|
||||
- 2026-07-02 doggy all-fours front-view expansion: residual contact-sheet
|
||||
review of `doggy all four - front view` expanded
|
||||
`normal_doggy_all_fours_front_view` from 3 to 15 reviewed references. The
|
||||
selected subset keeps front-facing all-fours framing with face and forearms
|
||||
readable; side-drifting, seated, tight-close, and vertical-crop outliers
|
||||
remain outside the route.
|
||||
- 2026-07-02 doggy generic front-view expansion: residual contact-sheet review
|
||||
of the duplicate trailing-space `doggy - front view ` folder expanded
|
||||
`normal_doggy_generic_front_view` from 6 to 15 reviewed references. The route
|
||||
remains grouped with the non-trailing duplicate folder, and one weak top/down
|
||||
close crop remains outside the selected subset.
|
||||
- 2026-07-02 piledriver selected split: residual contact-sheet review of
|
||||
`piledriver` preserved `normal_piledriver_mixed_camera_folder_pool` as a
|
||||
`needs_samples` source pool and promoted
|
||||
`normal_piledriver_high_front_down_view` as a 15-image high/front-down
|
||||
selected-reference subvariant. Tight top crops, side drifts, and mixed
|
||||
examples remain outside the selected route.
|
||||
- 2026-07-02 blowjob laying front-view expansion: residual contact-sheet review
|
||||
of `blowjob - laying - front view` expanded
|
||||
`normal_blowjob_laying_front_view` from 3 to 15 reviewed references. The
|
||||
selected subset keeps front-facing laying oral-contact geometry; side-drifting,
|
||||
wide couch/bed, and weak close-crop examples remain outside the route.
|
||||
- 2026-07-02 breast-contact front-view expansion: residual contact-sheet review
|
||||
of `breast - touching - front view` expanded
|
||||
`normal_breast_contact_front_view` from 3 to 15 reviewed references. The
|
||||
selected subset keeps front-facing body-contact geometry while side-drifting,
|
||||
costume/standing outliers, and weak-contact crops remain outside the route.
|
||||
- 2026-07-02 reverse-congress front-view expansion: residual contact-sheet
|
||||
review of `reverse congress - front view` expanded
|
||||
`normal_reverse_congress_front_view` from 3 to 15 reviewed references. The
|
||||
selected subset keeps lifted/front-facing stacked-body geometry while tight
|
||||
low crops, side/bed drift, and seated-only outliers remain outside the route.
|
||||
- 2026-07-02 boobjob selected split: residual contact-sheet review of `boobjob`
|
||||
preserved `normal_boobjob_front_close_mixed_camera_folder_pool` as a
|
||||
`needs_samples` source pool and promoted
|
||||
`normal_boobjob_front_close_view` as a 12-image front-close
|
||||
selected-reference subvariant. Side, standing, foreground-heavy, and
|
||||
downward/crop-drifting outliers remain outside the route.
|
||||
- 2026-07-02 fingering selected split: contact-sheet review of `fingering`
|
||||
added `normal_fingering_mixed_camera_folder_pool` as a `needs_samples` source
|
||||
pool and promoted `normal_fingering_reclined_front_view` as a 10-image
|
||||
reclined front-view selected-reference subvariant. Upright chair, standing,
|
||||
side, and stronger oral-adjacent outliers remain outside the route.
|
||||
- 2026-07-02 wand selected split: contact-sheet review of `wand` added
|
||||
`normal_wand_mixed_camera_folder_pool` as a `needs_samples` source pool and
|
||||
promoted `normal_wand_front_close_view` as a 7-image front-close
|
||||
selected-reference subvariant. Side, portrait-close, and wider posture
|
||||
outliers remain outside the route.
|
||||
- 2026-07-02 ballsucking standing selected split: contact-sheet review of
|
||||
`ballsucking - standing` preserved
|
||||
`normal_ballsucking_standing_partner_mixed_camera_folder_pool` as a
|
||||
`needs_samples` source pool and promoted
|
||||
`normal_ballsucking_standing_low_side_view` as an 11-image low side/near-side
|
||||
selected-reference subvariant. The water-close outlier remains outside the
|
||||
route.
|
||||
- 2026-07-02 face-sitting source-pool review: contact-sheet review of
|
||||
`face sitting` added `normal_face_sitting_mixed_camera_folder_pool` as a
|
||||
4-image `needs_samples` source pool. Three front/near-front samples and one
|
||||
rear/back-view outlier are preserved as review evidence; no pre-A/B route was
|
||||
promoted.
|
||||
- 2026-07-02 pussy-licking back-view source-pool review: contact-sheet review
|
||||
of `pussy licking - backv iew` added
|
||||
`normal_pussy_licking_backview_mixed_camera_folder_pool` as a 3-image
|
||||
`needs_samples` source pool. The folder label is not promoted as prompt truth:
|
||||
samples read as elevated front or high-oblique third-person references, so no
|
||||
pre-A/B route was promoted.
|
||||
- 2026-07-02 removing-pants source-pool review: contact-sheet review of
|
||||
`removing pants` added `normal_removing_pants_mixed_camera_folder_pool` as a
|
||||
3-image `needs_samples` source pool. The samples are close, near-duplicate,
|
||||
and foreground-heavy, so they remain action evidence rather than a promoted
|
||||
camera route.
|
||||
- 2026-07-02 thin-folder source-pool batch: contact-sheet review added
|
||||
`normal_rimjob_mixed_camera_folder_pool`,
|
||||
`normal_footjob_mixed_camera_folder_pool`,
|
||||
`normal_reverse_cowgirl_leg_up_mixed_camera_folder_pool`,
|
||||
`normal_reverse_cowgirl_pretzel_mixed_camera_folder_pool`, and
|
||||
`normal_fist_mixed_camera_folder_pool` as `needs_samples` coverage pools.
|
||||
Each folder has only one to three samples, so no pre-A/B camera route was
|
||||
promoted.
|
||||
- 2026-07-02 final single-reference coverage batch: contact-sheet review added
|
||||
coverage-only `needs_samples` pools for the remaining 12 one-image folders,
|
||||
including thin anal, oral, doggy, face-sitting, handjob, and under-desk
|
||||
references. This brings all non-empty source folders into the reviewed
|
||||
variant catalog without promoting any single-image folder to pre-A/B.
|
||||
- 2026-07-02 covered mixed-pool artifact pass: review manifests/contact sheets
|
||||
were added for the already-cataloged `ballsucking - laying`, `pretzel`, and
|
||||
`woman ass exposed` source pools. `woman ass exposed` now carries all four
|
||||
folder images as `needs_samples` evidence; no pre-A/B route was promoted.
|
||||
- 2026-07-02 sixty-nine selected split: contact-sheet review of `69` added
|
||||
`normal_sixty_nine_mixed_camera_folder_pool` as a `needs_samples` source pool
|
||||
and promoted `normal_sixty_nine_front_close_view` as a 7-image front-close
|
||||
selected-reference subvariant. Side/downward, upright seated, and wider
|
||||
room-context outliers remain outside the route.
|
||||
- 2026-07-02 handjob standing side-view residual review: residual contact-sheet
|
||||
review of `handjob standing - side view` kept
|
||||
`normal_handjob_standing_side_profile` at its existing 7 reviewed references.
|
||||
Remaining images mix kneeling, seated, close portrait, near-front, and
|
||||
oral-adjacent frames, so no additional references were promoted in this pass.
|
||||
- 2026-07-02 breast-sucking side-view expansion: residual contact-sheet review
|
||||
of `breast sucking - side view` expanded
|
||||
`normal_breast_sucking_side_view` from 3 to 15 reviewed references. The
|
||||
route remains side/near-side rather than strict profile-only; front-only,
|
||||
hand-touch-only, and weak-contact examples remain outside the selected subset.
|
||||
- 2026-07-02 standing from-front side-view residual review: residual
|
||||
contact-sheet review of `fuck from front standing - side view` kept
|
||||
`normal_standing_from_front_side_view` at its existing 3 reviewed references.
|
||||
Remaining images include some usable side/near-side frames, but too many drift
|
||||
into suspended/lifted, close-crop, couch, or front-heavy framing for a safe
|
||||
reference expansion.
|
||||
- 2026-07-02 standing backside side-view residual review: residual contact-sheet
|
||||
review of `fuck from behind standing - woman backside - side view` kept
|
||||
`normal_doggy_standing_backside_side_view` at its existing 16 reviewed
|
||||
references and preserved the 3-image folder-pool anchor. Remaining images mix
|
||||
lifted, seated, bed/couch, front-drifting, and portrait-like frames, so no
|
||||
additional references or distinct subvariant were promoted.
|
||||
- 2026-07-02 generic doggy rear three-quarter expansion: residual contact-sheet
|
||||
review of `doggy - back view - 3-4 angle` expanded
|
||||
`normal_doggy_generic_back_three_quarter` from 3 to 15 reviewed references.
|
||||
The selected subset keeps back-offset normal-camera composition while
|
||||
low/close and laying-drift examples remain outside the route.
|
||||
- 2026-07-02 cowgirl side-view expansion: residual contact-sheet review of
|
||||
`cowgirl - side view` expanded `normal_cowgirl_side_profile` from 3 to 15
|
||||
reviewed references. The selected subset keeps lateral straddle composition
|
||||
while front-drifting, rear-drifting, and tight-crop examples remain outside
|
||||
the route.
|
||||
- 2026-07-02 anal-random unused-pool tranche: the uncovered `anal random`
|
||||
folder with 99 JPGs was added as
|
||||
`normal_anal_random_mixed_camera_folder_pool`. Paged contact-sheet review
|
||||
promoted `normal_anal_random_front_view` as an 11-image front-view
|
||||
selected-reference split; residual-pool review then promoted
|
||||
`normal_anal_random_back_side_offset_view` as a 12-image rear/side-offset
|
||||
split. It remains `needs_samples` for standing, overhead-like, tight-crop, and
|
||||
other mixed material.
|
||||
- 2026-07-02 breasts-exposed selected splits: paged contact-sheet review of the
|
||||
168-image `breasts exposed` source pool promoted
|
||||
`normal_display_breasts_exposed_front_view` and
|
||||
`normal_display_breasts_exposed_side_offset_view`; residual-pool review then
|
||||
promoted `normal_display_breasts_exposed_standing_front_view` as a 12-image
|
||||
upright standing front-view subset and
|
||||
`normal_display_breasts_exposed_seated_kneeling_front_view` as a 12-image
|
||||
seated/kneeling front-view subset. The mixed source pool remains
|
||||
`needs_samples` for close-crop, couple/action, side-drifting, and other
|
||||
display families.
|
||||
- 2026-07-02 front open-leg display selected splits: paged contact-sheet review
|
||||
of the 100-image `pussy spread` source pool promoted
|
||||
`normal_display_front_open_leg_front_view` and
|
||||
`normal_display_front_open_leg_low_close`; residual-pool review then promoted
|
||||
`normal_display_front_open_leg_side_offset_view` as a 12-image side-offset
|
||||
seated or reclined subset. The mixed source pool remains `needs_samples` for
|
||||
remaining front, low-close, and one-off crop/camera variants.
|
||||
- 2026-07-02 couple-kissing selected split: paged contact-sheet review of the
|
||||
88-image `couple kissing` source pool promoted
|
||||
`normal_couple_kissing_upright_side_profile` as a 12-image upright
|
||||
side-profile subset. Seated, bed, close-crop, and front-facing examples stay
|
||||
in the mixed source pool.
|
||||
- 2026-07-02 cowgirl back-three-quarter reference expansion: residual-pool
|
||||
review of the 129-image `cowgirl - back view - 3-4 angle` source folder kept
|
||||
the existing `normal_cowgirl_back_three_quarter` route and expanded it to 15
|
||||
selected references instead of creating a near-duplicate route.
|
||||
- 2026-07-02 rear-body display selected split: residual-pool review of the
|
||||
99-image `woman solo showing her hass - back view` source folder promoted
|
||||
`normal_display_rear_body_standing_back_view` as a 12-image upright standing
|
||||
back-view subset. The broad folder pool remains `needs_samples` for seated,
|
||||
kneeling, side-leaning, and close-crop rear examples.
|
||||
- 2026-07-02 maintenance phase: prep artifacts now include a dedicated
|
||||
validator, review indexes, per-image manifest annotations, explicit
|
||||
typo/spacing alias metadata, and a separate `needs_samples` acquisition list.
|
||||
These additions do not promote any new route and do not add generated
|
||||
evidence.
|
||||
|
||||
Do not add fixed-seed evidence, eval-log IDs, or generator-default decisions to
|
||||
this catalog until the normal-camera A/B workflow starts. Keep POV A/B notes in
|
||||
the existing POV files.
|
||||
|
||||
## No-Generation Prep Artifacts
|
||||
|
||||
Prepared dry-run artifacts live under `ab_batches/normal_camera/`:
|
||||
|
||||
- `normal_camera_priority_plan.json`: all 55 `pre_ab_candidate` variants in
|
||||
stable catalog order, with representative references and deferred counts for
|
||||
`needs_samples` and `hold`.
|
||||
- `normal_camera_prompt_cue_batch.json`: source prompt cues split into
|
||||
prompt-ready positive cues and blocked review-only cues. Option words,
|
||||
negative wording, contrast wording, and instruction-like cleanup text stay out
|
||||
of prompt-ready text.
|
||||
- `normal_camera_score_sheet.json`: blank later-generation scoring rows for the
|
||||
selected variants. Rows keep generator seed, sampling seed, image path, score,
|
||||
note, and decision slots empty until fixed-seed generation exists.
|
||||
- `normal_camera_acceptance_gates.md`: human-readable scoring gates for later
|
||||
A/B review.
|
||||
- `normal_camera_unused_pool_backlog.json`: larger remaining source folders
|
||||
ranked by unselected image count so future tranches can proceed beyond the
|
||||
first reverse-cowgirl unused-pool tranche. Rows include `folder_alias`
|
||||
metadata so typo and spacing fixes remain separate from exact source paths.
|
||||
- `normal_camera_needs_samples_acquisition.json` and
|
||||
`normal_camera_needs_samples_acquisition.md`: all 76 `needs_samples` variants
|
||||
sorted by missing reference count against a 12-reference target. This list is
|
||||
for reference acquisition and remains separate from the 55-item pre-A/B
|
||||
priority plan.
|
||||
- `review/index.html` and `review/index.md`: no-generation indexes linking all
|
||||
generated review manifests and contact sheets by source folder, canonical
|
||||
alias label, image count, selected-reference count, and residual count.
|
||||
- `review/reverse_cowgirl_review_manifest.json`: no-generation review manifest
|
||||
for all 240 JPGs in the uncovered `reverse cowgirl` folder, paged for contact
|
||||
sheet review. Review manifests now include `review_items` for every image:
|
||||
selected references are marked `selected_reference`; remaining images are
|
||||
marked `residual_unassigned` with a conservative exclusion reason until a
|
||||
human assigns a tighter bucket.
|
||||
- `review/reverse_cowgirl_contact_sheet.html`: local-image contact sheet for
|
||||
assigning review buckets before any selected-reference subvariant is promoted.
|
||||
- `review/breasts_exposed_review_manifest.json` and
|
||||
`review/breasts_exposed_contact_sheet.html`: no-generation review scaffold for
|
||||
the large mixed display source pool.
|
||||
- `review/pussy_spread_review_manifest.json` and
|
||||
`review/pussy_spread_contact_sheet.html`: no-generation review scaffold for
|
||||
the large mixed front-display source pool.
|
||||
- `review/anal_random_review_manifest.json` and
|
||||
`review/anal_random_contact_sheet.html`: no-generation review scaffold for
|
||||
the uncovered `anal random` source pool.
|
||||
- `review/couple_kissing_review_manifest.json` and
|
||||
`review/couple_kissing_contact_sheet.html`: no-generation review scaffold for
|
||||
the large mixed couple-contact source pool.
|
||||
- `review/cowgirl_back_view_3_4_angle_review_manifest.json` and
|
||||
`review/cowgirl_back_view_3_4_angle_contact_sheet.html`: no-generation review
|
||||
scaffold for the large rear three-quarter cowgirl source folder.
|
||||
- `review/woman_solo_showing_her_hass_back_view_review_manifest.json` and
|
||||
`review/woman_solo_showing_her_hass_back_view_contact_sheet.html`:
|
||||
no-generation review scaffold for the large rear-body display source folder.
|
||||
|
||||
Acceptance gates for later fixed-seed review:
|
||||
|
||||
- `camera_geometry`: camera angle, elevation, side/front/back orientation, and
|
||||
framing match the atlas family.
|
||||
- `pose_ownership`: the visible actors own the pose correctly, with no POV body
|
||||
cues leaking into normal-camera framing.
|
||||
- `workspace_continuity`: workspace or lounge details support the camera angle
|
||||
instead of fighting the pose.
|
||||
- `clothing_visibility`: clothing cues stay attached to the intended visible
|
||||
subject and only describe garments visible in the pose.
|
||||
- `subject_identity`: the same woman identity, face, hair, eyes, and body type
|
||||
remain stable across fixed-seed variants.
|
||||
- `body_proportion_control`: penis/body proportions and limb lengths stay
|
||||
plausible for the selected atlas framing.
|
||||
- `prompt_noise`: prompt text uses direct visual cues, with option, negative,
|
||||
and instruction-like wording removed from positive text.
|
||||
- `atlas_reference_match`: the generated frame can be matched back to the
|
||||
selected atlas references for the variant.
|
||||
|
||||
Regenerate these files without sending prompts or images:
|
||||
|
||||
```bash
|
||||
python -m normal_camera_atlas_prep --write-artifacts --output-dir ab_batches/normal_camera
|
||||
```
|
||||
|
||||
Validate the catalog and generated artifacts:
|
||||
|
||||
```bash
|
||||
python tools/normal_camera_atlas_validate.py --artifacts-dir ab_batches/normal_camera
|
||||
```
|
||||
|
||||
## Camera Geometry Notes
|
||||
|
||||
### Side View
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
# Normal Camera Atlas Maintenance Phases Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Add phased maintenance tooling around the no-generation normal-camera atlas: a dedicated validator, review index, richer per-image annotations, folder alias metadata, needs-samples acquisition output, schema checks, and docs/smoke handoff.
|
||||
|
||||
**Architecture:** Keep `normal_camera_atlas_prep.py` as the artifact builder and add `tools/normal_camera_atlas_validate.py` as the strict validation CLI. `tools/prompt_smoke.py` should delegate normal-camera artifact invariants to the validator instead of carrying every detail inline. Generated artifacts remain under `ab_batches/normal_camera/`.
|
||||
|
||||
**Tech Stack:** Python standard library, JSON catalogs, generated Markdown/HTML review artifacts, existing `tools/prompt_smoke.py` smoke runner.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Dedicated Validator
|
||||
|
||||
**Files:**
|
||||
- Create: `tools/normal_camera_atlas_validate.py`
|
||||
- Modify: `tools/prompt_smoke.py`
|
||||
|
||||
- [x] Add a validator module that imports `normal_camera_atlas_prep`, reads `categories/normal_camera_variants.json`, verifies catalog schema/counts, folder coverage, no-generation invariants, artifact existence, review manifests/contact sheets, selected-reference consistency, folder alias metadata, and optional JSON schema-style structural checks.
|
||||
- [x] Expose `validate_normal_camera_atlas(...) -> list[str]` and a CLI that exits `1` with one error per line when validation fails.
|
||||
- [x] Add a narrow prompt-smoke check that calls the validator instead of duplicating all normal-camera artifact details.
|
||||
- [x] Verify with `python tools/normal_camera_atlas_validate.py --artifacts-dir ab_batches/normal_camera`.
|
||||
|
||||
### Task 2: Review Index
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
- Generated: `ab_batches/normal_camera/review/index.html`
|
||||
- Generated: `ab_batches/normal_camera/review/index.md`
|
||||
|
||||
- [x] Add `build_review_index(...)` helpers that list every default review folder with source folder, canonical alias, image count, selected subvariant count, status summary, manifest path, and contact-sheet path.
|
||||
- [x] Write both HTML and Markdown indexes from `write_artifacts(...)`.
|
||||
- [x] Include no-generation language and local artifact links only.
|
||||
|
||||
### Task 3: Per-Image Review Annotations
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
|
||||
- [x] Add `review_items` to every review manifest.
|
||||
- [x] For selected references, mark `review_decision: selected_reference`, preserve `review_bucket`, `variant_key`, and include selection notes.
|
||||
- [x] For residual images, mark `review_decision: residual_unassigned`, `review_bucket: unassigned`, and include a conservative reason such as `outside_selected_subvariants_or_pending_manual_bucket`.
|
||||
- [x] Reflect these decisions in contact-sheet figure attributes/captions.
|
||||
|
||||
### Task 4: Folder Alias Metadata
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
- Modify: `tools/normal_camera_atlas_validate.py`
|
||||
|
||||
- [x] Add explicit alias metadata for typo/spacing variants while preserving exact source folder names.
|
||||
- [x] Include alias metadata in review manifests, unused-pool backlog rows, and review indexes.
|
||||
- [x] Validate that every known typo/spacing source folder keeps an alias record.
|
||||
|
||||
### Task 5: Needs-Samples Acquisition List
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
- Generated: `ab_batches/normal_camera/normal_camera_needs_samples_acquisition.json`
|
||||
- Generated: `ab_batches/normal_camera/normal_camera_needs_samples_acquisition.md`
|
||||
|
||||
- [x] Build a needs-samples acquisition list from `categories/normal_camera_variants.json`.
|
||||
- [x] Sort by missing sample count, then action family, then variant key.
|
||||
- [x] Keep it separate from the pre-A/B priority plan.
|
||||
|
||||
### Task 6: Docs And Verification
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/normal-camera-atlas.md`
|
||||
- Modify: `tools/prompt_smoke.py`
|
||||
|
||||
- [x] Document the validator, review index, alias metadata, per-image annotations, and acquisition list.
|
||||
- [x] Run `python normal_camera_atlas_prep.py --write-artifacts --output-dir ab_batches/normal_camera`.
|
||||
- [x] Run `python tools/normal_camera_atlas_validate.py --artifacts-dir ab_batches/normal_camera`.
|
||||
- [x] Run `python tools/prompt_smoke.py --case normal_camera_atlas_catalog --case normal_camera_atlas_prep_artifacts --case normal_camera_unused_pool_review_artifacts --quiet`.
|
||||
- [x] Run `python -m py_compile normal_camera_atlas_prep.py tools/normal_camera_atlas_validate.py tools/prompt_smoke.py`.
|
||||
@@ -0,0 +1,279 @@
|
||||
# Normal Camera Unused Pool Extension Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Extend the no-generation normal-camera atlas prep system across larger unused image pools, starting with the uncovered `reverse cowgirl` folder.
|
||||
|
||||
**Architecture:** Keep the folder inventory and curated variant catalog as the source of truth. Add read-only review/backlog builders to `normal_camera_atlas_prep.py`, write review artifacts under `ab_batches/normal_camera/`, then add selected catalog variants only when review evidence supports stable non-POV camera/pose families.
|
||||
|
||||
**Tech Stack:** Python standard library, Pillow for optional contact-sheet image output, existing JSON catalogs, existing `tools/prompt_smoke.py` smoke harness.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Add Unused-Pool Review Artifact Tests
|
||||
|
||||
**Files:**
|
||||
- Modify: `tools/prompt_smoke.py`
|
||||
- Test: `python tools/prompt_smoke.py --case normal_camera_unused_pool_review_artifacts --quiet`
|
||||
|
||||
- [ ] **Step 1: Add failing smoke coverage**
|
||||
|
||||
Add a smoke case that imports `normal_camera_atlas_prep`, calls `build_unused_pool_backlog(limit=5)`, `build_review_manifest("reverse cowgirl", page_size=40)`, and `build_contact_sheet_html("reverse cowgirl", page_size=40)`, then asserts:
|
||||
|
||||
```python
|
||||
backlog = prep_module.build_unused_pool_backlog(limit=5)
|
||||
_expect(backlog.get("schema") == "sxcp_normal_camera_unused_pool_backlog_v1", "Normal camera unused-pool backlog schema changed")
|
||||
_expect(backlog.get("no_generation") is True, "Normal camera unused-pool backlog must stay no-generation")
|
||||
_expect((backlog.get("folders") or [])[0].get("folder") == "reverse cowgirl", "Reverse cowgirl should be the first unused-pool tranche")
|
||||
|
||||
manifest = prep_module.build_review_manifest("reverse cowgirl", page_size=40)
|
||||
_expect(manifest.get("schema") == "sxcp_normal_camera_review_manifest_v1", "Normal camera review manifest schema changed")
|
||||
_expect(manifest.get("folder") == "reverse cowgirl", "Review manifest should target reverse cowgirl")
|
||||
_expect(manifest.get("image_count") == 240, "Reverse cowgirl review should cover all 240 JPGs")
|
||||
_expect(len(manifest.get("contact_sheet_pages") or []) == 6, "Reverse cowgirl review should be paged at 40 images per sheet")
|
||||
_expect("back_view" in manifest.get("review_bucket_values", {}), "Review buckets lost back-view routing")
|
||||
|
||||
html = prep_module.build_contact_sheet_html("reverse cowgirl", page_size=40)
|
||||
_expect("reverse cowgirl/0001.jpg" in html, "Contact sheet lost first reverse-cowgirl image")
|
||||
_expect("data-review-bucket" in html, "Contact sheet should expose review buckets")
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Register the new smoke case**
|
||||
|
||||
Add `("normal_camera_unused_pool_review_artifacts", smoke_normal_camera_unused_pool_review_artifacts)` after the existing normal-camera prep smoke case.
|
||||
|
||||
- [ ] **Step 3: Verify the test fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_unused_pool_review_artifacts --quiet
|
||||
```
|
||||
|
||||
Expected: failure because `build_unused_pool_backlog`, `build_review_manifest`, and `build_contact_sheet_html` do not exist yet.
|
||||
|
||||
### Task 2: Implement Backlog and Review Manifest Builders
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
- Test: `python tools/prompt_smoke.py --case normal_camera_unused_pool_review_artifacts --quiet`
|
||||
|
||||
- [ ] **Step 1: Add schemas and review buckets**
|
||||
|
||||
Add constants:
|
||||
|
||||
```python
|
||||
UNUSED_POOL_BACKLOG_SCHEMA = "sxcp_normal_camera_unused_pool_backlog_v1"
|
||||
REVIEW_MANIFEST_SCHEMA = "sxcp_normal_camera_review_manifest_v1"
|
||||
DEFAULT_REVIEW_DIR = DEFAULT_OUTPUT_DIR / "review"
|
||||
REVIEW_BUCKET_VALUES = {
|
||||
"back_view": "Rear-facing normal-camera view where back/hips face camera.",
|
||||
"back_three_quarter": "Rear-offset normal-camera view with enough side/torso context.",
|
||||
"side_view": "Profile or near-profile lateral view with the body/action axis across frame.",
|
||||
"front_view": "Front-facing normal-camera view where the contact plane faces camera.",
|
||||
"front_three_quarter": "Front-offset normal-camera view.",
|
||||
"top_or_low_special": "Overhead, high-downward, low-angle, or under-view special camera.",
|
||||
"reject_or_unclear": "POV-like, mismatched, unclear, duplicate-only, or too mixed for cue drafting.",
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add helper functions**
|
||||
|
||||
Add helpers to compute selected-reference coverage and page full-folder images:
|
||||
|
||||
```python
|
||||
def _natural_sort_key(text: str) -> list[int | str]:
|
||||
return [int(part) if part.isdigit() else part.lower() for part in re.split(r"(\\d+)", text)]
|
||||
|
||||
def _atlas_folder_rows() -> list[dict[str, Any]]:
|
||||
return list(load_atlas().get("folders") or [])
|
||||
|
||||
def _variant_reference_map() -> dict[str, set[str]]:
|
||||
refs_by_folder: dict[str, set[str]] = {}
|
||||
for variant in load_variants().get("variants") or []:
|
||||
for ref in _reference_images(variant):
|
||||
folder = ref.rsplit("/", 1)[0]
|
||||
refs_by_folder.setdefault(folder, set()).add(ref)
|
||||
return refs_by_folder
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Implement backlog builder**
|
||||
|
||||
Implement `build_unused_pool_backlog(limit: int | None = None)` so it ranks non-empty folders by unselected image count, with fields `folder`, `image_count`, `selected_reference_count`, `remaining_image_count`, `covered_by_variants`, `camera_view`, `action_family`, `catalog_status`, and `suggested_action`.
|
||||
|
||||
- [ ] **Step 4: Implement review manifest and HTML builders**
|
||||
|
||||
Implement `build_review_manifest(folder_name: str, page_size: int = 40)` and `build_contact_sheet_html(folder_name: str, page_size: int = 40)` so `reverse cowgirl` produces six pages and exposes review buckets without classifying any image as truth.
|
||||
|
||||
- [ ] **Step 5: Verify green**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_unused_pool_review_artifacts --quiet
|
||||
```
|
||||
|
||||
Expected: `OK: smoke passed (1 cases).`
|
||||
|
||||
### Task 3: Write Review Artifacts
|
||||
|
||||
**Files:**
|
||||
- Modify: `normal_camera_atlas_prep.py`
|
||||
- Create: `ab_batches/normal_camera/normal_camera_unused_pool_backlog.json`
|
||||
- Create: `ab_batches/normal_camera/review/reverse_cowgirl_review_manifest.json`
|
||||
- Create: `ab_batches/normal_camera/review/reverse_cowgirl_contact_sheet.html`
|
||||
- Test: `python -m normal_camera_atlas_prep --write-artifacts --output-dir ab_batches/normal_camera`
|
||||
|
||||
- [ ] **Step 1: Extend artifact writing**
|
||||
|
||||
Update `write_artifacts()` to include the unused-pool backlog and reverse-cowgirl review artifacts. Keep existing artifact names stable.
|
||||
|
||||
- [ ] **Step 2: Regenerate artifacts**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python -m normal_camera_atlas_prep --write-artifacts --output-dir ab_batches/normal_camera
|
||||
```
|
||||
|
||||
Expected: output includes the four existing artifacts plus `unused_pool_backlog`, `reverse_cowgirl_review_manifest`, and `reverse_cowgirl_contact_sheet`.
|
||||
|
||||
- [ ] **Step 3: Verify prep smoke**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_atlas_prep_artifacts --case normal_camera_unused_pool_review_artifacts --quiet
|
||||
```
|
||||
|
||||
Expected: `OK: smoke passed (2 cases).`
|
||||
|
||||
### Task 4: Add Reverse-Cowgirl Catalog Source Pool
|
||||
|
||||
**Files:**
|
||||
- Modify: `categories/normal_camera_variants.json`
|
||||
- Modify: `tools/prompt_smoke.py`
|
||||
- Test: `python tools/prompt_smoke.py --case normal_camera_atlas_catalog --quiet`
|
||||
|
||||
- [ ] **Step 1: Add failing catalog expectation**
|
||||
|
||||
Extend `required_variants` in `smoke_normal_camera_atlas_catalog()` with `normal_reverse_cowgirl_mixed_camera_folder_pool`.
|
||||
|
||||
- [ ] **Step 2: Verify red**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_atlas_catalog --quiet
|
||||
```
|
||||
|
||||
Expected: failure because the mixed source-pool variant does not exist.
|
||||
|
||||
- [ ] **Step 3: Add the source-pool variant**
|
||||
|
||||
Add a `needs_samples` variant after the existing labeled reverse-cowgirl variants:
|
||||
|
||||
```json
|
||||
{
|
||||
"key": "normal_reverse_cowgirl_mixed_camera_folder_pool",
|
||||
"family": "reverse_cowgirl",
|
||||
"status": "needs_samples",
|
||||
"atlas_folders": ["reverse cowgirl"],
|
||||
"camera_view": "mixed_or_unspecified",
|
||||
"action_family": "reverse_cowgirl",
|
||||
"canonical_geometry": "Large reverse-cowgirl source pool with normal-camera examples but no single locked camera view until contact-sheet review selects stable subsets.",
|
||||
"prompt_cues": [
|
||||
"reverse cowgirl normal-camera source pool",
|
||||
"select a repeated camera family before cue drafting",
|
||||
"use contact-sheet evidence before fixed-seed testing"
|
||||
],
|
||||
"avoid_cues": [
|
||||
"using the full mixed folder as one locked camera preset",
|
||||
"POV reverse-cowgirl wording",
|
||||
"inventing camera cues from the folder label alone"
|
||||
],
|
||||
"reference_images": [
|
||||
"reverse cowgirl/0001.jpg",
|
||||
"reverse cowgirl/288.jpg",
|
||||
"reverse cowgirl/82.jpg"
|
||||
],
|
||||
"generator_hook": {
|
||||
"module": "future normal-camera routing; likely camera_config.py / row_camera.py / krea_format_route.py",
|
||||
"route_terms": ["reverse cowgirl", "mixed camera source pool"],
|
||||
"notes": "Future hook only. This catalog does not change generator defaults, prompt routes, formatters, eval logs, or POV workflow files."
|
||||
},
|
||||
"pre_ab_notes": "Added as the first large unused-pool review tranche. The full 240-image folder is a cue-expansion pool, not a prompt-ready route; split selected-reference subvariants only after contact-sheet evidence shows repeated non-POV camera geometry.",
|
||||
"folder_pool": true,
|
||||
"visual_review": {
|
||||
"reviewed_at": "2026-07-02",
|
||||
"scope": "Paged contact-sheet review scaffold covering 240 JPGs across atlas_folders plus representative references.",
|
||||
"decision": "added_as_large_unused_pool_review_tranche",
|
||||
"notes": "Folder is now tracked for review; selected-reference subvariants should be added only from repeated camera/pose families identified in the contact sheet."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Update inventory counts**
|
||||
|
||||
Increment `variant_count` and `needs_samples`, increment `covered_non_empty_folder_count`, decrement `uncovered_non_empty_folder_count`, and remove `reverse cowgirl` from `uncovered_non_empty_folders`.
|
||||
|
||||
- [ ] **Step 5: Verify green**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_atlas_catalog --quiet
|
||||
```
|
||||
|
||||
Expected: `OK: smoke passed (1 cases).`
|
||||
|
||||
### Task 5: Document and Regenerate Prep Outputs
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/normal-camera-atlas.md`
|
||||
- Modify: `ab_batches/normal_camera/normal_camera_priority_plan.json`
|
||||
- Modify: `ab_batches/normal_camera/normal_camera_prompt_cue_batch.json`
|
||||
- Modify: `ab_batches/normal_camera/normal_camera_score_sheet.json`
|
||||
- Test: `python tools/prompt_smoke.py --case normal_camera_atlas_catalog --case normal_camera_atlas_prep_artifacts --case normal_camera_unused_pool_review_artifacts --quiet`
|
||||
|
||||
- [ ] **Step 1: Update docs**
|
||||
|
||||
Document that the unused-pool extension starts with `reverse cowgirl`, adds `normal_camera_unused_pool_backlog.json`, and keeps full mixed folders out of `pre_ab_candidate` until selected-reference subvariants exist.
|
||||
|
||||
- [ ] **Step 2: Regenerate artifacts**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python -m normal_camera_atlas_prep --write-artifacts --output-dir ab_batches/normal_camera
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Verify focused smoke**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python tools/prompt_smoke.py --case normal_camera_atlas_catalog --case normal_camera_atlas_prep_artifacts --case normal_camera_unused_pool_review_artifacts --quiet
|
||||
```
|
||||
|
||||
Expected: `OK: smoke passed (3 cases).`
|
||||
|
||||
### Task 6: Visual Split Follow-Up
|
||||
|
||||
**Files:**
|
||||
- Modify later: `categories/normal_camera_variants.json`
|
||||
- Modify later: `docs/normal-camera-atlas.md`
|
||||
- Test later: focused smoke cases above
|
||||
|
||||
- [ ] **Step 1: Review the contact sheet**
|
||||
|
||||
Open `ab_batches/normal_camera/review/reverse_cowgirl_contact_sheet.html` or generated page images, classify repeated non-POV camera/pose families, and record selected image paths.
|
||||
|
||||
- [ ] **Step 2: Add selected-reference subvariants only when evidence is stable**
|
||||
|
||||
For each repeated family, add a subvariant with `source_variant: "normal_reverse_cowgirl_mixed_camera_folder_pool"`, `subset_selection.type: "review_selected_reference_images"`, positive-only cue sentences, and selected `reference_images`.
|
||||
|
||||
- [ ] **Step 3: Leave weak groups as `needs_samples`**
|
||||
|
||||
Do not promote one-off frames, POV-like frames, or visually mixed groups. Keep them in source-pool notes or review buckets until more evidence exists.
|
||||
|
||||
Reference in New Issue
Block a user