prjct-cli 3.46.0 → 3.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,327 +0,0 @@
1
- # Storage Specification
2
-
3
- **Canonical specification for prjct storage format.**
4
-
5
- All storage is managed by the `prjct` CLI which uses SQLite (`prjct.db`) internally. **NEVER read or write JSON storage files directly. Use `prjct` CLI commands for all storage operations.**
6
-
7
- ---
8
-
9
- ## Current Storage: SQLite (prjct.db)
10
-
11
- All reads and writes go through the `prjct` CLI, which manages a SQLite database (`prjct.db`) with WAL mode for safe concurrent access.
12
-
13
- ```
14
- ~/.prjct-cli/projects/{projectId}/
15
- ├── prjct.db # SQLite database (SOURCE OF TRUTH for all storage)
16
- ├── context/
17
- │ ├── now.md # Current task (generated from prjct.db)
18
- │ └── next.md # Queue (generated from prjct.db)
19
- ├── config/
20
- │ └── skills.json # Agent-to-skill mappings
21
- ├── agents/ # Domain specialists (auto-generated)
22
- └── sync/
23
- └── pending.json # Events for backend sync
24
- ```
25
-
26
- ### How to interact with storage
27
-
28
- - **Read state**: Use `prjct status`, `prjct context`, or MCP project tools
29
- - **Write state**: Use `prjct` CLI commands (`task`, `status`, `capture`, `remember`, etc.)
30
- - **Issue tracker setup**: Configure Linear/Jira MCP servers in the AI client; prjct has no native tracker CLI verbs
31
- - **Never** read/write JSON files in `storage/` or `memory/` directories
32
-
33
- ---
34
-
35
- ## LEGACY JSON Schemas (for reference only)
36
-
37
- > **WARNING**: These JSON schemas are LEGACY documentation only. The `storage/` and `memory/` directories are no longer used. All data lives in `prjct.db` (SQLite). Do NOT read or write these files.
38
-
39
- ### state.json (LEGACY)
40
-
41
- ```json
42
- {
43
- "task": {
44
- "id": "uuid-v4",
45
- "title": "string",
46
- "type": "feature|bug|improvement|refactor|chore",
47
- "status": "active|paused|done",
48
- "branch": "string|null",
49
- "subtasks": [
50
- {
51
- "id": "uuid-v4",
52
- "title": "string",
53
- "status": "pending|done"
54
- }
55
- ],
56
- "currentSubtask": 0,
57
- "createdAt": "2024-01-15T10:30:00.000Z",
58
- "updatedAt": "2024-01-15T10:30:00.000Z"
59
- }
60
- }
61
- ```
62
-
63
- **Empty state (no active task):**
64
- ```json
65
- {
66
- "task": null
67
- }
68
- ```
69
-
70
- ### queue.json (LEGACY)
71
-
72
- ```json
73
- {
74
- "tasks": [
75
- {
76
- "id": "uuid-v4",
77
- "title": "string",
78
- "type": "feature|bug|improvement|refactor|chore",
79
- "priority": 1,
80
- "createdAt": "2024-01-15T10:30:00.000Z"
81
- }
82
- ],
83
- "updatedAt": "2024-01-15T10:30:00.000Z"
84
- }
85
- ```
86
-
87
- ### shipped.json (LEGACY)
88
-
89
- ```json
90
- {
91
- "features": [
92
- {
93
- "id": "uuid-v4",
94
- "name": "string",
95
- "version": "1.0.0",
96
- "type": "feature|bug|improvement|refactor|chore",
97
- "shippedAt": "2024-01-15T10:30:00.000Z"
98
- }
99
- ],
100
- "updatedAt": "2024-01-15T10:30:00.000Z"
101
- }
102
- ```
103
-
104
- ### events.jsonl (LEGACY - now stored in SQLite `events` table)
105
-
106
- Previously append-only JSONL. Now stored in SQLite.
107
-
108
- ```jsonl
109
- {"type":"task.created","timestamp":"2024-01-15T10:30:00.000Z","data":{"taskId":"uuid","title":"string"}}
110
- {"type":"task.started","timestamp":"2024-01-15T10:30:00.000Z","data":{"taskId":"uuid"}}
111
- {"type":"subtask.completed","timestamp":"2024-01-15T10:35:00.000Z","data":{"taskId":"uuid","subtaskIndex":0}}
112
- {"type":"task.completed","timestamp":"2024-01-15T10:40:00.000Z","data":{"taskId":"uuid"}}
113
- {"type":"feature.shipped","timestamp":"2024-01-15T10:45:00.000Z","data":{"featureId":"uuid","name":"string","version":"1.0.0"}}
114
- ```
115
-
116
- **Event Types:**
117
- - `task.created` - New task created
118
- - `task.started` - Task activated
119
- - `task.paused` - Task paused
120
- - `task.resumed` - Task resumed
121
- - `task.completed` - Task completed
122
- - `subtask.completed` - Subtask completed
123
- - `feature.shipped` - Feature shipped
124
-
125
- ### learnings.jsonl (LEGACY - now stored in SQLite)
126
-
127
- Previously used for LLM-to-LLM knowledge transfer. Now stored in SQLite.
128
-
129
- ```jsonl
130
- {"taskId":"uuid","linearId":"PRJ-123","timestamp":"2024-01-15T10:40:00.000Z","learnings":{"patterns":["Use NestedContextResolver for hierarchical discovery"],"approaches":["Mirror existing method structure when extending"],"decisions":["Extended class rather than wrapper for consistency"],"gotchas":["Must handle null parent case"]},"value":{"type":"feature","impact":"high","description":"Hierarchical AGENTS.md support for monorepos"},"filesChanged":["core/resolver.ts","core/types.ts"],"tags":["agents","hierarchy","monorepo"]}
131
- ```
132
-
133
- **Schema:**
134
- ```json
135
- {
136
- "taskId": "uuid-v4",
137
- "linearId": "string|null",
138
- "timestamp": "2024-01-15T10:40:00.000Z",
139
- "learnings": {
140
- "patterns": ["string"],
141
- "approaches": ["string"],
142
- "decisions": ["string"],
143
- "gotchas": ["string"]
144
- },
145
- "value": {
146
- "type": "feature|bugfix|performance|dx|refactor|infrastructure",
147
- "impact": "high|medium|low",
148
- "description": "string"
149
- },
150
- "filesChanged": ["string"],
151
- "tags": ["string"]
152
- }
153
- ```
154
-
155
- **Why Local Cache**: Enables future semantic retrieval without API latency. Will feed into vector DB for cross-session knowledge transfer.
156
-
157
- ### skills.json
158
-
159
- ```json
160
- {
161
- "mappings": {
162
- "frontend.md": ["frontend-design"],
163
- "backend.md": ["javascript-typescript"],
164
- "testing.md": ["developer-kit"]
165
- },
166
- "updatedAt": "2024-01-15T10:30:00.000Z"
167
- }
168
- ```
169
-
170
- ### pending.json (sync queue)
171
-
172
- ```json
173
- {
174
- "events": [
175
- {
176
- "id": "uuid-v4",
177
- "type": "task.created",
178
- "timestamp": "2024-01-15T10:30:00.000Z",
179
- "data": {},
180
- "synced": false
181
- }
182
- ],
183
- "lastSync": "2024-01-15T10:30:00.000Z"
184
- }
185
- ```
186
-
187
- ---
188
-
189
- ## Formatting Rules (MANDATORY)
190
-
191
- All agents MUST follow these rules for cross-agent compatibility:
192
-
193
- | Rule | Value |
194
- |------|-------|
195
- | JSON indentation | 2 spaces |
196
- | Trailing commas | NEVER |
197
- | Key ordering | Logical (as shown in schemas above) |
198
- | Timestamps | ISO-8601 with milliseconds (`.000Z`) |
199
- | UUIDs | v4 format (lowercase) |
200
- | Line endings | LF (not CRLF) |
201
- | File encoding | UTF-8 without BOM |
202
- | Empty objects | `{}` |
203
- | Empty arrays | `[]` |
204
- | Null values | `null` (lowercase) |
205
-
206
- ### Timestamp Generation
207
-
208
- ```bash
209
- # ALWAYS use dynamic timestamps, NEVER hardcode
210
- bun -e "console.log(new Date().toISOString())" 2>/dev/null || node -e "console.log(new Date().toISOString())"
211
- ```
212
-
213
- ### UUID Generation
214
-
215
- ```bash
216
- # ALWAYS generate fresh UUIDs
217
- bun -e "console.log(crypto.randomUUID())" 2>/dev/null || node -e "console.log(require('crypto').randomUUID())"
218
- ```
219
-
220
- ---
221
-
222
- ## Write Rules (CRITICAL)
223
-
224
- ### Direct Writes Only
225
-
226
- **NEVER use temporary files** - Write directly to final destination:
227
-
228
- ```
229
- WRONG: Create `.tmp/file.json`, then `mv` to final path
230
- CORRECT: Use prjctDb.setDoc() or StorageManager.write() to write to SQLite
231
- ```
232
-
233
- ### Atomic Updates
234
-
235
- All writes go through SQLite which handles atomicity via WAL mode:
236
- ```typescript
237
- // StorageManager pattern (preferred):
238
- await stateStorage.update(projectId, (state) => {
239
- state.field = newValue
240
- return state
241
- })
242
-
243
- // Direct kv_store pattern:
244
- prjctDb.setDoc(projectId, 'key', data)
245
- ```
246
-
247
- ### NEVER Do These
248
-
249
- - Read or write JSON files in `storage/` or `memory/` directories
250
- - Use `.tmp/` directories
251
- - Use `mv` or `rename` operations for storage files
252
- - Create backup files like `*.bak` or `*.old`
253
- - Bypass `prjct` CLI to write directly to `prjct.db`
254
-
255
- ---
256
-
257
- ## Cross-Agent Compatibility
258
-
259
- ### Why This Matters
260
-
261
- 1. **User freedom**: Switch between Claude and Gemini freely
262
- 2. **Remote sync**: Storage will sync to prjct.app backend
263
- 3. **Single truth**: Both agents produce identical output
264
-
265
- ### Verification Test
266
-
267
- ```bash
268
- # Start work with Claude
269
- p. work "add feature X"
270
-
271
- # Switch to Gemini, continue
272
- prjct work --md # Should work seamlessly
273
-
274
- # Switch back to Claude
275
- p. ship # Should read Gemini's changes correctly
276
-
277
- # All agents read from the same prjct.db via CLI commands
278
- prjct status # Works from any agent
279
- ```
280
-
281
- ### Remote Sync Flow
282
-
283
- ```
284
- Local Storage: prjct.db (Claude/Gemini)
285
-
286
- sync/pending.json (events queue)
287
-
288
- prjct.app API
289
-
290
- Global Remote Storage
291
-
292
- Any device, any agent
293
- ```
294
-
295
- ---
296
-
297
- ## MCP Issue Tracker Strategy
298
-
299
- Issue tracker integrations are MCP-only.
300
-
301
- ### Rules
302
-
303
- - `prjct` CLI does not call Linear/Jira SDKs or REST APIs directly.
304
- - Issue operations (`sync`, `list`, `get`, `start`, `done`, `update`, etc.) are delegated to MCP tools in the AI client.
305
- - `p. sync` refreshes project context and agent artifacts, not issue tracker payloads.
306
- - Local storage keeps task linkage metadata (for example `linearId`) and project workflow state in SQLite.
307
-
308
- ### Setup
309
-
310
- Configure Linear/Jira MCP servers in the AI client when issue tracker access is needed.
311
-
312
- ### Operational Model
313
-
314
- ```
315
- AI client MCP tools <-> Linear/Jira
316
- |
317
- v
318
- prjct workflow state (prjct.db)
319
- ```
320
-
321
- The CLI remains the source of truth for local project/task state.
322
- Issue-system mutations happen through MCP operations in the active AI session.
323
-
324
- ---
325
-
326
- **Version**: 2.0.0
327
- **Last Updated**: 2026-02-10
@@ -1,195 +0,0 @@
1
- # Software Planning Methodology for prjct
2
-
3
- This methodology guides the AI through developing ideas into complete technical specifications.
4
-
5
- ## Phase 1: Discovery & Problem Definition
6
-
7
- ### Questions to Ask
8
- - What specific problem does this solve?
9
- - Who is the target user?
10
- - What's the budget and timeline?
11
- - What happens if this problem isn't solved?
12
-
13
- ### Output
14
- - Problem statement
15
- - User personas
16
- - Business constraints
17
- - Success metrics
18
-
19
- ## Phase 2: User Flows & Journeys
20
-
21
- ### Process
22
- 1. Map primary user journey
23
- 2. Identify entry points
24
- 3. Define success states
25
- 4. Document error states
26
- 5. Note edge cases
27
-
28
- ### Jobs-to-be-Done
29
- When [situation], I want to [motivation], so I can [expected outcome]
30
-
31
- ## Phase 3: Domain Modeling
32
-
33
- ### Entity Definition
34
- For each entity, define:
35
- - Description
36
- - Attributes (name, type, constraints)
37
- - Relationships
38
- - Business rules
39
- - Lifecycle states
40
-
41
- ### Bounded Contexts
42
- Group entities into logical boundaries with:
43
- - Owned entities
44
- - External dependencies
45
- - Events published/consumed
46
-
47
- ## Phase 4: API Contract Design
48
-
49
- ### Style Selection
50
- | Style | Best For |
51
- |----------|----------|
52
- | REST | Simple CRUD, broad compatibility |
53
- | GraphQL | Complex data requirements |
54
- | tRPC | Full-stack TypeScript |
55
- | gRPC | Microservices |
56
-
57
- ### Endpoint Specification
58
- - Method/Type
59
- - Path/Name
60
- - Authentication
61
- - Input/Output schemas
62
- - Error responses
63
-
64
- ## Phase 5: System Architecture
65
-
66
- ### Pattern Selection
67
- | Pattern | Best For |
68
- |---------|----------|
69
- | Modular Monolith | Small team, fast iteration |
70
- | Serverless-First | Variable load, event-driven |
71
- | Microservices | Large team, complex domain |
72
-
73
- ### C4 Model
74
- 1. Context - System and external actors
75
- 2. Container - Major components
76
- 3. Component - Internal structure
77
-
78
- ## Phase 6: Data Architecture
79
-
80
- ### Database Selection
81
- | Type | Options | Best For |
82
- |------|---------|----------|
83
- | Relational | PostgreSQL | ACID, structured data |
84
- | Document | MongoDB | Flexible schema |
85
- | Key-Value | Redis | Caching, sessions |
86
-
87
- ### Schema Design
88
- - Tables and columns
89
- - Indexes
90
- - Constraints
91
- - Relationships
92
-
93
- ## Phase 7: Tech Stack Decision
94
-
95
- ### Frontend Stack
96
- - Framework (Next.js, Remix, SvelteKit)
97
- - Styling (Tailwind, CSS Modules)
98
- - State management (Zustand, Jotai)
99
- - Data fetching (TanStack Query, SWR)
100
-
101
- ### Backend Stack
102
- - Runtime (Node.js, Bun)
103
- - Framework (Next.js API, Hono)
104
- - ORM (Drizzle, Prisma)
105
- - Validation (Zod, Valibot)
106
-
107
- ### Infrastructure
108
- - Hosting (Vercel, Railway, Fly.io)
109
- - Database (Neon, PlanetScale)
110
- - Cache (Upstash, Redis)
111
- - Monitoring (Sentry, Axiom)
112
-
113
- ## Phase 8: Implementation Roadmap
114
-
115
- ### MVP Scope Definition
116
- - Must-have features (P0)
117
- - Should-have features (P1)
118
- - Nice-to-have features (P2)
119
- - Future considerations (P3)
120
-
121
- ### Development Phases
122
- 1. Foundation - Setup, core infrastructure
123
- 2. Core Features - Primary functionality
124
- 3. Polish & Launch - Optimization, deployment
125
-
126
- ### Risk Assessment
127
- - Technical risks and mitigation
128
- - Business risks and mitigation
129
- - Dependencies and assumptions
130
-
131
- ## Output Structure
132
-
133
- When complete, generate:
134
-
135
- 1. **Executive Summary** - Problem, solution, key decisions
136
- 2. **Architecture Documents** - All phases detailed
137
- 3. **Implementation Plan** - Prioritized tasks with estimates
138
- 4. **Decision Log** - Key choices and reasoning
139
-
140
- ## Interactive Development Process
141
-
142
- 1. **Classification**: Determine if idea needs full architecture
143
- 2. **Discovery**: Ask clarifying questions
144
- 3. **Generation**: Create architecture phase by phase
145
- 4. **Validation**: Review with user at key points
146
- 5. **Refinement**: Iterate based on feedback
147
- 6. **Output**: Save complete specification
148
-
149
- ## Success Criteria
150
-
151
- A complete architecture includes:
152
- - Clear problem definition
153
- - User flows mapped
154
- - Domain model defined
155
- - API contracts specified
156
- - Tech stack chosen
157
- - Database schema designed
158
- - Implementation roadmap created
159
- - Risk assessment completed
160
-
161
- ## Templates
162
-
163
- ### Entity Template
164
- ```
165
- Entity: [Name]
166
- ├── Description: [What it represents]
167
- ├── Attributes:
168
- │ ├── id: uuid (primary key)
169
- │ └── [field]: [type] ([constraints])
170
- ├── Relationships: [connections]
171
- ├── Rules: [invariants]
172
- └── States: [lifecycle]
173
- ```
174
-
175
- ### API Endpoint Template
176
- ```
177
- Operation: [Name]
178
- ├── Method: [GET/POST/PUT/DELETE]
179
- ├── Path: [/api/resource]
180
- ├── Auth: [Required/Optional]
181
- ├── Input: {schema}
182
- ├── Output: {schema}
183
- └── Errors: [codes and descriptions]
184
- ```
185
-
186
- ### Phase Template
187
- ```
188
- Phase: [Name]
189
- ├── Duration: [timeframe]
190
- ├── Tasks:
191
- │ ├── [Task 1]
192
- │ └── [Task 2]
193
- ├── Deliverable: [outcome]
194
- └── Dependencies: [prerequisites]
195
- ```
@@ -1,85 +0,0 @@
1
- # SDD canonical sequence — prjct
2
-
3
- Spec-Driven Development is prjct's default flow for substantive work. The six stations:
4
-
5
- ```
6
- spec ─→ audit-spec ─→ task (--spec <id>) ─→ implement ─→ ship (acceptance gate)
7
- └─→ remember learning
8
- ```
9
-
10
- ## Stations
11
-
12
- ### 1. `spec`
13
-
14
- The user describes a feature, fix, or initiative WITH goals or stakes. You don't run `task` yet. You run `prjct spec "<title>"` and walk the forcing questions:
15
-
16
- - goal (1–3 sentences)
17
- - eli10 (2–4 sentences)
18
- - stakes if we ship the wrong thing
19
- - acceptance criteria (testable, observable list)
20
- - scope (what's IN)
21
- - out_of_scope (what's OUT)
22
- - risks (each with mitigation)
23
- - test plan
24
-
25
- The CLI persists this in the `specs` SQLite table.
26
-
27
- ### 2. `audit-spec`
28
-
29
- Before writing any code: harden the spec. Run `prjct audit-spec <id>` — it emits a dispatch prompt for THREE review subagents that you run IN PARALLEL (one tool-use block per reviewer in the SAME message):
30
-
31
- - **strategic** — scope sanity. Worth doing? Right size?
32
- - **architecture** — feasibility. Data flow, failure modes, dependencies.
33
- - **design** — UX/DX quality. Four dimensions rated 0–10.
34
-
35
- Each returns a verdict (pass | fail) + notes. You write each back via `prjct spec record-review`. When all three pass, the spec auto-promotes from `draft` → `reviewed`.
36
-
37
- If any reviewer fails: revise the spec via `prjct spec update`, re-audit. The cost of iteration is minutes; the cost of mid-implementation rework is hours-to-days.
38
-
39
- ### 3. `task --spec <id>`
40
-
41
- Now create the task. The `--spec` flag wires the task to its spec via `linked_spec_id`. Without it, `ship` later has nothing to gate against.
42
-
43
- ```
44
- prjct work "implement rate-limit middleware" --spec <id>
45
- ```
46
-
47
- ### 4. implement
48
-
49
- Normal coding loop. Mid-flight workflows (`review`, `qa`, `investigate`) still apply. The spec is your anti-creep shield: when the user pivots into out-of-scope territory, surface the spec and ask whether to update it or defer.
50
-
51
- ### 5. `ship` (with the spec gate)
52
-
53
- `prjct ship` reads the linked spec's `acceptance_criteria` and surfaces them as a checklist in the PR description. Walk each one — pass / fail / N/A. If any criterion is unmet → STOP and surface to the user.
54
-
55
- Override path: `prjct ship --no-spec-gate` (use only when the user explicitly accepts).
56
-
57
- ### 6. `remember learning`
58
-
59
- After ship, capture what the spec got right and wrong:
60
-
61
- ```
62
- prjct remember learning "spec missed the clock-skew edge case; future rate-limit specs should call out time-source"
63
- ```
64
-
65
- The next spec is sharper. Compounding effect: the vault accumulates spec-shaped lessons.
66
-
67
- ## When to bypass SDD
68
-
69
- Not every keystroke goes through six stations. Routine work skips `spec`:
70
-
71
- - single-file fix with known scope
72
- - doc tweak / typo
73
- - inbox capture / GTD dump
74
- - conversational Q&A
75
- - re-running a failing test
76
- - bug fix where root cause is already known
77
-
78
- Rule of thumb: if the work touches >1 file, ships to users, or takes >30 minutes, default to `spec` first.
79
-
80
- ## Anti-patterns
81
-
82
- - **Skipping straight to `task` because the user said "let's build X".** If they said it WITH stakes, the spec is what protects them from scope creep mid-implementation.
83
- - **Auditing AFTER implementing.** Pre-implementation review is the whole point. Post-hoc review of code-against-spec is the `review` workflow, not `audit-spec`.
84
- - **Treating the spec as immutable.** Specs evolve. When implementation surfaces a missing acceptance criterion or a wrong scope assumption, update the spec — `prjct spec update` — don't ship around it.
85
- - **Marking `acceptance_criteria` met without proof.** The criterion exists to be tested. If the test wasn't run, the criterion isn't met.
@@ -1,47 +0,0 @@
1
- # Architecture reviewer rubric — `audit-spec`
2
-
3
- You are reviewing a `prjct` spec for engineering feasibility. You receive the spec body verbatim. Apply the questions below; return a structured verdict.
4
-
5
- ## Questions to ask
6
-
7
- 1. **Can this be built?** With the team's stack and skill set, in the implied timeframe. If "no" or "yes but only by replacing the database", fail.
8
- 2. **Is the data flow coherent?** Trace input → state → output. Where does data live? Who writes it? Who reads it? Failure modes at each hop.
9
- 3. **Is the state machine implicit or explicit?** Explicit > implicit. If acceptance criteria reference behavior that depends on state transitions, the spec should name them.
10
- 4. **What edge cases / failure modes are missing?** Concurrency, partial writes, retries, network blips, auth failures, rate-limit collisions, clock skew. Name the top 1–2 that the spec doesn't address.
11
- 5. **What dependencies does this introduce?** New runtime dep? New infra (Redis, queue, cron)? Document it. New deps that aren't named in the spec are the #1 source of mid-implementation surprise.
12
- 6. **Test plan adequate?** A test plan that says "tests added" is not a plan. Look for: unit, integration, manual reproduction, performance (when relevant).
13
-
14
- ## Output format
15
-
16
- ```
17
- verdict: pass | fail
18
- notes: 2–4 sentences + (when applicable) a short ASCII data flow / state diagram.
19
- If pass, name the most load-bearing architectural choice.
20
- If fail, name the SINGLE biggest gap and how to close it.
21
- ```
22
-
23
- ## Examples
24
-
25
- **Pass with diagram:**
26
-
27
- ```
28
- verdict: pass
29
- notes: Token-bucket per IP with 5-minute Redis TTL is the right call — survives restarts, no GC pressure, easy to extend to user-id keys later. The spec correctly limits scope to /auth (no /api yet). One missing edge: clock-skew between Node process and Redis on bucket refill — recommend storing absolute timestamps server-side.
30
-
31
- request → middleware → Redis GETSET (token, ts)
32
- ├── allowed → next()
33
- └── refused → 429 + Retry-After
34
- ```
35
-
36
- **Fail:**
37
-
38
- ```
39
- verdict: fail
40
- notes: Spec references "real-time updates" in acceptance_criteria but is silent on transport (WebSocket? SSE? polling?). Each has different failure modes (reconnect storms, head-of-line blocking, server load). Pick one explicitly and re-spec — current acceptance criteria are vacuously true for a 60-second polling loop, which probably isn't what the user wants.
41
- ```
42
-
43
- ## Anti-patterns to refuse
44
-
45
- - Architectural cosplay: "consider using DDD/hexagonal/CQRS" without showing why this spec demands it.
46
- - Failing because "the spec doesn't say which framework" when framework is obvious from the project's stack (skill body's project context tells you).
47
- - Skipping the data flow trace — the most useful thing this rubric produces.
@@ -1,38 +0,0 @@
1
- # Design reviewer rubric — `audit-spec`
2
-
3
- You are reviewing a `prjct` spec for design quality (UX for user-facing surfaces, DX for developer-facing surfaces — same rubric, different surface).
4
-
5
- ## Questions to ask
6
-
7
- Rate each dimension 0–10 against the spec's described surface (UI, API, CLI, library):
8
-
9
- 1. **Clarity** — would a new user / developer know what this does without reading code or docs? 0 = inscrutable; 10 = self-documenting.
10
- 2. **Ergonomics** — is the common case fast and the rare case possible? 0 = forces the rare case into every flow; 10 = invisible until needed.
11
- 3. **Consistency** — does it match the surrounding system's conventions? 0 = a foreign body; 10 = indistinguishable from neighboring features.
12
- 4. **Accessibility** — for UI: keyboard / screen-reader / contrast / motion. For API/CLI: discoverability, error messages, --help, machine-readable output. 0 = unusable for entire categories of users; 10 = enables everyone.
13
-
14
- ## Verdict rule
15
-
16
- - All four dimensions ≥ 6 → `pass`.
17
- - Any dimension < 6 → `fail`.
18
-
19
- ## Output format
20
-
21
- ```
22
- verdict: pass | fail
23
- notes: clarity=N ergonomics=N consistency=N accessibility=N
24
- Lowest-scoring dimension first, with the SINGLE concrete change that would raise it.
25
- ```
26
-
27
- ## Examples
28
-
29
- **Pass:** "clarity=8 ergonomics=7 consistency=9 accessibility=6. Lowest is accessibility — the new endpoint returns errors as JSON only; recommend adding `Accept: text/plain` fallback for grep-the-pipeline operators. Otherwise the surface matches the existing `/api/v2` shape and ergonomics are right (single required field, sensible defaults)."
30
-
31
- **Fail:** "clarity=4 ergonomics=6 consistency=7 accessibility=7. Clarity tanks because the verb name `prjct shimmer` doesn't telegraph the action; rename to `prjct refresh` or `prjct rebuild` and re-rate. Other dimensions are healthy."
32
-
33
- ## Anti-patterns to refuse
34
-
35
- - Vague "looks good" — every dimension needs a number.
36
- - Ignoring accessibility for "internal tools" — internal users include the colorblind and the blind.
37
- - Failing on aesthetic taste alone (color, typography). Design rubric is about USE, not opinion.
38
- - Over-indexing on novelty. Surfaces that surprise users score LOW on consistency, not high.