Repository navigation
Description
Parent plan: #286.
Problem and evidence
P2. Stow has working quick packing but lacks the new-archive assembly workflow the user expects from ArcZip. This is more than adding a Welcome button. Native comparison on 2026-11-04 (Pacific/Honolulu), using one agent-created 37-byte text fixture:
| Step | ArcZip 1.2.1 (336) | Stow 0.1.4 (611) |
|---|---|---|
| New/Create command | Immediately opens an empty Untitled Archive.zip workspace | Command-N opens a source-file chooser |
| Assemble contents | Add Files, row selection, available Delete, title name/format editor; empty draft Save disabled | Chosen sources are passed to a Pack sheet; no Add/Remove sources control in that sheet |
| Configure output | Save opens Create Archive configuration: name, destination, purpose, format, compression, password and advanced options | Sentence tokens expose format/audience/password/splitting; name and More Options below; Pack… opens a destination chooser |
| Cancel configuration | Returns to the still-populated draft | Cancelling destination returns to Pack choices; cancelling Pack returns to Welcome |
| Close populated draft | Save / Discard / Cancel prompt | No equivalent editable new-archive draft exists |
ArcZip's advanced panel exposed Mac support files and split volumes. Some ArcZip options were Pro-gated; no Pro activation, protected-option verification or final compression is claimed. No archive was created in this UI comparison. The test draft was discarded and source file retained. This does not establish ArcZip's complete file-operation semantics.
Recommended functional design
- Introduce an explicit new archive draft state, initially empty and unsaved. Welcome Create Archive, File > New Archive (Command-N) and the Tray menu Create Archive route to the same workspace. Do not fabricate an already-open archive or create an empty ZIP on disk merely to obtain Browser UI.
- Support repeated Add Files and drag-in from different folders; show the draft's planned contents. Select/remove items without modifying source files. Define nested folder additions and duplicate/colliding archive paths explicitly, with existing safe name/conflict rules. Reuse existing navigation/selection semantics where valid, and provide Undo/Redo for draft changes.
- Name and format can be chosen before save; distinguish unsaved draft metadata from actual compressed size/encryption. Never display fictitious final bytes or claim encryption before successful output. Save/Create is disabled for an empty draft in this scope.
- Save opens one output configuration stage. Reuse
PackOptions, compatibility rules, format/password/split/metadata settings, destination authorization, collision handling, engine, progress and cancellation. Claude Code evaluates which current sentence tokens or explicit fields best expose these choices; preserving today's Pack sentence composition is not an acceptance requirement for this new surface. - Ensure name, destination and format are understandable before committing. Password confirmation/visibility, unsupported combinations, split naming, verification and output collisions preserve current functional guarantees. Changing format must reconcile its extension and unsupported options.
- Cancelling configuration/destination retains draft contents and applicable choices. Closing or replacing a changed draft offers Save / Discard / Cancel; failed/cancelled output leaves the draft recoverable and never truncates an existing destination. Successful creation transitions to the actual saved archive through the normal listing path, with no duplicate operation.
- Keep quick Pack for existing source collections (Tray, Finder/Services and ordinary-file drops). Do not force already-collected inputs through an empty draft. Both paths share options and packing engine; no second compression implementation.
- Keep security-scoped source access alive for the draft/operation. Handle source deletion/change, unreadable files, promised drops and asynchronous enumeration without disappearing rows or late callbacks resurrecting closed drafts. Do not pin passwords or unrestricted filesystem access into a draft persistence mechanism.
- Full UI opening from Tray-only mode belongs to the lifecycle coordinator. Avoid Welcome flashes and preserve existing Browser/Glance external-open choices.
Work division and acceptance
Codex / Grok Bot: draft model/state machine, source ownership, file reconciliation, shared packing path, undo/close/cancel guards, tests and functional controls. Claude Code: empty/populated draft layout, name/format editing, Add/Remove/Save hierarchy, configuration presentation and motion. First agree the observable states; optional compositions are not visual approval. This is a new workflow task, not a reopening of completed #153 Pack work.
Test empty→add→add→remove→undo; duplicate basenames/folders; save/cancel/retry; source mutation/revoked access; two New commands with an existing draft or edited archive; actual ZIP/7Z/password/split outputs as supported by existing functionality, verified through engine readback; quick-Pack regression; keyboard/IME and en/zh-Hans layouts. Record native paths actually exercised, independently of mocks and AX tests.
Ownership and delivery
Codex / Grok Bot owns functional state, routing, security, cancellation, errors, tests and accessibility semantics. Claude Code owns layout, hierarchy, copy presentation, materials and motion. Functional controls may be implemented before visual review. No collaborator session or visual approval is claimed; no unknown GitHub account is assigned. Preserve basic keyboard/focus access, meaningful names, Reduce Motion/Transparency and Increase Contrast; dedicated VoiceOver acceptance remains deferred under #93. Every new user-facing string needs zh-Hans. Run relevant tests, localization and generated-plist checks for implementation; coordinate installed/registered signed artifacts with the existing release owner (#32/#38).
Dependencies and integration
Supplies the shared New/Create route for #291 and #290. Coordinate draft lifetime and UI promotion with #289. Preserve the existing quick Pack engine/options delivered under #153.
Activity
skyswordw commentedon Nov 5, 2026
PR #295 adds
ArchiveDraftplus a minimal functionalArchiveDraftView/creation scene. Real imports are atomic, scoped and cancellable; colliding roots are numbered; subtree removal and Undo/Redo preserve sources. Save refreshes metadata and rejects missing/type-changed sources, then reuses PackSheet/engine options and publication. Cancel/failure retains the draft; success opens the real output. Native checks covered Add, Remove/Undo, Command-S, config cancel retaining name/files, unsaved-close Cancel, and actual ZIP creation/readback. Claude Code can now design the draft/configuration surface on this model; preserving the current Pack sentence or plain list composition is not required.Implementation: #295
Functional handoff: https://github.com/Beastry/stow/blob/codex/tray-functional-followups/Handoff/286-functional-followups.md
skyswordw commentedon Nov 5, 2026
Claude Code's visual/motion design for the draft workspace is in PR #297, stacked on #295. This is a design delivery, not functional acceptance. Codex / Grok Bot still own the draft model, routing, security, cancellation and tests, and this issue stays open for them.
Draft window. The heading shows the format's icon, the name as an inline title field, and the extension as a Pack-style token (
.zip ⌄) that picks the format. Under it: "Not saved yet · N items · X before compression". That's the originals' size, with no final-size or encryption claim. Save… sits at the trailing edge and is only prominent once the draft has contents. While the draft is empty, the drop card's Add Files… is the prominent button.The contents card is the drop target, like the Tray and Welcome. Filled, it's a native outline of the real files: Finder icons, collision-numbered names, folder item counts. Add Files… and Remove sit in a bar under the list, and failures show in a dismissible problem card.
Save sheet (draft only). It starts with the resulting file name, then a short form: Name, Format, For, Password, Where (the suggested folder, confirmed in the existing chooser next). The report, More Options, estimate and engine path are unchanged. Quick Pack keeps its sentence unchanged.
Behaviour changes (listed in the PR):
draft.problem.Verified:
draft-empty,draftanddraft-savescenes.Not verified:
Merge pull request #297 from Beastry/claude/293-draft-design-f53903
skyswordw commentedon Nov 6, 2026
Delivered by #295 and #297, with copy refinement in #300. The editable real-source draft supports add/remove/subtree/undo, collision names, format/name configuration, cancellation, guarded close and shared packing. Review additionally fixed leaked Save-and-Quit intent and stale global draft retries (ae3547d, 7de295e). In the integrated ad-hoc app, Add Files → Remove → Undo → Save → Cancel preserved name/files; subsequent Save created a real ZIP and opened it in Browser. Independent ZIP reading verified the exact original bytes and single expected path. Closing this workflow implementation; broader signed/source-revocation/physical-drop matrices remain in #38.
Validation for the integrated #295–#300 tree: 687 tests in 102 suites passed, zero failures/skips; localization export found 0/1,261 missing zh-Hans strings; generated plists are unchanged. Codex reviewed functional state/routing/security; Claude Code owns the visual/motion work in the linked design PRs. Native checks below used an isolated ad-hoc bundle without Finder/Quick Look plugins and are CUA/AX evidence, not VoiceOver testing. Signed/system-wide acceptance remains in #38/#32; #93 remains deferred and open.