A while back I ran a desktop tamagotchi through Groundwork's requirements workflow and wrote down everything it got wrong. This is the re-run — same pet, same prompt, after building the fixes.

In the first Groundwork dev log I pointed the plugin's requirements workflow at a desktop tamagotchi and let it run. Then I wrote down everything the output was missing. That list of complaints wasn't really a review — it was a backlog. This post is what happened after I built it.
Same pet. Same starting prompt. Here's the before and after.
Every gap I flagged in the first post, and where it stands now:
| What the first run missed | Status | How |
|---|---|---|
| Functional reqs were free-form bullets, no EARS | ✅ closed | 10 FRs, each a single EARS sentence with a declared pattern |
| The entire non-functional side was absent | ✅ closed | 7 ISO 25010 quality-attribute-scenario NFRs |
| Error paths, retention, accessibility, ops never came up | ✅ closed | An error-path FR, plus accessibility, local-data, and ops-logging NFRs |
| Acceptance criteria weren't Given/When/Then | ✅ closed | Every FR carries Gherkin AC, including negative scenarios |
| No assumptions written down | ✅ closed | A dedicated assumptions.md (assumptions, dependencies, open questions) |
| No self-critique / vague-word lint | ✅ closed | A content linter runs over the whole set |
| The Electron footprint choice slipped through | ✅ closed | Surfaced as an NFR + a constraint + an open question, flagged for review |
Seven for seven. But the last row is the one that actually matters, so I'll come back to it.
The gaps sorted themselves into a handful of pieces, which became the M1 milestone:
and/or gluing two behaviors together), EARS non-conformance, passive voice that hides the actor, and implementation bias leaking into high-tier requirements. It's advisory — it feeds the critic and the human, it doesn't silently rewrite.Same tamagotchi. The pipeline produced 22 atomic requirements — 10 functional, 7 non-functional, 3 constraints, 2 business rules — plus the assumptions file and a machine index.
Two gates ran over the result:
The first run gave me a page of bullets. This one gives me a validated, traceable set I could hand to an architect.
Here's the thing that actually sold me on the whole exercise.
In the original build, the plugin waved me toward Electron, I took it, and I later ripped it out for Tauri because the footprint was wrong for an always-on desktop pet. That switch cost real time. The requirements never flagged it — footprint just wasn't a thing the process thought about.
This time, the footprint question is impossible to miss. It shows up in three places, all pointing at the same decision.
NFR-002 turns it into a testable budget, written as a quality-attribute scenario:
NFR-002 — Idle CPU and memory footprint budget · Performance Efficiency → Resource Utilization · priority: must · confidence: low
While running idle in the background, the application process shall consume no more than the defined CPU and resident-memory budget on the reference machine.
Response measure: Over a 10-minute idle window, average CPU utilization is ≤ 1% of one core and resident memory is ≤ 150 MB, sampled at 1-second intervals.
Rationale: The app is always-on and competes with the user's real work for resources; an ambient companion that noticeably heats the fan or eats hundreds of megabytes of RAM will be uninstalled, so a hard idle budget is central to the product's viability and directly gates the runtime/framework choice (Q-4). The exact budget numbers depend on the framework selected, so this target is held at low confidence until that decision is made.
CON-001 records the same thing as a hard boundary. And Q-4 in the assumptions file states the actual decision out loud:
Q-4: Which framework/runtime is chosen given the footprint constraint (Electron vs Tauri vs native)? (owner: engineering)
Because NFR-002 and CON-001 are both low-confidence, they land in the review queue with their reasons attached — alongside three other items whose uncertainty traces back to a different unanswered question:
review_queue:
- id: FR-008
confidence: low
reason: "rests on open question Q-2 (is death permanent or a configurable soft reset)"
- id: NFR-002
confidence: low
reason: "idle-footprint budget depends on open question Q-4 (framework/runtime choice: Electron vs Tauri vs native)"
- id: CON-001
confidence: low
reason: "runtime footprint boundary rests on open question Q-4 (framework/runtime choice)"
- id: CON-003
confidence: low
reason: "cross-platform delivery scope rests on open question Q-3 (which platforms ship in v1)"
- id: BR-001
confidence: low
reason: "death/reset policy rests on open question Q-2 (death permanence)"The workflow doesn't pretend to know the answer. It states the requirement, admits the uncertainty, and puts the framework decision in front of me before anyone writes code. That's exactly the decision I got wrong the first time by not making it a decision at all.
The previously-missing error path is now a first-class requirement, and it's a nice showcase of the EARS "unwanted" pattern plus Gherkin acceptance criteria — including the negative scenario that the first run never thought to write:
FR-010 — Recover from corrupted or missing save file · unwanted · priority: must · confidence: high
If the saved state file is missing or fails integrity validation on load, then the system shall start a new pet from default values without terminating.
AC-2 — Corrupted save file is quarantined, not loaded
Given a saved state file whose integrity check fails
When the application starts
Then the application starts a new default pet
And the unreadable file is retained under a quarantine name for diagnosticsFit criterion: For an absent save file and for a deliberately corrupted save file, the application launches to a valid default pet in 100% of trials, exits 0, and retains the unreadable file under a quarantine name for diagnostics.
The full generated set — all 22 requirements, the assumptions file, and the review queue — is consolidated into a single readable document: CONSOLIDATED.md. The raw atomic files, plus the README on how to re-run the validators, live in docs/requirements/examples/tamagotchi/.
It's still an LLM writing requirements, and I want to be straight about what that means:
M1 — the requirements stage — is done. Next up is M2: turning a validated requirement set like this one into an architecture (component decomposition, interface design, ADRs, C4 diagrams) with the same discipline. The tamagotchi will be the guinea pig again.