|
160 | 160 | ], |
161 | 161 | "passes": true, |
162 | 162 | "priority": "P2" |
| 163 | + }, |
| 164 | + { |
| 165 | + "id": "US-012", |
| 166 | + "title": "Trust prompt resolver with allowlist auto-trust", |
| 167 | + "description": "Add allowlisted auto-trust behavior for known repos/worktrees. Trust prompts currently block TUI startup and require manual intervention. Implement automatic trust resolution for pre-approved repositories.", |
| 168 | + "acceptanceCriteria": [ |
| 169 | + "TrustAllowlist config structure with repo patterns", |
| 170 | + "Auto-trust behavior for allowlisted repos/worktrees", |
| 171 | + "trust_required event emitted when trust prompt detected", |
| 172 | + "trust_resolved event emitted when trust is granted", |
| 173 | + "Non-allowlisted repos remain gated (manual trust required)", |
| 174 | + "Integration with worker boot lifecycle", |
| 175 | + "Tests for allowlist matching and event emission" |
| 176 | + ], |
| 177 | + "passes": true, |
| 178 | + "priority": "P1" |
| 179 | + }, |
| 180 | + { |
| 181 | + "id": "US-013", |
| 182 | + "title": "Phase 2 - Session event ordering + terminal-state reconciliation", |
| 183 | + "description": "When the same session emits contradictory lifecycle events (idle, error, completed, transport/server-down) in close succession, expose deterministic final truth. Attach monotonic sequence/causal ordering metadata, classify terminal vs advisory events, reconcile duplicate/out-of-order terminal events into one canonical lane outcome.", |
| 184 | + "acceptanceCriteria": [ |
| 185 | + "Monotonic sequence / causal ordering metadata attached to session lifecycle events", |
| 186 | + "Terminal vs advisory event classification implemented", |
| 187 | + "Reconcile duplicate or out-of-order terminal events into one canonical outcome", |
| 188 | + "Distinguish 'session terminal state unknown because transport died' from real 'completed'", |
| 189 | + "Tests verify reconciliation behavior with out-of-order event bursts" |
| 190 | + ], |
| 191 | + "passes": true, |
| 192 | + "priority": "P1" |
| 193 | + }, |
| 194 | + { |
| 195 | + "id": "US-014", |
| 196 | + "title": "Phase 2 - Event provenance / environment labeling", |
| 197 | + "description": "Every emitted event should declare its source (live_lane, test, healthcheck, replay, transport) so claws do not mistake test noise for production truth. Include environment/channel label, emitter identity, and confidence/trust level.", |
| 198 | + "acceptanceCriteria": [ |
| 199 | + "EventProvenance enum with live_lane, test, healthcheck, replay, transport variants", |
| 200 | + "Environment/channel label attached to all events", |
| 201 | + "Emitter identity field on events", |
| 202 | + "Confidence/trust level field for downstream automation", |
| 203 | + "Tests verify provenance labeling and filtering" |
| 204 | + ], |
| 205 | + "passes": true, |
| 206 | + "priority": "P1" |
| 207 | + }, |
| 208 | + { |
| 209 | + "id": "US-015", |
| 210 | + "title": "Phase 2 - Session identity completeness at creation time", |
| 211 | + "description": "A newly created session should emit stable title, workspace/worktree path, and lane/session purpose at creation time. If any field is not yet known, emit explicit typed placeholder reason rather than bare unknown string.", |
| 212 | + "acceptanceCriteria": [ |
| 213 | + "Session creation emits stable title, workspace/worktree path, purpose immediately", |
| 214 | + "Explicit typed placeholder when fields unknown (not bare 'unknown' strings)", |
| 215 | + "Later-enriched metadata reconciles onto same session identity without ambiguity", |
| 216 | + "Tests verify session identity completeness and placeholder handling" |
| 217 | + ], |
| 218 | + "passes": true, |
| 219 | + "priority": "P1" |
| 220 | + }, |
| 221 | + { |
| 222 | + "id": "US-016", |
| 223 | + "title": "Phase 2 - Duplicate terminal-event suppression", |
| 224 | + "description": "When the same session emits repeated completed/failed/terminal notifications, collapse duplicates before they trigger repeated downstream reactions. Attach canonical terminal-event fingerprint per lane/session outcome.", |
| 225 | + "acceptanceCriteria": [ |
| 226 | + "Canonical terminal-event fingerprint attached per lane/session outcome", |
| 227 | + "Suppress/coalesce repeated terminal notifications within reconciliation window", |
| 228 | + "Preserve raw event history for audit while exposing one actionable outcome downstream", |
| 229 | + "Surface when later duplicate materially differs from original terminal payload", |
| 230 | + "Tests verify deduplication and material difference detection" |
| 231 | + ], |
| 232 | + "passes": true, |
| 233 | + "priority": "P2" |
| 234 | + }, |
| 235 | + { |
| 236 | + "id": "US-017", |
| 237 | + "title": "Phase 2 - Lane ownership / scope binding", |
| 238 | + "description": "Each session and lane event should declare who owns it and what workflow scope it belongs to. Attach owner/assignee identity, workflow scope (claw-code-dogfood, external-git-maintenance, infra-health, manual-operator), and mark whether watcher is expected to act, observe only, or ignore.", |
| 239 | + "acceptanceCriteria": [ |
| 240 | + "Owner/assignee identity attached to sessions and lane events", |
| 241 | + "Workflow scope field (claw-code-dogfood, external-git-maintenance, etc.)", |
| 242 | + "Watcher action expectation field (act, observe-only, ignore)", |
| 243 | + "Preserve scope through session restarts, resumes, and late terminal events", |
| 244 | + "Tests verify ownership and scope binding" |
| 245 | + ], |
| 246 | + "passes": true, |
| 247 | + "priority": "P2" |
| 248 | + }, |
| 249 | + { |
| 250 | + "id": "US-018", |
| 251 | + "title": "Phase 2 - Nudge acknowledgment / dedupe contract", |
| 252 | + "description": "Periodic clawhip nudges should carry nudge id/cycle id and delivery timestamp. Expose whether claw has already acknowledged or responded for that cycle. Distinguish new nudge, retry nudge, and stale duplicate.", |
| 253 | + "acceptanceCriteria": [ |
| 254 | + "Nudge id / cycle id and delivery timestamp attached", |
| 255 | + "Acknowledgment state exposed (already acknowledged or not)", |
| 256 | + "Distinguish new nudge vs retry nudge vs stale duplicate", |
| 257 | + "Allow downstream summaries to bind reported pinpoint back to triggering nudge id", |
| 258 | + "Tests verify nudge deduplication and acknowledgment tracking" |
| 259 | + ], |
| 260 | + "passes": true, |
| 261 | + "priority": "P2" |
| 262 | + }, |
| 263 | + { |
| 264 | + "id": "US-019", |
| 265 | + "title": "Phase 2 - Stable roadmap-id assignment for newly filed pinpoints", |
| 266 | + "description": "When a claw records a new pinpoint/follow-up, assign or expose a stable tracking id immediately. Expose that id in structured event/report payload and preserve across edits, reorderings, and summary compression.", |
| 267 | + "acceptanceCriteria": [ |
| 268 | + "Canonical roadmap id assigned at filing time", |
| 269 | + "Roadmap id exposed in structured event/report payload", |
| 270 | + "Same id preserved across edits, reorderings, summary compression", |
| 271 | + "Distinguish 'new roadmap filing' from 'update to existing roadmap item'", |
| 272 | + "Tests verify stable id assignment and update detection" |
| 273 | + ], |
| 274 | + "passes": true, |
| 275 | + "priority": "P2" |
| 276 | + }, |
| 277 | + { |
| 278 | + "id": "US-020", |
| 279 | + "title": "Phase 2 - Roadmap item lifecycle state contract", |
| 280 | + "description": "Each roadmap pinpoint should carry machine-readable lifecycle state (filed, acknowledged, in_progress, blocked, done, superseded). Attach last state-change timestamp and preserve lineage when one pinpoint supersedes or merges into another.", |
| 281 | + "acceptanceCriteria": [ |
| 282 | + "Lifecycle state enum with filed, acknowledged, in_progress, blocked, done, superseded", |
| 283 | + "Last state-change timestamp attached", |
| 284 | + "New report can declare first filing, status update, or closure", |
| 285 | + "Preserve lineage when one pinpoint supersedes or merges into another", |
| 286 | + "Tests verify lifecycle state transitions" |
| 287 | + ], |
| 288 | + "passes": true, |
| 289 | + "priority": "P2" |
| 290 | + }, |
| 291 | + { |
| 292 | + "id": "US-021", |
| 293 | + "title": "Request body size pre-flight check for OpenAI-compatible provider", |
| 294 | + "description": "Implement pre-flight request body size estimation to prevent 400 Bad Request errors from API gateways with size limits. Based on dogfood findings with kimi-k2.5 testing, DashScope API has a 6MB request body limit that was exceeded by large system prompts.", |
| 295 | + "acceptanceCriteria": [ |
| 296 | + "Pre-flight size estimation before sending requests to OpenAI-compatible providers", |
| 297 | + "Clear error message when request exceeds provider-specific size limit", |
| 298 | + "Configuration for different provider limits (6MB DashScope, 100MB OpenAI, etc.)", |
| 299 | + "Unit tests for size estimation and limit checking", |
| 300 | + "Integration with existing error handling for actionable user messages" |
| 301 | + ], |
| 302 | + "passes": true, |
| 303 | + "priority": "P1" |
| 304 | + }, |
| 305 | + { |
| 306 | + "id": "US-022", |
| 307 | + "title": "Enhanced error context for API failures", |
| 308 | + "description": "Add structured error context to API failures including request ID tracking across retries, provider-specific error code mapping, and suggested user actions based on error type (e.g., 'Reduce prompt size' for 413, 'Check API key' for 401).", |
| 309 | + "acceptanceCriteria": [ |
| 310 | + "Request ID tracking across retries with full context in error messages", |
| 311 | + "Provider-specific error code mapping with actionable suggestions", |
| 312 | + "Suggested user actions for common error types (401, 403, 413, 429, 500, 502-504)", |
| 313 | + "Unit tests for error context extraction", |
| 314 | + "All existing tests pass and clippy is clean" |
| 315 | + ], |
| 316 | + "passes": true, |
| 317 | + "priority": "P1" |
| 318 | + }, |
| 319 | + { |
| 320 | + "id": "US-023", |
| 321 | + "title": "Add automatic routing for kimi models to DashScope", |
| 322 | + "description": "Based on dogfood findings with kimi-k2.5 testing, users must manually prefix with dashscope/kimi-k2.5 instead of just using kimi-k2.5. Add automatic routing for kimi/ and kimi- prefixed models to DashScope (similar to qwen models), and add a 'kimi' alias to the model registry.", |
| 323 | + "acceptanceCriteria": [ |
| 324 | + "kimi/ and kimi- prefix routing to DashScope in metadata_for_model()", |
| 325 | + "'kimi' alias in MODEL_REGISTRY that resolves to 'kimi-k2.5'", |
| 326 | + "resolve_model_alias() handles the kimi alias correctly", |
| 327 | + "Unit tests for kimi routing (similar to qwen routing tests)", |
| 328 | + "All tests pass and clippy is clean" |
| 329 | + ], |
| 330 | + "passes": true, |
| 331 | + "priority": "P1" |
163 | 332 | } |
164 | | - ] |
| 333 | + ], |
| 334 | + "metadata": { |
| 335 | + "lastUpdated": "2026-04-16", |
| 336 | + "completedStories": ["US-001", "US-002", "US-003", "US-004", "US-005", "US-006", "US-007", "US-008", "US-009", "US-010", "US-011", "US-012", "US-013", "US-014", "US-015", "US-016", "US-017", "US-018", "US-019", "US-020", "US-021", "US-022", "US-023"], |
| 337 | + "inProgressStories": [], |
| 338 | + "totalStories": 23, |
| 339 | + "status": "completed" |
| 340 | + } |
165 | 341 | } |
0 commit comments