Version. 0.1
Date. 2026-05-15
Status. Pre-CR scoping evidence brief. Hands to CC at Phase 60 Step 0 execution. Mirrors the Phase 59 Step 0 inspection brief shape adapted for Phase 60's Operator Layer Upload Pathway v1 identity.
Author. Claude.ai (CC drafting session) on direction from Marvin Percival (DUNIN7 Operator).
Companion document. loomworks-phase-60-scoping-note-v0_1.md (parent — sixteen P60-D items closed); loomworks-phase-60-cr-drafting-handoff-v0_1.md (drafter checklist; §9 CRV verifications inform but live at a different layer than Step 0); phase-60-cr-operator-layer-upload-pathway-v0_1.md (the CR this brief is companion to).
What this document is. Phase 60 Step 0 inspection brief. The eleven verifications V0–V10 CC executes at pre-flight against the live Operator Layer (OL) repo + the live engine repo (read-only verifications of Phase 59 contracts Phase 60 consumes). Per Phase 59 v0.3 framing, the brief is the authoritative source for pre-flight verification; the findings document is what CC produces against the brief.
Why this brief exists at Phase 60 Step 0. The Phase 60 CR's pre-flight section consumes Step 0 verdicts. The CR sub-arc designs rest on assumptions about OL composer state (MAX_ROWS=5; plain-text input; no draft persistence; no Markdown library), folder-walker shape, OL converse-view rendering site, and engine contract shapes Phase 60 consumes (2e/2f/3c/4a + 2d-inheritance). This brief enumerates each, gives CC paste-ready commands, and defines what CC produces.
What CC does at Step 0d. Reads this brief; executes V0 through V10 against the live repos at the phase-60-step-0 branch HEAD on OL repo + the engine repo at the phase-59-upload-pathway-completion tag (commit 7048aae); produces verbatim evidence; classifies verdicts per the criteria below; files findings document at OL repo docs/phase-impl-notes/phase-60-step-0-findings-v0_1.md (or engine repo equivalent if OL has no such directory — CC selects per existing convention).
What CC does NOT do. Edit the scoping note. Edit the CR. Propose remediation. Start build work. CC verifies, evidence-cites, reports verdicts.
Decision needed at Step 0f. Operator confirms verdicts before CC proceeds to Step 0g (build branch creation). Operator may approve as-is, request CC re-verify a specific V, or halt the build for amendment scoping in a separate Claude.ai chat (v0.2 of CR absorbs scope changes).
Pre-CR live-codebase verification for Phase 60 — Operator Layer Upload Pathway v1. The scoping note records the sixteen P60-D items as Operator-confirmed; they rest on a small set of CC-verifiable-only-at-pre-flight assumptions per scoping note §1 (P60-D15 discipline carryover from Phase 60 entry handoff v0.2 §1).
The eleven verifications surface here covering: (a) OL repo close baseline (V0); (b) composer current shape (V1, V2, V3); (c) folder-walker location (V4); (d) OL converse view + upload-result rendering site (V5); (e) Markdown library presence in OL dependencies (V6); (f) engine contract shapes Phase 60 consumes (V7, V8, V9, V10); plus an inheritance verification for the accompanying_message field Phase 60 does NOT consume (V11; preserved for Phase 61 consumption).
Several scoping-note positions rest on CC-verifiable state per §1 discipline carryover: that OL composer's MAX_ROWS constant lives in a single source-of-truth location at value 5; that composer is plain-text-input only; that no draft persistence exists; that folder-walker is a discoverable insertion point; that OL converse view has a discoverable upload-result rendering site; that no Markdown library is in OL dependencies; that engine contracts 2e/2f/3c/4a/2d-inheritance ship in the shapes Phase 59 CR v0.4 records.
CC verifies, evidence-cites, reports verdicts. CC does not propose remediation, does not edit the scoping note, does not draft the CR, does not start build.
The brief assumes Phase 60 P60-D items hold per the scoping note:
.DS_Store, Thumbs.db, desktop.ini); case-insensitive, filename-only.phase-60-operator-layer-upload-pathway-v1 on OL repo at close.Remaining P60-D items run on the scoping note's recommendations unless Step 0 evidence reshapes them. The brief flags which verification touches which P60-D.
Lens-bounded discipline note. V0 plus V1+V2+V3 are the load-bearing triad for sub-arc 1 (composer-completeness): V0 sets the OL close baseline; V1/V2/V3 enumerate the composer's current state (MAX_ROWS constant; input mode; draft persistence). V4 is load-bearing for sub-arc 2 (folder filter); V5 is load-bearing for sub-arcs 3 + 4 (rendering site for engine consumers); V7/V8/V9/V10 verify the engine contracts those consumers consume; V6 is the Markdown library question (sub-arc 1.4); V11 is inheritance verification for Phase 61.
CC reads in this order before starting:
loomworks-phase-60-scoping-note-v0_1.md (project knowledge — authoritative source for the sixteen P60-D items). Especially §7 P60-D table; §1 discipline carryover; §3 Stage 2 per-item walks.loomworks-phase-60-entry-handoff-v0_2.md (project knowledge — §1 discipline framing for all Phase 60 documents).phase-59-cr-upload-pathway-completion-v0_4.md (engine repo docs/phase-crs/; or project knowledge) — engine contract shapes Phase 60 consumes: §13 (accompanying_message field on ExecutorResult / PerFileUploadResponse / UploadEventReceived); §14 (PurposeClassificationResult.framing_kind + per_candidate_scores for 2e); §15 (DetectionRule.purpose_framing + get_purpose_framings_for_chains for 2f); §18 (ReliabilityTier on TransformationResult for 3c); §19 (POST /engagements/{eid}/files/{file_id}/manual-content + ManualContentBody/ManualContentResponse for 4a).phase-59-implementation-notes-v0_1.md (engine repo docs/phase-impl-notes/) — Phase 59 close state per implementation notes §2 per-sub-arc summaries with as-shipped capture sections.phase-60-cr-operator-layer-upload-pathway-v0_1.md (engine repo docs/phase-crs/) — the CR this brief is companion to. CC reads §4 pre-flight which references this brief.CC confirms baseline before any verification:
/Users/dunin7/loomworks. Tag phase-58-upload-pathway at OL commit 9fac2e0. Vitest count: 167 per Phase 60 entry handoff statement (CC verifies actuals; expected 167 ±5). eslint/tsc/build clean expected; CC verifies. All Phase 60 substrate work lives in this repo./Users/dunin7/loomworks-engine. Tag phase-59-upload-pathway-completion at engine commit 7048aae. Substrate baseline: 2,458 passed + 30 skipped + 2 pre-existing failed at the tag (per Phase 59 implementation notes). Alembic head 0064. Working tree expected clean. Engine repo untouched in Phase 60 per P60-D12; Step 0 reads engine state for contract verification only.Any drift from baseline → CC reports actual numbers and continues with verifications.
Ask. Establish the Phase 60 baseline + the accounting needed for Step 0 branch convention at Phase 60 close (per Phase 57-established lifecycle).
What to check.
cd /Users/dunin7/loomworks && git log -1 --oneline main
cd /Users/dunin7/loomworks && git tag --list 'phase-58-*' 'phase-59-*' 'phase-60-*'
cd /Users/dunin7/loomworks && git branch | grep -E 'phase-' || echo "ZERO local phase-* branches"
cd /Users/dunin7/loomworks && git ls-remote origin 'refs/heads/phase-*' 2>/dev/null | wc -l
cd /Users/dunin7/loomworks && npm test -- --run --reporter=basic 2>&1 | tail -3
cd /Users/dunin7/loomworks && npm run lint 2>&1 | tail -3
cd /Users/dunin7/loomworks && npx tsc --noEmit 2>&1 | tail -3
cd /Users/dunin7/loomworks && npm run build 2>&1 | tail -5
cd /Users/dunin7/loomworks-engine && git rev-parse --short HEAD
cd /Users/dunin7/loomworks-engine && .venv/bin/pytest -q --collect-only 2>&1 | tail -3
cd /Users/dunin7/loomworks-engine && .venv/bin/alembic heads 2>&1 | head -3
Evidence expected.
9fac2e0 (Phase 58 close).phase-58-upload-pathway; **no phase-59-* tag on OL** (Phase 59 was engine-only); no phase-60-* tag yet.7048aae.0064.origin/phase-* ref count (carries from prior phases; queued operational hygiene).phase-* branches present (input to Phase 60 close's Step 0 branch lifecycle).Verdict criteria.
0064 (i.e., a between-Phase-59-and-Phase-60 commit added a migration). Reports actual head; CR drafter adjusts (this would also indicate engine activity contradicting P60-D12).Ask. Where is the composer's MAX_ROWS constant defined? What file imports it? What is the literal value? Phase 60 sub-arc 1.2 changes this; CC needs the exact location to plan the change.
Look at.
src/components/chat/MessageTextarea.tsx per CRV-2 evidence + entry handoff statement.What to check.
cd /Users/dunin7/loomworks && grep -rn "MAX_ROWS\|maxRows" src/ tests/
cd /Users/dunin7/loomworks && grep -n "lineHeight\|paddingTop\|MAX_ROWS" src/components/chat/MessageTextarea.tsx
Evidence expected.
src/components/chat/MessageTextarea.tsx:28: const MAX_ROWS = 5;. Module-local constant; not exported.src/components/chat/MessageTextarea.tsx:54: const max = lineH * MAX_ROWS + pad; — the cap interacts with computed line-height + padding.Verdict criteria.
MAX_ROWS = 5 at the named location; module-local constant; no other definitions in src/ or tests/. Sub-arc 1.2 changes this constant + height-cap math per P60-D3 (cap to 20 rows or 40% viewport whichever smaller).Ask. Is the composer plain-text or rich-text? Is any Markdown rendering already present? Phase 60 sub-arc 1.4 adds display-side Markdown rendering; CC needs to know the starting state.
Look at.
src/components/chat/MessageTextarea.tsx.What to check.
cd /Users/dunin7/loomworks && grep -rn "import.*markdown\|from 'react-markdown\|from '@?remark\|marked\|micromark" src/
cd /Users/dunin7/loomworks && head -100 src/components/chat/MessageTextarea.tsx
cd /Users/dunin7/loomworks && grep -rn "rich.text\|contentEditable\|RichText" src/
Evidence expected.
<textarea>-based (plain-text element).src/.contentEditable or rich-text library usage.Verdict criteria.
Ask. Does any local-storage / session-storage / context state hold in-progress composer content? Phase 60 sub-arc 1.3 adds per-engagement local-storage persistence; CC needs to know if any partial persistence already exists.
Look at.
What to check.
cd /Users/dunin7/loomworks && grep -rn "localStorage\|sessionStorage\|useLocalStorage" src/components/chat/ src/lib/
cd /Users/dunin7/loomworks && grep -rn "draft\|persist" src/components/chat/
cd /Users/dunin7/loomworks && grep -n "value\|onChange\|setValue" src/components/chat/ChatView.tsx 2>&1 | head -20
Evidence expected.
draft or persist references in the chat directory.Verdict criteria.
Ask. Where does the OL's folder-upload pathway walk the dropped folder? Where do files get added to the upload queue? Phase 60 sub-arc 2 inserts the platform-system-file filter at this point.
Look at.
What to check.
cd /Users/dunin7/loomworks && grep -rn "webkitdirectory\|webkitRelativePath" src/
cd /Users/dunin7/loomworks && grep -n "files\|FileList\|onFilesSelected\|setFiles" src/components/chat/UploadAttachmentButton.tsx
cd /Users/dunin7/loomworks && grep -n "files\|onFilesSelected\|setFiles\|handleUpload" src/components/chat/ChatView.tsx
cd /Users/dunin7/loomworks && grep -rn "postUpload\|FormData\|multipart" src/lib/
Evidence expected.
webkitdirectory="" attribute on <input type="file"> per CRV-5 evidence at src/components/chat/UploadAttachmentButton.tsx.onFilesSelected(files: File[]) to ChatView at src/components/chat/ChatView.tsx.src/lib/uploads.ts (or analogous; CC verifies exact path) for multipart construction.Verdict criteria.
webkitdirectory input + FileList iteration in ChatView's upload handler. Clean filter insertion point: between onFilesSelected receiving files: File[] and postUpload(files, ...) call. Sub-arc 2 adds a filterPlatformSystemFiles(files: File[]) -> File[] step at this point.Ask. Where does the OL converse view component live? Where do upload-result cards render today? How do engine-result data shapes flow into rendering? Phase 60 sub-arcs 3 + 4 attach new rendering surfaces to the converse view.
Look at.
UploadResultCard.tsx per CRV-6 evidence).What to check.
cd /Users/dunin7/loomworks && cat src/components/chat/UploadResultCard.tsx | head -50
cd /Users/dunin7/loomworks && grep -n "UploadResultCard\|uploadResults\|UploadPerFileEntry" src/components/chat/ChatView.tsx
cd /Users/dunin7/loomworks && grep -n "UploadPerFileEntry\|UploadResponse\|PerFileUploadResponse" src/lib/types.ts 2>&1
cd /Users/dunin7/loomworks && grep -rn "needs_clarification\|detection_failed\|transformation_failed" src/
Evidence expected.
src/components/chat/ChatView.tsx per CRV-6 evidence.UploadResultCard.tsx; component is invoked from ChatView's message-list rendering.UploadPerFileEntry (or analogous) type lives at src/lib/types.ts and mirrors engine's PerFileUploadResponse wire shape.completed / detection_failed / transformation_failed / needs_clarification / in_progress) drives rendering branches.Verdict criteria.
needs_clarification with framing_kind="accuracy" → AskOperatorToClarify rendering.needs_clarification with framing_kind="purpose" → AskOperatorForProcess rendering.completed with reliability="unreliable_succeeded" → warning rendering alongside content.detection_failed → fallback affordance text input.
Ask. Is any Markdown rendering library already in OL package.json dependencies? If so, which one and at what version? Phase 60 sub-arc 1.4 either uses an existing library OR introduces a new one (react-markdown or analogous).
What to check.
cd /Users/dunin7/loomworks && grep -E "react-markdown|remark|markdown-it|marked|micromark|markdown" package.json
cd /Users/dunin7/loomworks && cat package.json | head -60
Evidence expected.
src/; expected absent from package.json dependencies + devDependencies. Phase 60 introduces.Verdict criteria.
package.json. Sub-arc 1.4 introduces. CR drafter recommends react-markdown (well-maintained; React 19 compatible; sanitization hooks via rehype-sanitize); CC selects at execution.package.json but no src/ imports. CC reports library + version; Sub-arc 1.4 either uses it or surfaces drift to remove.package.json AND used by some non-composer component. Sub-arc 1.4 adopts the existing library for consistency. CC reports library + version + existing usage sites.AskOperatorToClarify (P60-D8)
Ask. Verify against engine 7048aae: where the 2e shape lives; response slot location; field shapes. Per Phase 59 CR v0.4 §14: extended PurposeClassificationResult with framing_kind + per_candidate_scores.
Look at.
src/loomworks/uploads/upload_event.py PurposeClassificationResult model.src/loomworks/uploads/executor.py PurposeClassification dataclass.src/loomworks/api/routers/uploads.py PerFileUploadResponse projection.What to check.
cd /Users/dunin7/loomworks-engine && sed -n '105,130p' src/loomworks/uploads/upload_event.py
cd /Users/dunin7/loomworks-engine && grep -n "framing_kind\|per_candidate_scores" src/loomworks/uploads/executor.py | head
cd /Users/dunin7/loomworks-engine && grep -n "purpose_classification_result\|framing_kind" src/loomworks/api/routers/uploads.py | head
Evidence expected.
PurposeClassificationResult model at src/loomworks/uploads/upload_event.py:105 with fields: classifier_invoked: bool, classified_label: str | None, confidence: float | None, threshold: float | None, above_threshold: bool | None, per_candidate_scores: dict[str, float] (default factory), framing_kind: Literal["accuracy", "purpose"] (default "accuracy").PerFileUploadResponse.purpose_classification_result (per CRV-8 evidence at uploads.py:425-426).needs_clarification accompanies non-None purpose_classification_result per Phase 59 routing.Verdict criteria.
framing_kind or no per_candidate_scores field. Engine-side gap; halt and surface (engine-touch-in-OL-phase precedent).AskOperatorForProcess (P60-D8)
Ask. Verify against engine 7048aae: where per-candidate purpose-framing strings register; how to query at consumption time. Per Phase 59 CR v0.4 §15: DetectionRule.purpose_framing field + get_purpose_framings_for_chains() registry helper.
Look at.
src/loomworks/uploads/detection_registry.py DetectionRule + helper.src/loomworks/uploads/skills/image_vision_analysis.py + image_ocr.py registration sites.What to check.
cd /Users/dunin7/loomworks-engine && grep -n "purpose_framing\|get_purpose_framings_for_chains" src/loomworks/uploads/detection_registry.py
cd /Users/dunin7/loomworks-engine && grep -n "purpose_framing" src/loomworks/uploads/skills/image_vision_analysis.py src/loomworks/uploads/skills/image_ocr.py
Evidence expected.
DetectionRule.purpose_framing: str = "" per CRV-9 evidence at detection_registry.py:111.get_purpose_framings_for_chains(candidate_chains) -> dict[str, str] helper at detection_registry.py:181.image_vision_analysis registers purpose_framing="describe what's in the image" per CRV-9.image_ocr registers purpose_framing="transcribe the text in the image" per CRV-9.framing_kind="purpose" on the PurposeClassificationResult when multi-above-threshold case fires (Phase 59 §15.3 routing reshape).Verdict criteria.
framing_kind="purpose" carries the discriminator. Sub-arc 3b consumes per P60-D8.ReliabilityTier on TransformationResult (P60-D9)
Ask. Verify against engine 7048aae: where the three-state union lives; field name (reliability); how content + warning data flow through response shape. Per Phase 59 CR v0.4 §18.
Look at.
src/loomworks/uploads/skills/base.py ReliabilityTier + TransformationResult.src/loomworks/api/routers/uploads.py PerFileUploadResponse projection.src/loomworks/uploads/upload_event.py UploadEventReceived persisted field.What to check.
cd /Users/dunin7/loomworks-engine && grep -n "ReliabilityTier\|reliability" src/loomworks/uploads/skills/base.py
cd /Users/dunin7/loomworks-engine && grep -n "reliability" src/loomworks/uploads/executor.py src/loomworks/api/routers/uploads.py src/loomworks/uploads/upload_event.py | head
Evidence expected.
ReliabilityTier = Literal["succeeded", "unreliable_succeeded", "failed"] at src/loomworks/uploads/skills/base.py:55 per CRV-11.TransformationResult.reliability: ReliabilityTier = "succeeded" (default) at src/loomworks/uploads/skills/base.py:115.ExecutorResult.reliability: str | None = None (populated from last skill).PerFileUploadResponse.reliability: str | None = None at src/loomworks/api/routers/uploads.py:134.UploadEventReceived.reliability: str | None = None at src/loomworks/uploads/upload_event.py:192.Verdict criteria.
unreliable_succeeded warning per P60-D9.quality_tier instead of reliability). CC reports; sub-arc 4a adapts.unreliable_succeeded in practice (heuristic mismatch). CC reports; sub-arc 4a still ships rendering for the case (preserves multi-pathway intent per Phase 60 prospective inquiry); methodology candidate surfacing.
Ask. Verify against engine 7048aae: endpoint exists at POST /engagements/{eid}/files/{file_id}/manual-content; request schema; response schema; how OL surfaces fallback against the failed-upload response shape. Per Phase 59 CR v0.4 §19.
Look at.
src/loomworks/api/routers/uploads.py submit_manual_content + ManualContentBody/Response.src/loomworks/uploads/manual_content.py ManualContentContributed typed MemoryObject.src/loomworks/memory/events.py _ANCHOR_PRIORITY entry.What to check.
cd /Users/dunin7/loomworks-engine && grep -n "manual-content\|ManualContentBody\|ManualContentResponse\|submit_manual_content" src/loomworks/api/routers/uploads.py
cd /Users/dunin7/loomworks-engine && cat src/loomworks/uploads/manual_content.py
cd /Users/dunin7/loomworks-engine && grep -n "manual_content_contributed" src/loomworks/memory/events.py
Evidence expected.
POST /engagements/{engagement_id}/files/{file_id}/manual-content per CRV-12 evidence at uploads.py:669.ManualContentBody request shape: {content: str, content_type: Literal["text/markdown", "text/plain"]}.ManualContentResponse shape: {manual_content_event_id: UUID, upload_event_id: UUID}.ManualContentContributed(MemoryObject) typed class at src/loomworks/uploads/manual_content.py:30._ANCHOR_PRIORITY entry "manual_content_contributed": "standard" in src/loomworks/memory/events.py.Verdict criteria.
/api/uploads/{id}/manual-content). CC reports actual path; sub-arc 4b adapts.content_type field absent or differently-named). CC reports; sub-arc 4b adapts.accompanying_message field inheritance verification (Phase 61 baseline preservation)
Ask. Verify against engine 7048aae: accompanying_message: str | None field present on ExecutorResult, PerFileUploadResponse, UploadEventReceived. Phase 60 does NOT consume this field (Phase 61 will, via β narration multi-pathway composition). Verified here so Phase 60 doesn't accidentally break Phase 61's inheritance baseline.
Look at.
src/loomworks/uploads/executor.py ExecutorResult.src/loomworks/api/routers/uploads.py PerFileUploadResponse.src/loomworks/uploads/upload_event.py UploadEventReceived.What to check.
cd /Users/dunin7/loomworks-engine && grep -n "accompanying_message" src/loomworks/uploads/executor.py src/loomworks/api/routers/uploads.py src/loomworks/uploads/upload_event.py
Evidence expected.
accompanying_message: str | None = None per CRV-15 evidence.operator_upload accepts the value._accompanying_message_disambiguates(...) helper at src/loomworks/uploads/executor.py:297 consumes the field for §13.7 pre-emption (Phase 59 substrate; not Phase 60's concern).Verdict criteria.
CC produces phase-60-step-0-findings-v0_1.md on a fresh phase-60-step-0 branch on the OL repo (or engine repo if OL has no docs/phase-impl-notes/ directory — CC verifies and selects). Format per Phase 56/57/58/59 Step 0 findings precedent:
CC does not propose remediation, does not edit the scoping note, does not start build.
Two paths:
Path A — All verifications HOLD. Scoping v0.1 stays current; CR drafter consumes v0.1 plus the findings document as evidence baseline. CC proceeds to Step 0g build branch creation.
Path B — One or more verifications reshape a P60-D item. Operator decides at Step 0f confirmation halt: in-flight absorption via existing CR conditional branches, OR halt for v0.2 amendment scoping in a separate Claude.ai chat. v0.2 absorbs scope changes; CC waits for v0.2 CR before resuming.
Either way, CR drafting runs in a fresh chat per standard pattern if v0.2 is needed.
CC halts and reports back to Operator (rather than continuing) if:
Halt-surface note format: phase-60-step-0-halt-{timestamp}-v0_1.md on phase-60-step-0 branch (OL repo, or engine repo per CC's earlier placement decision).
Per P57-D7 Option A: at Phase 60 close (Step 5), CC deletes phase-60-step-0 locally after merging Step 0 findings into the build branch context. Retroactive cleanup of any prior Step 0 branches still present per Phase 59 close's retroactive cleanup pattern.
Tag at Phase 60 close: phase-60-operator-layer-upload-pathway-v1 on OL repo only per P60-D12 (no engine tag; no marketing tag).
DUNIN7 — Done In Seven LLC — Miami, Florida Phase 60 Step 0 inspection brief — v0.1 — 2026-05-15