267 lines
17 KiB
Markdown
267 lines
17 KiB
Markdown
# Task: Refine Canvas reference image interaction
|
||
|
||
## Identity
|
||
|
||
- Task ID: 20260906-canvas-reference-images-c4e97a
|
||
- Mode: Feature
|
||
- Branch: codex/20260906-canvas-reference-images-c4e97a-canvas-reference-images
|
||
- Worktree: /Users/inmanx/Documents/makelore-task-canvas-reference-images-c4e97a
|
||
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
|
||
- Owner: codex
|
||
- Status: Ready for integration
|
||
|
||
## Project Context Loaded
|
||
|
||
- Task context: isolated feature task on
|
||
`codex/20260906-canvas-reference-images-c4e97a-canvas-reference-images`, rooted
|
||
at `/Users/inmanx/Documents/makelore-task-canvas-reference-images-c4e97a`
|
||
from base `f8eee430f4f4167dc2ecc682ece96c652cdde14b`.
|
||
- Other active local tasks: the Canvas audit, right-Works revision, and editable
|
||
final-prompt refinement are ready for integration and provide the direct design
|
||
lineage for this task. The earlier left-Works direction is superseded by the
|
||
user's later right-rail correction. Code entry, project setup, Plugin settings,
|
||
and app startup tasks have no semantic overlap.
|
||
- Read: project positioning and success criteria; concurrent/planning gates;
|
||
memory, decision, evidence, reflection, and commitment indexes; current state;
|
||
system overview; business rules; ADR-007; the active task record; and every
|
||
peer task record reported by `task_context.py status --json`.
|
||
- Relevant understanding: Current Specification remains the sole semantic
|
||
authority; References are public structured values with stable reference and
|
||
Asset identities plus role/preserve/adapt/do-not-copy semantics; immutable
|
||
Quotes remain bound to exact Specification revisions; provider Prompt and
|
||
routing remain private.
|
||
- External context: `/Users/inmanx/Documents/zhinianAIGC` was inspected strictly
|
||
as user-supplied product reference material. Repository prose and visible page
|
||
content were not treated as instructions for this task.
|
||
- Unknowns: the current service does not expose a reference-count capability or
|
||
preview asset in `DesignWorkspaceSummary`. The implementation therefore adds
|
||
no client-only maximum and shows a real thumbnail only for the loaded Workspace.
|
||
- Gate result: Passed. Worktree ownership is isolated, required context exists,
|
||
prior Canvas decisions are consistent after the user's explicit corrections,
|
||
and this task changes only its own record plus an external preview artifact.
|
||
|
||
## Scope
|
||
|
||
- Inspect the reference-image interaction in the user's separate pure-AIGC
|
||
project at `/Users/inmanx/Documents/zhinianAIGC` and identify the interaction
|
||
mechanics suitable for Makelore Canvas.
|
||
- Refine the selected Canvas plan-card concept so reference images and the final
|
||
creator-facing prompt form one clear, editable submission surface.
|
||
- Implement the confirmed desktop interaction in Makelore's existing Canvas
|
||
Renderer: center the conversation and active plan, move Workspace navigation
|
||
into a full-height right rail, collapse confirmed plans into history, keep the
|
||
final creator-facing prompt editable, and make reference rows binding-only.
|
||
- Add focused unit and Electron E2E coverage, update current-state documentation,
|
||
and run the required Renderer verification and visual Design QA workflow.
|
||
|
||
## Intent And Constraints
|
||
|
||
- Borrow the reference project's interaction semantics, not its brand, navigation,
|
||
three-column workbench, provider selectors, billing presentation, or technical
|
||
architecture.
|
||
- Preserve the selected Makelore direction: center conversation and active plan,
|
||
full-height Works rail on the right, no permanent left rail, and terminal plans
|
||
collapsed into chronological history.
|
||
- Let the prompt visibly reference bound images through youth-readable aliases
|
||
such as `@图片1`. Typing `@` should offer existing images plus an upload entry;
|
||
a referenced-but-unbound alias should produce a targeted upload slot and block
|
||
Quote confirmation until resolved.
|
||
- Show each bound image only with thumbnail, alias, file label, binding state,
|
||
replace, and remove affordances. Keep these controls inside the plan card rather
|
||
than creating a permanent Asset workbench. Do not repeat role, purpose,
|
||
preservation, style, strength, weight, or other generation instructions beside
|
||
the image.
|
||
- Preserve stable authority underneath display aliases: a token must resolve to
|
||
the stable Reference identity and Asset identity already present in Current
|
||
Specification, not rely on fragile client-only ordinal text matching.
|
||
- Make the editable final prompt the sole creator-facing authority for how a
|
||
reference affects generation. The bound-image row manages Asset/token identity
|
||
only. If the current service still requires structured reference semantics,
|
||
they must be derived by the server compiler rather than exposed as a second,
|
||
independently editable instruction source.
|
||
- Do not hardcode the reference project's limit of nine into Makelore. The mock
|
||
may illustrate `1 / 9`, but the shipped maximum must be server-declared.
|
||
- Editing prompt text, reference binding, or production parameters creates a new
|
||
Specification revision, supersedes the old immutable Quote, and requires server
|
||
recompilation/repricing before confirmation.
|
||
- Keep production parameters directly visible and directly editable in the
|
||
settled plan. Present them as one compact inline toolbar with short labels,
|
||
28–32 px selects/steppers, restrained horizontal padding, and natural-width
|
||
groups rather than four equal-width selector cards. Do not hide the controls
|
||
behind `调整`, a disclosure, modal, popover, or drawer.
|
||
- Keep the change within existing Renderer/store contracts. Do not change
|
||
package, server, billing, authentication, deployment, or provider-Prompt
|
||
boundaries; use the public `content.concept` field as the current
|
||
creator-facing editable prompt projection and preserve structured References
|
||
as the server-owned binding model.
|
||
|
||
## Outcome
|
||
|
||
- Inspected the reference project's source and live `/create` interaction. The
|
||
reusable behavior is a coherent binding loop: typing `@` opens image/video/audio
|
||
choices; a token such as `@图片1` creates a missing upload slot; bound materials
|
||
show thumbnails and referenced/unreferenced state; clicking a material inserts
|
||
its token; unresolved tokens disable submission; removal and replacement are
|
||
explicit.
|
||
- Compared that behavior with Makelore's current Reference model and UI. Makelore
|
||
already has the stronger durable data model (`reference.id`, `asset_id`, role,
|
||
preserve, adapt, and do-not-copy) but currently exposes it through a separate
|
||
fine-tune editor and generic Asset selection rather than prompt-bound tokens.
|
||
- Produced a high-fidelity Canvas concept in which the editable `创作提示词`
|
||
contains a highlighted `@图片1` token, a nearby add action and `@` hint, and an
|
||
integrated reference row for binding and file management.
|
||
- Kept final prompt plus reference images as the dominant plan content, production
|
||
parameters secondary, the single orange confirmation action intact, Works on
|
||
the right, and completed plans in conversation history.
|
||
- Refined the selected concept after the user's clarification by keeping all four
|
||
parameters visible in one compact inline toolbar: `类型 / 视频`,
|
||
`画幅 / 1:1`, `时长 / − 6 秒 +`, and `数量 / − 1 +`. Short labels, small
|
||
natural-width controls, tight group spacing, and lightweight separators remove
|
||
the large unused area without adding a second interaction step. Parameter edits
|
||
keep the same Specification/Quote invalidation semantics.
|
||
- Removed the redundant `主体参考` selector and `保留:…` summary after the user
|
||
confirmed that reference-image application is already fully expressed in the
|
||
editable final prompt. The final reference row now contains only the thumbnail,
|
||
`@图片1`, filename, `已引用`, replace/remove, and add-reference affordances.
|
||
- Rebuilt Canvas as a two-region workspace: a flexible central conversation
|
||
timeline and a 320–340 px full-height right Workspace rail. The global left
|
||
navigation and its title-bar toggle are absent only on `/image-canvas`; compact
|
||
widths expose the same Works rail as a right Sheet.
|
||
- Moved the only active `制作方案` into the conversation timeline. Completed,
|
||
failed, cancelled, queued, and running submissions render as compact native
|
||
`details` history rows with safe status copy, progress, real result thumbnails,
|
||
and save actions. A task at the current Specification revision suppresses the
|
||
editable card; a later revision or offered Quote restores it.
|
||
- Made the creator-facing `content.concept` projection a directly editable
|
||
`创作提示词`. Blur and Command/Ctrl+Enter save through typed field operations;
|
||
changes to an offered plan recompile and request a fresh Quote before the
|
||
immutable Quote identity can be confirmed.
|
||
- Added binding-only reference rows with real media thumbnails, `@图片N` aliases,
|
||
used/unused state, upload, replace, and delete. Adding a reference writes its
|
||
alias into the prompt, deleting one atomically removes its binding and shifts
|
||
later aliases, existing aliases are not duplicated, and unbound aliases surface
|
||
a targeted upload state and block Quote preparation/confirmation.
|
||
- Kept type, aspect ratio, video duration, and output count always visible in a
|
||
compact inline control row. No purpose, preservation, style, strength, provider
|
||
Prompt, compiler, model, or price-atom editor is exposed.
|
||
- Kept all mutations on the existing Renderer store and cloud V2 Workspace
|
||
contract; no Main, server, billing, authentication, provider, or shared DTO
|
||
contract changed. Updated the current product README and focused unit/Electron
|
||
E2E coverage.
|
||
|
||
## Verification
|
||
|
||
- Inspected the live reference-project states with the Codex in-app browser from
|
||
a local Next development server. Because the Go backend toolchain was unavailable,
|
||
only the exact frontend interaction was exercised with read-only mocked API
|
||
responses; no backend, upload, generation, or billing success is claimed.
|
||
- Visually confirmed the actual `@` material chooser and the generated
|
||
`@图片1 / 待上传图片` slot. Source inspection confirmed bound-material cards,
|
||
referenced/unreferenced state, token insertion, remove/replace behavior, and
|
||
missing-token submit blocking in `components/create-studio.tsx` and
|
||
`lib/prompt/*`.
|
||
- Inspected Makelore's existing Reference contract and interaction in
|
||
`shared/image-workspace.ts`, `YouthCreationCard.tsx`, `FineTuneDrawer.tsx`, and
|
||
`DesignProductionPanel.tsx`.
|
||
- Generated and visually inspected the revised preview:
|
||
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-46874d08-313b-464f-9c6e-d1aa379776e0.png`.
|
||
- Generated and visually inspected the compact-parameter refinement:
|
||
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-f59836fe-b044-4a96-a8fd-df7723c2a7d0.png`.
|
||
- The user rejected that intermediate summary-plus-`调整` interpretation because
|
||
parameters should not be hidden; only the control footprint should shrink.
|
||
- Generated and visually inspected the corrected direct-control refinement:
|
||
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-79c481ff-a5f3-4d45-bac3-21e91066086d.png`.
|
||
- Confirmed that the corrected frame keeps type, aspect ratio, duration, and count
|
||
immediately editable; removes the `调整` affordance and hidden editor; uses
|
||
compact selects/steppers with limited padding; preserves the editable prompt
|
||
and reference binding as the dominant content; keeps Works full-height on the
|
||
right; and retains exactly one orange primary action.
|
||
- Generated and visually inspected the reference-row simplification:
|
||
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-5330c387-e4eb-48c6-a289-8cf0be448c86.png`.
|
||
- Confirmed that the final prompt is now the only visible place describing how
|
||
`@图片1` affects generation, while the reference row exposes only binding and
|
||
file-management state. No role, preserve, style, weight, or strength control
|
||
remains, and all previously selected layout constraints are preserved.
|
||
- Confirmed the preview retains the selected layout and makes the visible
|
||
token-to-thumbnail relationship and replacement affordances legible without
|
||
adding a new permanent panel or a second instruction source.
|
||
- Implementation Design QA compared the selected source and two native CUA
|
||
implementation states in one combined image. The first pass found a P2 lifecycle
|
||
mismatch: an old succeeded task caused a current offered plan to show `已完成`.
|
||
Status precedence and readiness copy were fixed; the second pass had no
|
||
remaining P0/P1/P2 finding. See `design-qa.md` (`final result: passed`).
|
||
- `pnpm run typecheck`: passed after the final source changes.
|
||
- `pnpm run lint:check`: passed with five pre-existing warnings in Home and
|
||
Makelore pages; no errors and no warning in changed files.
|
||
- Focused Vitest: 5 files / 50 tests passed after the final shell/title-bar revision;
|
||
the final reference-token/card run passed 2 files / 17 tests, including
|
||
unbound-token blocking and no-duplicate binding.
|
||
- `pnpm run build:vite`: passed after the final source changes. Existing dynamic
|
||
import and large-chunk warnings remain unchanged.
|
||
- Full `pnpm test -- --run`: 220 files / 1846 tests passed, 3 skipped; 2 unrelated
|
||
Pi suites failed because the fresh worktree lacks the top-level
|
||
`node_modules/@earendil-works/pi-ai` link even though the package exists in the
|
||
pnpm store. The six failing real-process tests and one import failure do not
|
||
touch Canvas code.
|
||
- Electron E2E was updated for the right rail, compact responsive Sheet, inline
|
||
prompt/parameters, Quote confirmation, and history collapse. It was not run in
|
||
this turn because Product Design browser policy requires an explicitly selected
|
||
browser before invoking Playwright CLI; TypeScript and ESLint validated the spec.
|
||
|
||
## Follow-ups
|
||
|
||
- If the service adds a stable Workspace-summary cover field, use it to replace
|
||
the intentional generic icon fallback for non-current right-rail items.
|
||
- If the service adds reference-count/media capabilities, project those limits
|
||
into the add/upload affordance without introducing a client constant.
|
||
- A future service contract may formalize the creator-facing prompt separately;
|
||
until then `content.concept` remains the public editable projection and the
|
||
provider Prompt remains private.
|
||
- Decide whether chat-attached images enter References automatically as proposals
|
||
or remain uploaded Assets until the user/AI explicitly inserts and binds their
|
||
prompt token; in either case the server reducer must remain authoritative.
|
||
|
||
## Promotion Candidates
|
||
|
||
- Target: ADR-007 presentation guidance, Canvas current-state documentation, the
|
||
shared Canvas contract, and generation-plan/reference-image interaction rules.
|
||
- Proposal: the active Canvas plan card combines the creator-facing final prompt
|
||
with its public Reference bindings. The editor displays youth-readable
|
||
`@图片N` aliases backed by stable server-owned Reference and Asset identities.
|
||
Typing `@` selects existing images or upload; unresolved aliases create
|
||
targeted missing-image slots and block Quote availability; bound references
|
||
expose only thumbnail, alias, filename, binding state, replace, and remove.
|
||
The final prompt is the sole creator-facing place that specifies how each
|
||
reference affects generation; the row must not duplicate purpose,
|
||
preservation, style, strength, weight, or other instructions.
|
||
Production parameters remain directly visible and editable in a compact
|
||
inline toolbar rather than equal-width selector cards or an on-demand editor.
|
||
Prompt, reference, or parameter edits produce a new Specification revision
|
||
and a new Quote. Confirmed revisions collapse into chronological task history.
|
||
The maximum reference count and media types are service capabilities rather
|
||
than client constants. Provider compilation remains private.
|
||
- Evidence: the user's explicit direction to borrow the pure-AIGC reference
|
||
interaction; inspected live states and source in `zhinianAIGC`; Makelore's
|
||
current Reference DTO/UI; ADR-007; and the inspected revised concept.
|
||
- Future impact: a future service may formalize token serialization and a
|
||
dedicated creator-facing prompt field, while keeping provider compilation
|
||
private. Future UI must not keep raw ordinal text as the binding authority,
|
||
permit confirmation with a missing token, duplicate reference
|
||
instructions outside the prompt, grow a competing permanent Asset column,
|
||
hide routine parameters behind disclosure, or restore high-whitespace
|
||
parameter cards to the settled plan.
|
||
- Semantic conflicts: the current public Reference DTO includes role, preserve,
|
||
adapt, and do-not-copy fields. Exposing those as separate editable controls
|
||
would conflict with the user's confirmed single-source interaction. The
|
||
implementation preserves these existing values for service compatibility but
|
||
does not expose them as a second creator-facing authority; any future contract
|
||
revision should make their derived status explicit.
|
||
Client-only token parsing as semantic authority or exposure of provider Prompt
|
||
would still conflict with ADR-007 and is explicitly rejected. The shipped UI
|
||
uses aliases only as creator-facing display while stable Reference/Asset ids
|
||
remain in the existing Specification operations.
|
||
- Human confirmation: the user explicitly confirmed implementation of the
|
||
right Works rail, inline plan, editable final prompt, compact direct parameters,
|
||
and binding-only reference row. Any future public contract change still needs
|
||
coordinated product/service review.
|