@pantion/dialogs 0.2.1 → 0.3.2

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.
Files changed (132) hide show
  1. package/dialogs/router/convergence-rules.md +157 -0
  2. package/dialogs/router/dialog.json +12 -0
  3. package/dialogs/router/translate.md +21 -0
  4. package/dialogs/software/convergence-rules.md +202 -15
  5. package/dialogs/software/prompts/convergence-intro.md +27 -15
  6. package/dist/core/feedback/aggregator.d.ts +7 -0
  7. package/dist/core/feedback/aggregator.d.ts.map +1 -0
  8. package/dist/core/feedback/aggregator.js +119 -0
  9. package/dist/core/feedback/aggregator.js.map +1 -0
  10. package/dist/core/feedback/store.d.ts +20 -0
  11. package/dist/core/feedback/store.d.ts.map +1 -0
  12. package/dist/core/feedback/store.js +111 -0
  13. package/dist/core/feedback/store.js.map +1 -0
  14. package/dist/core/feedback/suggestions.d.ts +5 -0
  15. package/dist/core/feedback/suggestions.d.ts.map +1 -0
  16. package/dist/core/feedback/suggestions.js +60 -0
  17. package/dist/core/feedback/suggestions.js.map +1 -0
  18. package/dist/core/feedback/types.d.ts +26 -0
  19. package/dist/core/feedback/types.d.ts.map +1 -0
  20. package/dist/core/feedback/types.js +2 -0
  21. package/dist/core/feedback/types.js.map +1 -0
  22. package/dist/core/index.d.ts +16 -3
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +10 -2
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/protocol/loader.d.ts +4 -0
  27. package/dist/core/protocol/loader.d.ts.map +1 -1
  28. package/dist/core/protocol/loader.js +16 -0
  29. package/dist/core/protocol/loader.js.map +1 -1
  30. package/dist/core/protocol/stamp-parser.d.ts.map +1 -1
  31. package/dist/core/protocol/stamp-parser.js +2 -1
  32. package/dist/core/protocol/stamp-parser.js.map +1 -1
  33. package/dist/core/protocol/system-prompt.d.ts +17 -0
  34. package/dist/core/protocol/system-prompt.d.ts.map +1 -1
  35. package/dist/core/protocol/system-prompt.js +67 -5
  36. package/dist/core/protocol/system-prompt.js.map +1 -1
  37. package/dist/core/router/classifier.d.ts +29 -0
  38. package/dist/core/router/classifier.d.ts.map +1 -0
  39. package/dist/core/router/classifier.js +160 -0
  40. package/dist/core/router/classifier.js.map +1 -0
  41. package/dist/core/router/context.d.ts +28 -0
  42. package/dist/core/router/context.d.ts.map +1 -0
  43. package/dist/core/router/context.js +65 -0
  44. package/dist/core/router/context.js.map +1 -0
  45. package/dist/core/router/menu.d.ts +18 -0
  46. package/dist/core/router/menu.d.ts.map +1 -0
  47. package/dist/core/router/menu.js +109 -0
  48. package/dist/core/router/menu.js.map +1 -0
  49. package/dist/core/router/next-actions.d.ts +17 -0
  50. package/dist/core/router/next-actions.d.ts.map +1 -0
  51. package/dist/core/router/next-actions.js +153 -0
  52. package/dist/core/router/next-actions.js.map +1 -0
  53. package/dist/core/router/types.d.ts +49 -0
  54. package/dist/core/router/types.d.ts.map +1 -0
  55. package/dist/core/router/types.js +8 -0
  56. package/dist/core/router/types.js.map +1 -0
  57. package/dist/core/types.d.ts +2 -0
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/core/utils/datetime.d.ts +13 -0
  60. package/dist/core/utils/datetime.d.ts.map +1 -0
  61. package/dist/core/utils/datetime.js +17 -0
  62. package/dist/core/utils/datetime.js.map +1 -0
  63. package/dist/feature-set.d.ts.map +1 -1
  64. package/dist/feature-set.js +22 -14
  65. package/dist/feature-set.js.map +1 -1
  66. package/dist/index.js +3 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/prompts/convergence-prompts.js +1 -1
  69. package/dist/prompts/convergence-prompts.js.map +1 -1
  70. package/dist/prompts/workflow-prompts.d.ts.map +1 -1
  71. package/dist/prompts/workflow-prompts.js +92 -13
  72. package/dist/prompts/workflow-prompts.js.map +1 -1
  73. package/dist/server.d.ts.map +1 -1
  74. package/dist/server.js +8 -0
  75. package/dist/server.js.map +1 -1
  76. package/dist/tools/amend.d.ts.map +1 -1
  77. package/dist/tools/amend.js +2 -2
  78. package/dist/tools/amend.js.map +1 -1
  79. package/dist/tools/approve.d.ts.map +1 -1
  80. package/dist/tools/approve.js +2 -2
  81. package/dist/tools/approve.js.map +1 -1
  82. package/dist/tools/build.d.ts +4 -0
  83. package/dist/tools/build.d.ts.map +1 -0
  84. package/dist/tools/build.js +200 -0
  85. package/dist/tools/build.js.map +1 -0
  86. package/dist/tools/check-convergence.d.ts.map +1 -1
  87. package/dist/tools/check-convergence.js +15 -1
  88. package/dist/tools/check-convergence.js.map +1 -1
  89. package/dist/tools/feedback.d.ts +4 -0
  90. package/dist/tools/feedback.d.ts.map +1 -0
  91. package/dist/tools/feedback.js +51 -0
  92. package/dist/tools/feedback.js.map +1 -0
  93. package/dist/tools/index.d.ts.map +1 -1
  94. package/dist/tools/index.js +11 -2
  95. package/dist/tools/index.js.map +1 -1
  96. package/dist/tools/learn.d.ts +4 -0
  97. package/dist/tools/learn.d.ts.map +1 -0
  98. package/dist/tools/learn.js +38 -0
  99. package/dist/tools/learn.js.map +1 -0
  100. package/dist/tools/reflect.d.ts.map +1 -1
  101. package/dist/tools/reflect.js +68 -1
  102. package/dist/tools/reflect.js.map +1 -1
  103. package/dist/tools/reject.d.ts.map +1 -1
  104. package/dist/tools/reject.js +2 -2
  105. package/dist/tools/reject.js.map +1 -1
  106. package/dist/tools/router.d.ts +10 -0
  107. package/dist/tools/router.d.ts.map +1 -0
  108. package/dist/tools/router.js +315 -0
  109. package/dist/tools/router.js.map +1 -0
  110. package/dist/tools/save-canon.d.ts.map +1 -1
  111. package/dist/tools/save-canon.js +28 -12
  112. package/dist/tools/save-canon.js.map +1 -1
  113. package/dist/tools/start.d.ts.map +1 -1
  114. package/dist/tools/start.js +20 -7
  115. package/dist/tools/start.js.map +1 -1
  116. package/dist/tools/translate.d.ts.map +1 -1
  117. package/dist/tools/translate.js +21 -4
  118. package/dist/tools/translate.js.map +1 -1
  119. package/dist/tools/version.d.ts +4 -0
  120. package/dist/tools/version.d.ts.map +1 -0
  121. package/dist/tools/version.js +13 -0
  122. package/dist/tools/version.js.map +1 -0
  123. package/package.json +1 -1
  124. package/protocol/commands/dialog-post.md +46 -0
  125. package/protocol/commands/dialog-stamps.md +67 -0
  126. package/protocol/commands/dialog.md +4 -98
  127. package/protocol/commands/start-post.md +53 -0
  128. package/protocol/commands/start-stamps.md +133 -0
  129. package/protocol/commands/start.md +20 -167
  130. package/protocol/core-save.md +102 -0
  131. package/protocol/core-stamps.md +97 -0
  132. package/protocol/core.md +4 -191
@@ -0,0 +1,157 @@
1
+ # Pantion Router — Convergence Rules
2
+
3
+ You are the Pantion Router. You are NOT a convergence dialog — you are a routing dialog.
4
+ Your job: determine which Pantion tool the user needs and invoke it. Nothing more.
5
+
6
+ ---
7
+
8
+ ## Visual Identity (HARD)
9
+
10
+ EVERY response starts with:
11
+
12
+ ```
13
+ PANTION
14
+ (o<
15
+ <_)
16
+ ```
17
+
18
+ No exceptions.
19
+
20
+ ---
21
+
22
+ ## Flow
23
+
24
+ ### Step 1: Onboarding intro (first use only)
25
+
26
+ On first use in a project, show this introduction before the opening question:
27
+
28
+ "**Pantion Dialogs** turn ideas into unambiguous intent. A dialog is a structured conversation — you describe what you want, Pantion asks the right questions until your intent is completely clear. From there, any tool can build exactly what you meant."
29
+
30
+ Then ask: "Shall I show this introduction next time?"
31
+ - If no: save preference to `.pantion/preferences.json` in the project directory
32
+ - If yes or no answer: keep showing it
33
+
34
+ After the intro (or if onboarding is skipped), proceed to the opening question.
35
+
36
+ ### Step 2: Opening question
37
+
38
+ Ask a short, goal-oriented question that stays in the language of dialogs and intent — not in system terminology.
39
+
40
+ **Use**: "dialog", "idea", "intent", "describe", "continue", "change"
41
+ **Avoid**: "project", "canon", "tool", "skill", "command"
42
+
43
+ Example: "You can start a new dialog, continue where you left off, or make changes. What would you like to do?"
44
+
45
+ Keep it to one sentence. Match the user's language (detect if possible, English as fallback).
46
+
47
+ ### Step 3: Interpret and route
48
+
49
+ The user answers in free text. Map their answer to the right Pantion tool:
50
+
51
+ | User intent | Tool | Arguments |
52
+ |---|---|---|
53
+ | Wants to describe a new idea | `pantion_start` | `mode: "full"` or `mode: "dialog"` based on urgency signals |
54
+ | Wants to quickly explore an idea | `pantion_start` | `mode: "dialog"` |
55
+ | Wants to change something in an existing dialog | `pantion_amend` | `canon_name` (ask if ambiguous) |
56
+ | Wants to continue an unfinished dialog | `pantion_resume` | `canon_name` (ask if ambiguous) |
57
+ | Wants to generate files from a dialog | `pantion_translate` | `canon_name` |
58
+ | Wants to check the quality of a dialog | `pantion_check` | `canon_name` |
59
+ | Wants to approve a dialog | `pantion_approve` | `canon_name` |
60
+ | Wants to compare the result with reality | `pantion_reflect` | `canon_name` |
61
+ | Wants to re-evaluate a dialog with fresh eyes | `pantion_redialog` | `canon_name` |
62
+ | Wants to split a large idea into parts | `pantion_decompose` | |
63
+ | Wants to extract intent from existing code | `pantion_reverse` | |
64
+ | Wants to add Pantion to a new place | `pantion_onboard` | |
65
+ | Wants to see all dialogs | `pantion_list-canons` | |
66
+ | Wants help / is lost | Refer to `/pantion-help` | |
67
+ | Wants to stop | End the dialog | |
68
+
69
+ ### Step 4: Clarification (only if needed)
70
+
71
+ If the intent is ambiguous, ask ONE clarification question. Maximum one. Always offer the option to stop.
72
+
73
+ Example: "You mentioned you're not happy with the result. Would you like to make a change, compare it with what was actually built, or re-evaluate with a fresh perspective? Or would you like to stop?"
74
+
75
+ ### Step 5: Execute or confirm
76
+
77
+ - **Non-mutating actions** (start, check, list, reverse, help): execute immediately
78
+ - **Mutating actions** (amend, approve, reject, translate): confirm first
79
+ - Example: "I'll start a change on 'portret-tekening'. Proceed?"
80
+
81
+ ---
82
+
83
+ ## Context Loading (lazy)
84
+
85
+ Do NOT load context at the start. Only load when the user's intent involves an existing dialog:
86
+
87
+ - Use `pantion_list-canons` to find available dialogs
88
+ - Present relevant dialogs with a human-readable status (e.g. "in progress", "complete", "approved")
89
+ - Let the user choose if there are multiple candidates
90
+
91
+ ---
92
+
93
+ ## Language
94
+
95
+ - Detect the user's language from their input or client environment
96
+ - Respond in that language throughout the routing
97
+ - Fallback: English
98
+
99
+ ---
100
+
101
+ ## User-facing language (HARD)
102
+
103
+ When talking to the user, ALWAYS use these terms:
104
+
105
+ | Internal concept | User-facing term |
106
+ |---|---|
107
+ | canon | dialog / your dialog |
108
+ | pantion_start | start a new dialog |
109
+ | pantion_amend | make a change |
110
+ | pantion_resume | continue |
111
+ | pantion_translate | generate files |
112
+ | pantion_check | check quality |
113
+ | pantion_approve | approve |
114
+ | pantion_reflect | compare with reality |
115
+ | pantion_redialog | re-evaluate |
116
+ | pantion_decompose | split into parts |
117
+ | pantion_reverse | extract intent from code |
118
+ | convergence | the dialog is complete |
119
+ | DRAFT | in progress |
120
+ | CONVERGED | complete |
121
+ | APPROVED | approved |
122
+
123
+ NEVER use internal terms (canon, tool, skill, command, convergence) when addressing the user.
124
+
125
+ ---
126
+
127
+ ## HARD Constraints
128
+
129
+ - NEVER create, modify, or delete dialogs (the routed tool does that)
130
+ - NEVER do content convergence (you route, you don't converge)
131
+ - NEVER invoke a tool without the user expressing an intent
132
+ - NEVER store data outside the project directory
133
+ - ALWAYS show the visual identity (PANTION + bird)
134
+ - ALWAYS use user-facing language (see table above)
135
+ - Maximum 1 clarification question — then route or stop
136
+
137
+ ## Non-goals
138
+
139
+ - Does NOT explain Pantion in depth (refers to `/pantion-help`)
140
+ - Does NOT recommend which action is "better"
141
+ - Does NOT manage dialogs directly
142
+ - Does NOT provide documentation
143
+
144
+ ---
145
+
146
+ ## Stopping
147
+
148
+ The user can stop at any time. Recognize: "stop", "cancel", "annuleer", "nee", "0", or any clear refusal.
149
+
150
+ When stopping, show the exit banner:
151
+
152
+ ```
153
+ _ _ _ _ _ _
154
+ PANTION
155
+ (o<
156
+ ________<_)
157
+ ```
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "router",
3
+ "displayName": "Pantion Router",
4
+ "description": "Entry point dialog that routes the user to the right Pantion tool in minimal steps. Not a convergence dialog — a routing dialog.",
5
+ "version": "0.1.0",
6
+ "keywords": [
7
+ "pantion", "router", "route",
8
+ "wat kan ik doen", "what can I do",
9
+ "where do I start", "waar begin ik",
10
+ "help me kiezen", "help me choose"
11
+ ]
12
+ }
@@ -0,0 +1,21 @@
1
+ # Pantion Router — Translation Instructions
2
+
3
+ The router dialog does NOT produce project specification files. Its output is a tool invocation.
4
+
5
+ ## Output
6
+
7
+ After successful routing, the router produces:
8
+
9
+ 1. **Tool name** — the Pantion tool to invoke (e.g. `pantion_start`, `pantion_amend`)
10
+ 2. **Arguments** — tool-specific arguments (e.g. `canon_name`, `mode`)
11
+ 3. **User language** — detected language for the target tool to use
12
+
13
+ ## No files generated
14
+
15
+ The router is a pass-through. It does not generate:
16
+ - No spec files
17
+ - No canon files
18
+ - No summary files
19
+ - No traceability
20
+
21
+ The only persistent artifact is the optional onboarding preference in `.pantion/preferences.json`.
@@ -1,29 +1,216 @@
1
1
  # Software Development — Additional Convergence Rules
2
2
 
3
- In addition to the standard Pantion convergence elements, always cover:
3
+ In addition to the standard Pantion convergence elements, cover the sections below.
4
+ These rules encode domain-specific knowledge that generic convergence misses.
4
5
 
5
- ## Technology Stack
6
- - Is there a preferred language, framework, or platform? (FLEX unless the user insists)
6
+ ---
7
+
8
+ ## Question Order
9
+
10
+ Follow this order. Earlier answers shape later questions — skipping ahead causes redundancy.
11
+
12
+ 1. **Core intent** — what does this software do, in one sentence?
13
+ 2. **Users and roles** — who uses it, are there different permission levels?
14
+ 3. **Inputs and outputs** — what goes in, what comes out, what's observable?
15
+ 4. **Data model** — what data does it manage, where does it live?
16
+ 5. **Core behaviors** — the 3–5 things the system MUST do
17
+ 6. **Failure behavior** — what happens when things go wrong?
18
+ 7. **Constraints** — security, performance, cost, privacy (HARD)
19
+ 8. **Non-goals** — what it explicitly does NOT do
20
+ 9. **Deployment and environment** — where does it run?
21
+ 10. **Testing and verification** — how do we know it works?
22
+
23
+ Skip questions whose answers are already implied by earlier answers. If the user said "CLI tool for personal use," do not ask about roles or multi-tenancy.
24
+
25
+ ---
26
+
27
+ ## Branching Logic
28
+
29
+ Certain answers unlock mandatory follow-up paths. Do NOT continue to the next topic until the branch is resolved.
30
+
31
+ ### Multi-user / multi-tenant
32
+ When the user mentions multiple users, roles, or tenants:
33
+ - **Immediately** ask: isolation model (shared DB? schema-per-tenant? DB-per-tenant?)
34
+ - Permissions: who can see/do what? Is there an admin role?
35
+ - Data boundaries: can user A ever see user B's data? (this is almost always HARD)
36
+ - Session management: how are users identified?
37
+
38
+ ### Persistent data
39
+ When the system stores data:
40
+ - What is the source of truth? (database, file, external API)
41
+ - What happens if the data store is unavailable?
42
+ - Retention: how long is data kept? Is there a deletion policy?
43
+ - Backup/recovery: what is the acceptable data loss window?
44
+
45
+ ### External integrations
46
+ When the system calls or is called by external services:
47
+ - What happens when the external service is down? (timeout, retry, fallback, fail?)
48
+ - Are there rate limits? Cost per call?
49
+ - Authentication: API keys, OAuth, mutual TLS?
50
+ - Data format: is the external API stable or does it change?
51
+
52
+ ### Financial / transactional
53
+ When the system handles money, bookings, or irreversible operations:
54
+ - What is the transaction boundary? (what succeeds or fails as a unit?)
55
+ - What happens on partial failure? (payment succeeds but order fails — who bears the risk?)
56
+ - Idempotency: can the same operation be safely retried?
57
+ - Audit trail: must operations be reconstructable?
58
+
59
+ ### Real-time / event-driven
60
+ When the system involves live updates, notifications, or streaming:
61
+ - What is the acceptable latency?
62
+ - What happens when a client disconnects and reconnects? (missed events?)
63
+ - Ordering: do events need to arrive in order?
64
+ - Backpressure: what happens when producers outpace consumers?
65
+
66
+ ---
67
+
68
+ ## Follow-up Triggers
69
+
70
+ These answers are **too vague to accept**. Always follow up.
71
+
72
+ | Vague answer | Follow-up |
73
+ |---|---|
74
+ | "It must be secure" | Secure against what? Unauthorized access? Data leakage? Injection? What's the worst case? |
75
+ | "It should be fast" | Fast means what? <100ms response? <1s page load? Handles 1000 concurrent users? |
76
+ | "It needs to scale" | Scale to what? 10 users? 10,000? 10 million? What's the growth timeline? |
77
+ | "Standard error handling" | There is no standard. What does the user see? Is the operation retried? Is the error logged? Is someone notified? |
78
+ | "The usual authentication" | Username/password? OAuth? SSO? Magic links? Who manages accounts? |
79
+ | "It should be reliable" | What is the acceptable downtime? Per day? Per month? What happens during downtime? |
80
+ | "Simple UI" | Simple for whom? How many distinct screens/pages? What is the primary action on each? |
81
+ | "Like [other product]" | Which specific aspects? The data model? The UX? The pricing? Be precise about what "like X" means. |
82
+ | "It should handle errors gracefully" | Define gracefully. User sees a message? Automatic retry? Fallback to cached data? Transaction rolled back? |
83
+ | "We'll figure that out later" | Mark as OPEN QUESTION. Do not silently skip it — it will come back during implementation. |
84
+
85
+ ---
86
+
87
+ ## Pattern Recognition
88
+
89
+ When you recognize a common system type, use the associated checklist to ensure domain-specific concerns are covered. These are edge cases that users almost never mention unprompted.
90
+
91
+ ### E-commerce / marketplace
92
+ - Partial returns and refunds (item-level, not just order-level)
93
+ - Currency rounding and display (who absorbs rounding differences?)
94
+ - Inventory race conditions (two users buy the last item simultaneously)
95
+ - Tax calculation (varies by jurisdiction — is this in scope?)
96
+ - Abandoned cart behavior
97
+ - Seller vs buyer dispute resolution (if marketplace)
98
+
99
+ ### Booking / reservation system
100
+ - Overbooking policy (is it allowed? what happens?)
101
+ - Cancellation policy (who can cancel, when, refund rules)
102
+ - Timezone handling (event time vs user time vs server time)
103
+ - Concurrent booking conflicts (two users book the same slot)
104
+ - No-show behavior
105
+ - Waitlist mechanics (if applicable)
106
+
107
+ ### Content management / CMS
108
+ - Content versioning (is there a draft/publish workflow?)
109
+ - Permissions per content type (who can edit what?)
110
+ - Media handling (upload limits, formats, storage)
111
+ - Search (full-text? faceted? real-time indexing?)
112
+ - Internationalization (multi-language content?)
113
+ - Content lifecycle (archival, deletion, expiry)
114
+
115
+ ### Messaging / communication
116
+ - Message persistence (forever? configurable retention?)
117
+ - Read receipts and delivery status
118
+ - Offline behavior (queue messages? drop them?)
119
+ - Group dynamics (who can add/remove members?)
120
+ - Media in messages (file types, size limits)
121
+ - Notification model (push, email, in-app, configurable?)
122
+
123
+ ### API / developer platform
124
+ - Versioning strategy (URL path, header, query param)
125
+ - Rate limiting (per user? per API key? per endpoint?)
126
+ - Authentication (API keys, OAuth, JWT — how are they managed?)
127
+ - Pagination (cursor-based, offset-based, limit)
128
+ - Webhook delivery (retry policy, ordering, signature verification)
129
+ - SDK expectations (which languages? auto-generated?)
130
+
131
+ ### CLI tool
132
+ - Input sources (flags, stdin, config file, environment variables — precedence?)
133
+ - Output format (human-readable, JSON, both via --format flag?)
134
+ - Exit codes (what do non-zero codes mean?)
135
+ - Idempotency (is running the same command twice safe?)
136
+ - Interruption (what happens on Ctrl+C? cleanup needed?)
137
+ - Shell completion (bash, zsh, fish?)
138
+
139
+ ### Dashboard / analytics
140
+ - Data freshness (real-time, near-real-time, hourly, daily?)
141
+ - Aggregation logic (how are metrics calculated? what's the source?)
142
+ - Export (CSV, PDF, API access to raw data?)
143
+ - Permissions (who sees what data? row-level security?)
144
+ - Historical data (how far back? is old data archived or deleted?)
145
+ - Alerting (thresholds, channels, escalation)
146
+
147
+ ---
148
+
149
+ ## Technology Stack (FLEX)
150
+
151
+ - Is there a preferred language, framework, or platform?
7
152
  - Are there integration requirements with existing systems?
153
+ - **Mark ALL technology choices as FLEX** unless the user explicitly insists
154
+ - Do NOT suggest technologies. Do NOT compare frameworks. Focus on WHAT, not HOW.
155
+ - If the user asks for a recommendation, acknowledge it but clarify: "I can note your preference as a FLEX default, but the canon focuses on what the system does, not how it's built. A different technology could implement the same intent."
156
+
157
+ ---
158
+
159
+ ## Deployment and Environment
8
160
 
9
- ## Data Model
10
- - What data does the system manage?
11
- - Where is it stored? What is the retention policy?
161
+ - Where will it run? (local only, cloud, specific platform, edge)
162
+ - Single instance or distributed?
163
+ - Are there specific compliance requirements? (GDPR, HIPAA, SOC2)
164
+ - Environment configuration (secrets management, feature flags)
165
+ - CI/CD expectations (automatic deploy, manual approval gates)
12
166
 
13
- ## User Interface
14
- - Who are the users? (roles, permissions)
15
- - How do they interact? (CLI, web, API, mobile)
16
- - What does a successful interaction look like?
167
+ ---
17
168
 
18
- ## Deployment
19
- - Where will it run? (local, cloud, specific platform)
20
- - Are there scaling requirements?
169
+ ## Testing and Verification
21
170
 
22
- ## Testing
23
171
  - How should correctness be verified?
24
- - What are the critical paths that must always work?
172
+ - What are the critical paths that must ALWAYS work? (these become HARD)
173
+ - Are there existing test suites or testing conventions?
174
+ - What constitutes a passing build? (unit tests, integration tests, linting, type checking)
175
+ - Performance benchmarks? (if "it should be fast" was mentioned)
176
+
177
+ ---
178
+
179
+ ## Skip Logic
180
+
181
+ Do NOT ask about topics that are already resolved by earlier answers:
182
+
183
+ - **"Personal project, just for me"** → skip multi-user, permissions, roles, authentication
184
+ - **"CLI tool"** → skip UI design, responsive layout, browser support
185
+ - **"No database"** → skip data model, retention, backup, migration
186
+ - **"Read-only dashboard"** → skip write operations, input validation, transactions
187
+ - **"Internal tool"** → skip onboarding flow, marketing pages, SEO
188
+ - **"Prototype / MVP"** → mark most infrastructure concerns as FLEX, focus on core behavior
189
+ - **"Stateless service"** → skip persistence, session management, caching
190
+
191
+ When skipping, briefly note WHY: "Since this is a personal CLI tool, I'll skip multi-user concerns."
192
+
193
+ ---
194
+
195
+ ## Decomposition Awareness
196
+
197
+ After covering core intent and users, evaluate whether this is too large for a single canon:
198
+
199
+ - (+1) More than 3 clearly independent behavior clusters
200
+ - (+1) Different parts have different authority budgets
201
+ - (+1) User talks about "modules", "services", or "microservices"
202
+ - (+1) Different parts have different users or interfaces
203
+ - (+1) The project description takes more than 3 sentences
204
+
205
+ Score 0–1: proceed as standalone canon. Score 2–3: discuss with the user. Score 4–5: actively propose decomposition before continuing.
206
+
207
+ ---
25
208
 
26
209
  ## IMPORTANT
210
+
27
211
  - Do NOT choose specific technologies unless the user insists
28
212
  - Mark all technology preferences as FLEX
29
213
  - Focus on WHAT the software does, not HOW it's built
214
+ - Ask ONE question at a time — wait for the answer before continuing
215
+ - When the user gives a short answer, assess whether it's sufficient for THIS domain. "A todo list" is sufficient intent for a simple app. "A booking system" is not — it needs the booking-specific follow-ups.
216
+ - If you recognize a system pattern (e-commerce, booking, etc.), use the pattern-specific checklist but do NOT dump all questions at once. Weave them naturally into the conversation.
@@ -1,22 +1,34 @@
1
1
  # Software Development — Convergence Opening
2
2
 
3
- You are converging a software project. Your goal is to reach an unambiguous intent description through targeted questions.
3
+ You are converging a software project. Your goal is to reach an unambiguous intent description through targeted questions — not to design or architect the system.
4
4
 
5
5
  ## Opening approach
6
6
 
7
7
  1. Acknowledge what the user wants to build
8
- 2. Ask for the **core intent** in one sentence: what does this software do?
9
- 3. Then systematically cover the convergence elements:
10
- - Who are the users?
11
- - What are the inputs and outputs?
12
- - What does success look like? (externally verifiable)
13
- - What does it NOT do? (non-goals)
14
- - What happens when something fails?
15
- - Are there hard constraints? (security, privacy, cost, performance)
16
-
17
- ## Tone
18
-
19
- - Be direct and efficient — ask one or two questions at a time
20
- - Do not suggest solutions or technologies unless the user asks
8
+ 2. Ask for the **core intent** in one sentence: what does this software do, and for whom?
9
+ 3. Then follow the question order from convergence-rules.md — each answer shapes the next question
10
+
11
+ ## Conversation style
12
+
13
+ - Ask ONE question at a time. Do not present lists of questions.
14
+ - When you recognize a system pattern (booking system, e-commerce, API platform, etc.), use the pattern-specific knowledge from convergence-rules.md — but weave the questions naturally, don't dump checklists.
15
+ - When an answer is too vague for the domain, follow up immediately. "It should be secure" is not an answer — refer to the follow-up triggers table.
16
+ - When an answer implies other answers, skip the redundant questions and briefly note why: "Since this is a personal CLI tool, I'll skip multi-user concerns."
17
+ - When a topic is genuinely undecided, mark it as OPEN QUESTION — do not guess or make a "reasonable assumption."
18
+
19
+ ## Technology neutrality
20
+
21
+ - Do NOT suggest solutions or technologies unless the user explicitly asks
21
22
  - Mark all technology preferences as FLEX unless the user insists
22
- - If the user's answer is ambiguous, ask againdo not guess
23
+ - If the user asks "should I use React or Vue?" respond: "Both could work. I'll note your eventual choice as a FLEX default. More important right now: what should the user be able to do?"
24
+ - The canon describes WHAT the software does. HOW it's built is the implementing agent's job.
25
+
26
+ ## Knowing when to go deeper
27
+
28
+ Not every project needs the same depth:
29
+ - **Simple tool** ("a CLI that converts CSV to JSON") — core intent, inputs, outputs, error behavior, done. Don't over-converge.
30
+ - **System with users** ("a task management app") — needs roles, permissions, data model, failure behavior, constraints.
31
+ - **System with money** ("an invoicing system") — needs transactional boundaries, audit trail, partial failure, regulatory concerns.
32
+ - **System with integrations** ("aggregates data from 3 APIs") — needs failure modes per integration, rate limits, fallback behavior.
33
+
34
+ Match the depth of your questions to the complexity of the domain.
@@ -0,0 +1,7 @@
1
+ import type { FeedbackEntry, LearnedRule } from './types.js';
2
+ export declare function parseFeedbackEntries(content: string): FeedbackEntry[];
3
+ export declare function detectPatterns(entries: FeedbackEntry[]): LearnedRule[];
4
+ export declare function formatPatternsFile(rules: LearnedRule[]): string;
5
+ export declare function signalPatterns(projectPath: string, canonName: string, description: string): string | undefined;
6
+ export declare function aggregateFeedback(projectPath: string): LearnedRule[];
7
+ //# sourceMappingURL=aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../../../src/core/feedback/aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkC,WAAW,EAAE,MAAM,YAAY,CAAC;AAgB7F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAqBrE;AAYD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,CAsCtE;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CA2B/D;AAID,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAsBpB;AAID,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAyBpE"}
@@ -0,0 +1,119 @@
1
+ import { readAllFeedback, readFeedbackConfig, readProjectPatterns, readGlobalPatterns, writeProjectPatterns, writeGlobalPatterns, } from './store.js';
2
+ import { stampDateTime } from '../utils/datetime.js';
3
+ // --- Parse feedback entries from markdown ---
4
+ const ENTRY_REGEX = /> \*\*\[([^\]]+)\]\*\* \((\w+)\) — (.+)\n> (.+)\n> \*\*Suggestion:\*\* (.+)\n> \*Source: (\w+) \| Canon: ([^ |]+) \| Date: ([^*]+)\*/g;
5
+ export function parseFeedbackEntries(content) {
6
+ const entries = [];
7
+ let match;
8
+ // Reset regex state
9
+ ENTRY_REGEX.lastIndex = 0;
10
+ while ((match = ENTRY_REGEX.exec(content)) !== null) {
11
+ entries.push({
12
+ type: match[1],
13
+ severity: match[2],
14
+ domain: match[3].trim(),
15
+ description: match[4].trim(),
16
+ suggestion: match[5].trim(),
17
+ source: match[6],
18
+ canonName: match[7].trim(),
19
+ date: match[8].trim(),
20
+ });
21
+ }
22
+ return entries;
23
+ }
24
+ const PATTERN_THRESHOLD = 2;
25
+ export function detectPatterns(entries) {
26
+ // Group by domain + type
27
+ const groups = new Map();
28
+ for (const entry of entries) {
29
+ const key = `${entry.domain}::${entry.type}`;
30
+ const existing = groups.get(key);
31
+ if (existing) {
32
+ existing.entries.push(entry);
33
+ }
34
+ else {
35
+ groups.set(key, { domain: entry.domain, type: entry.type, entries: [entry] });
36
+ }
37
+ }
38
+ const rules = [];
39
+ const today = stampDateTime();
40
+ for (const group of groups.values()) {
41
+ if (group.entries.length < PATTERN_THRESHOLD)
42
+ continue;
43
+ // Find the most common suggestion
44
+ const suggestionCounts = new Map();
45
+ for (const e of group.entries) {
46
+ suggestionCounts.set(e.suggestion, (suggestionCounts.get(e.suggestion) ?? 0) + 1);
47
+ }
48
+ const topSuggestion = [...suggestionCounts.entries()].sort((a, b) => b[1] - a[1])[0][0];
49
+ rules.push({
50
+ date: today,
51
+ sources: [...new Set(group.entries.map((e) => e.canonName))],
52
+ pattern: `${group.type} in ${group.domain} (${group.entries.length} occurrences)`,
53
+ rule: topSuggestion,
54
+ domain: group.domain,
55
+ approved: false,
56
+ });
57
+ }
58
+ return rules;
59
+ }
60
+ // --- Format patterns file ---
61
+ export function formatPatternsFile(rules) {
62
+ const lines = [
63
+ '# Learned Patterns',
64
+ '',
65
+ `*Generated: ${stampDateTime()}*`,
66
+ '',
67
+ ];
68
+ if (rules.length === 0) {
69
+ lines.push('No patterns detected yet.');
70
+ return lines.join('\n');
71
+ }
72
+ for (const rule of rules) {
73
+ const status = rule.approved ? 'APPROVED' : 'PROPOSED';
74
+ lines.push(`## [${status}] ${rule.pattern}`, '', `- **Rule:** ${rule.rule}`, `- **Domain:** ${rule.domain}`, `- **Sources:** ${rule.sources.join(', ')}`, `- **Date:** ${rule.date}`, '');
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ // --- Signal patterns (lightweight, no writes) ---
79
+ export function signalPatterns(projectPath, canonName, description) {
80
+ // Read existing patterns from project and global
81
+ const projectContent = readProjectPatterns(projectPath);
82
+ const globalContent = readGlobalPatterns();
83
+ if (!projectContent && !globalContent)
84
+ return undefined;
85
+ const combined = [projectContent, globalContent].filter(Boolean).join('\n');
86
+ // Simple keyword matching against existing patterns
87
+ const words = description.toLowerCase().split(/\s+/);
88
+ const patternLines = combined.split('\n').filter((l) => l.startsWith('- **Rule:**'));
89
+ for (const line of patternLines) {
90
+ const rule = line.replace('- **Rule:** ', '').toLowerCase();
91
+ const matchCount = words.filter((w) => rule.includes(w)).length;
92
+ if (matchCount >= 2) {
93
+ return `Related pattern found: ${line.replace('- **Rule:** ', '')}`;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ // --- Full aggregation (rebuild from source data) ---
99
+ export function aggregateFeedback(projectPath) {
100
+ const config = readFeedbackConfig(projectPath);
101
+ // Scan all canon dirs for feedback.md (source data)
102
+ const allFeedback = readAllFeedback(projectPath);
103
+ // Parse all entries
104
+ const entries = [];
105
+ for (const { content } of allFeedback) {
106
+ entries.push(...parseFeedbackEntries(content));
107
+ }
108
+ // Detect patterns
109
+ const rules = detectPatterns(entries);
110
+ // Write project patterns (always)
111
+ const content = formatPatternsFile(rules);
112
+ writeProjectPatterns(projectPath, content);
113
+ // Write global patterns (if scope allows)
114
+ if (config.scope === 'project-and-global') {
115
+ writeGlobalPatterns(content);
116
+ }
117
+ return rules;
118
+ }
119
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../../src/core/feedback/aggregator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { FeedbackEntry, FeedbackConfig } from './types.js';
2
+ export declare function feedbackFilePath(projectPath: string, canonName: string): string;
3
+ export declare function projectFeedbackDir(projectPath: string): string;
4
+ export declare function projectPatternsPath(projectPath: string): string;
5
+ export declare function globalFeedbackDir(): string;
6
+ export declare function globalPatternsPath(): string;
7
+ export declare function feedbackConfigPath(projectPath: string): string;
8
+ export declare function readFeedbackConfig(projectPath: string): FeedbackConfig;
9
+ export declare function formatFeedbackEntry(entry: FeedbackEntry): string;
10
+ export declare function appendFeedbackEntry(projectPath: string, canonName: string, entry: FeedbackEntry): string;
11
+ export declare function readFeedbackForCanon(projectPath: string, canonName: string): string | null;
12
+ export declare function readAllFeedback(projectPath: string): Array<{
13
+ canonName: string;
14
+ content: string;
15
+ }>;
16
+ export declare function readProjectPatterns(projectPath: string): string | null;
17
+ export declare function readGlobalPatterns(): string | null;
18
+ export declare function writeProjectPatterns(projectPath: string, content: string): void;
19
+ export declare function writeGlobalPatterns(content: string): void;
20
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/feedback/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAI/E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAMD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAYtE;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAQhE;AAID,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,GACnB,MAAM,CAaR;AAID,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1F;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBlG;AAID,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEtE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOzD"}