diff --git a/.wave/contracts/adr-context.schema.json b/.wave/contracts/adr-context.schema.json new file mode 100644 index 0000000..a54f828 --- /dev/null +++ b/.wave/contracts/adr-context.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ADR Context", + "description": "Contextual information gathered for an Architecture Decision Record", + "type": "object", + "required": ["decision_topic", "current_state", "constraints", "timestamp"], + "properties": { + "decision_topic": { "type": "string", "minLength": 5 }, + "current_state": { + "type": "object", + "required": ["description"], + "properties": { + "description": { "type": "string", "minLength": 10 }, + "affected_files": { "type": "array", "items": { "type": "string" } }, + "affected_components": { "type": "array", "items": { "type": "string" } } + } + }, + "constraints": { + "type": "array", + "items": { + "type": "object", + "required": ["type", "description"], + "properties": { + "type": { "type": "string", "enum": ["technical", "organizational", "timeline"] }, + "description": { "type": "string", "minLength": 5 } + } + } + }, + "precedents": { + "type": "array", + "items": { + "type": "object", + "required": ["description"], + "properties": { + "description": { "type": "string" }, + "location": { "type": "string" }, + "outcome": { "type": "string" } + } + } + }, + "stakeholders": { "type": "array", "items": { "type": "string" } }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/adr-options.schema.json b/.wave/contracts/adr-options.schema.json new file mode 100644 index 0000000..53396ba --- /dev/null +++ b/.wave/contracts/adr-options.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ADR Options Analysis", + "description": "Analysis of options for an architectural decision", + "type": "object", + "required": ["decision_topic", "options", "recommendation", "timestamp"], + "properties": { + "decision_topic": { "type": "string", "minLength": 5 }, + "options": { + "type": "array", + "minItems": 2, + "items": { + "type": "object", + "required": ["name", "description", "pros", "cons"], + "properties": { + "name": { "type": "string", "minLength": 1 }, + "description": { "type": "string", "minLength": 10 }, + "pros": { "type": "array", "items": { "type": "string" } }, + "cons": { "type": "array", "items": { "type": "string" } }, + "effort": { "type": "string", "enum": ["trivial", "small", "medium", "large", "epic"] }, + "risk": { "type": "string", "enum": ["low", "medium", "high"] }, + "reversibility": { "type": "string", "enum": ["easy", "moderate", "difficult", "irreversible"] }, + "compatibility": { "type": "string", "enum": ["high", "medium", "low"] } + } + } + }, + "recommendation": { + "type": "object", + "required": ["option", "rationale", "confidence"], + "properties": { + "option": { "type": "string", "minLength": 1 }, + "rationale": { "type": "string", "minLength": 20 }, + "confidence": { "type": "string", "enum": ["high", "medium", "low"] } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/analysis-report.schema.json b/.wave/contracts/analysis-report.schema.json new file mode 100644 index 0000000..1956d71 --- /dev/null +++ b/.wave/contracts/analysis-report.schema.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Analysis Report", + "description": "Cross-artifact consistency and quality analysis report before implementation.", + "type": "object", + "required": ["total_requirements", "total_tasks", "coverage_percent", "can_proceed", "feature_dir", "summary"], + "properties": { + "total_requirements": { + "type": "integer", + "description": "Total number of requirements extracted from spec" + }, + "total_tasks": { + "type": "integer", + "description": "Total number of tasks in the task breakdown" + }, + "coverage_percent": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Percentage of requirements covered by tasks (0-100)" + }, + "can_proceed": { + "type": "boolean", + "description": "Whether the feature is ready for implementation" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief summary of the analysis findings" + }, + "issues": { + "type": "object", + "properties": { + "critical": { + "type": "integer", + "description": "Number of critical severity issues" + }, + "high": { + "type": "integer", + "description": "Number of high severity issues" + }, + "medium": { + "type": "integer", + "description": "Number of medium severity issues" + }, + "low": { + "type": "integer", + "description": "Number of low severity issues" + } + }, + "description": "Issue counts grouped by severity level" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/audit-report.schema.json b/.wave/contracts/audit-report.schema.json new file mode 100644 index 0000000..9750c60 --- /dev/null +++ b/.wave/contracts/audit-report.schema.json @@ -0,0 +1,120 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Audit Report", + "description": "Zettelkasten health audit covering orphans, dangling links, and index gaps", + "type": "object", + "required": ["orphans", "dangling_links", "stats", "index_gaps", "dead_ends"], + "properties": { + "orphans": { + "type": "array", + "items": { + "type": "object", + "required": ["filename", "title"], + "properties": { + "filename": { + "type": "string", + "description": "Hex-ID filename of the orphan note" + }, + "title": { + "type": "string", + "description": "Title of the orphan note" + }, + "suggested_connection": { + "type": "string", + "description": "Suggested note to link from" + } + } + }, + "description": "Notes with no incoming or outgoing links" + }, + "dangling_links": { + "type": "array", + "items": { + "type": "object", + "required": ["source_filename", "target_filename", "link_text"], + "properties": { + "source_filename": { + "type": "string", + "description": "File containing the broken link" + }, + "target_filename": { + "type": "string", + "description": "Target file that doesn't exist" + }, + "link_text": { + "type": "string", + "description": "Display text of the broken link" + }, + "suggested_fix": { + "type": "string", + "enum": ["retarget", "remove"], + "description": "Suggested fix action" + } + } + }, + "description": "Links pointing to non-existent notes" + }, + "stats": { + "type": "object", + "required": ["total_notes", "total_links"], + "properties": { + "total_notes": { "type": "integer", "minimum": 0 }, + "total_links": { "type": "integer", "minimum": 0 }, + "label_notes": { "type": "integer", "minimum": 0 }, + "orphan_count": { "type": "integer", "minimum": 0 }, + "dangling_count": { "type": "integer", "minimum": 0 }, + "avg_links_per_note": { "type": "number", "minimum": 0 } + }, + "description": "Overall collection statistics" + }, + "index_gaps": { + "type": "array", + "items": { + "type": "object", + "required": ["section", "description"], + "properties": { + "section": { + "type": "string", + "description": "Section name missing from index" + }, + "description": { + "type": "string", + "description": "What's missing" + }, + "suggested_entry_point": { + "type": "string", + "description": "Suggested note to use as entry point" + } + } + }, + "description": "Sections or keywords missing from the index note" + }, + "dead_ends": { + "type": "array", + "items": { + "type": "object", + "required": ["filename", "title"], + "properties": { + "filename": { + "type": "string", + "description": "Hex-ID filename of the dead-end note" + }, + "title": { + "type": "string", + "description": "Title of the note" + }, + "outgoing_links": { + "type": "integer", + "minimum": 0, + "description": "Number of outgoing links (may have outgoing but no incoming)" + } + } + }, + "description": "Notes with no incoming links (reachable only via search)" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/categorized-changes.schema.json b/.wave/contracts/categorized-changes.schema.json new file mode 100644 index 0000000..e17dae6 --- /dev/null +++ b/.wave/contracts/categorized-changes.schema.json @@ -0,0 +1,55 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Categorized Changelog Changes", + "description": "Categorized and described changes for changelog generation", + "type": "object", + "required": ["version_label", "sections", "timestamp"], + "properties": { + "version_label": { "type": "string", "minLength": 1 }, + "breaking_changes": { + "type": "array", + "items": { + "type": "object", + "required": ["description"], + "properties": { + "description": { "type": "string" }, + "migration": { "type": "string" }, + "related_commits": { "type": "array", "items": { "type": "string" } } + } + } + }, + "sections": { + "type": "array", + "items": { + "type": "object", + "required": ["title", "type", "entries"], + "properties": { + "title": { "type": "string" }, + "type": { "type": "string" }, + "entries": { + "type": "array", + "items": { + "type": "object", + "required": ["description"], + "properties": { + "description": { "type": "string" }, + "scope": { "type": "string" }, + "commits": { "type": "array", "items": { "type": "string" } }, + "notable": { "type": "boolean" } + } + } + } + } + } + }, + "contributors": { "type": "array", "items": { "type": "string" } }, + "stats": { + "type": "object", + "properties": { + "total_entries": { "type": "integer" }, + "notable_entries": { "type": "integer" } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/checklist-status.schema.json b/.wave/contracts/checklist-status.schema.json new file mode 100644 index 0000000..a2fe86e --- /dev/null +++ b/.wave/contracts/checklist-status.schema.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Checklist Status", + "description": "Status report from the checklist step: quality checklist generation for requirement validation.", + "type": "object", + "required": ["checklist_files", "total_items", "feature_dir", "summary"], + "properties": { + "checklist_files": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Paths to generated checklist files" + }, + "total_items": { + "type": "integer", + "minimum": 0, + "description": "Total number of checklist items across all files" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of the checklists generated" + }, + "critical_gaps": { + "type": "integer", + "description": "Number of critical quality gaps identified" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/clarify-status.schema.json b/.wave/contracts/clarify-status.schema.json new file mode 100644 index 0000000..2622f60 --- /dev/null +++ b/.wave/contracts/clarify-status.schema.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Clarify Status", + "description": "Status report from the clarify step: ambiguity resolution and spec refinement.", + "type": "object", + "required": ["questions_asked", "answers_encoded", "feature_dir", "summary"], + "properties": { + "questions_asked": { + "type": "integer", + "minimum": 0, + "description": "Number of clarification questions identified" + }, + "answers_encoded": { + "type": "integer", + "minimum": 0, + "description": "Number of clarifications resolved and encoded into the spec" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of clarifications made" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/comment-result.schema.json b/.wave/contracts/comment-result.schema.json new file mode 100644 index 0000000..9e7aad3 --- /dev/null +++ b/.wave/contracts/comment-result.schema.json @@ -0,0 +1,84 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Comment Result", + "description": "Result of posting research report as a GitHub issue comment", + "type": "object", + "required": ["success", "issue_reference", "timestamp"], + "properties": { + "success": { + "type": "boolean", + "description": "Whether the comment was successfully posted" + }, + "issue_reference": { + "type": "object", + "required": ["issue_number", "repository"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1, + "description": "Issue number that was commented on" + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$", + "description": "Repository full name" + }, + "issue_url": { + "type": "string", + "format": "uri", + "description": "URL to the issue" + } + } + }, + "comment": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "minimum": 1, + "description": "GitHub comment ID" + }, + "url": { + "type": "string", + "format": "uri", + "description": "Direct URL to the posted comment" + }, + "body_length": { + "type": "integer", + "minimum": 0, + "description": "Length of the posted comment body in characters" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "When the comment was created" + } + }, + "description": "Details of the posted comment (only present if success=true)" + }, + "error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": ["authentication_failed", "rate_limit_exceeded", "issue_not_found", "issue_locked", "permission_denied", "comment_too_long", "network_error", "api_error", "unknown_error"], + "description": "Error code" + }, + "message": { + "type": "string", + "description": "Human-readable error message" + }, + "retryable": { + "type": "boolean", + "description": "Whether the operation can be retried" + } + }, + "description": "Error details (only present if success=false)" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Operation timestamp" + } + } +} diff --git a/.wave/contracts/commit-analysis.schema.json b/.wave/contracts/commit-analysis.schema.json new file mode 100644 index 0000000..e0d4150 --- /dev/null +++ b/.wave/contracts/commit-analysis.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Commit Analysis", + "description": "Structured analysis of git commits for changelog generation", + "type": "object", + "required": ["range", "commits", "summary", "timestamp"], + "properties": { + "range": { + "type": "object", + "required": ["from", "to", "total_commits"], + "properties": { + "from": { "type": "string", "minLength": 1 }, + "to": { "type": "string", "minLength": 1 }, + "total_commits": { "type": "integer", "minimum": 0 }, + "date_range": { + "type": "object", + "properties": { + "start": { "type": "string" }, + "end": { "type": "string" } + } + } + } + }, + "commits": { + "type": "array", + "items": { + "type": "object", + "required": ["hash", "date", "type", "subject"], + "properties": { + "hash": { "type": "string", "minLength": 4 }, + "author": { "type": "string" }, + "date": { "type": "string" }, + "type": { "type": "string", "enum": ["feat", "fix", "docs", "refactor", "test", "chore", "perf", "ci", "other"] }, + "scope": { "type": ["string", "null"] }, + "subject": { "type": "string", "minLength": 1 }, + "breaking": { "type": "boolean" }, + "breaking_note": { "type": "string" } + } + } + }, + "summary": { + "type": "object", + "required": ["by_type"], + "properties": { + "by_type": { "type": "object" }, + "breaking_changes": { "type": "integer", "minimum": 0 }, + "contributors": { "type": "array", "items": { "type": "string" } }, + "most_changed_scopes": { "type": "array", "items": { "type": "string" } } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/connections.schema.json b/.wave/contracts/connections.schema.json new file mode 100644 index 0000000..e7d704b --- /dev/null +++ b/.wave/contracts/connections.schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Connections", + "description": "Mapping of new content to existing Zettelkasten notes and addresses", + "type": "object", + "required": ["source_title", "related_notes", "suggested_placements"], + "properties": { + "source_title": { + "type": "string", + "description": "Title of the source being connected" + }, + "related_notes": { + "type": "array", + "items": { + "type": "object", + "required": ["filename", "title", "folgezettel_address", "relationship"], + "properties": { + "filename": { + "type": "string", + "pattern": "^[0-9a-f]{8}\\.md$", + "description": "Hex-ID filename of the related note" + }, + "title": { + "type": "string", + "description": "Full title of the related note" + }, + "folgezettel_address": { + "type": "string", + "description": "Folgezettel address of the related note" + }, + "relationship": { + "type": "string", + "description": "Why this note is related to the source" + }, + "link_direction": { + "type": "string", + "enum": ["from_new", "to_new", "bidirectional"], + "description": "Whether the new note should link to this, or this should link to new" + } + } + }, + "description": "Existing notes related to the source content" + }, + "suggested_placements": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["folgezettel_address", "parent_note", "section", "rationale"], + "properties": { + "folgezettel_address": { + "type": "string", + "description": "Suggested Folgezettel address for a new note" + }, + "parent_note": { + "type": "string", + "description": "Filename of the parent note in the Folgezettel sequence" + }, + "section": { + "type": "string", + "description": "Top-level section name" + }, + "rationale": { + "type": "string", + "description": "Why this placement makes sense" + }, + "concept": { + "type": "string", + "description": "Which concept from the source this placement is for" + } + } + }, + "description": "Suggested positions in the Folgezettel for new notes" + }, + "index_update_needed": { + "type": "boolean", + "description": "Whether the index note should be updated" + }, + "suggested_index_entries": { + "type": "array", + "items": { + "type": "object", + "required": ["keyword", "rationale"], + "properties": { + "keyword": { "type": "string" }, + "rationale": { "type": "string" } + } + }, + "description": "Suggested new entries for the index note" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/convergent-proposals.schema.json b/.wave/contracts/convergent-proposals.schema.json new file mode 100644 index 0000000..5a64db4 --- /dev/null +++ b/.wave/contracts/convergent-proposals.schema.json @@ -0,0 +1,81 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Convergent Proposals", + "description": "Prioritized simplification proposals from convergent thinking phase", + "type": "object", + "required": ["source_findings", "validation_summary", "proposals", "timestamp"], + "properties": { + "source_findings": { + "type": "object", + "required": ["total_reviewed", "confirmed", "partially_confirmed", "rejected"], + "properties": { + "total_reviewed": { "type": "integer" }, + "confirmed": { "type": "integer" }, + "partially_confirmed": { "type": "integer" }, + "rejected": { "type": "integer" }, + "rejection_reasons": { + "type": "array", + "items": { + "type": "object", + "required": ["finding_id", "reason"], + "properties": { + "finding_id": { "type": "string" }, + "reason": { "type": "string" } + } + } + } + } + }, + "validation_summary": { + "type": "string", + "description": "Narrative summary of the converge→diverge→converge validation process" + }, + "proposals": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "title", "description", "source_findings", "impact", "effort", "risk", "tier", "files"], + "properties": { + "id": { "type": "string", "pattern": "^SMP-\\d{3}$" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "source_findings": { + "type": "array", + "items": { "type": "string" }, + "description": "DVG-xxx IDs this proposal addresses" + }, + "impact": { "type": "string", "enum": ["high", "medium", "low"] }, + "effort": { "type": "string", "enum": ["small", "medium", "large"] }, + "risk": { "type": "string", "enum": ["low", "medium", "high"] }, + "tier": { + "type": "integer", + "minimum": 1, + "maximum": 3, + "description": "Priority tier: 1=do now, 2=do next, 3=consider later" + }, + "files": { + "type": "array", + "items": { "type": "string" }, + "description": "Files that would be modified" + }, + "dependencies": { + "type": "array", + "items": { "type": "string" }, + "description": "SMP-xxx IDs that must be applied first" + }, + "lines_removed_estimate": { "type": "integer" }, + "second_order_effects": { + "type": "array", + "items": { "type": "string" }, + "description": "Insights discovered during deeper probing" + } + } + } + }, + "eighty_twenty_analysis": { + "type": "string", + "description": "Which 20% of proposals yield 80% of the simplification benefit" + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/coverage-analysis.schema.json b/.wave/contracts/coverage-analysis.schema.json new file mode 100644 index 0000000..a964750 --- /dev/null +++ b/.wave/contracts/coverage-analysis.schema.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["current_coverage", "uncovered_functions", "uncovered_branches", "edge_cases", "mock_requirements"], + "properties": { + "current_coverage": { "type": "string" }, + "uncovered_functions": { + "type": "array", + "items": { "type": "string" } + }, + "uncovered_branches": { + "type": "array", + "items": { "type": "string" } + }, + "edge_cases": { + "type": "array", + "items": { "type": "string" } + }, + "mock_requirements": { + "type": "array", + "items": { "type": "string" } + } + } +} diff --git a/.wave/contracts/dead-code-scan.schema.json b/.wave/contracts/dead-code-scan.schema.json new file mode 100644 index 0000000..46dc82a --- /dev/null +++ b/.wave/contracts/dead-code-scan.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Dead Code Scan", + "description": "Scan results for dead or redundant code", + "type": "object", + "required": ["target", "findings", "summary", "timestamp"], + "properties": { + "target": { "type": "string", "minLength": 1 }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "type", "location", "description", "confidence", "safe_to_remove"], + "properties": { + "id": { "type": "string", "pattern": "^DC-[0-9]{3}$" }, + "type": { + "type": "string", + "enum": ["unused_export", "unreachable", "orphaned_file", "redundant", "stale_test", "unused_import", "commented_code"] + }, + "location": { "type": "string", "minLength": 1 }, + "symbol": { "type": "string" }, + "description": { "type": "string", "minLength": 5 }, + "evidence": { "type": "string" }, + "confidence": { "type": "string", "enum": ["high", "medium", "low"] }, + "safe_to_remove": { "type": "boolean" }, + "removal_note": { "type": "string" } + } + } + }, + "summary": { + "type": "object", + "required": ["total_findings"], + "properties": { + "total_findings": { "type": "integer", "minimum": 0 }, + "by_type": { "type": "object" }, + "high_confidence_count": { "type": "integer", "minimum": 0 }, + "estimated_lines_removable": { "type": "integer", "minimum": 0 } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/debug-hypotheses.schema.json b/.wave/contracts/debug-hypotheses.schema.json new file mode 100644 index 0000000..f63cce4 --- /dev/null +++ b/.wave/contracts/debug-hypotheses.schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["hypotheses"], + "properties": { + "hypotheses": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "description", "likelihood", "test_approach"], + "properties": { + "id": { "type": "integer" }, + "description": { "type": "string", "minLength": 1 }, + "likelihood": { "type": "string", "enum": ["high", "medium", "low"] }, + "test_approach": { "type": "string", "minLength": 1 }, + "expected_result_if_true": { "type": "string" } + } + } + } + } +} diff --git a/.wave/contracts/debug-reproduction.schema.json b/.wave/contracts/debug-reproduction.schema.json new file mode 100644 index 0000000..a174d1c --- /dev/null +++ b/.wave/contracts/debug-reproduction.schema.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["expected_behavior", "actual_behavior", "reproduction_steps", "relevant_files"], + "properties": { + "expected_behavior": { "type": "string", "minLength": 1 }, + "actual_behavior": { "type": "string", "minLength": 1 }, + "reproduction_steps": { + "type": "array", + "items": { "type": "string" } + }, + "relevant_files": { + "type": "array", + "items": { "type": "string" } + }, + "environmental_factors": { + "type": "array", + "items": { "type": "string" } + } + } +} diff --git a/.wave/contracts/diff-analysis.schema.json b/.wave/contracts/diff-analysis.schema.json new file mode 100644 index 0000000..bd614d5 --- /dev/null +++ b/.wave/contracts/diff-analysis.schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["files_changed", "modules_affected", "related_tests", "breaking_changes"], + "properties": { + "files_changed": { + "type": "array", + "items": { + "type": "object", + "required": ["path", "change_type", "purpose"], + "properties": { + "path": { "type": "string" }, + "change_type": { "type": "string", "enum": ["added", "modified", "deleted"] }, + "purpose": { "type": "string" } + } + } + }, + "modules_affected": { + "type": "array", + "items": { "type": "string" } + }, + "related_tests": { + "type": "array", + "items": { "type": "string" } + }, + "breaking_changes": { + "type": "array", + "items": { "type": "string" } + } + } +} diff --git a/.wave/contracts/divergent-findings.schema.json b/.wave/contracts/divergent-findings.schema.json new file mode 100644 index 0000000..5bf7e0a --- /dev/null +++ b/.wave/contracts/divergent-findings.schema.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Divergent Findings", + "description": "Broad-net findings from divergent thinking phase of the recinq pipeline", + "type": "object", + "required": ["scope", "findings", "metrics_summary", "timestamp"], + "properties": { + "scope": { + "type": "object", + "required": ["target", "files_scanned", "total_lines"], + "properties": { + "target": { "type": "string", "description": "What was analyzed (path, module, or 'whole-project')" }, + "files_scanned": { "type": "integer" }, + "total_lines": { "type": "integer" } + } + }, + "findings": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "category", "title", "description", "evidence", "severity"], + "properties": { + "id": { "type": "string", "pattern": "^DVG-\\d{3}$" }, + "category": { + "type": "string", + "enum": [ + "premature_abstraction", + "unnecessary_indirection", + "overengineering", + "yagni_violation", + "accidental_complexity", + "copy_paste_drift", + "dead_weight", + "naming_lie", + "dependency_gravity", + "missing_abstraction", + "other" + ] + }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "evidence": { + "type": "object", + "required": ["files"], + "properties": { + "files": { "type": "array", "items": { "type": "string" } }, + "line_count": { "type": "integer" }, + "reference_count": { "type": "integer" }, + "change_frequency": { "type": "integer" }, + "metrics": { "type": "string" } + } + }, + "severity": { + "type": "string", + "enum": ["critical", "high", "medium", "low"] + }, + "confidence": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "How confident the provocateur is in this finding" + } + } + } + }, + "metrics_summary": { + "type": "object", + "required": ["total_findings"], + "properties": { + "total_findings": { "type": "integer" }, + "by_category": { "type": "object", "additionalProperties": { "type": "integer" } }, + "by_severity": { "type": "object", "additionalProperties": { "type": "integer" } }, + "hotspot_files": { + "type": "array", + "items": { "type": "string" }, + "description": "Files appearing in multiple findings" + } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/doc-consistency-report.schema.json b/.wave/contracts/doc-consistency-report.schema.json new file mode 100644 index 0000000..e970d64 --- /dev/null +++ b/.wave/contracts/doc-consistency-report.schema.json @@ -0,0 +1,87 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Documentation Consistency Report", + "description": "Output from the analyze-consistency step: list of inconsistencies between code and documentation", + "type": "object", + "required": ["summary", "inconsistencies", "timestamp"], + "properties": { + "summary": { + "type": "object", + "required": ["total_count", "by_severity"], + "properties": { + "total_count": { + "type": "integer", + "minimum": 0, + "description": "Total number of inconsistencies found" + }, + "by_severity": { + "type": "object", + "properties": { + "critical": { "type": "integer", "minimum": 0 }, + "high": { "type": "integer", "minimum": 0 }, + "medium": { "type": "integer", "minimum": 0 }, + "low": { "type": "integer", "minimum": 0 } + }, + "description": "Count of inconsistencies by severity level" + }, + "clean": { + "type": "boolean", + "description": "True if no inconsistencies were found" + } + } + }, + "inconsistencies": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "severity", "category", "title", "description", "source_location", "doc_location"], + "properties": { + "id": { + "type": "string", + "pattern": "^DOC-[0-9]{3}$", + "description": "Unique inconsistency ID (DOC-001, DOC-002, etc.)" + }, + "severity": { + "type": "string", + "enum": ["critical", "high", "medium", "low"], + "description": "Severity of the inconsistency" + }, + "category": { + "type": "string", + "enum": ["cli_flags", "personas", "pipelines", "contracts", "env_vars", "api", "stale_reference", "missing_docs", "other"], + "description": "Category of the inconsistency" + }, + "title": { + "type": "string", + "minLength": 1, + "maxLength": 200, + "description": "Short title describing the inconsistency" + }, + "description": { + "type": "string", + "minLength": 1, + "description": "Detailed description of the inconsistency and what needs to change" + }, + "source_location": { + "type": "string", + "description": "File and line where the source of truth is (code, pipeline, etc.)" + }, + "doc_location": { + "type": "string", + "description": "File and section where the documentation is stale or missing" + }, + "fix_description": { + "type": "string", + "description": "What specifically needs to be updated" + } + } + }, + "description": "List of documentation inconsistencies" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When the analysis was performed" + } + } +} diff --git a/.wave/contracts/doc-issue-result.schema.json b/.wave/contracts/doc-issue-result.schema.json new file mode 100644 index 0000000..cf1ae31 --- /dev/null +++ b/.wave/contracts/doc-issue-result.schema.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Documentation Issue Result", + "description": "Output from the create-issue step: GitHub issue creation result", + "type": "object", + "required": ["success", "repository", "timestamp"], + "properties": { + "success": { + "type": "boolean", + "description": "Whether the issue was successfully created" + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$", + "description": "Repository full name (owner/repo)" + }, + "issue": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1, + "description": "GitHub issue number" + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL to the created issue" + }, + "title": { + "type": "string", + "description": "Issue title" + }, + "inconsistency_count": { + "type": "integer", + "minimum": 0, + "description": "Number of inconsistencies reported in the issue" + } + }, + "description": "Details of the created issue (only present if success=true)" + }, + "skipped": { + "type": "boolean", + "description": "True if no issue was created because no inconsistencies were found" + }, + "error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": ["authentication_failed", "rate_limit_exceeded", "permission_denied", "network_error", "api_error", "unknown_error"], + "description": "Error code" + }, + "message": { + "type": "string", + "description": "Human-readable error message" + }, + "retryable": { + "type": "boolean", + "description": "Whether the operation can be retried" + } + }, + "description": "Error details (only present if success=false)" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Operation timestamp" + } + } +} diff --git a/.wave/contracts/doc-scan-results.schema.json b/.wave/contracts/doc-scan-results.schema.json new file mode 100644 index 0000000..a0f4cee --- /dev/null +++ b/.wave/contracts/doc-scan-results.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Documentation Scan Results", + "description": "Output from the scan-changes step: changed files and current documentation state snapshot", + "type": "object", + "required": ["scan_scope", "changed_files", "documentation_snapshot", "timestamp"], + "properties": { + "scan_scope": { + "type": "object", + "required": ["mode", "range"], + "properties": { + "mode": { + "type": "string", + "enum": ["diff", "full"], + "description": "Whether this was a diff-based or full scan" + }, + "range": { + "type": "string", + "description": "Git range used for diff (e.g. 'main...HEAD') or 'full' for full scan" + }, + "base_ref": { + "type": "string", + "description": "Base reference for comparison" + } + } + }, + "changed_files": { + "type": "object", + "required": ["total_count", "categories"], + "properties": { + "total_count": { + "type": "integer", + "minimum": 0, + "description": "Total number of changed files" + }, + "categories": { + "type": "object", + "properties": { + "go_code": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed Go source files" + }, + "cli_commands": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed CLI command files (cmd/wave/commands/)" + }, + "pipelines": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed pipeline definitions" + }, + "personas": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed persona definitions" + }, + "contracts": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed contract schemas" + }, + "documentation": { + "type": "array", + "items": { "type": "string" }, + "description": "Changed documentation files (docs/, README.md, CLAUDE.md, etc.)" + }, + "other": { + "type": "array", + "items": { "type": "string" }, + "description": "Other changed files" + } + } + } + } + }, + "documentation_snapshot": { + "type": "object", + "required": ["files"], + "properties": { + "files": { + "type": "array", + "items": { + "type": "object", + "required": ["path", "exists"], + "properties": { + "path": { + "type": "string", + "description": "Path to the documentation file" + }, + "exists": { + "type": "boolean", + "description": "Whether the file exists" + }, + "summary": { + "type": "string", + "description": "Brief summary of the file's content and key sections" + } + } + }, + "description": "Key documentation files and their current state" + } + } + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When the scan was performed" + } + } +} diff --git a/.wave/contracts/doc-sync-scan.schema.json b/.wave/contracts/doc-sync-scan.schema.json new file mode 100644 index 0000000..0fc7f0c --- /dev/null +++ b/.wave/contracts/doc-sync-scan.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Doc Sync Scan Results", + "description": "Documentation inconsistency scan for doc-sync pipeline", + "type": "object", + "required": ["scan_scope", "findings", "summary", "timestamp"], + "properties": { + "scan_scope": { "type": "string", "minLength": 1 }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "type", "severity", "title", "description"], + "properties": { + "id": { "type": "string", "pattern": "^DOC-[0-9]{3}$" }, + "type": { "type": "string", "enum": ["MISSING_DOCS", "STALE_DOCS", "INACCURATE", "INCOMPLETE"] }, + "severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] }, + "title": { "type": "string", "minLength": 3 }, + "doc_location": { "type": "string" }, + "code_location": { "type": "string" }, + "description": { "type": "string", "minLength": 10 }, + "suggested_fix": { "type": "string" } + } + } + }, + "summary": { + "type": "object", + "required": ["total_findings"], + "properties": { + "total_findings": { "type": "integer", "minimum": 0 }, + "by_type": { "type": "object" }, + "by_severity": { "type": "object" }, + "fixable_count": { "type": "integer", "minimum": 0 } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/docs-phase.schema.json b/.wave/contracts/docs-phase.schema.json new file mode 100644 index 0000000..392efc7 --- /dev/null +++ b/.wave/contracts/docs-phase.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schema.recinq.com/wave/docs-phase.schema.json", + "title": "Wave Docs Phase Output Contract", + "description": "Validates docs phase outputs for prototype-driven development pipeline", + "type": "object", + "properties": { + "phase": { + "type": "string", + "const": "docs", + "description": "Phase identifier" + }, + "artifacts": { + "type": "object", + "properties": { + "feature_docs": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*feature-docs\\.md$", + "description": "Path to feature documentation file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Feature documentation file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Documentation content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + }, + "stakeholder_summary": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*stakeholder-summary\\.md$", + "description": "Path to stakeholder summary file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Stakeholder summary file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Summary content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + } + }, + "required": ["feature_docs", "stakeholder_summary"], + "additionalProperties": true + }, + "validation": { + "type": "object", + "properties": { + "coverage_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Specification coverage in documentation" + }, + "readability_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Documentation readability rating" + }, + "documentation_quality": { + "type": "string", + "enum": ["poor", "fair", "good", "excellent"], + "description": "Overall documentation quality assessment" + } + }, + "required": ["documentation_quality"], + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When docs phase was completed" + }, + "duration_seconds": { + "type": "number", + "minimum": 0, + "description": "Time taken for docs phase" + }, + "source_spec_path": { + "type": "string", + "description": "Path to source specification file" + } + }, + "required": ["timestamp", "source_spec_path"], + "additionalProperties": false + } + }, + "required": ["phase", "artifacts", "validation", "metadata"], + "additionalProperties": false +} diff --git a/.wave/contracts/dummy-phase.schema.json b/.wave/contracts/dummy-phase.schema.json new file mode 100644 index 0000000..cf209e7 --- /dev/null +++ b/.wave/contracts/dummy-phase.schema.json @@ -0,0 +1,110 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schema.recinq.com/wave/dummy-phase.schema.json", + "title": "Wave Dummy Phase Output Contract", + "description": "Validates dummy phase outputs for prototype-driven development pipeline", + "type": "object", + "properties": { + "phase": { + "type": "string", + "const": "dummy", + "description": "Phase identifier" + }, + "artifacts": { + "type": "object", + "properties": { + "prototype": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*prototype/?$", + "description": "Path to prototype directory" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Prototype directory must exist" + }, + "content_type": { + "type": "string", + "const": "code", + "description": "Prototype content type" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + }, + "interface_definitions": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*interfaces\\.md$", + "description": "Path to interface definitions file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Interface definitions file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Interface definitions content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + } + }, + "required": ["prototype", "interface_definitions"], + "additionalProperties": true + }, + "validation": { + "type": "object", + "properties": { + "runnable": { + "type": "boolean", + "description": "Whether the prototype can be executed" + }, + "interface_completeness": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Percentage of interfaces stubbed" + }, + "prototype_quality": { + "type": "string", + "enum": ["poor", "fair", "good", "excellent"], + "description": "Overall prototype quality assessment" + } + }, + "required": ["runnable", "prototype_quality"], + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When dummy phase was completed" + }, + "duration_seconds": { + "type": "number", + "minimum": 0, + "description": "Time taken for dummy phase" + }, + "source_docs_path": { + "type": "string", + "description": "Path to source documentation file" + } + }, + "required": ["timestamp", "source_docs_path"], + "additionalProperties": false + } + }, + "required": ["phase", "artifacts", "validation", "metadata"], + "additionalProperties": false +} diff --git a/.wave/contracts/editorial-plan.schema.json b/.wave/contracts/editorial-plan.schema.json new file mode 100644 index 0000000..ef362d8 --- /dev/null +++ b/.wave/contracts/editorial-plan.schema.json @@ -0,0 +1,98 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Editorial Plan", + "description": "Analysis of a blog draft with a mapped editorial plan based on author criticism", + "type": "object", + "required": ["draft_filename", "draft_title", "sections", "editorial_actions"], + "properties": { + "draft_filename": { + "type": "string", + "pattern": "^[0-9a-f]{8}\\.md$", + "description": "Hex-ID filename of the draft note" + }, + "draft_title": { + "type": "string", + "description": "Title of the blog draft" + }, + "sections": { + "type": "array", + "items": { + "type": "object", + "required": ["heading", "line_range", "summary"], + "properties": { + "heading": { + "type": "string", + "description": "Section heading text" + }, + "line_range": { + "type": "string", + "description": "Line range in the file (e.g., 15-42)" + }, + "summary": { + "type": "string", + "description": "Brief summary of what this section covers" + }, + "word_count": { + "type": "integer", + "minimum": 0 + } + } + }, + "description": "Structural map of the draft's sections" + }, + "editorial_actions": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "type", "target_section", "description", "criticism_addressed"], + "properties": { + "id": { + "type": "string", + "pattern": "^EDIT-[0-9]{3}$", + "description": "Unique action identifier" + }, + "type": { + "type": "string", + "enum": ["rewrite", "restructure", "cut", "expand", "add", "replace_example", "fix_tone", "fix_links"], + "description": "Type of editorial action" + }, + "target_section": { + "type": "string", + "description": "Section heading this action targets, or 'global' for whole-draft changes" + }, + "description": { + "type": "string", + "description": "Specific description of what to change and why" + }, + "criticism_addressed": { + "type": "string", + "description": "Which part of the author's criticism this action addresses" + }, + "priority": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "How critical this edit is" + } + } + }, + "description": "Ordered list of editorial actions to apply" + }, + "linked_notes": { + "type": "array", + "items": { + "type": "object", + "required": ["filename", "title"], + "properties": { + "filename": { "type": "string" }, + "title": { "type": "string" } + } + }, + "description": "Notes currently linked from the draft" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/explain-analysis.schema.json b/.wave/contracts/explain-analysis.schema.json new file mode 100644 index 0000000..37c3dd9 --- /dev/null +++ b/.wave/contracts/explain-analysis.schema.json @@ -0,0 +1,76 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Code Architecture Analysis", + "description": "Architecture and design analysis of explored code", + "type": "object", + "required": ["topic", "patterns", "timestamp"], + "properties": { + "topic": { "type": "string", "minLength": 3 }, + "patterns": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "where", "why"], + "properties": { + "name": { "type": "string" }, + "where": { "type": "string" }, + "why": { "type": "string" }, + "quality": { "type": "string", "enum": ["well-implemented", "adequate", "needs-improvement"] } + } + } + }, + "data_flow": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { "type": "string" }, + "stages": { "type": "array", "items": { "type": "string" } }, + "key_transformations": { "type": "array", "items": { "type": "string" } } + } + } + }, + "error_handling": { + "type": "object", + "properties": { + "strategy": { "type": "string" }, + "patterns": { "type": "array", "items": { "type": "string" } }, + "gaps": { "type": "array", "items": { "type": "string" } } + } + }, + "concurrency": { + "type": "object", + "properties": { + "model": { "type": "string" }, + "primitives": { "type": "array", "items": { "type": "string" } }, + "risks": { "type": "array", "items": { "type": "string" } } + } + }, + "extension_points": { + "type": "array", + "items": { + "type": "object", + "required": ["interface", "file"], + "properties": { + "interface": { "type": "string" }, + "file": { "type": "string" }, + "purpose": { "type": "string" } + } + } + }, + "design_decisions": { + "type": "array", + "items": { + "type": "object", + "required": ["decision"], + "properties": { + "decision": { "type": "string" }, + "rationale": { "type": "string" }, + "trade_offs": { "type": "string" } + } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/explain-exploration.schema.json b/.wave/contracts/explain-exploration.schema.json new file mode 100644 index 0000000..20a98ae --- /dev/null +++ b/.wave/contracts/explain-exploration.schema.json @@ -0,0 +1,62 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Explain Exploration Results", + "description": "Structured exploration of a codebase topic for explanation", + "type": "object", + "required": ["topic", "entry_points", "key_types", "timestamp"], + "properties": { + "topic": { "type": "string", "minLength": 1 }, + "entry_points": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["file", "symbol", "role"], + "properties": { + "file": { "type": "string", "minLength": 1 }, + "symbol": { "type": "string", "minLength": 1 }, + "role": { "type": "string", "minLength": 1 }, + "line": { "type": "integer", "minimum": 1 } + } + } + }, + "key_types": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "file", "purpose"], + "properties": { + "name": { "type": "string", "minLength": 1 }, + "file": { "type": "string", "minLength": 1 }, + "purpose": { "type": "string", "minLength": 1 }, + "methods": { "type": "array", "items": { "type": "string" } }, + "relationships": { "type": "array", "items": { "type": "string" } } + } + } + }, + "call_flows": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "steps"], + "properties": { + "name": { "type": "string" }, + "steps": { "type": "array", "items": { "type": "string" } }, + "description": { "type": "string" } + } + } + }, + "dependencies": { + "type": "object", + "properties": { + "depends_on": { "type": "array", "items": { "type": "string" } }, + "depended_by": { "type": "array", "items": { "type": "string" } }, + "external": { "type": "array", "items": { "type": "string" } } + } + }, + "test_files": { "type": "array", "items": { "type": "string" } }, + "config_points": { "type": "array", "items": { "type": "string" } }, + "file_count": { "type": "integer", "minimum": 0 }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/feature-exploration.schema.json b/.wave/contracts/feature-exploration.schema.json new file mode 100644 index 0000000..036b7dd --- /dev/null +++ b/.wave/contracts/feature-exploration.schema.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Feature Exploration", + "description": "Codebase exploration for feature implementation", + "type": "object", + "required": ["feature", "scope", "related_files", "timestamp"], + "properties": { + "feature": { "type": "string", "minLength": 1 }, + "scope": { "type": "string", "enum": ["small", "medium", "large"] }, + "related_files": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["path", "relevance", "reason"], + "properties": { + "path": { "type": "string", "minLength": 1 }, + "relevance": { "type": "string", "enum": ["primary", "secondary"] }, + "reason": { "type": "string", "minLength": 1 }, + "key_symbols": { "type": "array", "items": { "type": "string" } } + } + } + }, + "patterns_to_follow": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { "type": "string" }, + "example_file": { "type": "string" }, + "relevance": { "type": "string", "enum": ["must_follow", "should_follow"] } + } + } + }, + "affected_modules": { "type": "array", "items": { "type": "string" } }, + "test_files": { "type": "array", "items": { "type": "string" } }, + "risks": { + "type": "array", + "items": { + "type": "object", + "required": ["description", "severity"], + "properties": { + "description": { "type": "string" }, + "severity": { "type": "string", "enum": ["high", "medium", "low"] }, + "mitigation": { "type": "string" } + } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/feature-plan.schema.json b/.wave/contracts/feature-plan.schema.json new file mode 100644 index 0000000..d298909 --- /dev/null +++ b/.wave/contracts/feature-plan.schema.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Feature Implementation Plan", + "description": "Ordered implementation plan for a feature", + "type": "object", + "required": ["feature", "steps", "total_complexity", "timestamp"], + "properties": { + "feature": { "type": "string", "minLength": 5 }, + "steps": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "title", "description"], + "properties": { + "id": { "type": "string", "pattern": "^S\\d{2}$" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "files_to_modify": { "type": "array", "items": { "type": "string" } }, + "files_to_create": { "type": "array", "items": { "type": "string" } }, + "tests_to_write": { "type": "array", "items": { "type": "string" } }, + "acceptance_criteria": { "type": "array", "items": { "type": "string" } }, + "complexity": { "type": "string", "enum": ["S", "M", "L"] }, + "dependencies": { "type": "array", "items": { "type": "string" } } + } + } + }, + "total_complexity": { "type": "string", "enum": ["S", "M", "L", "XL"] }, + "branch_name_suggestion": { "type": "string" }, + "commit_message_suggestion": { "type": "string" }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/findings.schema.json b/.wave/contracts/findings.schema.json new file mode 100644 index 0000000..9a7540c --- /dev/null +++ b/.wave/contracts/findings.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Investigation Findings", + "type": "object", + "required": [ + "root_cause", + "affected_files", + "fix_approach" + ], + "properties": { + "root_cause": { + "type": "string", + "description": "Description of the root cause" + }, + "affected_files": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of affected file paths" + }, + "recent_commits": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of relevant commit hashes" + }, + "blast_radius": { + "type": "string", + "description": "Assessment of what else could be affected" + }, + "fix_approach": { + "type": "string", + "description": "Recommended approach to fix the issue" + } + } +} \ No newline at end of file diff --git a/.wave/contracts/github-enhancement-plan.schema.json b/.wave/contracts/github-enhancement-plan.schema.json new file mode 100644 index 0000000..f6ea905 --- /dev/null +++ b/.wave/contracts/github-enhancement-plan.schema.json @@ -0,0 +1,65 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Issue Enhancement Plan", + "description": "Schema for GitHub issue enhancement recommendations", + "type": "object", + "required": ["issues_to_enhance"], + "properties": { + "issues_to_enhance": { + "type": "array", + "items": { + "type": "object", + "required": ["issue_number", "enhancements"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "current_title": { + "type": "string" + }, + "suggested_title": { + "type": "string" + }, + "current_body": { + "type": "string" + }, + "body_template": { + "type": ["string", "null"], + "description": "Enhanced body template preserving original content" + }, + "suggested_labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "enhancements": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "List of specific enhancements to apply" + }, + "rationale": { + "type": "string", + "description": "Why these enhancements are recommended" + }, + "priority": { + "type": "string", + "enum": ["high", "medium", "low"] + } + } + } + }, + "total_to_enhance": { + "type": "integer", + "minimum": 0 + }, + "enhancement_strategy": { + "type": "string", + "description": "Overall strategy for enhancements" + } + } +} diff --git a/.wave/contracts/github-enhancement-results.schema.json b/.wave/contracts/github-enhancement-results.schema.json new file mode 100644 index 0000000..1806af6 --- /dev/null +++ b/.wave/contracts/github-enhancement-results.schema.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Issue Enhancement Results", + "description": "Schema for GitHub issue enhancement execution results", + "type": "object", + "required": ["enhanced_issues", "total_attempted", "total_successful"], + "properties": { + "enhanced_issues": { + "type": "array", + "items": { + "type": "object", + "required": ["issue_number", "success", "changes_made", "url"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "success": { + "type": "boolean" + }, + "changes_made": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of changes successfully applied" + }, + "title_updated": { + "type": "boolean" + }, + "body_updated": { + "type": "boolean" + }, + "labels_added": { + "type": "array", + "items": { + "type": "string" + } + }, + "comment_added": { + "type": "boolean" + }, + "error": { + "type": "string", + "description": "Error message if enhancement failed" + }, + "url": { + "type": "string", + "format": "uri" + } + } + } + }, + "total_attempted": { + "type": "integer", + "minimum": 0 + }, + "total_successful": { + "type": "integer", + "minimum": 0 + }, + "total_failed": { + "type": "integer", + "minimum": 0 + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/github-issue-analysis.schema.json b/.wave/contracts/github-issue-analysis.schema.json new file mode 100644 index 0000000..d0cbcb3 --- /dev/null +++ b/.wave/contracts/github-issue-analysis.schema.json @@ -0,0 +1,86 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Issue Analysis", + "description": "Schema for GitHub issue quality analysis results", + "type": "object", + "required": ["repository", "total_issues", "poor_quality_issues"], + "properties": { + "repository": { + "type": "object", + "required": ["owner", "name"], + "properties": { + "owner": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + } + } + }, + "total_issues": { + "type": "integer", + "minimum": 0 + }, + "analyzed_count": { + "type": "integer", + "minimum": 0 + }, + "poor_quality_issues": { + "type": "array", + "items": { + "type": "object", + "required": ["number", "title", "quality_score", "problems"], + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string" + }, + "body": { + "type": "string" + }, + "quality_score": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "problems": { + "type": "array", + "items": { + "type": "string" + } + }, + "recommendations": { + "type": "array", + "items": { + "type": "string" + } + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "url": { + "type": "string", + "format": "uri" + } + } + } + }, + "quality_threshold": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/github-verification-report.schema.json b/.wave/contracts/github-verification-report.schema.json new file mode 100644 index 0000000..9a470ec --- /dev/null +++ b/.wave/contracts/github-verification-report.schema.json @@ -0,0 +1,87 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Enhancement Verification Report", + "description": "Schema for verifying GitHub issue enhancements were applied", + "type": "object", + "required": ["total_enhanced", "successful_enhancements", "failed_enhancements"], + "properties": { + "total_enhanced": { + "type": "integer", + "minimum": 0 + }, + "successful_enhancements": { + "type": "array", + "items": { + "type": "object", + "required": ["issue_number", "verified_changes"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "verified_changes": { + "type": "array", + "items": { + "type": "string" + } + }, + "quality_score_before": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "quality_score_after": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "url": { + "type": "string", + "format": "uri" + } + } + } + }, + "failed_enhancements": { + "type": "array", + "items": { + "type": "object", + "required": ["issue_number", "problems"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "problems": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "quality_improvement": { + "type": "object", + "properties": { + "average_score_before": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "average_score_after": { + "type": "number", + "minimum": 0, + "maximum": 100 + }, + "improvement_percentage": { + "type": "number" + } + } + }, + "summary": { + "type": "string", + "description": "Human-readable summary of verification results" + } + } +} diff --git a/.wave/contracts/hello-world-result.schema.json b/.wave/contracts/hello-world-result.schema.json new file mode 100644 index 0000000..9678072 --- /dev/null +++ b/.wave/contracts/hello-world-result.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Hello World Result", + "description": "Verification result from the hello-world verify step", + "type": "object", + "required": ["success", "message"], + "properties": { + "success": { + "type": "boolean", + "description": "Whether the hello-world pipeline completed successfully" + }, + "message": { + "type": "string", + "description": "Human-readable verification result" + }, + "checks": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + }, + "description": "Optional list of individual verification checks performed" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/implement-phase.schema.json b/.wave/contracts/implement-phase.schema.json new file mode 100644 index 0000000..afbcba7 --- /dev/null +++ b/.wave/contracts/implement-phase.schema.json @@ -0,0 +1,138 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schema.recinq.com/wave/implement-phase.schema.json", + "title": "Wave Implement Phase Output Contract", + "description": "Validates implementation phase outputs for prototype-driven development pipeline", + "type": "object", + "properties": { + "phase": { + "type": "string", + "const": "implement", + "description": "Phase identifier" + }, + "artifacts": { + "type": "object", + "properties": { + "implementation_plan": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*implementation-plan\\.md$", + "description": "Path to implementation plan file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Implementation plan file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Implementation plan content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + }, + "progress_checklist": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*implementation-checklist\\.md$", + "description": "Path to progress checklist file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Progress checklist file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Checklist content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + } + }, + "required": ["implementation_plan", "progress_checklist"], + "additionalProperties": true + }, + "validation": { + "type": "object", + "properties": { + "tests_executed": { + "type": "boolean", + "description": "Whether test suite was executed" + }, + "test_results": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "minimum": 0, + "description": "Total number of tests" + }, + "passed": { + "type": "integer", + "minimum": 0, + "description": "Number of tests that passed" + }, + "failed": { + "type": "integer", + "minimum": 0, + "description": "Number of tests that failed" + }, + "coverage_percent": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Test coverage percentage" + } + }, + "required": ["total", "passed", "failed"], + "additionalProperties": false + }, + "implementation_readiness": { + "type": "string", + "enum": ["ready", "partial", "needs_work"], + "description": "Assessment of implementation readiness" + } + }, + "required": ["tests_executed", "implementation_readiness"], + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When implementation phase was completed" + }, + "duration_seconds": { + "type": "number", + "minimum": 0, + "description": "Time taken for implementation phase" + }, + "previous_phases": { + "type": "array", + "items": { + "type": "string", + "enum": ["spec", "docs", "dummy"] + }, + "minItems": 3, + "maxItems": 3, + "description": "Previous phases that fed into this implementation" + } + }, + "required": ["timestamp", "previous_phases"], + "additionalProperties": false + } + }, + "required": ["phase", "artifacts", "validation", "metadata"], + "additionalProperties": false +} \ No newline at end of file diff --git a/.wave/contracts/improvement-assessment.schema.json b/.wave/contracts/improvement-assessment.schema.json new file mode 100644 index 0000000..e29aab6 --- /dev/null +++ b/.wave/contracts/improvement-assessment.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Improvement Assessment", + "description": "Structured assessment of code improvement opportunities", + "type": "object", + "required": ["target", "findings", "summary", "timestamp"], + "properties": { + "target": { "type": "string", "minLength": 1 }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "category", "title", "location", "description", "impact", "effort"], + "properties": { + "id": { "type": "string", "pattern": "^IMP-[0-9]{3}$" }, + "category": { + "type": "string", + "enum": ["error_handling", "performance", "testability", "robustness", "maintainability", "code_quality"] + }, + "title": { "type": "string", "minLength": 3 }, + "location": { "type": "string", "minLength": 1 }, + "description": { "type": "string", "minLength": 10 }, + "current_code": { "type": "string" }, + "suggested_fix": { "type": "string", "minLength": 5 }, + "impact": { "type": "string", "enum": ["high", "medium", "low"] }, + "effort": { "type": "string", "enum": ["trivial", "small", "medium", "large"] }, + "risk": { "type": "string", "enum": ["none", "low", "medium", "high"] } + } + } + }, + "summary": { + "type": "object", + "required": ["total_findings", "overall_quality"], + "properties": { + "total_findings": { "type": "integer", "minimum": 0 }, + "by_category": { "type": "object" }, + "quick_wins": { "type": "array", "items": { "type": "string" } }, + "high_impact": { "type": "array", "items": { "type": "string" } }, + "overall_quality": { "type": "string", "minLength": 10 } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/issue-assessment.schema.json b/.wave/contracts/issue-assessment.schema.json new file mode 100644 index 0000000..0517cb7 --- /dev/null +++ b/.wave/contracts/issue-assessment.schema.json @@ -0,0 +1,91 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Issue Implementation Assessment", + "type": "object", + "required": ["implementable", "issue", "assessment"], + "properties": { + "implementable": { + "type": "boolean", + "const": true, + "description": "Must be true for the pipeline to proceed. Set to false if the issue lacks sufficient detail." + }, + "issue": { + "type": "object", + "required": ["number", "title", "body", "repository", "url"], + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "body": { + "type": "string" + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$" + }, + "url": { + "type": "string", + "format": "uri" + }, + "labels": { + "type": "array", + "items": { "type": "string" } + }, + "state": { + "type": "string" + }, + "author": { + "type": "string" + }, + "comments": { + "type": "array", + "items": { "type": "object" } + } + } + }, + "assessment": { + "type": "object", + "required": ["quality_score", "complexity", "skip_steps", "branch_name"], + "properties": { + "quality_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "How well-specified the issue is (0-100)" + }, + "complexity": { + "type": "string", + "enum": ["trivial", "simple", "medium", "complex"], + "description": "Estimated implementation complexity" + }, + "skip_steps": { + "type": "array", + "items": { + "type": "string", + "enum": ["specify", "clarify", "checklist", "analyze"] + }, + "description": "Speckit steps that can be skipped because the issue provides sufficient detail" + }, + "branch_name": { + "type": "string", + "minLength": 1, + "description": "Suggested branch name for the implementation" + }, + "missing_info": { + "type": "array", + "items": { "type": "string" }, + "description": "Information that would improve the issue but isn't blocking" + }, + "summary": { + "type": "string", + "description": "Brief summary of the assessment" + } + } + } + } +} diff --git a/.wave/contracts/issue-content.schema.json b/.wave/contracts/issue-content.schema.json new file mode 100644 index 0000000..9637552 --- /dev/null +++ b/.wave/contracts/issue-content.schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "GitHub Issue Content", + "description": "Parsed content from a GitHub issue for research pipeline processing", + "type": "object", + "required": ["issue_number", "title", "body", "author", "url", "repository"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1, + "description": "GitHub issue number" + }, + "title": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "description": "Issue title" + }, + "body": { + "type": "string", + "description": "Issue body/description text" + }, + "author": { + "type": "object", + "required": ["login"], + "properties": { + "login": { + "type": "string", + "minLength": 1, + "description": "GitHub username of issue author" + } + } + }, + "labels": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "description": "Label name" + }, + "color": { + "type": "string", + "description": "Label color hex code" + }, + "description": { + "type": "string", + "description": "Label description" + } + } + }, + "description": "Labels applied to the issue" + }, + "url": { + "type": "string", + "format": "uri", + "description": "HTML URL to the GitHub issue" + }, + "repository": { + "type": "object", + "required": ["owner", "name", "full_name"], + "properties": { + "owner": { + "type": "string", + "description": "Repository owner" + }, + "name": { + "type": "string", + "description": "Repository name" + }, + "full_name": { + "type": "string", + "pattern": "^[^/]+/[^/]+$", + "description": "Full repository name (owner/repo)" + } + } + }, + "state": { + "type": "string", + "enum": ["open", "closed"], + "description": "Issue state" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Issue creation timestamp" + }, + "comments_count": { + "type": "integer", + "minimum": 0, + "description": "Number of comments on the issue" + } + } +} diff --git a/.wave/contracts/issue-impl-plan.schema.json b/.wave/contracts/issue-impl-plan.schema.json new file mode 100644 index 0000000..6d525e1 --- /dev/null +++ b/.wave/contracts/issue-impl-plan.schema.json @@ -0,0 +1,72 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Issue Implementation Plan", + "type": "object", + "required": ["issue_number", "branch_name", "feature_dir", "tasks"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "branch_name": { + "type": "string", + "minLength": 1 + }, + "feature_dir": { + "type": "string", + "description": "Path to the feature directory under specs/" + }, + "spec_file": { + "type": "string", + "description": "Path to the spec.md file" + }, + "plan_file": { + "type": "string", + "description": "Path to the plan.md file" + }, + "tasks_file": { + "type": "string", + "description": "Path to the tasks.md file" + }, + "tasks": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "title", "description"], + "properties": { + "id": { + "type": "string", + "description": "Task identifier" + }, + "title": { + "type": "string", + "description": "Brief task title" + }, + "description": { + "type": "string", + "description": "Detailed task description" + }, + "file_changes": { + "type": "array", + "items": { + "type": "object", + "required": ["path", "action"], + "properties": { + "path": { "type": "string" }, + "action": { + "type": "string", + "enum": ["create", "modify", "delete"] + } + } + } + } + } + } + }, + "summary": { + "type": "string", + "description": "Brief summary of the implementation plan" + } + } +} diff --git a/.wave/contracts/issue-update-context.schema.json b/.wave/contracts/issue-update-context.schema.json new file mode 100644 index 0000000..ad76624 --- /dev/null +++ b/.wave/contracts/issue-update-context.schema.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Issue Update Context", + "description": "Schema for gathered context about a GitHub issue and recent codebase changes", + "type": "object", + "required": ["repository", "issue", "changes_since_creation", "referenced_files"], + "properties": { + "repository": { + "type": "object", + "required": ["owner", "name"], + "properties": { + "owner": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + } + } + }, + "issue": { + "type": "object", + "required": ["number", "title", "body", "url", "created_at"], + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "body": { + "type": "string" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "url": { + "type": "string", + "format": "uri" + }, + "created_at": { + "type": "string" + }, + "comments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "body": { + "type": "string" + }, + "created_at": { + "type": "string" + } + } + } + } + } + }, + "changes_since_creation": { + "type": "object", + "required": ["commits", "commit_count"], + "properties": { + "commits": { + "type": "array", + "items": { + "type": "string" + } + }, + "commit_count": { + "type": "integer", + "minimum": 0 + }, + "releases": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "referenced_files": { + "type": "object", + "required": ["found", "missing"], + "properties": { + "found": { + "type": "array", + "items": { + "type": "string" + } + }, + "missing": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "criticism": { + "type": "string" + }, + "project_context": { + "type": "string" + } + } +} diff --git a/.wave/contracts/issue-update-draft.schema.json b/.wave/contracts/issue-update-draft.schema.json new file mode 100644 index 0000000..5610a4e --- /dev/null +++ b/.wave/contracts/issue-update-draft.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Issue Update Draft", + "description": "Schema for a drafted update to a GitHub issue", + "type": "object", + "required": ["issue_number", "original_title", "updated_title", "title_changed", "original_body", "updated_body", "staleness_assessment", "changes_made"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "original_title": { + "type": "string", + "minLength": 1 + }, + "updated_title": { + "type": "string", + "minLength": 1 + }, + "title_changed": { + "type": "boolean" + }, + "original_body": { + "type": "string" + }, + "updated_body": { + "type": "string", + "minLength": 1 + }, + "staleness_assessment": { + "type": "object", + "required": ["overall_staleness", "sections"], + "properties": { + "overall_staleness": { + "type": "string", + "enum": ["low", "medium", "high", "critical"] + }, + "sections": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "status", "reason"], + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["STILL_VALID", "OUTDATED", "INCOMPLETE", "WRONG"] + }, + "reason": { + "type": "string" + } + } + } + } + } + }, + "changes_made": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "criticism_addressed": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/.wave/contracts/issue-update-result.schema.json b/.wave/contracts/issue-update-result.schema.json new file mode 100644 index 0000000..334cb80 --- /dev/null +++ b/.wave/contracts/issue-update-result.schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Issue Update Result", + "description": "Schema for the result of applying an issue update", + "type": "object", + "required": ["issue_number", "success", "changes_applied", "verification"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "format": "uri" + }, + "success": { + "type": "boolean" + }, + "title_updated": { + "type": "boolean" + }, + "body_updated": { + "type": "boolean" + }, + "changes_applied": { + "type": "array", + "items": { + "type": "string" + } + }, + "verification": { + "type": "object", + "required": ["title_matches", "body_matches"], + "properties": { + "title_matches": { + "type": "boolean" + }, + "body_matches": { + "type": "boolean" + }, + "discrepancies": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staleness_assessment": { + "type": "string", + "enum": ["low", "medium", "high", "critical"] + }, + "error": { + "type": ["string", "null"] + } + } +} diff --git a/.wave/contracts/plan-exploration.schema.json b/.wave/contracts/plan-exploration.schema.json new file mode 100644 index 0000000..6bfaa19 --- /dev/null +++ b/.wave/contracts/plan-exploration.schema.json @@ -0,0 +1,179 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Plan Exploration", + "description": "Structured codebase exploration output for feature planning", + "type": "object", + "required": ["feature_context", "related_files", "patterns", "affected_modules", "testing_landscape", "risks", "timestamp"], + "properties": { + "feature_context": { + "type": "object", + "required": ["input_summary", "scope_assessment"], + "properties": { + "input_summary": { + "type": "string", + "minLength": 10, + "description": "Brief summary of the feature or task being planned" + }, + "scope_assessment": { + "type": "string", + "enum": ["small", "medium", "large", "epic"], + "description": "Estimated scope of the work" + } + } + }, + "related_files": { + "type": "array", + "items": { + "type": "object", + "required": ["path", "relevance", "reason"], + "properties": { + "path": { + "type": "string", + "description": "File path relative to project root" + }, + "relevance": { + "type": "string", + "enum": ["primary", "secondary", "reference"], + "description": "How relevant this file is to the feature" + }, + "reason": { + "type": "string", + "description": "Why this file is relevant" + }, + "key_symbols": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Important functions, types, or constants in this file" + } + } + }, + "description": "Files related to the feature" + }, + "patterns": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "name", "description", "relevance"], + "properties": { + "id": { + "type": "string", + "pattern": "^PAT-[0-9]{3}$", + "description": "Pattern identifier" + }, + "name": { + "type": "string", + "description": "Short name for the pattern" + }, + "description": { + "type": "string", + "description": "What the pattern is and how it works" + }, + "example_file": { + "type": "string", + "description": "File that best demonstrates this pattern" + }, + "relevance": { + "type": "string", + "enum": ["must_follow", "should_follow", "informational"], + "description": "How important it is to follow this pattern" + } + } + }, + "description": "Codebase patterns and conventions discovered" + }, + "affected_modules": { + "type": "array", + "items": { + "type": "object", + "required": ["path", "description", "impact_level"], + "properties": { + "path": { + "type": "string", + "description": "Module or package path" + }, + "description": { + "type": "string", + "description": "What this module does" + }, + "impact_level": { + "type": "string", + "enum": ["direct", "indirect", "none"], + "description": "Level of impact from the planned changes" + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Modules this one depends on" + }, + "dependents": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Modules that depend on this one" + } + } + }, + "description": "Modules affected by the planned changes" + }, + "testing_landscape": { + "type": "object", + "required": ["existing_test_files", "testing_patterns"], + "properties": { + "existing_test_files": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Test files relevant to the feature" + }, + "testing_patterns": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Testing patterns used in the codebase (e.g., table-driven, mocks)" + }, + "coverage_gaps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Areas lacking test coverage" + } + } + }, + "risks": { + "type": "array", + "items": { + "type": "object", + "required": ["description", "severity"], + "properties": { + "description": { + "type": "string", + "description": "What the risk is" + }, + "severity": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "Risk severity" + }, + "mitigation": { + "type": "string", + "description": "How to mitigate this risk" + } + } + }, + "description": "Risks identified during exploration" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When the exploration was completed" + } + } +} diff --git a/.wave/contracts/plan-review.schema.json b/.wave/contracts/plan-review.schema.json new file mode 100644 index 0000000..684e05c --- /dev/null +++ b/.wave/contracts/plan-review.schema.json @@ -0,0 +1,235 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Plan Review", + "description": "Structured review of a task breakdown plan", + "type": "object", + "required": ["verdict", "summary", "task_reviews", "cross_cutting_concerns", "recommendations", "risk_assessment", "timestamp", "markdown_content"], + "properties": { + "verdict": { + "type": "object", + "required": ["decision", "confidence", "rationale"], + "properties": { + "decision": { + "type": "string", + "enum": ["approve", "approve_with_notes", "revise"], + "description": "Overall verdict on the plan" + }, + "confidence": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "Confidence in the verdict" + }, + "rationale": { + "type": "string", + "minLength": 20, + "description": "Explanation for the verdict" + } + } + }, + "summary": { + "type": "object", + "required": ["total_tasks_reviewed", "issues_found", "issues_by_severity", "strengths"], + "properties": { + "total_tasks_reviewed": { + "type": "integer", + "minimum": 1, + "description": "Number of tasks reviewed" + }, + "issues_found": { + "type": "integer", + "minimum": 0, + "description": "Total number of issues found" + }, + "issues_by_severity": { + "type": "object", + "properties": { + "critical": { + "type": "integer", + "minimum": 0 + }, + "high": { + "type": "integer", + "minimum": 0 + }, + "medium": { + "type": "integer", + "minimum": 0 + }, + "low": { + "type": "integer", + "minimum": 0 + } + }, + "description": "Issues broken down by severity" + }, + "strengths": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Things the plan does well" + } + } + }, + "task_reviews": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["task_id", "status"], + "properties": { + "task_id": { + "type": "string", + "pattern": "^T[0-9]{2}$", + "description": "ID of the reviewed task" + }, + "status": { + "type": "string", + "enum": ["ok", "needs_refinement", "missing_details", "overcomplicated", "wrong_persona", "bad_dependencies"], + "description": "Review status for this task" + }, + "issues": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "severity", "description", "suggestion"], + "properties": { + "id": { + "type": "string", + "pattern": "^REV-[0-9]{3}$", + "description": "Issue identifier" + }, + "severity": { + "type": "string", + "enum": ["critical", "high", "medium", "low"], + "description": "Issue severity" + }, + "description": { + "type": "string", + "description": "What the issue is" + }, + "suggestion": { + "type": "string", + "description": "How to fix it" + } + } + }, + "description": "Issues found in this task" + } + } + }, + "description": "Per-task review results" + }, + "cross_cutting_concerns": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "category", "description", "affected_tasks", "recommendation"], + "properties": { + "id": { + "type": "string", + "pattern": "^CC-[0-9]{3}$", + "description": "Concern identifier" + }, + "category": { + "type": "string", + "description": "Category of concern (e.g., testing, security, performance)" + }, + "description": { + "type": "string", + "description": "What the concern is" + }, + "affected_tasks": { + "type": "array", + "items": { + "type": "string", + "pattern": "^T[0-9]{2}$" + }, + "description": "Tasks affected by this concern" + }, + "recommendation": { + "type": "string", + "description": "Recommended action" + } + } + }, + "description": "Concerns that span multiple tasks" + }, + "recommendations": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "priority", "description", "type"], + "properties": { + "id": { + "type": "string", + "pattern": "^REC-[0-9]{3}$", + "description": "Recommendation identifier" + }, + "priority": { + "type": "string", + "enum": ["critical", "high", "medium", "low"], + "description": "Priority of the recommendation" + }, + "description": { + "type": "string", + "description": "What should be done" + }, + "type": { + "type": "string", + "enum": ["add_task", "modify_task", "remove_task", "reorder", "split_task", "merge_tasks", "change_persona", "add_dependency"], + "description": "Type of change recommended" + } + } + }, + "description": "Actionable recommendations for improving the plan" + }, + "risk_assessment": { + "type": "object", + "required": ["overall_risk", "key_risks"], + "properties": { + "overall_risk": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "Overall risk level of the plan" + }, + "key_risks": { + "type": "array", + "items": { + "type": "object", + "required": ["description", "severity", "likelihood"], + "properties": { + "description": { + "type": "string", + "description": "Risk description" + }, + "severity": { + "type": "string", + "enum": ["high", "medium", "low"] + }, + "likelihood": { + "type": "string", + "enum": ["high", "medium", "low"] + }, + "mitigation": { + "type": "string", + "description": "How to mitigate" + } + } + }, + "description": "Key risks identified in the plan" + } + } + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When the review was completed" + }, + "markdown_content": { + "type": "string", + "minLength": 50, + "description": "Pre-rendered human-readable review in markdown format" + } + } +} diff --git a/.wave/contracts/plan-status.schema.json b/.wave/contracts/plan-status.schema.json new file mode 100644 index 0000000..1e86863 --- /dev/null +++ b/.wave/contracts/plan-status.schema.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Plan Status", + "description": "Status report from the plan step: research, design, and implementation plan generation.", + "type": "object", + "required": ["plan_file", "feature_dir", "summary"], + "properties": { + "plan_file": { + "type": "string", + "minLength": 1, + "description": "Path to the generated implementation plan file" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of the plan produced" + }, + "research_file": { + "type": "string", + "description": "Path to research.md if generated" + }, + "data_model_file": { + "type": "string", + "description": "Path to data-model.md if generated" + }, + "constitution_issues": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Constitution compliance issues found during planning" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/plan-tasks.schema.json b/.wave/contracts/plan-tasks.schema.json new file mode 100644 index 0000000..fd48ce9 --- /dev/null +++ b/.wave/contracts/plan-tasks.schema.json @@ -0,0 +1,142 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Plan Tasks", + "description": "Structured task breakdown for feature implementation", + "type": "object", + "required": ["feature_summary", "tasks", "execution_order", "metadata", "markdown_content"], + "properties": { + "feature_summary": { + "type": "object", + "required": ["title", "description", "total_tasks", "estimated_total_complexity"], + "properties": { + "title": { + "type": "string", + "minLength": 5, + "description": "Short title for the feature" + }, + "description": { + "type": "string", + "minLength": 20, + "description": "Brief description of what the feature does" + }, + "total_tasks": { + "type": "integer", + "minimum": 1, + "description": "Total number of tasks in the breakdown" + }, + "estimated_total_complexity": { + "type": "string", + "enum": ["S", "M", "L", "XL"], + "description": "Overall complexity estimate" + } + } + }, + "tasks": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "title", "description", "persona", "complexity", "acceptance_criteria"], + "properties": { + "id": { + "type": "string", + "pattern": "^T[0-9]{2}$", + "description": "Task identifier (T01, T02, etc.)" + }, + "title": { + "type": "string", + "minLength": 5, + "description": "Short task title" + }, + "description": { + "type": "string", + "minLength": 20, + "description": "What needs to be done" + }, + "persona": { + "type": "string", + "enum": ["navigator", "philosopher", "craftsman", "auditor", "planner", "implementer", "reviewer"], + "description": "Which persona should execute this task" + }, + "complexity": { + "type": "string", + "enum": ["S", "M", "L", "XL"], + "description": "Task complexity estimate" + }, + "dependencies": { + "type": "array", + "items": { + "type": "string", + "pattern": "^T[0-9]{2}$" + }, + "description": "Task IDs that must complete before this one" + }, + "acceptance_criteria": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + }, + "description": "How to verify the task is complete" + }, + "affected_files": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Files that will be created or modified" + }, + "risks": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Risks specific to this task" + } + } + }, + "description": "Ordered list of tasks" + }, + "execution_order": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["phase", "task_ids"], + "properties": { + "phase": { + "type": "integer", + "minimum": 1, + "description": "Execution phase number" + }, + "task_ids": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^T[0-9]{2}$" + }, + "description": "Tasks that can run in parallel in this phase" + } + } + }, + "description": "Parallelization groups for task execution" + }, + "metadata": { + "type": "object", + "required": ["generated_at"], + "properties": { + "generated_at": { + "type": "string", + "format": "date-time", + "description": "When the plan was generated" + } + } + }, + "markdown_content": { + "type": "string", + "minLength": 50, + "description": "Pre-rendered human-readable plan in markdown format" + } + } +} diff --git a/.wave/contracts/pr-result.schema.json b/.wave/contracts/pr-result.schema.json new file mode 100644 index 0000000..641e88e --- /dev/null +++ b/.wave/contracts/pr-result.schema.json @@ -0,0 +1,43 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Pull Request Result", + "description": "Result of creating a pull request. Used by pipeline steps that produce a PR as their final output.", + "type": "object", + "required": ["pr_url", "pr_number", "branch", "summary"], + "properties": { + "pr_url": { + "type": "string", + "format": "uri", + "description": "URL to the created pull request" + }, + "pr_number": { + "type": "integer", + "minimum": 1, + "description": "Pull request number" + }, + "branch": { + "type": "string", + "minLength": 1, + "description": "Branch name for the pull request" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of what the pull request does" + }, + "copilot_review_requested": { + "type": "boolean", + "description": "Whether a Copilot review was requested for the PR" + }, + "closes_issue": { + "type": "boolean", + "description": "Whether the PR closes a linked issue" + }, + "issue_number": { + "type": "integer", + "minimum": 1, + "description": "Issue number that this PR addresses" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/probed-findings.schema.json b/.wave/contracts/probed-findings.schema.json new file mode 100644 index 0000000..e7f9027 --- /dev/null +++ b/.wave/contracts/probed-findings.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Probed Findings", + "description": "Deep-dive analysis from the recinq probe step", + "type": "object", + "required": ["target", "total_probed", "findings"], + "properties": { + "target": { + "type": "string", + "description": "What was analyzed (path, module, or 'whole-project')" + }, + "total_probed": { + "type": "integer", + "description": "Total number of confirmed findings that were probed deeper" + }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "deeper_analysis", "files"], + "properties": { + "id": { + "type": "string", + "description": "Original finding ID (e.g. DVG-001)" + }, + "deeper_analysis": { + "type": "string", + "description": "Extended analysis including dependency graph, second-order effects, and cross-finding patterns" + }, + "files": { + "type": "array", + "items": { "type": "string" }, + "description": "File paths involved in this finding and its connections" + } + }, + "additionalProperties": true + }, + "description": "Per-finding deep-dive results" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/project-survey.schema.json b/.wave/contracts/project-survey.schema.json new file mode 100644 index 0000000..25e36e6 --- /dev/null +++ b/.wave/contracts/project-survey.schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Project Survey", + "description": "Structured survey of a project for onboarding guide generation", + "type": "object", + "required": ["project", "build", "structure", "timestamp"], + "properties": { + "project": { + "type": "object", + "required": ["name", "language", "purpose"], + "properties": { + "name": { "type": "string", "minLength": 1 }, + "language": { "type": "string", "minLength": 1 }, + "framework": { "type": "string" }, + "purpose": { "type": "string", "minLength": 5 }, + "license": { "type": "string" } + } + }, + "build": { + "type": "object", + "required": ["commands"], + "properties": { + "commands": { + "type": "object", + "properties": { + "build": { "type": "string" }, + "test": { "type": "string" }, + "run": { "type": "string" } + } + }, + "prerequisites": { "type": "array", "items": { "type": "string" } }, + "ci_system": { "type": "string" } + } + }, + "structure": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["path", "purpose"], + "properties": { + "path": { "type": "string", "minLength": 1 }, + "purpose": { "type": "string", "minLength": 1 }, + "key_files": { "type": "array", "items": { "type": "string" } } + } + } + }, + "architecture": { + "type": "object", + "properties": { + "entry_points": { "type": "array", "items": { "type": "string" } }, + "components": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "role"], + "properties": { + "name": { "type": "string" }, + "package": { "type": "string" }, + "role": { "type": "string" } + } + } + }, + "patterns": { "type": "array", "items": { "type": "string" } } + } + }, + "dependencies": { + "type": "object", + "properties": { + "key_deps": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "purpose"], + "properties": { + "name": { "type": "string" }, + "purpose": { "type": "string" }, + "import": { "type": "string" } + } + } + }, + "total_count": { "type": "integer", "minimum": 0 } + } + }, + "configuration": { + "type": "object", + "properties": { + "env_vars": { "type": "array", "items": { "type": "string" } }, + "config_files": { "type": "array", "items": { "type": "string" } }, + "feature_flags": { "type": "array", "items": { "type": "string" } } + } + }, + "testing": { + "type": "object", + "properties": { + "framework": { "type": "string" }, + "patterns": { "type": "array", "items": { "type": "string" } }, + "run_command": { "type": "string" }, + "coverage_command": { "type": "string" } + } + }, + "workflow": { + "type": "object", + "properties": { + "branch_strategy": { "type": "string" }, + "commit_convention": { "type": "string" }, + "pr_process": { "type": "string" } + } + }, + "documentation": { + "type": "object", + "properties": { + "locations": { "type": "array", "items": { "type": "string" } }, + "quality": { "type": "string", "enum": ["good", "adequate", "sparse", "missing"] } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/publish-result.schema.json b/.wave/contracts/publish-result.schema.json new file mode 100644 index 0000000..cc4b8cf --- /dev/null +++ b/.wave/contracts/publish-result.schema.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Code Review Publish Result", + "description": "Result of publishing a code review comment on a pull request", + "type": "object", + "required": ["comment_url", "pr_number"], + "properties": { + "comment_url": { + "type": "string", + "format": "uri", + "description": "URL to the posted review comment" + }, + "pr_number": { + "type": "integer", + "minimum": 1, + "description": "PR number that was reviewed" + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$", + "description": "Repository full name (owner/repo)" + }, + "summary": { + "type": "string", + "description": "Brief summary of the review" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/recinq-context.schema.json b/.wave/contracts/recinq-context.schema.json new file mode 100644 index 0000000..44ec3ca --- /dev/null +++ b/.wave/contracts/recinq-context.schema.json @@ -0,0 +1,43 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Recinq Context", + "description": "Parsed input context from the recinq gather step", + "type": "object", + "required": ["input_type", "original_input", "focus_hint"], + "properties": { + "input_type": { + "type": "string", + "enum": ["issue", "pr", "local"], + "description": "The kind of input: GitHub issue, GitHub PR, or local path/description" + }, + "original_input": { + "type": "string", + "description": "The raw input string exactly as given by the user" + }, + "focus_hint": { + "type": "string", + "description": "Summary of what should be simplified or focused on" + }, + "url": { + "type": "string", + "description": "GitHub issue or PR URL (empty for local input)" + }, + "repo": { + "type": "string", + "description": "GitHub owner/repo (empty for local input)" + }, + "number": { + "type": "integer", + "description": "GitHub issue or PR number (0 for local input)" + }, + "title": { + "type": "string", + "description": "GitHub issue or PR title (empty for local input)" + }, + "body": { + "type": "string", + "description": "GitHub issue or PR body (empty for local input)" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/refactor-analysis.schema.json b/.wave/contracts/refactor-analysis.schema.json new file mode 100644 index 0000000..9027347 --- /dev/null +++ b/.wave/contracts/refactor-analysis.schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "required": ["target_files", "affected_callers", "existing_tests", "integration_points", "risk_assessment"], + "properties": { + "target_files": { + "type": "array", + "items": { "type": "string" } + }, + "affected_callers": { + "type": "array", + "items": { "type": "string" } + }, + "existing_tests": { + "type": "array", + "items": { "type": "string" } + }, + "integration_points": { + "type": "array", + "items": { "type": "string" } + }, + "risk_assessment": { + "type": "string", + "enum": ["low", "medium", "high"] + } + } +} diff --git a/.wave/contracts/research-findings.schema.json b/.wave/contracts/research-findings.schema.json new file mode 100644 index 0000000..6e68b00 --- /dev/null +++ b/.wave/contracts/research-findings.schema.json @@ -0,0 +1,178 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Research Findings", + "description": "Web research results organized by topic with sources and insights", + "type": "object", + "required": ["issue_reference", "findings_by_topic", "research_metadata"], + "properties": { + "issue_reference": { + "type": "object", + "required": ["issue_number", "repository"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$" + } + } + }, + "findings_by_topic": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["topic_id", "topic_title", "findings", "confidence_level"], + "properties": { + "topic_id": { + "type": "string", + "pattern": "^TOPIC-[0-9]{3}$", + "description": "Reference to topic ID from research-topics" + }, + "topic_title": { + "type": "string", + "description": "Topic title for readability" + }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "summary", "source", "relevance_score"], + "properties": { + "id": { + "type": "string", + "pattern": "^FINDING-[0-9]{3}$", + "description": "Unique finding identifier" + }, + "summary": { + "type": "string", + "minLength": 20, + "maxLength": 2000, + "description": "Summarized finding content" + }, + "key_points": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Bullet points of key insights" + }, + "source": { + "type": "object", + "required": ["url", "title", "type"], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Source URL" + }, + "title": { + "type": "string", + "description": "Source page/article title" + }, + "type": { + "type": "string", + "enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"], + "description": "Type of source" + }, + "author": { + "type": "string", + "description": "Author or organization name" + }, + "credibility_score": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Source credibility assessment (0-1)" + } + } + }, + "relevance_score": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Relevance to the topic (0-1)" + }, + "quotes": { + "type": "array", + "items": { + "type": "object", + "required": ["text"], + "properties": { + "text": { + "type": "string", + "description": "Direct quote from source" + }, + "context": { + "type": "string", + "description": "Context for the quote" + } + } + }, + "description": "Notable quotes from the source" + } + } + }, + "description": "Individual research findings for this topic" + }, + "confidence_level": { + "type": "string", + "enum": ["high", "medium", "low", "inconclusive"], + "description": "Overall confidence in findings for this topic" + }, + "consensus": { + "type": "string", + "description": "Summary of consensus across sources" + }, + "gaps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Questions that couldn't be fully answered" + } + } + }, + "description": "Research findings organized by topic" + }, + "research_metadata": { + "type": "object", + "required": ["started_at", "completed_at"], + "properties": { + "started_at": { + "type": "string", + "format": "date-time", + "description": "Research start timestamp" + }, + "completed_at": { + "type": "string", + "format": "date-time", + "description": "Research completion timestamp" + }, + "persona": { + "type": "string", + "description": "Wave persona that conducted research" + }, + "total_sources_consulted": { + "type": "integer", + "minimum": 0, + "description": "Total number of sources examined" + }, + "sources_included": { + "type": "integer", + "minimum": 0, + "description": "Number of sources included in findings" + }, + "search_queries_used": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Search queries that were used" + } + } + } + } +} diff --git a/.wave/contracts/research-report.schema.json b/.wave/contracts/research-report.schema.json new file mode 100644 index 0000000..601dd1f --- /dev/null +++ b/.wave/contracts/research-report.schema.json @@ -0,0 +1,206 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Research Report", + "description": "Synthesized research report for GitHub issue comment", + "type": "object", + "required": ["issue_reference", "executive_summary", "detailed_findings", "recommendations", "sources", "markdown_content"], + "properties": { + "issue_reference": { + "type": "object", + "required": ["issue_number", "repository", "title"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1 + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + } + }, + "executive_summary": { + "type": "object", + "required": ["overview", "key_findings", "primary_recommendation"], + "properties": { + "overview": { + "type": "string", + "minLength": 50, + "maxLength": 1000, + "description": "Brief overview of research conducted and main conclusions" + }, + "key_findings": { + "type": "array", + "minItems": 1, + "maxItems": 7, + "items": { + "type": "string" + }, + "description": "Top findings as bullet points" + }, + "primary_recommendation": { + "type": "string", + "minLength": 20, + "description": "Single most important recommendation" + }, + "confidence_assessment": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "Overall confidence in the research conclusions" + } + } + }, + "detailed_findings": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["section_title", "content", "relevance"], + "properties": { + "section_title": { + "type": "string", + "minLength": 3, + "description": "Section heading" + }, + "topic_id": { + "type": "string", + "pattern": "^TOPIC-[0-9]{3}$", + "description": "Reference to original topic if applicable" + }, + "content": { + "type": "string", + "minLength": 50, + "description": "Detailed markdown content for this section" + }, + "relevance": { + "type": "string", + "enum": ["critical", "high", "medium", "supplementary"], + "description": "How relevant this section is to the issue" + }, + "code_examples": { + "type": "array", + "items": { + "type": "object", + "required": ["code", "language"], + "properties": { + "code": { + "type": "string", + "description": "Code snippet" + }, + "language": { + "type": "string", + "description": "Language for syntax highlighting" + }, + "caption": { + "type": "string", + "description": "Explanation of the code" + } + } + }, + "description": "Code examples for this section" + }, + "related_sources": { + "type": "array", + "items": { + "type": "string", + "pattern": "^SRC-[0-9]{3}$" + }, + "description": "References to sources list" + } + } + }, + "description": "Detailed findings organized by section" + }, + "recommendations": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "items": { + "type": "object", + "required": ["id", "title", "description", "priority"], + "properties": { + "id": { + "type": "string", + "pattern": "^REC-[0-9]{3}$", + "description": "Recommendation identifier" + }, + "title": { + "type": "string", + "minLength": 5, + "maxLength": 100, + "description": "Concise recommendation title" + }, + "description": { + "type": "string", + "minLength": 20, + "description": "Detailed recommendation explanation" + }, + "priority": { + "type": "string", + "enum": ["critical", "high", "medium", "low"], + "description": "Recommendation priority" + }, + "effort_estimate": { + "type": "string", + "enum": ["trivial", "small", "medium", "large", "unknown"], + "description": "Estimated implementation effort" + } + } + }, + "description": "Actionable recommendations based on research" + }, + "sources": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["id", "url", "title"], + "properties": { + "id": { + "type": "string", + "pattern": "^SRC-[0-9]{3}$", + "description": "Source identifier for cross-referencing" + }, + "url": { + "type": "string", + "format": "uri", + "description": "Source URL" + }, + "title": { + "type": "string", + "description": "Source title" + }, + "type": { + "type": "string", + "enum": ["official_docs", "github_issue", "github_discussion", "stack_overflow", "blog_post", "tutorial", "api_reference", "academic_paper", "forum_post", "other"] + }, + "reliability": { + "type": "string", + "enum": ["authoritative", "reputable", "community", "unverified"], + "description": "Source reliability assessment" + } + } + }, + "description": "All sources cited in the report" + }, + "markdown_content": { + "type": "string", + "minLength": 100, + "description": "Pre-rendered markdown content ready for GitHub comment" + }, + "follow_up_questions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Questions that warrant further investigation" + } + } +} diff --git a/.wave/contracts/research-topics.schema.json b/.wave/contracts/research-topics.schema.json new file mode 100644 index 0000000..905c652 --- /dev/null +++ b/.wave/contracts/research-topics.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Research Topics", + "description": "Extracted research topics from GitHub issue analysis", + "type": "object", + "required": ["issue_reference", "topics"], + "properties": { + "issue_reference": { + "type": "object", + "required": ["issue_number", "repository"], + "properties": { + "issue_number": { + "type": "integer", + "minimum": 1, + "description": "Reference to source issue number" + }, + "repository": { + "type": "string", + "pattern": "^[^/]+/[^/]+$", + "description": "Repository full name (owner/repo)" + }, + "title": { + "type": "string", + "description": "Issue title for context" + } + } + }, + "topics": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "items": { + "type": "object", + "required": ["id", "title", "questions", "keywords", "priority"], + "properties": { + "id": { + "type": "string", + "pattern": "^TOPIC-[0-9]{3}$", + "description": "Unique topic identifier (e.g., TOPIC-001)" + }, + "title": { + "type": "string", + "minLength": 5, + "maxLength": 200, + "description": "Concise topic title" + }, + "description": { + "type": "string", + "description": "Detailed description of what needs to be researched" + }, + "questions": { + "type": "array", + "minItems": 1, + "maxItems": 5, + "items": { + "type": "string", + "minLength": 10 + }, + "description": "Specific questions to answer through research" + }, + "keywords": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "items": { + "type": "string", + "minLength": 2 + }, + "description": "Search keywords for web research" + }, + "priority": { + "type": "string", + "enum": ["critical", "high", "medium", "low"], + "description": "Research priority level" + }, + "category": { + "type": "string", + "enum": ["technical", "documentation", "best_practices", "security", "performance", "compatibility", "other"], + "description": "Topic category for organization" + } + } + }, + "description": "List of research topics extracted from the issue" + }, + "extraction_metadata": { + "type": "object", + "properties": { + "extracted_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when topics were extracted" + }, + "persona": { + "type": "string", + "description": "Wave persona that performed the extraction" + }, + "confidence": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Confidence score for topic relevance (0-1)" + } + } + } + } +} diff --git a/.wave/contracts/security-scan.schema.json b/.wave/contracts/security-scan.schema.json new file mode 100644 index 0000000..d6aa647 --- /dev/null +++ b/.wave/contracts/security-scan.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Security Scan Results", + "description": "Output from the security scan step", + "type": "object", + "required": ["target", "findings", "summary", "timestamp"], + "properties": { + "target": { + "type": "string", + "minLength": 1, + "description": "What was scanned" + }, + "attack_surface": { + "type": "array", + "items": { + "type": "object", + "required": ["entry_point", "type", "description"], + "properties": { + "entry_point": { "type": "string", "minLength": 1 }, + "type": { + "type": "string", + "enum": ["http_handler", "cli_input", "file_parser", "db_query", "api_call", "ipc", "other"] + }, + "description": { "type": "string", "minLength": 1 }, + "risk_level": { "type": "string", "enum": ["high", "medium", "low"] } + } + } + }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "title", "severity", "category", "location", "description"], + "properties": { + "id": { "type": "string", "pattern": "^SEC-[0-9]{3}$" }, + "title": { "type": "string", "minLength": 5 }, + "severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] }, + "category": { "type": "string", "minLength": 1 }, + "location": { "type": "string", "minLength": 1 }, + "description": { "type": "string", "minLength": 10 }, + "evidence": { "type": "string" }, + "exploitability": { "type": "string" } + } + } + }, + "secrets_check": { + "type": "object", + "properties": { + "hardcoded_secrets": { "type": "array", "items": { "type": "string" } }, + "insecure_configs": { "type": "array", "items": { "type": "string" } } + } + }, + "summary": { + "type": "object", + "required": ["total_findings", "by_severity", "risk_assessment"], + "properties": { + "total_findings": { "type": "integer", "minimum": 0 }, + "by_severity": { + "type": "object", + "required": ["CRITICAL", "HIGH", "MEDIUM", "LOW"], + "properties": { + "CRITICAL": { "type": "integer", "minimum": 0 }, + "HIGH": { "type": "integer", "minimum": 0 }, + "MEDIUM": { "type": "integer", "minimum": 0 }, + "LOW": { "type": "integer", "minimum": 0 } + } + }, + "risk_assessment": { "type": "string", "minLength": 10 } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/smoke-test.schema.json b/.wave/contracts/smoke-test.schema.json new file mode 100644 index 0000000..d766e8b --- /dev/null +++ b/.wave/contracts/smoke-test.schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Smoke Test Analysis", + "type": "object", + "required": [ + "summary", + "files_examined", + "recommendation" + ], + "properties": { + "summary": { + "type": "string", + "minLength": 10, + "description": "Brief summary of the analysis" + }, + "files_examined": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "List of files that were examined" + }, + "recommendation": { + "type": "string", + "minLength": 10, + "description": "Recommendation based on analysis" + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/.wave/contracts/source-extract.schema.json b/.wave/contracts/source-extract.schema.json new file mode 100644 index 0000000..30a7420 --- /dev/null +++ b/.wave/contracts/source-extract.schema.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Source Extract", + "description": "Extracted content from a single web source for ingestion", + "type": "object", + "required": ["url", "title", "summary", "key_concepts"], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Original URL that was fetched" + }, + "title": { + "type": "string", + "description": "Article or page title" + }, + "author": { + "type": "string", + "description": "Author name" + }, + "date": { + "type": "string", + "description": "Publication date" + }, + "summary": { + "type": "string", + "minLength": 50, + "maxLength": 3000, + "description": "Summary of the source content" + }, + "key_concepts": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["concept", "description"], + "properties": { + "concept": { + "type": "string", + "description": "Name of the key concept" + }, + "description": { + "type": "string", + "description": "Explanation of the concept as presented in the source" + } + } + }, + "description": "Key concepts extracted from the source" + }, + "notable_quotes": { + "type": "array", + "items": { + "type": "object", + "required": ["text"], + "properties": { + "text": { + "type": "string", + "description": "Direct quote" + }, + "context": { + "type": "string", + "description": "Context for the quote" + } + } + }, + "description": "Notable direct quotes from the source" + }, + "author_year_key": { + "type": "string", + "pattern": "^[A-Z][a-zA-Z]+[0-9]{4}[a-z]?$", + "description": "Suggested AuthorYear key for bibliographic note (e.g., Willison2026)" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/spec-phase.schema.json b/.wave/contracts/spec-phase.schema.json new file mode 100644 index 0000000..2cf37d5 --- /dev/null +++ b/.wave/contracts/spec-phase.schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schema.recinq.com/wave/spec-phase.schema.json", + "title": "Wave Spec Phase Output Contract", + "description": "Validates spec phase outputs for prototype-driven development pipeline", + "type": "object", + "properties": { + "phase": { + "type": "string", + "const": "spec", + "description": "Phase identifier" + }, + "artifacts": { + "type": "object", + "properties": { + "spec": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*spec\\.md$", + "description": "Path to specification file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Specification file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Specification content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + }, + "requirements": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^.*requirements\\.md$", + "description": "Path to requirements file" + }, + "exists": { + "type": "boolean", + "const": true, + "description": "Requirements file must exist" + }, + "content_type": { + "type": "string", + "const": "markdown", + "description": "Requirements content format" + } + }, + "required": ["path", "exists", "content_type"], + "additionalProperties": false + } + }, + "required": ["spec"], + "additionalProperties": true + }, + "validation": { + "type": "object", + "properties": { + "completeness_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Specification completeness rating" + }, + "clarity_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Specification clarity rating" + }, + "testability_score": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "Specification testability rating" + }, + "specification_quality": { + "type": "string", + "enum": ["poor", "fair", "good", "excellent"], + "description": "Overall specification quality assessment" + } + }, + "required": ["specification_quality"], + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "When spec phase was completed" + }, + "duration_seconds": { + "type": "number", + "minimum": 0, + "description": "Time taken for spec phase" + }, + "input_description": { + "type": "string", + "minLength": 1, + "description": "Original project description input" + } + }, + "required": ["timestamp", "input_description"], + "additionalProperties": false + } + }, + "required": ["phase", "artifacts", "validation", "metadata"], + "additionalProperties": false +} diff --git a/.wave/contracts/specify-status.schema.json b/.wave/contracts/specify-status.schema.json new file mode 100644 index 0000000..c9cd7f2 --- /dev/null +++ b/.wave/contracts/specify-status.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Specify Status", + "description": "Status report from the specify step: feature branch creation and spec authoring.", + "type": "object", + "required": ["branch_name", "spec_file", "feature_dir", "summary"], + "properties": { + "branch_name": { + "type": "string", + "minLength": 1, + "description": "Git branch name created for the feature" + }, + "spec_file": { + "type": "string", + "minLength": 1, + "description": "Path to the generated spec.md file" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of what was created" + }, + "checklist_status": { + "type": "string", + "enum": ["pass", "fail"], + "description": "Result of self-validation against the quality checklist" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/supervision-evaluation.schema.json b/.wave/contracts/supervision-evaluation.schema.json new file mode 100644 index 0000000..e32dc40 --- /dev/null +++ b/.wave/contracts/supervision-evaluation.schema.json @@ -0,0 +1,97 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Supervision Evaluation", + "description": "Quality evaluation of both output and process", + "type": "object", + "required": ["output_quality", "process_quality", "overall_score", "timestamp"], + "properties": { + "output_quality": { + "type": "object", + "required": ["correctness", "completeness", "test_coverage", "code_quality"], + "properties": { + "correctness": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "completeness": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "test_coverage": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "code_quality": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + } + } + }, + "process_quality": { + "type": "object", + "required": ["efficiency", "scope_discipline", "tool_usage"], + "properties": { + "efficiency": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "scope_discipline": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "tool_usage": { + "type": "object", + "required": ["score", "findings"], + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + }, + "token_economy": { + "type": "object", + "properties": { + "score": { "type": "string", "enum": ["excellent", "good", "adequate", "poor"] }, + "findings": { "type": "array", "items": { "type": "string" } } + } + } + } + }, + "overall_score": { + "type": "string", + "enum": ["excellent", "good", "adequate", "poor"] + }, + "key_strengths": { + "type": "array", + "items": { "type": "string" } + }, + "key_concerns": { + "type": "array", + "items": { "type": "string" } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/supervision-evidence.schema.json b/.wave/contracts/supervision-evidence.schema.json new file mode 100644 index 0000000..cd193c4 --- /dev/null +++ b/.wave/contracts/supervision-evidence.schema.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Supervision Evidence", + "description": "Evidence gathered for supervising completed work", + "type": "object", + "required": ["scope", "commits", "artifacts", "test_results", "timestamp"], + "properties": { + "scope": { + "type": "object", + "description": "What was inspected and how it was identified", + "required": ["description", "detection_method"], + "properties": { + "description": { "type": "string", "minLength": 5 }, + "detection_method": { + "type": "string", + "enum": ["auto_detect", "pipeline_run", "branch", "pr", "freeform"] + }, + "pipeline_name": { "type": "string" }, + "branch_name": { "type": "string" }, + "pr_number": { "type": "integer" } + } + }, + "commits": { + "type": "array", + "items": { + "type": "object", + "required": ["hash", "message", "files_changed"], + "properties": { + "hash": { "type": "string" }, + "message": { "type": "string" }, + "author": { "type": "string" }, + "files_changed": { "type": "integer" }, + "insertions": { "type": "integer" }, + "deletions": { "type": "integer" }, + "has_session_transcript": { "type": "boolean" }, + "transcript_summary": { "type": "string" } + } + } + }, + "artifacts": { + "type": "array", + "description": "Pipeline workspace artifacts found", + "items": { + "type": "object", + "required": ["path", "type"], + "properties": { + "path": { "type": "string" }, + "type": { "type": "string" }, + "size_bytes": { "type": "integer" }, + "summary": { "type": "string" } + } + } + }, + "test_results": { + "type": "object", + "required": ["ran", "passed"], + "properties": { + "ran": { "type": "boolean" }, + "passed": { "type": "boolean" }, + "total_tests": { "type": "integer" }, + "failed_tests": { "type": "integer" }, + "coverage_percent": { "type": "number" }, + "details": { "type": "string" } + } + }, + "session_transcripts": { + "type": "array", + "description": "Claudit session transcripts from git notes", + "items": { + "type": "object", + "required": ["commit_hash", "summary"], + "properties": { + "commit_hash": { "type": "string" }, + "summary": { "type": "string" }, + "tool_calls_count": { "type": "integer" }, + "notable_detours": { "type": "array", "items": { "type": "string" } }, + "errors_encountered": { "type": "array", "items": { "type": "string" } } + } + } + }, + "timestamp": { "type": "string", "format": "date-time" } + } +} diff --git a/.wave/contracts/tasks-status.schema.json b/.wave/contracts/tasks-status.schema.json new file mode 100644 index 0000000..05f32be --- /dev/null +++ b/.wave/contracts/tasks-status.schema.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Speckit Tasks Status", + "description": "Status report from the tasks step: dependency-ordered task breakdown generation.", + "type": "object", + "required": ["total_tasks", "feature_dir", "summary"], + "properties": { + "total_tasks": { + "type": "integer", + "minimum": 1, + "description": "Total number of tasks generated" + }, + "feature_dir": { + "type": "string", + "minLength": 1, + "description": "Path to the feature directory" + }, + "summary": { + "type": "string", + "minLength": 1, + "description": "Brief description of the task breakdown" + }, + "tasks_per_story": { + "type": "object", + "description": "Mapping of user story identifiers to task counts" + }, + "parallel_opportunities": { + "type": "integer", + "description": "Number of tasks that can be executed in parallel" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/validated-findings.schema.json b/.wave/contracts/validated-findings.schema.json new file mode 100644 index 0000000..ef67a45 --- /dev/null +++ b/.wave/contracts/validated-findings.schema.json @@ -0,0 +1,50 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Validated Findings", + "description": "Convergent validation results from the recinq converge step", + "type": "object", + "required": ["target", "total_findings", "confirmed", "rejected", "findings"], + "properties": { + "target": { + "type": "string", + "description": "What was analyzed (path, module, or 'whole-project')" + }, + "total_findings": { + "type": "integer", + "description": "Total number of divergent findings reviewed" + }, + "confirmed": { + "type": "integer", + "description": "Number of findings classified as CONFIRMED or PARTIALLY_CONFIRMED" + }, + "rejected": { + "type": "integer", + "description": "Number of findings classified as REJECTED" + }, + "findings": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "status", "rationale"], + "properties": { + "id": { + "type": "string", + "description": "Original finding ID (e.g. DVG-001)" + }, + "status": { + "type": "string", + "enum": ["CONFIRMED", "PARTIALLY_CONFIRMED", "REJECTED"], + "description": "Validation classification" + }, + "rationale": { + "type": "string", + "description": "Explanation of why the finding was classified this way" + } + }, + "additionalProperties": true + }, + "description": "Per-finding validation results" + } + }, + "additionalProperties": true +} diff --git a/.wave/contracts/web-findings.schema.json b/.wave/contracts/web-findings.schema.json new file mode 100644 index 0000000..27f5f58 --- /dev/null +++ b/.wave/contracts/web-findings.schema.json @@ -0,0 +1,85 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Web Findings", + "description": "Structured web research results for a given topic", + "type": "object", + "required": ["topic", "sources", "search_queries"], + "properties": { + "topic": { + "type": "string", + "description": "The topic that was researched" + }, + "sources": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["url", "title", "key_ideas", "relevance_to_topic"], + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "Source URL" + }, + "title": { + "type": "string", + "description": "Article or page title" + }, + "author": { + "type": "string", + "description": "Author name if available" + }, + "date": { + "type": "string", + "description": "Publication date if available" + }, + "key_ideas": { + "type": "array", + "minItems": 1, + "items": { "type": "string" }, + "description": "Key ideas extracted from the source" + }, + "quotes": { + "type": "array", + "items": { + "type": "object", + "required": ["text"], + "properties": { + "text": { + "type": "string", + "description": "Direct quote from source" + }, + "context": { + "type": "string", + "description": "Context for the quote" + } + } + }, + "description": "Notable direct quotes" + }, + "relevance_to_topic": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Relevance score (0-1)" + }, + "source_type": { + "type": "string", + "enum": ["blog_post", "academic_paper", "documentation", "news_article", "conference_talk", "book_excerpt", "other"], + "description": "Type of source" + } + } + }, + "description": "Web sources found and analyzed" + }, + "search_queries": { + "type": "array", + "items": { "type": "string" }, + "description": "Search queries that were executed" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +} diff --git a/.wave/contracts/zettel-references.schema.json b/.wave/contracts/zettel-references.schema.json new file mode 100644 index 0000000..e7e4acb --- /dev/null +++ b/.wave/contracts/zettel-references.schema.json @@ -0,0 +1,72 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Zettel References", + "description": "Notes found in the Zettelkasten relevant to a given topic", + "type": "object", + "required": ["query_keywords", "references", "index_entry_points"], + "properties": { + "query_keywords": { + "type": "array", + "items": { "type": "string" }, + "description": "Keywords used for searching" + }, + "references": { + "type": "array", + "items": { + "type": "object", + "required": ["filename", "title", "folgezettel_address", "relevance", "key_quotes"], + "properties": { + "filename": { + "type": "string", + "pattern": "^[0-9a-f]{8}\\.md$", + "description": "Hex-ID filename of the note" + }, + "title": { + "type": "string", + "description": "Full title including Folgezettel address" + }, + "folgezettel_address": { + "type": "string", + "description": "Folgezettel address (e.g., 3.1c2)" + }, + "relevance": { + "type": "string", + "enum": ["high", "medium", "low"], + "description": "Relevance to the search topic" + }, + "key_quotes": { + "type": "array", + "items": { "type": "string" }, + "description": "Notable passages from the note" + }, + "section": { + "type": "string", + "description": "Top-level section the note belongs to" + } + } + }, + "description": "Relevant notes found in the Zettelkasten" + }, + "index_entry_points": { + "type": "array", + "items": { + "type": "object", + "required": ["keyword", "filename", "title"], + "properties": { + "keyword": { "type": "string" }, + "filename": { "type": "string" }, + "title": { "type": "string" } + } + }, + "description": "Entry points from the index note" + }, + "total_notes_searched": { + "type": "integer", + "minimum": 0 + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } +}