Proposal: task management#760
Open
ThisIsMani wants to merge 5 commits intojuspay:masterfrom
Open
Conversation
Adds proposal 0001 — a thin opt-in layer above terminals so a
developer's intent ("fix the auth bug", "learn about CRDTs") can
persist independently of any process. Three layers — Project, Task,
Terminal — with user-defined kanban boards per project, persisted as
plain markdown that mirrors the obsidian-kanban format.
The principle ("Kolu has agency over IO; Kolu has no agency over
semantics") is what keeps the feature small: Kolu reads, parses, and
writes the user's task data on user action — never autonomously,
never inferred from agent state, never derived from terminal exit.
Includes a sibling HTML mockup at
docs/proposals/0001-task-management/ showing four proposed Kolu
surfaces (per-project board, cross-project list, terminal canvas
with task tags, creation UI with palette modal + per-lane inline
add) and one explanation-only view (raw markdown side-by-side with
the rendered board, included to make the file format concrete — not
a proposed Kolu surface).
Status: draft. Several open questions (default lanes on first
project, "No Project" UX in the project picker, completion-timestamp
visual treatment) call for directional feedback before promoting to
accepted.
_Generated by [\`/do\`](https://github.com/srid/agency) on Claude
Code (model \`claude-opus-4-7\`)._
This comment was marked as off-topic.
This comment was marked as off-topic.
…lifecycle Folds in the architectural and UX decisions from a follow-up talk-mode session structurally reviewed by both Lowy and Hickey lenses. **Navigation.** Adds an explicit Navigation subsection: two top-level routes (`/` for the workspace, `/projects/<id>` for a project board). Project addressing uses the existing UUID `id` directly — no URL-friendly `slug` field; rejected because slug-collisions force fallback to UUID, meaning UUID was always the identity. Project navigation lives entirely in the URL; `preferences.activeProject` is explicitly rejected to prevent two stores claiming the same fact. Mobile swipe (per juspay#622) is preserved as a gesture layer that calls `navigate()` rather than a parallel navigation stack. **Card interactions.** Cards become self-sufficient — five affordances on each card (drag, click-title, click-description, click-pill, click-✕) with no detail view, modal-on-click, or drawer. Long descriptions collapse by heuristic with session-only state — never persisted to markdown or preferences. **Project lifecycle.** Palette → CreateProjectModal / EditProjectModal (deliberately separate components sharing only a stateless ProjectForm). Archive is the in-app affordance; project deletion stays a manual filesystem operation. **Task lifecycle.** Inline edit primary, palette EditTaskModal as a keyboard-only secondary path. Delete is anchored to the card's ✕ because Cmd+K has no notion of "this task right here." **Implementation notes** add the router prerequisite, the card-as-layout-shell pattern, and the session-only collapse-state guidance. **Alternatives considered** records six rejected shapes (slug, preferences-driven navigation, card detail view, single create+edit modal, persisted collapse, right-click menu). **Out of scope** records persisted collapse state, in-app project deletion, and drag-to-trash zones. Proposal grows 222 → 288 lines. Status remains *draft* — the open questions on default lanes, "No Project" UX, and completion-timestamp visual treatment are unchanged. _Generated by [\`/do\`](https://github.com/srid/agency) on Claude Code (model \`claude-opus-4-7\`)._
This comment was marked as off-topic.
This comment was marked as off-topic.
Catches the visual prototype up to the prose. Card affordances added in afb590f (✕ delete in card top-right, ▸ collapse chevron for long descriptions) are now visible in the per-project board mockup. - Each card on the kanban view gains a small ✕ in the top-right (low opacity by default; full-strength on hover; turns red on focus). On click in the live UI this opens DeleteTaskConfirm. - One new card in the Todo lane ("Investigate dropped frames in scrollback") carries a long description and renders in collapsed state with a ▸ show more chevron — demonstrates the collapse-by-heuristic, session-only state. - The on-disk markdown panel grows to match (the new task appears as a `- [ ]` entry with the same long description). - Mini-cards in the Creation UI view (section 04) get the ✕ for consistency. - The "What's shown" legend explains both new affordances. The Prototype section of the proposal markdown gains a one-line note on view 1 calling out the ✕ and chevron. _Generated by [\`/do\`](https://github.com/srid/agency) on Claude Code (model \`claude-opus-4-7\`)._
…hema/migrations
Folds in the design decisions from a third lowy/hickey-reviewed
discussion. The Task schema collapses; routes get a third entry;
Implementation notes pick up a Schema and migrations note.
**Single timestamp.** `Task` shrinks to
`{ id, projectId, name, description?, updatedAt }`. `createdAt` and
`completedAt` are gone as stored fields:
- `createdAt` isn't recoverable from markdown after lane moves —
we'd be lying about precision the source can't back up.
- `completedAt` is a derivation: *if the task's current lane has
the `complete` role, `updatedAt` is the completion time;
otherwise the task isn't done.* Storing it independently invited
drift. First-completion-immutable semantics are deliberately
dropped — moving a task back through Done re-stamps `updatedAt`
rather than preserving the original completion date.
`updatedAt` is named "last meaningful interaction": bumped on lane
move, title edit, or description edit. *Not* bumped on
drag-to-reorder within the same lane (reordering is presentation,
not content).
**`/tasks` route.** Added as the third top-level route alongside
`/` and `/projects/<id>`. The cross-project view's URL is no
longer implicit.
**Storage.** The on-disk markdown sample now shows `@{YYYY-MM-DD}`
on every task line (not just the Done ones). The annotation IS
`updatedAt`. Conventions explain auto-heal on hand-edit deletion.
**Schema and migrations.** New Implementation-notes bullet:
parsed boards validated through Zod schemas (`TaskSchema`,
`LaneSchema`, `BoardSchema`) following the discipline of
`PersistedStateSchema` at packages/server/src/state.ts:34-39.
`kolu-board: v1` is the version handle; bumping to v2 means a
`migrateBoardFromV1ToV2` runner. Schema home (client vs.
kolu-common) is left to the implementer following the
`PersistedStateSchema` rule of own-where-owned.
**Out of scope** picks up first-completion-immutable timestamps
(deliberate drop, with the trade explained), cycle-time analytics,
and per-task version fields.
**Alternatives considered** records two more rejected shapes —
stored `createdAt`/`completedAt` fields, and the
`<!-- ^id c=… u=… d=… -->` triplet that an earlier round
considered before the single-`updatedAt` model landed.
**Mockup catches up.** Each frame's chrome gains a faux URL bar
showing the route it lives at (`/projects/<id>`, `/tasks`, `/`).
Each kanban card carries an `@{YYYY-MM-DD}` chip. The on-disk
markdown panel shows the annotation on every task.
_Generated by [\`/do\`](https://github.com/srid/agency) on Claude
Code (model \`claude-opus-4-7\`)._
This comment was marked as off-topic.
This comment was marked as off-topic.
Member
|
[Discussion on |
Sibling refinement under docs/proposals/0001-task-management/ proposing a smaller surface for the same user need: pill-tree-on-hover becomes a two-lane kanban (Backlog + Active) backed by one Task concept persisted in the JSON state file. Cuts the Project layer, the markdown substrate, and user-defined lanes; keeps "queued + live work in one surface" and the IO-not-semantics principle.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Mockup preview
Proposal preview
Adds proposal 0001 — a thin opt-in layer above terminals so a developer's intent ("fix the auth bug", "learn about CRDTs") can persist independently of any process. Three layers — Project, Task, Terminal — with user-defined kanban boards per project, persisted as plain markdown that mirrors the obsidian-kanban format.
The principle that keeps the feature small: Kolu has agency over IO; Kolu has no agency over semantics. Kolu reads, parses, and writes the user's task data on user action — never autonomously, never inferred from agent state, never derived from terminal exit. The user is the brain; Kolu is the hands.
A sibling HTML mockup makes the design concrete: four proposed Kolu surfaces (per-project board, cross-project list, terminal canvas with task tags, and a creation UI with both a palette modal and a per-lane inline `+ add`) plus one explanation-only view (raw markdown side-by-side with the rendered board, included so reviewers can see the file format — not itself a proposed Kolu surface).
Why
This is a new user-facing feature, so per `CONTRIBUTING.md` it needs a merged proposal before any implementation PR. Opening as a draft because three open questions still want directional feedback before promotion to accepted: default lanes on first project creation, "No Project" UX in the project picker, and visual treatment of completion-timestamp annotations.
Type of change
Generated by `/do` on Claude Code (model `claude-opus-4-7`).