This commit is contained in:
@@ -20,13 +20,18 @@ Raw runner evidence recorded; Ty owns gate exit (QUALITY-25/30).
|
|||||||
## Goals (accepted direction)
|
## Goals (accepted direction)
|
||||||
|
|
||||||
1. **Stabilize + polish the M3 experience (A) — includes the #99 tape-line calibration (B).**
|
1. **Stabilize + polish the M3 experience (A) — includes the #99 tape-line calibration (B).**
|
||||||
- **Tape-line calibration (#99):** replace the axis-rectangle calibration with a draggable
|
- **Tape-line calibration (#99) — SHIPPED (as-built 2026-09-25, UAT signed off):** the
|
||||||
tape-line (black line + two rifle-scope end ticks). Declared length = distance between
|
axis-rectangle calibration is replaced by a **fixed** black centre line with two end
|
||||||
ticks (owner-declared); scale = tick-pixel distance / declared length, no
|
ticks. The line is a stage fixture and is **never an owner input** (not draggable, not
|
||||||
`maskSpanAlong` check. New
|
focusable, not keyboard-nudgeable). The **source photo/slab is the only thing that
|
||||||
requirement row(s); supersedes the projected-span length model in CAPTURE-60/75. The `m4`
|
moves** — pan/zoom/tilt it until it lines up with the fixed line at the place the tape
|
||||||
branch already carries `crop_fill` + `TapePrototype.svelte` (`?tape-prototype`); M4
|
measurement was taken. Declared Length = the real inches read off the tape, and the
|
||||||
promotes it from prototype to shipped.
|
fixed line represents that same length; scale = fixed-line pixel span / declared
|
||||||
|
Length, no `maskSpanAlong` check. The crop slider alone sets the line ends
|
||||||
|
(`crop_fill=90` ⇒ each end 5% from its edge). The earlier `?tape-prototype` sandbox,
|
||||||
|
`TapePrototype.svelte`, `frontend/src/png/crop.ts` and the `sveltedrag` dependency are
|
||||||
|
all superseded/removed. Requirement rows CAPTURE-170/175/75 carry the as-built; see
|
||||||
|
`tasks.md` T2 for detail.
|
||||||
- **UX polish:** photo-picker look/feel (#91), photo filenames on submit (#92), capture
|
- **UX polish:** photo-picker look/feel (#91), photo filenames on submit (#92), capture
|
||||||
gated on a tested Woo connection (#93), review UI is always the human-pick flow (#94),
|
gated on a tested Woo connection (#93), review UI is always the human-pick flow (#94),
|
||||||
debug mode (#95), required-photo lock glyph (#100). (#96 Call 1/2 prompt viewer drops
|
debug mode (#95), required-photo lock glyph (#100). (#96 Call 1/2 prompt viewer drops
|
||||||
@@ -125,9 +130,10 @@ Raw runner evidence recorded; Ty owns gate exit (QUALITY-25/30).
|
|||||||
|
|
||||||
## Acceptance criteria (draft)
|
## Acceptance criteria (draft)
|
||||||
|
|
||||||
1. **Tape-line calibration + M3 polish ship together (Goal 1):** the `?tape-prototype`
|
1. **Tape-line calibration + M3 polish ship together (Goal 1):** the tape-line calibration
|
||||||
sandbox is replaced by the shipped calibration path (owner drags both ticks; declared
|
ships as a **fixed** centre line the owner pans/zooms/tilts the slab onto (line is never
|
||||||
length = tick distance; no `maskSpanAlong` check), and the
|
an owner input; crop slider sets its ends; declared length = the real tape inches, and
|
||||||
|
the fixed line represents that same length; no `maskSpanAlong` check), and the
|
||||||
M3 polish issues (#91–#100, excluding #96 which drops with Call 1) are closed with
|
M3 polish issues (#91–#100, excluding #96 which drops with Call 1) are closed with
|
||||||
passing tests and raw runner evidence.
|
passing tests and raw runner evidence.
|
||||||
2. **The review flow is human-driven, thumb-first, and Call 1-free:** the owner can pick
|
2. **The review flow is human-driven, thumb-first, and Call 1-free:** the owner can pick
|
||||||
|
|||||||
@@ -26,25 +26,40 @@ exit (QUALITY-30); agents record raw evidence, never declare green.
|
|||||||
- **Sequence:** first task of the sprint.
|
- **Sequence:** first task of the sprint.
|
||||||
- **Stop:** rows merged + gate green. **Evidence:** runner output.
|
- **Stop:** rows merged + gate green. **Evidence:** runner output.
|
||||||
|
|
||||||
### T2. #99 tape-line calibration (folded into G1)
|
### T2. #99 tape-line calibration (folded into G1) — AS-BUILT, shipped
|
||||||
- **Goal:** G1. **IDs:** CAPTURE (dimensions), REQS-50. **Issues:** #99.
|
- **Goal:** G1. **IDs:** CAPTURE-170, CAPTURE-175, CAPTURE-75. **Issues:** #99 (issue
|
||||||
- **Skills:** `systematic-debugging` (verify the prototype assumption),
|
body still describes the superseded draggable-tick model — this entry is the as-built).
|
||||||
`wireframe-review-iteration` (reference the overlay interaction), `svelte-core-bestpractices`.
|
- **Skills:** `systematic-debugging`, `svelte-core-bestpractices`,
|
||||||
- **Starting point:** `frontend/src/capture/TapePrototype.svelte` + `?tape-prototype`
|
`docker-uat-deploy` (isolate-and-verify the review preview).
|
||||||
sandbox on the `m4` branch; `docs/design/issue-99-tape-line-overlay.html` (approved
|
- **As-built:** a **fixed** black centre line with two end ticks, drawn on the stage
|
||||||
wireframe); `frontend/src/png/crop.ts` (projection logic).
|
fixture. The line is **never an owner input** — not draggable, not focusable, not
|
||||||
- **Work:** promote the prototype to the shipped calibration path (owner drags both
|
keyboard-nudgeable, and not part of the published pose. The **source photo/slab is the
|
||||||
ticks to the actual tape start/end; scale = tick-pixel distance / owner-declared
|
only thing that moves**: drag to pan, wheel/pinch to zoom, the ↻ handle or arrow keys
|
||||||
length — no `maskSpanAlong` check), delete the
|
(Shift = fine step) to tilt. The owner aligns the *slab* to the fixed line at the place
|
||||||
sandbox + query-param gating, keep `crop_fill` (already landed in 818874e).
|
the tape measurement was taken. Typed Length is the real inches read off the tape, and
|
||||||
**Scope (Ty confirmed):** confined to the calibration step — the photos-ready
|
the fixed line represents that same length. Scale = fixed-line pixel span / declared
|
||||||
lineup (CAPTURE-130) stays as-is; #99 does not touch it.
|
Length; `maskSpanAlong` is not the scale source. The crop slider is the **sole** control
|
||||||
- **Verification:** unit tests in `frontend/src/png/*` (tape geometry + tick-distance
|
of the line ends: `crop_fill=90` puts each end 5% from its corresponding edge.
|
||||||
scale math in photo px under pan/zoom/rotate), `tsc --noEmit`,
|
Calibration rotation applies to the calibration clean PNG + overlay only; batch
|
||||||
manual calibration on one slab at 375px.
|
siblings stay unrotated.
|
||||||
|
- **Superseded (do not restore):** draggable ticks; `TapePrototype.svelte` and the
|
||||||
|
`?tape-prototype` sandbox (both deleted); `frontend/src/png/crop.ts` (removed in
|
||||||
|
6000ac2 — crop geometry now lives in `frontend/src/capture/tapeLine.ts`
|
||||||
|
`cropEnds(fillPercent)`); the `sveltedrag` dependency (404s on npm, never added).
|
||||||
|
The wireframe `docs/design/issue-99-tape-line-overlay.html` lives on branch
|
||||||
|
`issue-99-tape-line-overlay` (63b8879), not on `m4`.
|
||||||
|
- **Verification:** unit tests in `frontend/src/capture/tapeLine.test.ts` (ends fixed by
|
||||||
|
the crop slider, never an owner input) + `frontend/src/png/{inventory,overlay}.test.ts`
|
||||||
|
(calibration rotation reaches the calibration PNG/overlay only); `tsc --noEmit`;
|
||||||
|
`npm run build`; e2e `frontend/tests/e2e/tape-fixed-line.spec.ts` (no tick drag; a tick
|
||||||
|
drag behaves identically to a pan; ends follow the crop slider).
|
||||||
- **Sequence:** parallel with T3–T5; no dependency on T1.
|
- **Sequence:** parallel with T3–T5; no dependency on T1.
|
||||||
- **Stop:** prototype shipped, `?tape-prototype` removed, tests green.
|
- **Stop:** SHIPPED. UAT-signed off by Ty 2026-09-25 on the M4 review preview
|
||||||
**Evidence:** test output + a 375px capture of the calibration drag.
|
(`http://192.168.1.202:10883/?noload=1`, build `a756cf5`, branch `m4`).
|
||||||
|
- **Evidence:** `npm test` 102/102; requirements + coverage gates green; live e2e on the
|
||||||
|
deployed preview (0°/20° rotation produces differing clean PNG + overlay bytes); render
|
||||||
|
gate clean at 1440/768/375 with no overflow or clipped text; Ty's UAT sign-off.
|
||||||
|
**Not covered:** `svelte-check` still reports its known 42-error baseline.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -117,3 +117,33 @@ Do not put a host name in the product spec.
|
|||||||
GET slab/taxonomy/settings 200, review 200.
|
GET slab/taxonomy/settings 200, review 200.
|
||||||
- In-repo mock e2e (m3-create + photo-strip) 6/6 green against the same bundle hash before deploy.
|
- In-repo mock e2e (m3-create + photo-strip) 6/6 green against the same bundle hash before deploy.
|
||||||
- Not done: commit/push of the import restore; Woo publish path not re-exercised this round.
|
- Not done: commit/push of the import restore; Woo publish path not re-exercised this round.
|
||||||
|
|
||||||
|
### 2026-09-25 08:57 PDT — M4 review preview: #99 fixed tape line + calibration rotation
|
||||||
|
|
||||||
|
- Source: branch `m4`, commit **`a756cf5`** (`fix(m4): drop stale tick-nudge hint from tape page (#99)`),
|
||||||
|
pushed and verified on `origin/m4`. `matches HEAD`: **yes**. Preceding M4 commits on the same
|
||||||
|
branch: `1882fa3` (calibration tilt applied to the calibration PNG/overlay only) and
|
||||||
|
`7908a99` (tape calibration collapsed onto one page).
|
||||||
|
- Image `deploy-frontend:m4-a756cf5` (`sha256:26402a77…`) built on the 5060 from a clean release
|
||||||
|
archive, **not** from the `~/slab-deploy` greenfield checkout. Container `slabuploader-m4-review`
|
||||||
|
recreated on network `deploy_default`, host port `10883:80`, **zero mounts**.
|
||||||
|
- URL: http://192.168.1.202:10883/?noload=1 (M4 review only). **Not** `10881` — that is the old
|
||||||
|
`main` stack and has no Length page. `10882` is the API, not a UI.
|
||||||
|
- Bundle: `assets/index-BI2cLnOA.js`. Served bundle has **zero** `Drag the ticks` /
|
||||||
|
`nudge the last tick` strings and **does** contain the fixed-line hint.
|
||||||
|
- Main stack untouched: `:10881` and `:10882/api/health` both 200 throughout.
|
||||||
|
- Sample data preserved: **yes** — the review container is volume-free; the real DB was never
|
||||||
|
rebuilt or re-seeded.
|
||||||
|
- Live verification (deployed URL, real backend): the fixed line renders with both end ticks;
|
||||||
|
a drag starting on a tick behaves identically to a pan elsewhere (line does not move); the
|
||||||
|
crop slider moves the line ends; Length/Thickness → Calculate reaches Photos ready. A drag is
|
||||||
|
still allowed (that is the intended pan).
|
||||||
|
- Gates: `npm test` 102/102; `tsc --noEmit` clean; requirements + coverage gates green;
|
||||||
|
render gate clean at 1440/768/375 (no overflow, no clipped text, no page/console/HTTP errors).
|
||||||
|
- Regression guard proven to fail against pre-fix code, not just pass post-fix.
|
||||||
|
- Ty UAT sign-off: **length e2e signed off 2026-09-25**; minor bugs to be filed separately.
|
||||||
|
- Not done: `svelte-check` still reports its known 42-error baseline (no new error from this work);
|
||||||
|
`Calculate` (42px) and `Fit` (41px) are marginally under the 44px touch reference — pre-existing,
|
||||||
|
deliberately left for a separate decision; Gitea #99's **body** still describes the superseded
|
||||||
|
draggable-tick model (the as-built is recorded in `tasks.md` T2 and requirements rows
|
||||||
|
CAPTURE-170/175/75).
|
||||||
|
|||||||
Reference in New Issue
Block a user