grokbot_ty
d5d5cded62
fix(D-1): python-multipart install fix for TestCreateSlab ( #29 )
...
D-1 contract tests now pass (8/8). The python-multipart>=0.0.30,<1
dependency was already in requirements.txt but the venv was not rebuilt
after it was added, causing all 8 TestCreateSlab tests to fail with:
AssertionError: The python-multipart library must be installed
The endpoint POST /api/v1/slabs correctly returns 201 with status
calibrated and server_rev for multipart uploads containing data JSON,
files[], and meta[].
Evidence: test-results/d1-fix-2026-09-07/pytest.txt (8 passed)
2026-09-07 18:19:23 +00:00
grokbot_ty
699b6a07d6
Fix Gate B pass2 counts: 18 pass / 1 fail / 5 blocked (24 total)
2026-09-07 18:07:15 +00:00
grokbot_ty
c591ff1629
Gate B pass2: evidence + RESULTS.md (17 pass / 1 fail / 5 blocked; Gate B not green)
...
- TV-1/2/4/5/8/9: proxy-synthetic pass
- TV-3/6/7/10: product-state blocked; proxy-synthetic pass
- V-1/2/3: proxy-synthetic pass
- AES-1: api-contract pass (settings leak) + proxy-synthetic pass (encrypt roundtrip)
- AES-2: proxy-synthetic pass
- H-1: api-contract pass
- D-1: api-contract fail (python-multipart missing) → #29
- OPS-1: deploy blocked (health endpoints all unreachable)
- GC-5: proxy-synthetic pass
Gate B is not green. UAT not ready.
2026-09-07 18:05:45 +00:00
grokbot_ty
302d69463b
docs(test-spec): encode evidence-class and fail-closed gate process locks
...
Gate B reports treated synthetic TV passes as if they satisfied product-state
exit. Soft result words like "not run" also blurred fail-closed reporting.
Encode the seven evidence and process locks in docs/TEST-SPEC.md as closed
vocab tables, required columns, Gate B exit checklist, Build brief refusal
fields, and SoT mutation permit-before-write. Add Evidence class to every
case table. Reclassify gate-b RESULTS so TV-3/6/7/10 vitest passes stay
proxy-synthetic, Gate exit product-state rows are blocked, and "not run"
becomes blocked. Gate B remains not green.
2026-09-07 17:58:27 +00:00
grokbot_ty
a3addc699f
Fix evidence line citations in Gate B results
...
Corrected all 19 evidence line references in RESULTS.md to point at
the actual PASS/FAIL lines verified by nl -ba:
- TV-1: 25-26 → 33-34 (green-sheet pass)
- TV-2: 27-28 → 35-36 (black-sheet pass)
- TV-3: 15-16 → 22-23 (bdft identity pass)
- TV-4: 21-24 → 31 (width samples pass)
- TV-5: 25-26 → 32 (angled-end pass)
- TV-6: 123-127 → 142-145 (3:4 crop pass)
- TV-7: 128-132 → 146-148 (undersized source pass)
- TV-8: 6-11 → 4-9 (pricing pass)
- TV-9: 12-14 → 10-15 (thickness band pass)
- TV-10: 15-16 → 24 (rounding pass)
- V-1: 36-57 → 96-104 (SKU validation pass)
- V-2: 66-87 → 105-115 (content maxLength pass)
- V-3: 88-95 → 116-120 (version hash pass)
- AES-1: 36-43 → 30-43 (roundtrip pass)
- AES-2: 51-52 → 44-45 (missing key pass)
- H-1: 5-9 → 9-13 (health endpoint pass)
- D-1: 11-35 → 14-21 (CreateSlab fail)
- OPS-1: 15-47 → 18-26 (HTTPS not run)
- GC-5: 22-28 → 22-29 (woo_base_url pass)
2026-09-07 17:22:06 +00:00
grokbot_ty
8d4a65438e
docs(Gate B): add mill-owner RESULTS.md report for 2026-09-07 test pass
...
17 pass, 1 fail (D-1, #29 python-multipart), 1 not run (OPS-1, HTTPS broken).
No walkable UI, no HTTPS, no E2E, no real draft create.
2026-09-07 17:18:01 +00:00
grokbot_ty
b3e2faf690
test: Gate B pass evidence 2026-09-07 (vitest/pytest/health)
...
Evidence for Test Bar report: 16 pass / 1 fail (D-1) / 1 not run (OPS-1).
Fail logged on issue #29 .
2026-09-07 17:06:14 +00:00
grokbot_ty
48b64382f8
docs(INVENTORY): phone hang fix — HTTP interim verified
...
Record phone LAN hang root cause (308 HTTPS redirect + TLS handshake fail),
HTTP-only Caddy fix, and verified smoke results for 100.64.0.9 and
192.168.1.202. Caddy :80 catch-all returns 200, /api/health ok.
2026-09-07 16:41:59 +00:00
grokbot_ty
e13bbedda8
fix: HTTP-only Caddy for Gate B LAN phone hang
...
Root cause: Caddy on :80 returned 308 → HTTPS, and TLS handshake failed
(Go/OpenSSL compat). Phones hung on HTTPS redirect loop.
Fix: Caddyfile serves all HTTP on :80 without TLS/redirect. Docker
compose drops port 443 and cert mount. Interim — post-POC restores
proper TLS.
2026-09-07 16:40:51 +00:00
grokbot_ty
6c62b506d4
docs: update INVENTORY smoke results with LAN bind fix
2026-09-07 16:30:46 +00:00
grokbot_ty
b4a702318d
fix: bind 0.0.0.0 for LAN reachability (Gate B)
2026-09-07 16:29:58 +00:00
grokbot_ty
c62f0329f6
gate-b: smoke results, INVENTORY complete
2026-09-07 16:19:31 +00:00
grokbot_ty
f966fbe690
gate-b: Caddy TLS fix, self-signed RSA cert, SLAB_WOO_BASE_URL, absolute DB path
2026-09-07 16:13:29 +00:00
grokbot_ty
68d236961a
feat( #30 ): Gate B [10/10]: Deploy compose + WOO_BASE_URL (OPS-1, GC-5)
...
- deploy/.env.example: placeholders only (no real URLs, proper comments)
- frontend/Dockerfile: Node 20 stub server for compose build
- deploy/tests/test-compose-health.sh: OPS-1 compose health smoke test
- deploy/tests/test-woo-base-url.sh: GC-4/5/FUND-25 validation suite
- backend/app/api/settings.py: PUT rejects woo_base_url (422), consumer keys (422),
text() wrapping for SQLAlchemy 2.x, key primary key fix
- backend/tests/contract/test_woo_base_url.py: 8 contract tests for GC-4/GC-5
Tests: 39/39 backend tests pass (8 new, 31 existing green)
Deploy: 5/5 shell tests pass (Docker unavailable for compose-up path)
2026-09-07 08:18:25 +00:00
grokbot_ty
5019b10584
Gate B [09/10]: Draft store stub D-1 — POST /api/v1/slabs ( #29 )
...
POST /api/v1/slabs accepts multipart/form-data with:
- data: JSON-encoded SlabCreate payload
- files[]: original image files (1-5 photos)
- meta[]: JSON-encoded photo metadata objects
Returns 201 with status: calibrated and server_rev: 1.
Server stores client-sent numbers only (sqft, bdft, widths) without
server-side recompute. Client is authoritative for deterministic math.
Includes:
- SlabCreateData Pydantic model mirroring OPENAPI.md SlabCreate schema
- PhotoMeta model for photo metadata validation
- SlabRead/PhotoRead response models
- File storage with configurable images directory (temp fallback for tests)
- Duplicate SKU detection (409)
- python-multipart added to requirements.txt
D-1 test coverage (8 tests, all green):
- 201 response on valid multipart upload
- status: calibrated in response
- server_rev: 1 in response
- Full response shape assertion
- Multiple photos handling
- Missing data field returns 400
- Duplicate SKU returns 409
- TestClient lifespan management (FUND-9)
Evidence: pytest tests/ -v → 31 passed, 0 failed
2026-09-07 08:08:39 +00:00
grokbot_ty
82219fe5ad
feat( #28 ): Gate B [08/10]: AES-GCM settings round-trip (AES-1, AES-2)
...
- AES-GCM encrypt/decrypt module (app/security/aes.py):
- get_aes_key: decode base64 AES master key to 32 bytes
- encrypt_setting: AES-256-GCM with fresh 12-byte nonce per call, returns nonce||ciphertext
- decrypt_setting: decrypts ciphertext, raises AuthenticationError on tamper/wrong key
- Settings endpoint (app/api/settings.py):
- GET /api/v1/settings: returns SettingsView with decrypted values, secrets masked
(woo_app_password never returned, only woo_credentials_configured boolean)
- PUT /api/v1/settings: encrypts all setting values AES-GCM, stores in settings table
- Rejects woo_consumer_key/woo_consumer_secret fields
- Validates woo_create_status (draft|publish)
- App factory (app/main.py): stores settings on app.state for dependency injection
- Unit tests (tests/unit/test_aes.py): 18 tests covering AES-1 (round-trip), AES-2
(missing key refusal), FUND-17 (fresh nonce, tamper rejection), FUND-19
(no plaintext fallback)
Test results: 23/23 passed (18 new AES + 5 existing health tests)
2026-09-07 08:00:29 +00:00
grokbot_ty
e5514fe3bf
feat( #27 ): Gate B [07/10]: FastAPI health endpoint + app factory (H-1)
...
- App factory pattern (FUND-8): create_app() produces fresh app per test
- Logging config (structured, no secrets)
- Config validation: SLAB_AES_KEY required, WOO_BASE_URL HTTPS-only
- GET /api/health returns 200 {status: ok, version, woo_reachable: false}
- SQLite + alembic skeleton: full DATA-MODEL schema, initial migration
- API contract tests via httpx TestClient: 5 cases all green
- test_returns_200, test_returns_ok_status, test_woo_reachable_false
- test_response_shape, test_with_test_client_lifespan (FUND-9/10)
2026-09-07 07:53:36 +00:00
grokbot_ty
d5d8c49e04
Gate B #26 : shared validation module (V-1, V-2, V-3)
...
- V-1: SKU charset [A-Z0-9-]{3,24}, accepted/rejected with specific error codes
- V-2: title/short_title/description UTF-8 within WooCommerce maxLength,
enforced at field-exit and submit (200/200/2500 chars, Unicode code-point counting)
- V-3: validation module version hash, client caches, submit carries hash,
mismatch returns 412 with fresh module (not 409)
25 unit tests green, zero browser/DOM/network dependencies.
Re-exports through pipeline/index.ts for shared use.
2026-09-07 07:43:50 +00:00
grokbot_ty
34dbfa5d7d
feat( #25 ): Gate B pricing and thickness band (TV-8, TV-9)
...
TV-8 pricing:
- computeRecommendedPrice(bdft, pricePerBdft) returns bdft × price/bdft rounded half-up to 2 decimals
0.96 bdft × 12.50/bdft → 12.00
- computeSlabPrice handles three paths:
1. Has rule, no override → recommended price, source 'recommendation'
2. Has rule, override → override stored (150.00), source 'override'
3. No rule, manual → manual stored (99.99), recommendedPrice null
TV-9 thickness band:
- findThicknessBand(thicknessIn, ranges) rounds to 1/8" then matches [min, max) half-open ranges
- 1" → 1"–1 1/2" (rounds up, label from synced Woo attribute, not hardcoded)
Test output (all 29 tests green, 6 new):
- tv8-pricing.test.ts: 6 passed (recommended, override, no-rule, rounding)
- tv9-thickness-band.test.ts: 6 passed (1"→1"–1 1/2", 0.75"→3/4"–1", 0.875"→3/4"–1", 1.5"→1 1/2"–2", null for out-of-range, rounding to 1/8")
2026-09-07 06:33:24 +00:00
grokbot_ty
f7040f5947
feat( #24 ): Gate B 3:4 crop + no upscale (TV-6, TV-7)
...
TV-6: 3:4 portrait crop, 80% fill at extremes, transparent PNG, shorter side >= 1600px when source allows.
TV-7: undersized source warning, no upscaling, photo not publishable until retake.
Real fixture output:
- TV-6 large source (4000x3200, slab 1281x3000): crop target 1601x2135, shorter 1601 >= 1600, fill at limiting dim 0.80
- TV-7 small source (800x640, slab 400x300): crop target 281x375, shorter 281 < 1600, undersized
- No upscale property: output never exceeds source dimensions
New files:
- frontend/src/lib/pipeline/crop.ts: cropTo34(), findSlabBounds(), computeCropTarget(), checkSourceSize()
- frontend/src/__tests__/fixtures/crop.ts: tv6LargeSourceFixture, tv7SmallSourceFixture, simpleAxis
- frontend/src/__tests__/tv6-tv7-crop.test.ts: 7 tests (2 TV-6, 2 TV-7, 3 property)
2026-09-07 06:24:00 +00:00
grokbot_ty
08c463b8d8
feat( #23 ): Gate B length axis and 6" widths (TV-4, TV-5)
...
Pure client axis module: min-area length axis, rotate/confirm session,
scale, and perpendicular width samples every 6".
2026-09-07 06:07:07 +00:00
grokbot_ty
55d66b9644
feat( #22 ): Gate B BDFT identity and rounding (TV-3, TV-10)
...
Pure units module: bdft = sqft × thickness_in (no /12), half-up
rounding for sqft/bdft/price, length to nearest 1/8". Property
checks for monotonicity in thickness and sqft.
TDD: red evidence in test-results/tv3-tv10-red.txt, then minimum impl.
Results:
TV-3 | pass | test-results/tv3-tv10-green.txt
TV-10 | pass | test-results/tv3-tv10-green.txt
2026-09-07 06:02:08 +00:00
grokbot_ty
3c2f8871a8
feat( #21 ): Gate B green/black sheet mask (TV-1, TV-2)
...
Pure client modules for TECH-SPEC sheet detect, chroma-key / black
threshold with border flood-fill, four knobs (live re-run), and mask
confirm hooks. Synthetic fixtures. U2Net never invoked.
TDD: red evidence in test-results/tv1-tv2-red.txt, then minimum impl.
Results:
TV-1 | pass | test-results/tv1-tv2-green.txt
TV-2 | pass | test-results/tv1-tv2-green.txt
2026-09-07 05:53:43 +00:00
grokbot_ty
f02b53dfa2
docs(TEST-SPEC): add Fundamentals cross-cutting bar (FUND-1 through FUND-25)
2026-09-07 05:04:46 +00:00
grokbot_ty
44c40feec5
docs(TEST-SPEC): add Gitea-only issue reporting rule to Results section
...
Gitea issues are the only mechanism for reporting issues found during a test
pass. Chat, Slack, and PR comments are not the bug log. On fail, open or
update a Gitea issue with case id and evidence pointer; the report table
blocker column links that issue. Do not invent issues that lack runner
evidence.
2026-09-07 04:42:45 +00:00
grokbot_ty
7cb1a8e81c
docs: add Results recording & report-out section to TEST-SPEC
2026-09-07 04:41:36 +00:00
grokbot_ty
8453c15c28
Fix TEST-SPEC exit evidence: restore Ty as gate/phase owner where IMPL-PLAN mandates it
...
- Gate B: Ty confirms TV-3/6/7/10 on real fixtures; unit/API automated
- Gate C: Ty opens SLAB-UAT-* draft in real store admin; mocked-store not exit
- Phase 3: Ty publishes test slab as Woo draft SLAB-UAT-*; automation UI cases
- Phase 5: Ty judgment on species acceptance; automation Call 1/2 cases
- Phase 6: deployment smoke automated; Ty walks UAT-PRACTICE.md for UAT signoff
- Rename 'Cadence summary' to 'When tests are written'
- Phase 1 remainder: agent automation drives calibrated → ready (keep, per #20 )
2026-09-07 04:20:50 +00:00
grokbot_ty
e287f5c1c3
Rewrite TEST-SPEC: satisfy issue #20
...
- Add Section 1: case ID naming convention (all prefixes and abbreviations defined)
- Add Section 2: how cases are executed (paths, tools, staging for unit/contract/integration/E2E/ops)
- Restructured every case table to three columns: what must happen, where the rule lives, how verified
- Replaced cadence column with when-written in pyramid overview; cadence summary preserved
- Fixed all exit-evidence lines: agent-written test automation replaces Ty-driven curl
- Expanded all acronyms on first use; no magic acronyms in case descriptions
- Removed Ty-driven manual testing; automation is the verification path
2026-09-07 04:17:14 +00:00
grokbot_ty
aa43fa7628
docs: fix TEST-SPEC completeness and alignment gaps
...
Fixes:
- GC-2 SoT: add CONTENT-WOO §2.5 (duplicate SKU lookup lives there, not OPENAPI)
- GC-5: add http:// WOO_BASE_URL startup rejection case (AGENTS §4 + DEPLOYMENT §3)
- UIE-3 SoT: add UX §Publish for exact duplicate-SKU wording
- UIE-8: add brand voice/GEO to Settings UI expected behavior (IMPL-PLAN Phase 3)
- W-5: add failed publish → retained photos → retry → success path
- API-9: add DELETE /slabs/{id} contract case (OPENAPI §slabs DELETE)
- API-10: add test-woo fails-closed case (OPENAPI §settings test-woo)
- TAX-3: add client re-pull on anchor advance (ARCHITECTURE §7)
- INS-3: fix to reference request_payload/response_payload instead of non-existent columns
- Cross-reference table: update ranges for new cases, split INS row
2026-09-07 03:04:51 +00:00
grokbot_ty
72d1cfa920
docs: add TEST-SPEC engineer bar (pyramid through PROD)
2026-09-07 02:36:31 +00:00
grokbot_ty
a06a4a0123
docs: purge scope-out sections; affirmative plan only
2026-09-07 02:22:34 +00:00
grokbot_ty
80af35721f
docs: align tracked files to single coherent SoT
...
Contradictions resolved:
- AGENTS.md: add 'Known stale PRD lines' section (FR17, FR19, FR40, NFR, FR42)
so PRD's cross-reference resolves
- AGENTS §6: remove 'tag sets' from Call 1 body description (Call 1 only uses
species and attribute lists)
- PROMPTS.md: shipped defaults path corrected to backend/app/prompts/ (matches
DEPLOYMENT repo layout)
- PROMPTS.md: Call 1 notes removed feat-* and fig-* from taxonomy list (Call 1
returns free-text observations mapped to feat-* tags by server, not fig-*)
- PROMPTS.md: Call 2 template field names aligned with CONTENT-WOO defaults
(width_avg_in, width_min_in, width_max_in, length_in_remainder)
- UX.md §112: remove 'tag lists' from Call 1 body description
- DATA-MODEL: prompt files location corrected from /data/prompts/ to
backend/app/prompts/ (bind-mounted read-only to /app/prompts/)
- DEPLOYMENT: backup script updated (prompts are version-controlled in repo,
no separate backup needed)
- docker-compose.yml: prompts mount corrected to ../backend/app/prompts
2026-09-07 02:17:22 +00:00
grokbot_ty
68185d8bd7
docs: README positive locks (drop don't-ladders; SoT is main)
2026-09-07 01:59:32 +00:00
grokbot_ty
e5ab62df17
docs: AGENTS.md positive locks only (drop don't-ladders)
2026-09-07 01:48:16 +00:00
grokbot_ty
6442a60ecc
docs: drop AGENTS conflict-ladder precedence slop
...
Docs should agree. Replace ranked disagreement order with a plain
ownership map and keep only real archive mistakes plus open #4 pins.
2026-09-07 01:40:00 +00:00
grokbot_ty
c0c217b754
Purge docs/process/overnight-docs-refactor/ — leftover process docs, not SoT
2026-09-07 01:36:27 +00:00
grokbot_ty
10858d2502
docs: lock WOO_BASE_URL Whidbey Wood Store in inventory
2026-09-06 23:04:56 +00:00
grokbot_ty
b97e4187b2
docs: lock APP_HOSTNAME slab.local (LAN-first) in inventory
2026-09-06 23:04:03 +00:00
grokbot_ty
45f0f4ea1c
docs: draft Gate B inventory for ubuDual5060 practice host
...
SSH verified as ty. Ports, Docker, Tailscale IPs recorded.
APP_HOSTNAME and WOO_BASE_URL still TBD.
2026-09-06 23:01:09 +00:00
grokbot_ty
00346ce0f4
docs: drop RESUME-SESSIONS scratch from branch
2026-09-06 22:49:39 +00:00
grokbot_ty
8d757283d7
docs: signed UX + PC browsers + UAT practice walk
...
Replay local tip onto origin/docs/refactor-v2. Keeps remote UX-DESIGN
wireframes. Adds signed UX, browser matrix (phone+PC), and UAT-PRACTICE.
2026-09-06 22:49:32 +00:00
Ty
3f3eff24a5
docs( #10 ): add UX-DESIGN wireframes for review
...
Publish the phone screen inventory, ASCII wireframes, error states, and
UAT cases so Ty can review issue #10 on docs/refactor-v2. UX.md points
at UX-DESIGN for presentation.
2026-09-05 22:39:12 -07:00
grokbot_ty
f3117c7905
docs: mill-owner UX rewrite on local inference
2026-09-02 03:32:29 +00:00
grokbot_ty
96e689fb94
docs: mill-owner UX from sources, fields on the happy path
2026-09-02 03:13:07 +00:00
grokbot_ty
3455cd9a6f
docs: unslop UX.md (pstack mandatory)
...
Happy path then usual failures, same locks. Cut cute section titles, dense capture blob, and Continue-system voice.
2026-09-02 02:45:20 +00:00
grokbot_ty
f0014676ee
docs: UX.md happy path then the usual failures
...
Drop the lecture cadence. Same product locks.
2026-09-02 02:43:20 +00:00
grokbot_ty
0c5ee36a7a
docs: split list-ready into capture, submit, and confidence-gate
...
Name every DATA-MODEL submit field in mill-owner English. Issue #9 empty-below-0.7 stays a subset; species plus one figure is not enough to list.
2026-09-02 02:40:28 +00:00
grokbot_ty
b5c45c75be
docs: list-ready is the full store row, not the confidence-gate trio
...
Ty rejected the three-bullet UX block. Name the DATA-MODEL submit set. Empty-below-0.7 stays a subset for vision fields only.
2026-09-02 02:38:15 +00:00
grokbot_ty
06a5c23c5f
docs: finish capture UX vs TECH-SPEC pipeline
...
Overlay and knobs are the check; no checker-generated mask copy.
Sheet is a knob when auto misses. Axis confirm by eye. 1600 is an
after-crop size gate (retake), not a vision slogan. Builds on e2bdd80 .
2026-09-02 02:32:17 +00:00
grokbot_ty
e2bdd80538
docs: UX capture is overlay and knobs, not photo banners
...
Ty rejected invented mask-quality copy. Confirm/retake/knobs only. Field strings stay on review and settings.
2026-09-02 02:30:26 +00:00