ariadna 1.1.3 → 1.2.0

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.
@@ -155,7 +155,7 @@ params.require(:user).permit(:name, :email)
155
155
  [Root cause — e.g., tenant scoping not enforced at the framework level, new developers unaware of scoping requirements, background jobs not carrying tenant context]
156
156
 
157
157
  **How to avoid:**
158
- [Prevention strategy — e.g., acts_as_tenant gem, Current attributes for tenant context, controller-level `around_action` for scoping, test isolation per tenant]
158
+ [Prevention strategy — e.g., Current attributes for tenant context, controller-level `around_action` for scoping, test isolation per tenant]
159
159
 
160
160
  **Warning signs:**
161
161
  [How to detect early — e.g., queries without `WHERE tenant_id = ?`, cross-tenant data appearing in tests, background jobs processing wrong tenant data]
@@ -184,6 +184,53 @@ params.require(:user).permit(:name, :email)
184
184
 
185
185
  ---
186
186
 
187
+ ### Pitfall 7: Explicit Translation Keys Instead of ActiveRecord Automatic Lookup
188
+
189
+ **What goes wrong:**
190
+ [Describe where explicit `t()` calls duplicate what Rails I18n automatic lookup provides — e.g., form labels passing explicit keys, validation messages hardcoded, model names translated manually]
191
+
192
+ **Why it happens:**
193
+ [Root cause — e.g., developers unaware of ActiveRecord I18n conventions, copying patterns from non-Rails projects, not reading Rails I18n guide]
194
+
195
+ **How to avoid:**
196
+ [Prevention strategy — e.g., use `form.label :name` instead of `form.label :name, t("teams.form.name")`, define translations under `activerecord.attributes.*` and `activerecord.models.*`, rely on automatic lookup for validation messages]
197
+
198
+ **Warning signs:**
199
+ [How to detect early — e.g., duplicate translation keys for the same attribute in different namespaces, inconsistent labels between forms and error messages, `t()` calls in form labels that mirror `activerecord.attributes` keys]
200
+
201
+ **Example:**
202
+ ```ruby
203
+ # Bad — explicit key duplicates what Rails provides automatically
204
+ <%= form.label :name, t("teams.form.name") %>
205
+ # Requires: teams.form.name in locale file AND activerecord.attributes.team.name for validations
206
+
207
+ # Good — resolves from activerecord.attributes.team.name automatically
208
+ <%= form.label :name %>
209
+ # Single source of truth: activerecord.attributes.team.name used by forms AND validations
210
+ ```
211
+
212
+ ```yaml
213
+ # Good — single source of truth for attribute names
214
+ en:
215
+ activerecord:
216
+ models:
217
+ team: "Team"
218
+ attributes:
219
+ team:
220
+ name: "Team name"
221
+ errors:
222
+ models:
223
+ team:
224
+ attributes:
225
+ name:
226
+ blank: "cannot be empty"
227
+ ```
228
+
229
+ **Phase to address:**
230
+ [Which roadmap phase should prevent this]
231
+
232
+ ---
233
+
187
234
  [Continue for additional critical pitfalls specific to this application...]
188
235
 
189
236
  ## Technical Debt Patterns
@@ -215,6 +262,7 @@ Common mistakes when integrating Rails gems and external services.
215
262
  | Turbo / Hotwire | [e.g., full page reloads from misconfigured frames, missing turbo stream responses, form submission edge cases] | [what to do instead] |
216
263
  | Rails version upgrades | [e.g., skipping deprecation warnings, upgrading multiple major versions at once, not running `rails app:update`] | [what to do instead] |
217
264
  | Third-party APIs | [e.g., no circuit breaker, synchronous calls in request cycle, no webhook signature verification] | [what to do instead] |
265
+ | I18n / rails-i18n | [e.g., using explicit `t()` keys for model attributes and form labels instead of ActiveRecord automatic lookup, missing `rails-i18n` gem for CLDR data (dates, currency, numbers), inconsistent locale file organization mixing per-model and flat structures] | [e.g., define translations under `activerecord.attributes.*` and `activerecord.models.*`, use `form.label :field` without explicit `t()`, add `rails-i18n` gem for base locale data, organize locale files consistently] |
218
266
  | [integration] | [what people do wrong] | [what to do instead] |
219
267
 
220
268
  ## Performance Traps
@@ -241,7 +289,7 @@ Rails-specific security issues beyond basic web security.
241
289
  | SQL injection via string interpolation in `where` | [e.g., user input directly in query string allows data exfiltration] | [e.g., always use parameterized queries: `where("name = ?", params[:name])` or hash syntax `where(name: params[:name])`] |
242
290
  | CSRF token handling gaps | [e.g., API endpoints without `protect_from_forgery`, token not verified on state-changing requests] | [e.g., `protect_from_forgery with: :exception`, proper token handling for JS requests, `csrf_meta_tags` in layout] |
243
291
  | Credential management mistakes | [e.g., secrets in ENV vars without encryption, credentials checked into git, different credentials per environment not managed] | [e.g., Rails encrypted credentials, `rails credentials:edit`, per-environment credential files] |
244
- | Insecure direct object references | [e.g., `User.find(params[:id])` without authorization check, enumerable IDs exposing records] | [e.g., always scope to authorized records: `current_user.posts.find(params[:id])`, use Pundit/CanCanCan] |
292
+ | Insecure direct object references | [e.g., `User.find(params[:id])` without authorization check, enumerable IDs exposing records] | [e.g., always scope to authorized records: `current_user.posts.find(params[:id])`, use Current.account or Current.employee] |
245
293
  | Mass assignment vulnerabilities | [e.g., unpermitted nested attributes modifying admin fields, `accepts_nested_attributes_for` without `reject_if`] | [e.g., explicit strong parameters, test that admin attributes cannot be set via API, `attr_readonly` for sensitive fields] |
246
294
  | Unsafe `html_safe` / `raw` usage | [e.g., XSS from marking user input as safe, rendering unescaped HTML from database] | [e.g., never call `html_safe` on user input, use `sanitize` helper, Content Security Policy headers] |
247
295
  | Open redirects | [e.g., `redirect_to params[:return_to]` allows redirecting to malicious sites] | [e.g., validate redirect URLs against allowlist, use `redirect_back` with `fallback_location`] |
@@ -261,6 +309,7 @@ Rails features that appear complete but are missing critical pieces.
261
309
  - [ ] **Database connection pooling:** Pool size matches worker/thread count — verify `database.yml` pool matches Puma thread count
262
310
  - [ ] **Timezone handling:** Application uses `Time.current` / `Date.current` instead of `Time.now` / `Date.today` — verify `config.time_zone` is set and used consistently
263
311
  - [ ] **Email delivery:** Mailers use `deliver_later` not `deliver_now` in web requests — verify mailer calls don't block request cycle
312
+ - [ ] **I18n locale completeness:** All supported locales have matching keys for `activerecord.models.*`, `activerecord.attributes.*`, and `activerecord.errors.*` — verify with `i18n-tasks` gem or manual comparison that no locale is missing translations present in others
264
313
  - [ ] **[Feature]:** Often missing [thing] — verify [check]
265
314
  - [ ] **[Feature]:** Often missing [thing] — verify [check]
266
315
 
@@ -52,13 +52,14 @@ Template for `.planning/research/STACK.md` — discovered technology stack for t
52
52
  | File storage service | [local/S3/GCS/Azure/none] | [config/storage.yml] |
53
53
  | Email | [Action Mailer/Postmark/SendGrid/none] | [Gemfile, mailer configs] |
54
54
  | PDF generation | [Prawn/wicked_pdf/Grover/none] | [Gemfile] |
55
+ | Internationalization | [rails-i18n gem / manual locale files only / none] | [Gemfile, config/locales/] |
55
56
 
56
57
  ## Authentication & Authorization
57
58
 
58
59
  | Category | Discovered Value | Evidence |
59
60
  |----------|-----------------|----------|
60
61
  | Authentication | [Rails authentication generator/Rodauth/Clearance/custom/none] | [Gemfile, user model] |
61
- | Authorization | [Pundit/CanCanCan/Action Policy/custom/none] | [Gemfile, policy files] |
62
+ | Authorization | [Custom/Pundit/CanCanCan/Action Policy/none] | [Gemfile, policy files] |
62
63
  | OAuth/social login | [OmniAuth/Doorkeeper/none] | [Gemfile, initializers] |
63
64
  | API authentication | [API tokens/JWT/OAuth2/none] | [Gemfile, controller concerns] |
64
65
 
@@ -209,38 +210,38 @@ bin/rails server
209
210
  - Look at `database.yml` for multiple database configurations
210
211
 
211
212
  **Frontend & Assets:**
212
- - Check for `config/importmap.rb` (Importmap), `package.json` (Node-based), or `vite.config.ts` (Vite)
213
- - Look at `app/views/layouts/application.html.erb` for asset tags
214
- - Check `app/javascript/` structure and `app/assets/` for CSS approach
215
- - Look for `app/components/` (ViewComponent) or Phlex usage
213
+ - Check for `config/importmap.rb` (Importmap), `package.json` (Node-based), or `vite.config.ts` (Vite).
214
+ - Look at `app/views/layouts/application.html.erb` for asset tags.
215
+ - Check `app/javascript/` structure and `app/assets/` for CSS approach.
216
+ - Look for `app/components/` (ViewComponent) or Phlex usage.
216
217
 
217
218
  **Backend Services:**
218
- - Check `config/application.rb` for `active_job.queue_adapter` setting
219
- - Check `config/environments/production.rb` for cache store configuration
220
- - Look at `config/cable.yml` for Action Cable adapter
221
- - Check `config/storage.yml` for Active Storage service
219
+ - Check `config/application.rb` for `active_job.queue_adapter` setting.
220
+ - Check `config/environments/production.rb` for cache store configuration.
221
+ - Look at `config/cable.yml` for Action Cable adapter.
222
+ - Check `config/storage.yml` for Active Storage service.
222
223
 
223
224
  **Authentication & Authorization:**
224
- - Look for `Authentication` concern generated by `rails generate authentication`
225
- - Look for `app/policies/` (Pundit) or `app/models/ability.rb` (CanCanCan)
226
- - Check `app/models/user.rb` for authentication modules
225
+ - Look for `Authentication` concern generated by `rails generate authentication`.
226
+ - Look for `app/policies/` (Pundit) or `app/models/ability.rb` (CanCanCan) or custom authorization logic.
227
+ - Check `app/models/user.rb` for authentication modules.
227
228
 
228
229
  **Testing:**
229
230
  - Determine framework: check for `test/` (Minitest, recommended) vs `spec/` (RSpec)
230
- - Check `test/test_helper.rb` (Minitest) or `spec/rails_helper.rb` (if RSpec) for test configuration
231
- - Look for `test/fixtures/` or `spec/factories/` to determine data strategy
232
- - Check for system test configuration and browser driver
231
+ - Check `test/test_helper.rb` (Minitest) or `spec/rails_helper.rb` (if RSpec) for test configuration.
232
+ - Look for `test/fixtures/` or `spec/factories/` to determine data strategy.
233
+ - Check for system test configuration and browser driver.
233
234
 
234
235
  **What to Avoid:**
235
- - Flag gems that are no longer maintained or have known security issues
236
- - Note deprecated Rails patterns found in the codebase (e.g., `before_filter`, `attr_accessible`)
237
- - Identify gems that duplicate Rails built-in functionality unnecessarily
238
- - Flag any gems with known incompatibilities with the discovered Rails version
236
+ - Flag gems that are no longer maintained or have known security issues.
237
+ - Note deprecated Rails patterns found in the codebase (e.g., `before_filter`, `attr_accessible`).
238
+ - Identify gems that duplicate Rails built-in functionality unnecessarily.
239
+ - Flag any gems with known incompatibilities with the discovered Rails version.
239
240
 
240
241
  **Gem Inventory:**
241
- - Record version constraints as written in the Gemfile, not resolved versions
242
- - Note which Bundler group each gem belongs to
243
- - For important gems, check if the version is current or significantly outdated
242
+ - Record version constraints as written in the Gemfile, not resolved versions.
243
+ - Note which Bundler group each gem belongs to.
244
+ - For important gems, check if the version is current or significantly outdated.
244
245
 
245
246
  **Version Compatibility:**
246
247
  - Note any gems that pin to specific Rails or Ruby versions
@@ -53,7 +53,7 @@ Template for `.planning/research/SUMMARY.md` — executive summary of project re
53
53
 
54
54
  **Authentication & authorization:**
55
55
  - [Auth solution]: [purpose] — [why recommended — e.g., Rails authentication generator for session-based auth]
56
- - [Authorization]: [purpose] — [why recommended — e.g., Pundit for policies, Action Policy for scalable rules]
56
+ - [Authorization]: [purpose] — [why recommended — e.g., before_action, Pundit for policies, Action Policy for scalable rules]
57
57
 
58
58
  **Additional gems:**
59
59
  - [Gem]: [purpose] — [why recommended]
@@ -87,7 +87,7 @@ Template for `.planning/research/SUMMARY.md` — executive summary of project re
87
87
  6. [Data access patterns] — [approach — e.g., scopes, query objects, eager loading strategy]
88
88
 
89
89
  **Multi-tenancy approach (if applicable):**
90
- - [Strategy] — [e.g., acts_as_tenant scoping, PostgreSQL schemas, separate databases]
90
+ - [Strategy] — [e.g., Denormalise tables with account_id and use Current.account, PostgreSQL schemas, separate databases]
91
91
 
92
92
  **Engine extraction (if applicable):**
93
93
  - [Engine/mountable concern] — [e.g., admin engine, API engine, shared authentication engine]
@@ -14,9 +14,9 @@ Check if `--auto` flag is present in $ARGUMENTS.
14
14
  **If auto mode:**
15
15
  - Skip brownfield mapping offer (assume greenfield)
16
16
  - Skip deep questioning (extract context from provided document)
17
- - Config questions still required (Step 5)
17
+ - Skip config questions use opinionated defaults (Step 5)
18
18
  - After config: run Steps 6-9 automatically with smart defaults:
19
- - Research: Always yes
19
+ - Research: No (Rails conventions pre-loaded). Use `--auto --research` to force research.
20
20
  - Requirements: Include all table stakes + features from provided document
21
21
  - Requirements approval: Auto-approve
22
22
  - Roadmap approval: Auto-approve
@@ -215,129 +215,45 @@ mkdir -p .planning
215
215
  ariadna-tools commit "docs: initialize project" --files .planning/PROJECT.md
216
216
  ```
217
217
 
218
- ## 5. Workflow Preferences
218
+ ## 5. Workflow Configuration
219
219
 
220
- **Round 1 Core workflow settings (4 questions):**
220
+ **Use opinionated defaults. Only ask if user wants to customize.**
221
221
 
222
- ```
223
- questions: [
224
- {
225
- header: "Mode",
226
- question: "How do you want to work?",
227
- multiSelect: false,
228
- options: [
229
- { label: "YOLO (Recommended)", description: "Auto-approve, just execute" },
230
- { label: "Interactive", description: "Confirm at each step" }
231
- ]
232
- },
233
- {
234
- header: "Depth",
235
- question: "How thorough should planning be?",
236
- multiSelect: false,
237
- options: [
238
- { label: "Quick", description: "Ship fast (3-5 phases, 1-3 plans each)" },
239
- { label: "Standard", description: "Balanced scope and speed (5-8 phases, 3-5 plans each)" },
240
- { label: "Comprehensive", description: "Thorough coverage (8-12 phases, 5-10 plans each)" }
241
- ]
242
- },
243
- {
244
- header: "Execution",
245
- question: "Run plans in parallel?",
246
- multiSelect: false,
247
- options: [
248
- { label: "Parallel (Recommended)", description: "Independent plans run simultaneously" },
249
- { label: "Sequential", description: "One plan at a time" }
250
- ]
251
- },
252
- {
253
- header: "Git Tracking",
254
- question: "Commit planning docs to git?",
255
- multiSelect: false,
256
- options: [
257
- { label: "Yes (Recommended)", description: "Planning docs tracked in version control" },
258
- { label: "No", description: "Keep .planning/ local-only (add to .gitignore)" }
259
- ]
222
+ Apply these defaults directly to `.planning/config.json`:
223
+
224
+ ```json
225
+ {
226
+ "mode": "interactive",
227
+ "depth": "standard",
228
+ "parallelization": true,
229
+ "commit_docs": true,
230
+ "model_profile": "balanced",
231
+ "workflow": {
232
+ "research": false,
233
+ "plan_check": true,
234
+ "verifier": true
260
235
  }
261
- ]
236
+ }
262
237
  ```
263
238
 
264
- **Round 2Workflow agents:**
265
-
266
- These spawn additional agents during planning/execution. They add tokens and time but improve quality.
267
-
268
- | Agent | When it runs | What it does |
269
- |-------|--------------|--------------|
270
- | **Researcher** | Before planning each phase | Investigates domain, finds patterns, surfaces gotchas |
271
- | **Plan Checker** | After plan is created | Verifies plan actually achieves the phase goal |
272
- | **Verifier** | After phase execution | Confirms must-haves were delivered |
273
-
274
- All recommended for important projects. Skip for quick experiments.
239
+ **Ask ONE question only the non-obvious setting:**
275
240
 
276
241
  ```
277
242
  questions: [
278
243
  {
279
- header: "Research",
280
- question: "Research before planning each phase? (adds tokens/time)",
281
- multiSelect: false,
282
- options: [
283
- { label: "Yes (Recommended)", description: "Investigate domain, find patterns, surface gotchas" },
284
- { label: "No", description: "Plan directly from requirements" }
285
- ]
286
- },
287
- {
288
- header: "Plan Check",
289
- question: "Verify plans will achieve their goals? (adds tokens/time)",
290
- multiSelect: false,
291
- options: [
292
- { label: "Yes (Recommended)", description: "Catch gaps before execution starts" },
293
- { label: "No", description: "Execute plans without verification" }
294
- ]
295
- },
296
- {
297
- header: "Verifier",
298
- question: "Verify work satisfies requirements after each phase? (adds tokens/time)",
299
- multiSelect: false,
300
- options: [
301
- { label: "Yes (Recommended)", description: "Confirm deliverables match phase goals" },
302
- { label: "No", description: "Trust execution, skip verification" }
303
- ]
304
- },
305
- {
306
- header: "Model Profile",
307
- question: "Which AI models for planning agents?",
244
+ header: "Depth",
245
+ question: "How thorough should planning be?",
308
246
  multiSelect: false,
309
247
  options: [
310
- { label: "Balanced (Recommended)", description: "Sonnet for most agents good quality/cost ratio" },
311
- { label: "Quality", description: "Opus for research/roadmap higher cost, deeper analysis" },
312
- { label: "Budget", description: "Haiku where possible — fastest, lowest cost" }
248
+ { label: "Standard (Recommended)", description: "Balanced scope and speed (5-8 phases, 3-5 plans each)" },
249
+ { label: "Quick", description: "Ship fast (3-5 phases, 1-3 plans each)" },
250
+ { label: "Comprehensive", description: "Thorough coverage (8-12 phases, 5-10 plans each)" }
313
251
  ]
314
252
  }
315
253
  ]
316
254
  ```
317
255
 
318
- Create `.planning/config.json` with all settings:
319
-
320
- ```json
321
- {
322
- "mode": "yolo|interactive",
323
- "depth": "quick|standard|comprehensive",
324
- "parallelization": true|false,
325
- "commit_docs": true|false,
326
- "model_profile": "quality|balanced|budget",
327
- "workflow": {
328
- "research": true|false,
329
- "plan_check": true|false,
330
- "verifier": true|false
331
- }
332
- }
333
- ```
334
-
335
- **If commit_docs = No:**
336
- - Set `commit_docs: false` in config.json
337
- - Add `.planning/` to `.gitignore` (create if needed)
338
-
339
- **If commit_docs = Yes:**
340
- - No additional gitignore entries needed
256
+ Create `.planning/config.json` with the defaults above, applying the user's depth selection.
341
257
 
342
258
  **Commit config.json:**
343
259
 
@@ -345,24 +261,26 @@ Create `.planning/config.json` with all settings:
345
261
  ariadna-tools commit "chore: add project config" --files .planning/config.json
346
262
  ```
347
263
 
348
- **Note:** Run `/ariadna:settings` anytime to update these preferences.
264
+ **Note:** Run `/ariadna:settings` anytime to update these preferences (research, model profile, parallelization, etc.).
349
265
 
350
266
  ## 5.5. Resolve Model Profile
351
267
 
352
- Use models from init: `researcher_model`, `synthesizer_model`, `roadmapper_model`.
268
+ Use models from init: `roadmapper_model`.
353
269
 
354
270
  ## 6. Research Decision
355
271
 
356
- **If auto mode:** Default to "Research first" without asking.
272
+ **Default: Skip research.** Rails conventions are pre-loaded via `rails-conventions.md` reference document, which provides standard stack, architecture patterns, common pitfalls, and testing patterns.
357
273
 
358
- Use AskUserQuestion:
359
- - header: "Research"
360
- - question: "Research the domain ecosystem before defining requirements?"
361
- - options:
362
- - "Research first (Recommended)" — Discover standard stacks, expected features, architecture patterns
363
- - "Skip research" — I know this domain well, go straight to requirements
274
+ **If `--research` flag was passed or auto mode:** Run full research (see below).
364
275
 
365
- **If "Research first":**
276
+ **Otherwise:** Display skip notice and continue to Step 7:
277
+
278
+ ```
279
+ Using pre-loaded Rails conventions (stack, architecture, patterns, pitfalls).
280
+ To research instead: /ariadna:new-project --research
281
+ ```
282
+
283
+ **If research requested (`--research` flag or auto mode):**
366
284
 
367
285
  Display stage banner:
368
286
  ```
@@ -596,7 +514,7 @@ Display research complete banner and key findings:
596
514
  Files: `.planning/research/`
597
515
  ```
598
516
 
599
- **If "Skip research":** Continue to Step 7.
517
+ **If research not requested:** Continue to Step 7.
600
518
 
601
519
  ## 7. Define Requirements
602
520
 
@@ -769,6 +687,9 @@ Task(prompt="
769
687
  **Research (if exists):**
770
688
  @.planning/research/SUMMARY.md
771
689
 
690
+ **Rails Conventions (pre-loaded domain knowledge):**
691
+ @~/.claude/ariadna/references/rails-conventions.md
692
+
772
693
  **Config:**
773
694
  @.planning/config.json
774
695
 
@@ -780,8 +701,9 @@ Create roadmap:
780
701
  2. Map every v1 requirement to exactly one phase
781
702
  3. Derive 2-5 success criteria per phase (observable user behaviors)
782
703
  4. Validate 100% coverage
783
- 5. Write files immediately (ROADMAP.md, STATE.md, update REQUIREMENTS.md traceability)
784
- 6. Return ROADMAP CREATED with summary
704
+ 5. Use Rails conventions reference for standard patterns and build order
705
+ 6. Write files immediately (ROADMAP.md, STATE.md, update REQUIREMENTS.md traceability)
706
+ 7. Return ROADMAP CREATED with summary
785
707
 
786
708
  Write files first, then return. This ensures artifacts persist even if context is lost.
787
709
  </instructions>
@@ -903,14 +825,15 @@ Present completion with next steps:
903
825
 
904
826
  **Phase 1: [Phase Name]** — [Goal from ROADMAP.md]
905
827
 
906
- /ariadna:discuss-phase 1 — gather context and clarify approach
828
+ /ariadna:plan-phase 1
907
829
 
908
830
  <sub>/clear first → fresh context window</sub>
909
831
 
910
832
  ---
911
833
 
912
834
  **Also available:**
913
- - /ariadna:plan-phase 1 — skip discussion, plan directly
835
+ - /ariadna:discuss-phase 1 — gather detailed context before planning (optional)
836
+ - /ariadna:plan-phase 1 --research — research before planning (for non-standard integrations)
914
837
 
915
838
  ───────────────────────────────────────────────────────────────
916
839
  ```
@@ -940,18 +863,18 @@ Present completion with next steps:
940
863
  - [ ] Brownfield detection completed
941
864
  - [ ] Deep questioning completed (threads followed, not rushed)
942
865
  - [ ] PROJECT.md captures full context → **committed**
943
- - [ ] config.json has workflow mode, depth, parallelization → **committed**
944
- - [ ] Research completed (if selected) — 4 parallel agents spawned → **committed**
945
- - [ ] Requirements gathered (from research or conversation)
866
+ - [ ] config.json has opinionated defaults → **committed**
867
+ - [ ] Research completed (only if `--research` flag) — 4 parallel agents spawned → **committed**
868
+ - [ ] Requirements gathered (from research or conversation, with Rails conventions as context)
946
869
  - [ ] User scoped each category (v1/v2/out of scope)
947
870
  - [ ] REQUIREMENTS.md created with REQ-IDs → **committed**
948
- - [ ] ariadna-roadmapper spawned with context
871
+ - [ ] ariadna-roadmapper spawned with context (including rails-conventions.md)
949
872
  - [ ] Roadmap files written immediately (not draft)
950
873
  - [ ] User feedback incorporated (if any)
951
874
  - [ ] ROADMAP.md created with phases, requirement mappings, success criteria
952
875
  - [ ] STATE.md initialized
953
876
  - [ ] REQUIREMENTS.md traceability updated
954
- - [ ] User knows next step is `/ariadna:discuss-phase 1`
877
+ - [ ] User knows next step is `/ariadna:plan-phase 1`
955
878
 
956
879
  **Atomic commits:** Each phase commits its artifacts immediately. If context is lost, artifacts persist.
957
880