# ADR-019 Implementation: Versioning Guidance **Date**: 2025-11-19 **Author**: StarPunk Architect **Status**: Final Recommendation ## Current Situation **Current Version**: 0.7.1 **Released Tags**: v0.4.0, v0.5.2, v0.6.0, v0.6.1, v0.7.0, v0.7.1 **Problem**: ADR-019 initially suggested v0.6.3, but we have already released v0.7.0 and v0.7.1. We cannot go backward in semantic versioning (0.7.1 → 0.6.3 is invalid). ## What v0.7.0 and v0.7.1 Contained ### v0.7.0 (2025-11-19) **Added**: - IndieAuth detailed logging with token redaction - OAuth Client ID Metadata Document endpoint (`/.well-known/oauth-authorization-server`) - **NOTE**: This endpoint is unnecessary and will be removed in ADR-019 implementation **Changed**: - Enhanced authentication flow visibility with structured logging - LOG_LEVEL environment variable for configurable logging **Security**: - Automatic token redaction in logs ### v0.7.1 (2025-11-19) **Fixed**: - IndieAuth h-app visibility (removed `hidden` and `aria-hidden` attributes) - Made h-app microformat visible to parsers for backward compatibility - **NOTE**: h-app microformats are unnecessary and will be removed in ADR-019 implementation ## Analysis of Changes in ADR-019 Implementation ### What ADR-019 Will Do **Fixes**: 1. Fix broken IndieAuth authentication (critical bug) 2. Add PKCE implementation (security enhancement, required by IndieLogin.com) 3. Correct API endpoints (/authorize and /token instead of /auth) 4. Add issuer validation **Removes**: 1. OAuth metadata endpoint added in v0.7.0 (unnecessary) 2. h-app microformats modified in v0.7.1 (unnecessary) **Changes**: 1. Database schema: adds `code_verifier` column to `auth_state` table 2. Authentication flow: implements PKCE properly ### Semantic Versioning Analysis According to `/home/phil/Projects/starpunk/docs/standards/versioning-strategy.md`: **MAJOR** (x.0.0): - Breaking API changes - Database schema changes requiring migration ✓ (we have this) - Configuration file format changes - Removal of deprecated features **MINOR** (0.x.0): - New features (backward compatible) - New API endpoints - Non-breaking enhancements - Optional configuration parameters **PATCH** (0.0.x): - Bug fixes - Security patches - Documentation corrections - Dependency updates **Special Rules for 0.x.y versions** (from versioning-strategy.md): > "Public API should not be considered stable. Breaking changes allowed without major version increment." During the 0.x phase, we have flexibility. ### Change Classification **This implementation includes**: 1. **Critical bug fix** - Authentication completely broken 2. **Security enhancement** - PKCE implementation (best practice) 3. **Database schema change** - Adding column (backward compatible with DEFAULT) 4. **Feature removal** - OAuth metadata endpoint (added in v0.7.0, never worked) 5. **Code cleanup** - Removing unnecessary h-app microformats **NOT included**: - New user-facing features - Breaking API changes for working features - Configuration changes requiring user intervention ## Version Number Decision ### Recommended: v0.8.0 (MINOR Increment) **Rationale**: 1. **Following 0.x Convention**: During the 0.x phase (pre-1.0), MINOR increments are used for both features and breaking changes. This is documented in our versioning strategy. 2. **This is a Significant Change**: - Fixes critical broken functionality - Adds PKCE (security enhancement) - Changes authentication flow - Modifies database schema - Removes features added in v0.7.0 3. **Database Schema Change**: While backward compatible (DEFAULT clause), schema changes traditionally warrant MINOR increment. 4. **Not a PATCH**: Too substantial for PATCH (0.7.2): - Not a simple bug fix - Adds new security mechanism (PKCE) - Removes endpoints - Changes multiple files and flow 5. **Not MAJOR (1.0.0)**: We're not ready for 1.0: - Still in development phase - V1 feature set not complete - This fixes existing planned functionality, doesn't complete the roadmap ### Version Progression Comparison **Option A: v0.8.0 (RECOMMENDED)** ``` v0.7.0 → Logging + OAuth metadata (broken) v0.7.1 → h-app visibility fix (unnecessary) v0.8.0 → Fix IndieAuth with PKCE, remove unnecessary features v1.0.0 → (Future) First stable release when all V1 features complete ``` **Option B: v0.7.2 (NOT RECOMMENDED)** ``` v0.7.0 → Logging + OAuth metadata (broken) v0.7.1 → h-app visibility fix (unnecessary) v0.7.2 → Fix IndieAuth with PKCE, remove unnecessary features v1.0.0 → (Future) First stable release ``` Too minor for the scope of changes. PATCH should be simple fixes. **Option C: v1.0.0 (NOT RECOMMENDED - TOO EARLY)** ``` v0.7.0 → Logging + OAuth metadata (broken) v0.7.1 → h-app visibility fix (unnecessary) v1.0.0 → Fix IndieAuth with PKCE, remove unnecessary features ``` Premature. Not all V1 features complete. 1.0.0 should signal "production ready." ## Git Tag Handling ### Recommendation: Keep All Existing Tags **Do NOT delete v0.7.0 or v0.7.1** **Rationale**: 1. **Git History Integrity**: Tags mark historical points. Deleting creates confusion. 2. **Semantic Versioning Rules**: You can't "un-release" a version. 3. **Traceability**: Keep record of what was attempted even if it didn't work. 4. **Documentation**: CHANGELOG will explain the situation clearly. ### What To Do Instead **Mark v0.7.0 and v0.7.1 as broken in documentation**: - CHANGELOG notes explain what didn't work - GitHub release notes (if using) can be updated with warnings - README or docs can reference the issue ## CHANGELOG Updates ### How to Document This **Add v0.8.0 entry**: ```markdown ## [0.8.0] - 2025-11-19 ### Fixed - **CRITICAL**: Fixed IndieAuth authentication to work with IndieLogin.com - Implemented required PKCE (Proof Key for Code Exchange) for security - Corrected IndieLogin.com API endpoints (/authorize and /token) - Added issuer validation for authentication callbacks ### Added - PKCE code_verifier generation and storage - PKCE code_challenge generation and validation - Database column: auth_state.code_verifier for PKCE support ### Removed - OAuth Client ID Metadata Document endpoint (/.well-known/oauth-authorization-server) - Added in v0.7.0 but unnecessary for IndieLogin.com - IndieLogin.com does not use OAuth client discovery - h-app microformats markup from templates - Modified in v0.7.1 but unnecessary for IndieLogin.com - IndieLogin.com does not parse h-app for client identification - indieauth-metadata link from HTML head ### Changed - Authentication flow now follows IndieLogin.com API specification exactly - Database schema: auth_state table includes code_verifier column - State token validation now returns code_verifier for token exchange ### Security - PKCE prevents authorization code interception attacks - Issuer validation prevents token substitution attacks - Code verifier securely stored and single-use ### Breaking Changes - Users mid-authentication when upgrading will need to restart login (state tokens expire in 5 minutes) - Existing state tokens without code_verifier will be invalid (intentional security improvement) ### Notes on Previous Versions - **v0.7.0**: OAuth metadata endpoint added based on misunderstanding of requirements. This endpoint was never functional for our use case and is removed in v0.8.0. - **v0.7.1**: h-app visibility changes attempted to fix authentication but addressed wrong issue. h-app discovery not used by IndieLogin.com. Removed in v0.8.0. - **v0.8.0**: Correct implementation based on official IndieLogin.com API documentation. ### Related Documentation - ADR-019: IndieAuth Correct Implementation Based on IndieLogin.com API - Design Document: docs/designs/indieauth-pkce-authentication.md - ADR-016: Superseded (h-app client discovery not required) - ADR-017: Superseded (OAuth metadata not required) ### Migration Notes - Database migration required: Add code_verifier column to auth_state table - See docs/designs/indieauth-pkce-authentication.md for full implementation guide ``` **Update v0.7.0 entry with note**: ```markdown ## [0.7.0] - 2025-11-19 ### Added - **IndieAuth Detailed Logging**: Comprehensive logging for authentication flows - Logging helper functions with automatic token redaction - **OAuth Client ID Metadata Document endpoint** (/.well-known/oauth-authorization-server) - **NOTE (2025-11-19)**: This endpoint was added based on misunderstanding of IndieLogin.com requirements. IndieLogin.com does not use OAuth client discovery. This endpoint is removed in v0.8.0. See ADR-019 for correct implementation. [... rest of v0.7.0 entry ...] ### Known Issues - **IndieAuth authentication still broken**: This release attempted to fix authentication by adding OAuth metadata endpoint, but this is not required by IndieLogin.com. Missing PKCE implementation is the actual issue. Fixed in v0.8.0. ``` **Update v0.7.1 entry with note**: ```markdown ## [0.7.1] - 2025-11-19 ### Fixed - **IndieAuth h-app Visibility**: Removed `hidden` and `aria-hidden="true"` attributes from h-app microformat markup - h-app was invisible to IndieAuth parsers - **NOTE (2025-11-19)**: This fix attempted to enable client discovery, but IndieLogin.com does not use h-app microformats. h-app markup removed entirely in v0.8.0. See ADR-019 for correct implementation. ### Known Issues - **IndieAuth authentication still broken**: This release attempted to fix authentication by making h-app visible, but IndieLogin.com does not parse h-app. Missing PKCE implementation is the actual issue. Fixed in v0.8.0. ``` ## Version File Updates ### File: `/home/phil/Projects/starpunk/starpunk/__init__.py` **Current** (line 156): ```python __version__ = "0.7.1" __version_info__ = (0, 7, 1) ``` **Change to**: ```python __version__ = "0.8.0" __version_info__ = (0, 8, 0) ``` ### Git Tag Creation **After implementation and testing complete**: ```bash # Commit all changes git add . git commit -m "feat: Implement PKCE authentication for IndieLogin.com - Add PKCE code_verifier and code_challenge generation - Correct IndieLogin.com API endpoints (/authorize, /token) - Add issuer validation - Remove unnecessary OAuth metadata endpoint (from v0.7.0) - Remove unnecessary h-app microformats (from v0.7.1) - Update database schema: add auth_state.code_verifier column Fixes critical IndieAuth authentication bug. Version: 0.8.0 Related: ADR-019 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude " # Create annotated tag git tag -a v0.8.0 -m "Release 0.8.0: Fix IndieAuth Authentication with PKCE Critical Fixes: - Implemented PKCE (Proof Key for Code Exchange) as required by IndieLogin.com - Corrected IndieLogin.com API endpoints - Added issuer validation - Fixed broken authentication flow Removals: - OAuth metadata endpoint (v0.7.0, unnecessary) - h-app microformats (v0.7.1, unnecessary) Security Enhancements: - PKCE prevents authorization code interception - Issuer validation prevents token substitution Breaking Changes: - Users mid-authentication must restart login after upgrade - Database migration required (add auth_state.code_verifier column) This release corrects authentication issues in v0.7.0 and v0.7.1 by implementing the IndieLogin.com API specification correctly. See ADR-019 and design document for full details. See CHANGELOG.md for complete change details." # Push git push origin main git push origin v0.8.0 ``` ## Summary: What the Developer Should Do ### 1. Version Number **Use: 0.8.0** - Update `starpunk/__init__.py`: `__version__ = "0.8.0"` and `__version_info__ = (0, 8, 0)` ### 2. Git Tags **Keep all existing tags**: v0.4.0, v0.5.2, v0.6.0, v0.6.1, v0.7.0, v0.7.1 **Create new tag**: v0.8.0 after implementation complete ### 3. CHANGELOG Updates - Add v0.8.0 entry with comprehensive details - Update v0.7.0 entry with note about OAuth metadata being unnecessary - Update v0.7.1 entry with note about h-app being unnecessary - Explain the progression and corrections clearly ### 4. GitHub Release (if used) - Create v0.8.0 release from tag - Use tag message as release notes - Optionally update v0.7.0 and v0.7.1 release descriptions with warnings ### 5. Documentation Updates - ADR-016: Change status to "Superseded by ADR-019" - ADR-017: Change status to "Superseded by ADR-019" - ADR-005: Add implementation note referencing ADR-019 ## Rationale for v0.8.0 **Why NOT v0.7.2 (PATCH)**: - Too substantial (PKCE implementation, endpoint changes, removals) - Database schema change - Semantic versioning: PATCH should be simple fixes - This is a significant rework, not a small fix **Why NOT v1.0.0 (MAJOR)**: - Not all V1 features complete yet - Still in development phase (0.x series) - 1.0.0 should signal "production ready, all planned features" - This fixes existing planned functionality, doesn't complete roadmap **Why v0.8.0 (MINOR)**: - Appropriate for 0.x development phase - Signals significant change from v0.7.x - Follows project versioning strategy for 0.x phase - Database schema change warrants MINOR - Keeps clean numbering progression toward 1.0.0 ## Version Roadmap **Current Path**: ``` v0.7.0 - Logging + OAuth metadata (misunderstood requirements) v0.7.1 - h-app visibility (wrong fix) v0.8.0 - PKCE + correct IndieLogin.com implementation (THIS RELEASE) v0.9.0 - (Future) Additional features or fixes v1.0.0 - (Future) First stable release with all V1 features ``` This progression clearly shows: 1. v0.7.x attempted fixes based on wrong understanding 2. v0.8.0 correct implementation based on actual API requirements 3. Clean path to v1.0.0 when V1 scope is complete --- **Decision**: Use v0.8.0 **Reasoning**: MINOR increment appropriate for significant fix with schema change during 0.x phase **Action**: Update version to 0.8.0, create tag v0.8.0, update CHANGELOG with detailed notes **Git Tags**: Keep all existing tags (v0.7.0, v0.7.1), add v0.8.0