Skip to content

Commit 0e3897f

Browse files
Uarmaganclaude
andauthored
Week timed-event overlap deck cleanup and verification (#1816)
* feat(web): timed event overlap cascade plus calendar event targeting Stack overlapping Week View timed events as right-anchored cards rather than equal-width columns. The back card keeps the full column width; overlays cascade as narrow cards stepped right, with the frontmost card lifted by a stronger shadow. - Add computeTimedOverlapLayout helper and TimedOverlapLayout type - Right-anchor overlays with telescoping middle cards and a min width floor - Mark the highest-z card per overlap group as isFrontmost for shadow tuning - Wire layout into MainGridEvents and GridEvent with border, padding and shadow - Add calendarEventTargeting helper and Week shortcuts to focus/edit events - Extract Week shortcut section data into weekShortcutSections - Label timed and all-day grids with role/aria-label for region accessibility - Tests for overlap layout, calendar targeting, shortcuts and accessibility * fix(web): remove week timed event stacking * docs: add week grid progress writeup * feat(web): add keyboard draft movement * feat(web): deck layout for overlapping week timed events Render overlapping same-day Week timed events as a left-anchored deck: uniform-width cards fanned right by a fixed indent, each card's top edge equal to its true start time. Replaces the fully-stacked "blob". - Add additive position.deck field; presence switches position math into Deck mode and leaves Day equal-split, single events, all-day, and drafts untouched. - New pure util applyWeekTimedOverlapLayout: per-day bucketing, transitive overlap groups, background-first ordering. Wired into selectGridEvents only. - Deck geometry in position.util: uniform width (floored at DECK_MIN_WIDTH), left indent, zIndex order+1; getEventPosition gains optional zIndex. - GridEvent: gutter ring + downward shadow + top highlight on deck cards, time-label width gate, and float-above-deck z-index for the clicked/edited draft, dragged, resized, or keyboard-focused card so buried events surface. - Delete the throwaway /prototype/overlap route and view. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore: add design/prototype/handoff skills and lockfile updates Skill tooling used during the overlap layout exploration (design-taste-frontend, prototype, handoff) plus the improve-codebase report and skills-lock refresh. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(web): harden week deck overlap layout * chore(web): trim week overlap cleanup * fix(web): stabilize week e2e overlap checks * refactor(web): clean week event editing * fix(web): move active drafts with arrow keys * chore: update agent skills * Increase timed overlap spacing for stacked events * fix(web): tighten event form and overlap layout --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 3771d24 commit 0e3897f

58 files changed

Lines changed: 4432 additions & 443 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/design-taste-frontend/SKILL.md

Lines changed: 1206 additions & 0 deletions
Large diffs are not rendered by default.

.agents/skills/handoff/SKILL.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
name: handoff
3+
description: Compact the current conversation into a handoff document for another agent to pick up.
4+
argument-hint: "What will the next session be used for?"
5+
---
6+
7+
Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS - not the current workspace.
8+
9+
Include a "suggested skills" section in the document, which suggests skills that the agent should invoke.
10+
11+
Do not duplicate content already captured in other artifacts (PRDs, plans, ADRs, issues, commits, diffs). Reference them by path or URL instead.
12+
13+
Redact any sensitive information, such as API keys, passwords, or personally identifiable information.
14+
15+
If the user passed arguments, treat them as a description of what the next session will focus on and tailor the doc accordingly.
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# HTML Report Format
2+
3+
The architectural review is rendered as a single self-contained HTML file in the OS temp directory. Tailwind and Mermaid both come from CDNs. Mermaid handles graph-shaped diagrams reliably; hand-built divs and inline SVG handle the more editorial visuals (mass diagrams, cross-sections). Mix the two — don't lean on Mermaid for everything, it'll start to look generic.
4+
5+
## Scaffold
6+
7+
```html
8+
<!doctype html>
9+
<html lang="en">
10+
<head>
11+
<meta charset="utf-8" />
12+
<title>Architecture review — {{repo name}}</title>
13+
<script src="https://cdn.tailwindcss.com"></script>
14+
<script type="module">
15+
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
16+
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
17+
</script>
18+
<style>
19+
/* small custom layer for things Tailwind doesn't cover cleanly:
20+
dashed seam lines, hand-drawn-feeling arrow heads, etc. */
21+
.seam { stroke-dasharray: 4 4; }
22+
.leak { stroke: #dc2626; }
23+
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
24+
</style>
25+
</head>
26+
<body class="bg-stone-50 text-slate-900 font-sans">
27+
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
28+
<header>...</header>
29+
<section id="candidates" class="space-y-10">...</section>
30+
<section id="top-recommendation">...</section>
31+
</main>
32+
</body>
33+
</html>
34+
```
35+
36+
## Header
37+
38+
Repo name, date, and a compact legend: solid box = module, dashed line = seam, red arrow = leakage, thick dark box = deep module. No introduction paragraph — straight into the candidates.
39+
40+
## Candidate card
41+
42+
The diagrams carry the weight. Prose is sparse, plain, and uses the glossary terms ([LANGUAGE.md](LANGUAGE.md)) without ceremony.
43+
44+
Each candidate is one `<article>`:
45+
46+
- **Title** — short, names the deepening (e.g. "Collapse the Order intake pipeline").
47+
- **Badge row** — recommendation strength (`Strong` = emerald, `Worth exploring` = amber, `Speculative` = slate), plus a tag for the dependency category (`in-process`, `local-substitutable`, `ports & adapters`, `mock`).
48+
- **Files** — monospaced list, `font-mono text-sm`.
49+
- **Before / After diagram** — the centrepiece. Two columns, side by side. See patterns below.
50+
- **Problem** — one sentence. What hurts.
51+
- **Solution** — one sentence. What changes.
52+
- **Wins** — bullets, ≤6 words each. e.g. "Tests hit one interface", "Pricing logic stops leaking", "Delete 4 shallow wrappers".
53+
- **ADR callout** (if applicable) — one line in an amber-tinted box.
54+
55+
No paragraphs of explanation. If the diagram needs a paragraph to be understood, redraw the diagram.
56+
57+
## Diagram patterns
58+
59+
Pick the pattern that fits the candidate. Mix them. Don't make every diagram look the same — variety is part of the point.
60+
61+
### Mermaid graph (the workhorse for dependencies / call flow)
62+
63+
Use a Mermaid `flowchart` or `graph` when the point is "X calls Y calls Z, and look at the mess." Wrap it in a Tailwind-styled card so it doesn't feel parachuted in. Style with classDef to colour leakage edges red and the deep module dark. Sequence diagrams work well for "before: 6 round-trips; after: 1."
64+
65+
```html
66+
<div class="rounded-lg border border-slate-200 bg-white p-4">
67+
<pre class="mermaid">
68+
flowchart LR
69+
A[OrderHandler] --> B[OrderValidator]
70+
B --> C[OrderRepo]
71+
C -.leak.-> D[PricingClient]
72+
classDef leak stroke:#dc2626,stroke-width:2px;
73+
class C,D leak
74+
</pre>
75+
</div>
76+
```
77+
78+
### Hand-built boxes-and-arrows (when Mermaid's layout fights you)
79+
80+
Modules as `<div>`s with borders and labels. Arrows as inline SVG `<line>` or `<path>` elements positioned absolutely over a relative container. Reach for this when you want the "after" diagram to feel like one thick-bordered deep module with greyed-out internals — Mermaid won't render that with the right weight.
81+
82+
### Cross-section (good for layered shallowness)
83+
84+
Stack horizontal bands (`h-12 border-l-4`) to show layers a call passes through. Before: 6 thin layers each doing nothing. After: 1 thick band labelled with the consolidated responsibility.
85+
86+
### Mass diagram (good for "interface as wide as implementation")
87+
88+
Two rectangles per module — one for interface surface area, one for implementation. Before: interface rectangle is nearly as tall as the implementation rectangle (shallow). After: interface rectangle is short, implementation rectangle is tall (deep).
89+
90+
### Call-graph collapse
91+
92+
Before: a tree of function calls rendered as nested boxes. After: the same tree collapsed into one box, with the now-internal calls shown faded inside it.
93+
94+
## Style guidance
95+
96+
- Lean editorial, not corporate-dashboard. Generous whitespace. Serif optional for headings (`font-serif` works well with stone/slate).
97+
- Colour sparingly: one accent (emerald or indigo) plus red for leakage and amber for warnings.
98+
- Keep diagrams ~320px tall so before/after sits comfortably side by side without scrolling.
99+
- Use `text-xs uppercase tracking-wider` for module labels inside diagrams — they should read as schematic, not as UI.
100+
- The only scripts are the Tailwind CDN and the Mermaid ESM import. The report is otherwise static — no app code, no interactivity beyond Mermaid's own rendering.
101+
102+
## Top recommendation section
103+
104+
One larger card. Candidate name, one sentence on why, anchor link to its card. That's it.
105+
106+
## Tone
107+
108+
Plain English, concise — but the architectural nouns and verbs come straight from [LANGUAGE.md](LANGUAGE.md). Concision is not an excuse to drift.
109+
110+
**Use exactly:** module, interface, implementation, depth, deep, shallow, seam, adapter, leverage, locality.
111+
112+
**Never substitute:** component, service, unit (for module) · API, signature (for interface) · boundary (for seam) · layer, wrapper (for module, when you mean module).
113+
114+
**Phrasings that fit the style:**
115+
116+
- "Order intake module is shallow — interface nearly matches the implementation."
117+
- "Pricing leaks across the seam."
118+
- "Deepen: one interface, one place to test."
119+
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."
120+
121+
**Wins bullets** name the gain in glossary terms: *"locality: bugs concentrate in one module"*, *"leverage: one interface, N call sites"*, *"interface shrinks; implementation absorbs the wrappers"*. Don't write *"easier to maintain"* or *"cleaner code"* — those terms aren't in the glossary and don't earn their place.
122+
123+
No hedging, no throat-clearing, no "it's worth noting that…". If a sentence could be a bullet, make it a bullet. If a bullet could be cut, cut it. If a term isn't in [LANGUAGE.md](LANGUAGE.md), reach for one that is before inventing a new one.

.agents/skills/improve-codebase-architecture/SKILL.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,30 @@ Then use the Agent tool with `subagent_type=Explore` to walk the codebase. Don't
4444

4545
Apply the **deletion test** to anything you suspect is shallow: would deleting it concentrate complexity, or just move it? A "yes, concentrates" is the signal you want.
4646

47-
### 2. Present candidates
47+
### 2. Present candidates as an HTML report
4848

49-
Present a numbered list of deepening opportunities. For each candidate:
49+
Write a self-contained HTML file to the OS temp directory so nothing lands in the repo. Resolve the temp dir from `$TMPDIR`, falling back to `/tmp` (or `%TEMP%` on Windows), and write to `<tmpdir>/architecture-review-<timestamp>.html` so each run gets a fresh file. Open it for the user — `xdg-open <path>` on Linux, `open <path>` on macOS, `start <path>` on Windows — and tell them the absolute path.
50+
51+
The report uses **Tailwind via CDN** for layout and styling, and **Mermaid via CDN** for diagrams where a graph/flow/sequence reliably communicates the structure. Mix Mermaid with hand-crafted CSS/SVG visuals — use Mermaid when relationships are graph-shaped (call graphs, dependencies, sequences), and hand-built divs/SVG when you want something more editorial (mass diagrams, cross-sections, collapse animations). Each candidate gets a **before/after visualisation**. Be visual.
52+
53+
For each candidate, the same template as before, but rendered as a card:
5054

5155
- **Files** — which files/modules are involved
5256
- **Problem** — why the current architecture is causing friction
5357
- **Solution** — plain English description of what would change
54-
- **Benefits** — explained in terms of locality and leverage, and also in how tests would improve
58+
- **Benefits** — explained in terms of locality and leverage, and how tests would improve
59+
- **Before / After diagram** — side-by-side, custom-drawn, illustrating the shallowness and the deepening
60+
- **Recommendation strength** — one of `Strong`, `Worth exploring`, `Speculative`, rendered as a badge
61+
62+
End the report with a **Top recommendation** section: which candidate you'd tackle first and why.
5563

5664
**Use CONTEXT.md vocabulary for the domain, and [LANGUAGE.md](LANGUAGE.md) vocabulary for the architecture.** If `CONTEXT.md` defines "Order," talk about "the Order intake module" — not "the FooBarHandler," and not "the Order service."
5765

58-
**ADR conflicts**: if a candidate contradicts an existing ADR, only surface it when the friction is real enough to warrant revisiting the ADR. Mark it clearly (e.g. _"contradicts ADR-0007 — but worth reopening because…"_). Don't list every theoretical refactor an ADR forbids.
66+
**ADR conflicts**: if a candidate contradicts an existing ADR, only surface it when the friction is real enough to warrant revisiting the ADR. Mark it clearly in the card (e.g. a warning callout: _"contradicts ADR-0007 — but worth reopening because…"_). Don't list every theoretical refactor an ADR forbids.
67+
68+
See [HTML-REPORT.md](HTML-REPORT.md) for the full HTML scaffold, diagram patterns, and styling guidance.
5969

60-
Do NOT propose interfaces yet. Ask the user: "Which of these would you like to explore?"
70+
Do NOT propose interfaces yet. After the file is written, ask the user: "Which of these would you like to explore?"
6171

6272
### 3. Grilling loop
6373

.agents/skills/prototype/LOGIC.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# Logic Prototype
2+
3+
A tiny interactive terminal app that lets the user drive a state model by hand. Use this when the question is about **business logic, state transitions, or data shape** — the kind of thing that looks reasonable on paper but only feels wrong once you push it through real cases.
4+
5+
## When this is the right shape
6+
7+
- "I'm not sure if this state machine handles the edge case where X then Y."
8+
- "Does this data model actually let me represent the case where..."
9+
- "I want to feel out what the API should look like before writing it."
10+
- Anything where the user wants to **press buttons and watch state change**.
11+
12+
If the question is "what should this look like" — wrong branch. Use [UI.md](UI.md).
13+
14+
## Process
15+
16+
### 1. State the question
17+
18+
Before writing code, write down what state model and what question you're prototyping. One paragraph, in the prototype's README or a comment at the top of the file. A logic prototype that answers the wrong question is pure waste — make the question explicit so it can be checked later, whether the user is watching now or returning to it AFK.
19+
20+
### 2. Pick the language
21+
22+
Use whatever the host project uses. If the project has no obvious runtime (e.g. a docs repo), ask.
23+
24+
Match the project's existing conventions for tooling — don't add a new package manager or runtime just for the prototype.
25+
26+
### 3. Isolate the logic in a portable module
27+
28+
Put the actual logic — the bit that's answering the question — behind a small, pure interface that could be lifted out and dropped into the real codebase later. The TUI around it is throwaway; the logic module shouldn't be.
29+
30+
The right shape depends on the question:
31+
32+
- **A pure reducer**`(state, action) => state`. Good when actions are discrete events and state is a single value.
33+
- **A state machine** — explicit states and transitions. Good when "which actions are even legal right now" is part of the question.
34+
- **A small set of pure functions** over a plain data type. Good when there's no implicit current state — just transformations.
35+
- **A class or module with a clear method surface** when the logic genuinely owns ongoing internal state.
36+
37+
Pick whichever shape best fits the question being asked, *not* whichever is easiest to wire to a TUI. Keep it pure: no I/O, no terminal code, no `console.log` for control flow. The TUI imports it and calls into it; nothing flows the other direction.
38+
39+
This is what makes the prototype useful past its own lifetime. When the question's been answered, the validated reducer / machine / function set can be lifted into the real module — the TUI shell gets deleted.
40+
41+
### 4. Build the smallest TUI that exposes the state
42+
43+
Build it as a **lightweight TUI** — on every tick, clear the screen (`console.clear()` / `print("\033[2J\033[H")` / equivalent) and re-render the whole frame. The user should always see one stable view, not an ever-growing scrollback.
44+
45+
Each frame has two parts, in this order:
46+
47+
1. **Current state**, pretty-printed and diff-friendly (one field per line, or formatted JSON). Use **bold** for field names or section headers and **dim** for less important context (timestamps, IDs, derived values). Native ANSI escape codes are fine — `\x1b[1m` bold, `\x1b[2m` dim, `\x1b[0m` reset. No need to pull in a styling library unless one is already in the project.
48+
2. **Keyboard shortcuts**, listed at the bottom: `[a] add user [d] delete user [t] tick clock [q] quit`. Bold the key, dim the description, or vice-versa — whatever reads cleanly.
49+
50+
Behaviour:
51+
52+
1. **Initialise state** — a single in-memory object/struct. Render the first frame on start.
53+
2. **Read one keystroke (or one line)** at a time, dispatch to a handler that mutates state.
54+
3. **Re-render** the full frame after every action — don't append, replace.
55+
4. **Loop until quit.**
56+
57+
The whole frame should fit on one screen.
58+
59+
### 5. Make it runnable in one command
60+
61+
Add a script to the project's existing task runner (`package.json` scripts, `Makefile`, `justfile`, `pyproject.toml`). The user should run `pnpm run <prototype-name>` or equivalent — never need to remember a path.
62+
63+
If the host project has no task runner, just put the command at the top of the prototype's README.
64+
65+
### 6. Hand it over
66+
67+
Give the user the run command. They'll drive it themselves; the interesting moments are when they say "wait, that shouldn't be possible" or "huh, I assumed X would be different" — those are the bugs in the _idea_, which is the whole point. If they want new actions added, add them. Prototypes evolve.
68+
69+
### 7. Capture the answer
70+
71+
When the prototype has done its job, the answer to the question is the only thing worth keeping. If the user is around, ask what it taught them. If not, leave a `NOTES.md` next to the prototype so the answer can be filled in (or filled in by you, if you've watched the session) before the prototype gets deleted.
72+
73+
## Anti-patterns
74+
75+
- **Don't add tests.** A prototype that needs tests is no longer a prototype.
76+
- **Don't wire it to the real database.** Use an in-memory store unless the question is specifically about persistence.
77+
- **Don't generalise.** No "what if we wanted to support X later." The prototype answers one question.
78+
- **Don't blur the logic and the TUI together.** If the reducer / state machine references `console.log`, prompts, or terminal escape codes, it's no longer portable. Keep the TUI as a thin shell over a pure module.
79+
- **Don't ship the TUI shell into production.** The shell is optimised for being driven by hand from a terminal. The logic module behind it is the bit worth keeping.

.agents/skills/prototype/SKILL.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
name: prototype
3+
description: Build a throwaway prototype to flesh out a design before committing to it. Routes between two branches — a runnable terminal app for state/business-logic questions, or several radically different UI variations toggleable from one route. Use when the user wants to prototype, sanity-check a data model or state machine, mock up a UI, explore design options, or says "prototype this", "let me play with it", "try a few designs".
4+
---
5+
6+
# Prototype
7+
8+
A prototype is **throwaway code that answers a question**. The question decides the shape.
9+
10+
## Pick a branch
11+
12+
Identify which question is being answered — from the user's prompt, the surrounding code, or by asking if the user is around:
13+
14+
- **"Does this logic / state model feel right?"**[LOGIC.md](LOGIC.md). Build a tiny interactive terminal app that pushes the state machine through cases that are hard to reason about on paper.
15+
- **"What should this look like?"**[UI.md](UI.md). Generate several radically different UI variations on a single route, switchable via a URL search param and a floating bottom bar.
16+
17+
The two branches produce very different artifacts — getting this wrong wastes the whole prototype. If the question is genuinely ambiguous and the user isn't reachable, default to whichever branch better matches the surrounding code (a backend module → logic; a page or component → UI) and state the assumption at the top of the prototype.
18+
19+
## Rules that apply to both
20+
21+
1. **Throwaway from day one, and clearly marked as such.** Locate the prototype code close to where it will actually be used (next to the module or page it's prototyping for) so context is obvious — but name it so a casual reader can see it's a prototype, not production. For throwaway UI routes, obey whatever routing convention the project already uses; don't invent a new top-level structure.
22+
2. **One command to run.** Whatever the project's existing task runner supports — `pnpm <name>`, `python <path>`, `bun <path>`, etc. The user must be able to start it without thinking.
23+
3. **No persistence by default.** State lives in memory. Persistence is the thing the prototype is _checking_, not something it should depend on. If the question explicitly involves a database, hit a scratch DB or a local file with a clear "PROTOTYPE — wipe me" name.
24+
4. **Skip the polish.** No tests, no error handling beyond what makes the prototype _runnable_, no abstractions. The point is to learn something fast and then delete it.
25+
5. **Surface the state.** After every action (logic) or on every variant switch (UI), print or render the full relevant state so the user can see what changed.
26+
6. **Delete or absorb when done.** When the prototype has answered its question, either delete it or fold the validated decision into the real code — don't leave it rotting in the repo.
27+
28+
## When done
29+
30+
The _answer_ is the only thing worth keeping from a prototype. Capture it somewhere durable (commit message, ADR, issue, or a `NOTES.md` next to the prototype) along with the question it was answering. If the user is around, that capture is a quick conversation; if not, leave the placeholder so they (or you, on the next pass) can fill in the verdict before deleting the prototype.

0 commit comments

Comments
 (0)