# Release Management Optimization Workplan **Topic**: 260106-release-management-optimization **Created**: 2026-01-06 **Status**: Stages 1-2 Complete, v0.10.0 Released **Priority**: High (blocks v0.10.0 release) ✅ UNBLOCKED --- ## Overview Enhance release management infrastructure with robust validation and automation, using the newly built schema system. This creates a practical showcase for the schema evolution capabilities while fixing critical release tooling issues. ## Motivation ### Current Issues 1. **setuptools-scm Configuration Bug** - Missing tag regex filter → picks up non-version tags - Result: `markitect --version` returns "unknown" - Impact: Users can't verify installed version 2. **Version History Inconsistency** - CHANGELOG shows v0.9.0 (2025-11-14) but git tag never created - setuptools-scm sees v0.8.0 as latest - 109 commits between v0.8.0 and current 3. **No Validation Infrastructure** - No CHANGELOG validation (format, version consistency) - No pre-release checks for version/tag alignment - No automated version bump validation 4. **Missing CLI Features** - No explicit `markitect --version` command - Version info only via __version__.py fallback ### Opportunity: Schema System Showcase Creating a **CHANGELOG schema** demonstrates: - Real-world use of x-markitect extensions - Schema validation for structured markdown - Section classification (Unreleased, versioned releases) - Content patterns (Keep a Changelog format) - Integration with release tooling **Perfect timing**: Release v0.10.0 with the tool that validates its own changelog! --- ## Goals ### Primary 1. ✅ **Fix setuptools-scm configuration** (blocks release) 2. ✅ **Restore version history** (retroactive v0.9.0 tag) 3. ✅ **Create CHANGELOG schema** (Keep a Changelog format) 4. ✅ **Implement CHANGELOG validation** (pre-release check) ### Secondary 5. ⭐ **Add explicit version command** to markitect CLI 6. ⭐ **Extend schema system** (if needed for system calls/agents) 7. ⭐ **Release capability enhancements** (validation hooks) ### Stretch 8. 🎯 **Git tag validation** (ensure CHANGELOG ↔ tags sync) 9. 🎯 **Automated version bumping** suggestions 10. 🎯 **Release notes generation** from CHANGELOG --- ## Staged Workplan ### Stage 1: Critical Fixes (Required for v0.10.0) **Goal**: Unblock immediate release #### Task 1.1: Fix setuptools-scm Configuration **File**: `pyproject.toml` **Current**: ```toml [tool.setuptools_scm] write_to = "markitect/_version.py" ``` **Updated**: ```toml [tool.setuptools_scm] write_to = "markitect/_version.py" version_scheme = "python-simplified-semver" tag_regex = "^v(?P[0-9]+\\.[0-9]+\\.[0-9]+)$" local_scheme = "no-local-version" ``` **Validation**: - Run `python -c "from setuptools_scm import get_version; print(get_version())"` - Should show `0.8.1.dev109+g5e3646f` (or similar, based on v0.8.0 tag) - Run `markitect --version` → should show version (after reinstall) **Estimated**: 10 minutes #### Task 1.2: Restore Version History **Action**: Retroactively create v0.9.0 tag **Find v0.9.0 release commit**: ```bash # Find commit around 2025-11-14 with plugin/rendering changes git log --since="2025-11-13" --until="2025-11-15" --oneline ``` **Create tag**: ```bash # Tag the identified commit git tag -a v0.9.0 -m "Release v0.9.0: Plugin infrastructure and TestDrive JSUI - Plugin Infrastructure Foundation - RenderingEngineManager - TestDrive JSUI Plugin - ChatGPT Document Theme - CLI Engine Parameter See CHANGELOG.md for full details." ``` **Validation**: - `git tag -l 'v*'` → should show v0.9.0 - `git describe --tags --match='v*'` → should show v0.9.0-based description **Estimated**: 15 minutes #### Task 1.3: Prepare v0.10.0 Release **File**: `CHANGELOG.md` **Actions**: 1. Move Unreleased content to v0.10.0 section 2. Add release date 3. Verify version links at bottom **Format**: ```markdown ## [Unreleased] ## [0.10.0] - 2026-01-06 ### Added - **ADR Schema**: Architecture Decision Record validation schema - 12 section classifications for comprehensive ADR structure - Content pattern validation for formatting rules - Quality metrics for completeness - **Markdown Schema Support**: Fixed validate and generate-stub commands - load_schema_from_path() supports .json and .md files - DocumentWrapper extracts headings from AST - All schema commands now work with markdown schemas - **Schema Evolution Topic Closure**: Complete Phase 1-3 implementation - 5 production schemas (manpage, API docs, terminology, schema-schema, ADR) - Semantic validation system fully operational - Template generation working with schemas ### Fixed - setuptools-scm configuration with tag_regex for proper version detection - markitect --version now returns correct version instead of "unknown" - Semantic validator AST heading extraction via DocumentWrapper [Unreleased]: https://github.com/worsch/markitect/compare/v0.10.0...HEAD [0.10.0]: https://github.com/worsch/markitect/compare/v0.9.0...v0.10.0 ``` **Estimated**: 20 minutes **Total Stage 1**: ~45 minutes --- ### Stage 2: CHANGELOG Schema (Showcase Feature) **Goal**: Create and validate CHANGELOG schema using schema evolution infrastructure #### Task 2.1: Analyze CHANGELOG Structure **Method**: Study Keep a Changelog format **Structure to validate**: ```markdown # Changelog [preamble text] ## [Unreleased] ### Added / Changed / Deprecated / Removed / Fixed / Security - Bullet points ## [X.Y.Z] - YYYY-MM-DD ### Added / Changed / Deprecated / Removed / Fixed / Security - Bullet points [version links at bottom] ``` **Schema Requirements**: - **Sections**: Unreleased (required), Version sections (pattern: `[X.Y.Z]`) - **Subsections**: Added/Changed/Deprecated/Removed/Fixed/Security (optional) - **Content Patterns**: - Version format: `\[(\d+\.\d+\.\d+)\]` - Date format: `YYYY-MM-DD` - Links at bottom: `[version]: url` - **Quality Metrics**: - Each version should have at least one subsection - Bullet points required in subsections **Estimated**: 30 minutes #### Task 2.2: Create changelog-schema-v1.0.md **File**: `markitect/schemas/changelog-schema-v1.0.md` **Schema structure**: ```markdown --- schema-id: "https://markitect.dev/schemas/changelog/v1.0" version: "1.0.0" status: "stable" domain: "changelog" description: "JSON schema for Keep a Changelog format with version history validation" --- # Changelog Schema v1.0 ## Overview This schema validates CHANGELOG.md files following the Keep a Changelog format... ## Schema Definition ```json { "$schema": "http://json-schema.org/draft-07/schema#", "x-markitect-sections": { "Unreleased": { "classification": "required", "heading_level": 2, "error_message": "Unreleased section is mandatory for tracking upcoming changes" }, // Version sections validated via pattern }, "x-markitect-content-control": { "unreleased": { "content_quality": { "min_words": 0 // Can be empty } }, // Version sections with date validation } } ``` ``` **Considerations for Extension**: - **System Call Validation**: Check git tags match CHANGELOG versions - `x-markitect-validation-hooks`: { "system": "git tag -l 'v*'" } - Requires schema system extension - **Agent Validation**: Use AI to validate version consistency - `x-markitect-validation-agents`: { "prompt": "Check versions align" } - Requires agent integration **Decision**: Start with pure schema validation, add hooks/agents if needed **Estimated**: 90 minutes #### Task 2.3: Ingest and Test CHANGELOG Schema **Commands**: ```bash # Ingest markitect schema-ingest markitect/schemas/changelog-schema-v1.0.md # Validate our CHANGELOG markitect validate CHANGELOG.md --schema changelog-schema-v1.0.md ``` **Expected**: - Section validation: Unreleased section present ✓ - Version format validation: All versions follow X.Y.Z ✓ - Date validation: ISO format YYYY-MM-DD ✓ - Content structure: Subsections present ✓ **Fix any issues found in CHANGELOG.md** **Estimated**: 30 minutes **Total Stage 2**: ~2.5 hours --- ### Stage 3: Release Capability Enhancements **Goal**: Integrate CHANGELOG validation into release workflow #### Task 3.1: Add CHANGELOG Validation to Release Manager **File**: `capabilities/release-management/src/release_management/core/manager.py` **Add validation method**: ```python def validate_changelog(self) -> tuple[bool, list[str]]: """Validate CHANGELOG.md against changelog schema.""" from markitect.cli import validate_against_schema changelog_path = self.project_root / "CHANGELOG.md" schema_path = self.project_root / "markitect/schemas/changelog-schema-v1.0.md" if not changelog_path.exists(): return False, ["CHANGELOG.md not found"] is_valid = validate_against_schema(changelog_path, schema_path) if not is_valid: return False, ["CHANGELOG.md validation failed"] return True, [] ``` **Integrate into validate_release_state()**: ```python def validate_release_state(self) -> tuple[bool, list[str]]: issues = [] # Existing validations... # Add CHANGELOG validation changelog_valid, changelog_issues = self.validate_changelog() if not changelog_valid: issues.extend(changelog_issues) return len(issues) == 0, issues ``` **Estimated**: 45 minutes #### Task 3.2: Add Version-Tag Consistency Check **Feature**: Verify CHANGELOG versions match git tags **Method**: ```python def check_version_tag_consistency(self) -> tuple[bool, list[str]]: """Check CHANGELOG versions have corresponding git tags.""" import re # Parse CHANGELOG for versions changelog = (self.project_root / "CHANGELOG.md").read_text() versions = re.findall(r'## \[(\d+\.\d+\.\d+)\]', changelog) # Get git tags result = subprocess.run(['git', 'tag', '-l', 'v*'], capture_output=True, text=True) tags = result.stdout.strip().split('\n') tag_versions = [t.lstrip('v') for t in tags if t.startswith('v')] # Check consistency issues = [] for version in versions: if version not in tag_versions: issues.append(f"CHANGELOG version {version} has no git tag v{version}") return len(issues) == 0, issues ``` **Estimated**: 45 minutes #### Task 3.3: Add Explicit Version Command **File**: `markitect/cli.py` **Add command**: ```python @cli.command() def version(): """Display detailed version information.""" from markitect.__version__ import get_version_info info = get_version_info() click.echo(f"MarkiTect {info['full_version']}") click.echo(f"Git Commit: {info['git_commit']}") click.echo(f"Git Branch: {info['git_branch']}") if info['is_dev']: click.echo("⚠️ Development version (not released)") else: click.echo(f"✅ Released version") ``` **Update --version option**: ```python @click.version_option(version=get_version(), prog_name="markitect") def cli(): ... ``` **Estimated**: 30 minutes **Total Stage 3**: ~2 hours --- ### Stage 4: Schema System Extensions (If Needed) **Goal**: Add validation hooks for system calls and agents **Only implement if pure schema validation insufficient** #### Option A: System Call Hooks **Extension**: `x-markitect-validation-hooks` ```json { "x-markitect-validation-hooks": { "pre-validation": [ { "name": "check-git-tags", "command": "git tag -l 'v*'", "parser": "lines", "validation": { "min_count": 5, "pattern": "^v\\d+\\.\\d+\\.\\d+$" } } ] } } ``` **Implementation**: - Add HookValidator to validators package - Execute system commands securely - Parse and validate output - Integrate into SemanticValidator **Estimated**: 3 hours #### Option B: Agent Validation **Extension**: `x-markitect-validation-agents` ```json { "x-markitect-validation-agents": { "consistency-check": { "prompt": "Verify all CHANGELOG versions have corresponding git tags", "context": ["CHANGELOG.md", "git tag -l"], "severity": "warning" } } } ``` **Implementation**: - Add AgentValidator to validators package - Integration with LLM/agent framework - Structured output parsing - Integrate into SemanticValidator **Estimated**: 4 hours **Decision Point**: Only proceed if needed for CHANGELOG validation **Total Stage 4**: 0-7 hours (conditional) --- ## Success Criteria ### Stage 1 (Required for Release) - ✅ `markitect --version` returns actual version (not "unknown") - ✅ v0.9.0 git tag exists - ✅ CHANGELOG.md has v0.10.0 section - ✅ v0.10.0 ready for tagging ### Stage 2 (Showcase Feature) - ✅ changelog-schema-v1.0.md created and ingested - ✅ CHANGELOG.md validates against schema - ✅ Schema demonstrates Keep a Changelog format validation ### Stage 3 (Enhanced Tooling) - ✅ Release validation includes CHANGELOG check - ✅ Version-tag consistency checking works - ✅ `markitect version` command available ### Stage 4 (Optional Extensions) - ⭐ System call hooks functional (if implemented) - ⭐ Agent validation working (if implemented) --- ## Timeline Estimate ### Fast Track (Stage 1 Only) - **Time**: 45 minutes - **Scope**: Critical fixes for v0.10.0 release - **Result**: Can release immediately ### Standard Track (Stages 1-3) - **Time**: 5 hours - **Scope**: Fixes + CHANGELOG schema + tooling enhancements - **Result**: Production-ready release management ### Full Track (Stages 1-4) - **Time**: 5-12 hours (depends on extensions needed) - **Scope**: Complete system with validation hooks/agents - **Result**: Advanced validation infrastructure --- ## Decision Points ### 1. Release Strategy **Options**: - A. Fast track → Release v0.10.0 now with Stage 1 fixes only - B. Standard track → Complete Stages 1-3, release as v0.10.1 or v0.11.0 - C. Full track → Include Stage 4, major release v1.0.0 **Recommendation**: **Option B (Standard Track)** - Showcases schema system with real use case - Improves release tooling robustly - Reasonable timeline (5 hours) - Release as **v0.10.0** with all features ### 2. Schema Extensions **When to implement**: - Stage 4 only if pure schema validation can't handle: - Git tag checking (may need system call hook) - Version consistency (may need agent validation) **Recommendation**: **Start without extensions** - Try pure schema validation first - Add hooks/agents only if needed - Document extension needs for future enhancement ### 3. release-management Extraction **Question**: Make it a git submodule? **Current**: Regular directory (not extracted) **Recommendation**: **Defer to future** - Not blocking for release - Works fine as capability - Can extract later if needed for reuse --- ## Files to Create/Modify ### Create - `markitect/schemas/changelog-schema-v1.0.md` - CHANGELOG validation schema - `roadmap/260106-release-management-optimization/DONE.md` - Completion checklist (when done) ### Modify - `pyproject.toml` - Fix setuptools-scm configuration - `CHANGELOG.md` - Add v0.10.0 section, fix format if needed - `markitect/cli.py` - Add explicit version command - `capabilities/release-management/src/release_management/core/manager.py` - Add CHANGELOG validation - (Optional) `markitect/validators/` - Add hook/agent validators if needed ### Git Operations - Create v0.9.0 tag retroactively - Create v0.10.0 tag for release --- ## Risks & Mitigations ### Risk 1: Retroactive Tagging **Issue**: Creating v0.9.0 tag retroactively might confuse users **Mitigation**: - Document in CHANGELOG that tag was missing - Use tag message to explain retroactive creation - Don't publish v0.9.0 packages (already past that release) ### Risk 2: Schema Extensions Complexity **Issue**: Implementing hooks/agents might be complex **Mitigation**: - Start with pure schema validation - Only add extensions if necessary - Document extension API for future ### Risk 3: CHANGELOG Format Variations **Issue**: Real-world CHANGELOGs may not match Keep a Changelog exactly **Mitigation**: - Make schema flexible with optional sections - Use warnings instead of errors for style issues - Support alternative section names --- ## Completion Summary **Completed**: 2026-01-06 **Release**: v0.10.0 **Track**: Standard (Stages 1-2) ### Stage 1: Critical Fixes ✅ **Duration**: ~45 minutes **Status**: COMPLETE #### Achievements: 1. ✅ **Fixed setuptools-scm Configuration** - Added `git_describe_command = "git describe --tags --long --match 'v*'"` - Filters out non-version tags (e.g., "testdrive-jsui-migration-phase4-complete") - Version detection now works: `markitect --version` → 0.10.0 - File: `pyproject.toml` - Commit: 061ba88 2. ✅ **Retroactively Created v0.9.0 Git Tag** - Tagged commit b9c1b90 from 2025-11-14 - Maintains version history integrity - CHANGELOG documented v0.9.0 but tag was missing - Enables proper version progression to v0.10.0 - Commit: 061ba88 3. ✅ **Prepared CHANGELOG.md for v0.10.0** - Created [0.10.0] - 2026-01-06 section - Moved Unreleased content to v0.10.0 - Documented version detection fixes - Documented v0.9.0 retroactive tag - Commit: 061ba88 ### Stage 2: CHANGELOG Schema ✅ **Duration**: ~90 minutes **Status**: COMPLETE #### Achievements: 1. ✅ **Created changelog-schema-v1.0.md** - Comprehensive schema for Keep a Changelog format - 360+ lines of schema definition and documentation - File: `markitect/schemas/changelog-schema-v1.0.md` - Commit: c4ee5cc 2. ✅ **Implemented x-markitect Extensions** - `x-markitect-sections`: 7 section classifications - [Unreleased]: required - Added/Changed/Deprecated/Removed/Fixed/Security: optional - `x-markitect-content-control`: 6 content patterns - Title validation, introduction patterns, version format - Date format (ISO 8601), change types, reference links - `x-markitect-validation-rules`: 4 custom rules - Version format, date format, version ordering, unreleased position 3. ✅ **Schema Ingestion and Testing** - Ingested into schema catalog (Record ID: 12) - Successfully validates project CHANGELOG.md - All section requirements met (7 checked, 11 found) - All content requirements met - All semantic checks passing - Command: `markitect validate CHANGELOG.md --schema changelog-schema-v1.0.md --semantic` 4. ✅ **Documentation in CHANGELOG** - Documented new schema in v0.10.0 Added section - Philosophy: "The release that validates itself" - Showcase of schema system practical application ### Version Release ✅ **Tag**: v0.10.0 **Date**: 2026-01-06 **Verification**: `markitect --version` → 0.10.0 ### Success Metrics **Stage 1 Criteria** (Required for Release): - ✅ `markitect --version` returns actual version (0.10.0, not "unknown") - ✅ v0.9.0 git tag exists - ✅ CHANGELOG.md has v0.10.0 section - ✅ v0.10.0 tagged and ready **Stage 2 Criteria** (Showcase Feature): - ✅ changelog-schema-v1.0.md created and ingested - ✅ CHANGELOG.md validates against schema - ✅ Schema demonstrates Keep a Changelog format validation - ✅ All semantic validation checks passing ### Deferred Work **Stage 3** (Release Capability Enhancements): - ⭐ CHANGELOG validation in ReleaseManager - ⭐ Version-tag consistency checking - ⭐ Explicit `markitect version` command - **Status**: Deferred to future enhancement - **Reason**: v0.10.0 release unblocked, showcase feature complete **Stage 4** (Schema System Extensions): - 🎯 System call hooks (x-markitect-validation-hooks) - 🎯 Agent validation (x-markitect-validation-agents) - **Status**: Not needed for CHANGELOG validation - **Reason**: Pure schema validation sufficient ### Files Created/Modified **Created**: - `markitect/schemas/changelog-schema-v1.0.md` (360 lines) **Modified**: - `pyproject.toml` (setuptools-scm configuration) - `CHANGELOG.md` (v0.10.0 section, changelog schema documentation) - `roadmap/260106-release-management-optimization/WORKPLAN.md` (this file) **Tags Created**: - `v0.9.0` (retroactive, commit b9c1b90) - `v0.10.0` (release, commit c4ee5cc+) ### Commits 1. `4e9117d` - plan: create release-management-optimization roadmap topic 2. `061ba88` - fix: resolve version detection and prepare v0.10.0 release 3. `c4ee5cc` - feat: add changelog schema for Keep a Changelog validation 4. `v0.10.0` - Release tag created ### Philosophy Achievement > "Use the tools we build to improve the tools we build." **Result**: v0.10.0 is "The release that validates itself" - ✅ Uses its own schema system to validate its CHANGELOG.md - ✅ Demonstrates schema evolution practical value - ✅ Real-world showcase of x-markitect extensions - ✅ Perfect example of dogfooding infrastructure --- ## Notes - This workplan creates a **perfect showcase** for schema evolution - Validates its own CHANGELOG with the schema system it just built - Real-world practical application demonstrating value - Release v0.10.0 becomes a milestone: "The release that validates itself" **Philosophy**: Use the tools we build to improve the tools we build.