Skip to content

Instantly share code, notes, and snippets.

@fxstein
Created January 28, 2026 00:16
Show Gist options
  • Select an option

  • Save fxstein/19a43595ce66e9ca7ba624ad9f19b081 to your computer and use it in GitHub Desktop.

Select an option

Save fxstein/19a43595ce66e9ca7ba624ad9f19b081 to your computer and use it in GitHub Desktop.
ai-todo bug repro: TODO.md current + prior

Project ToDo List

⚠️ IMPORTANT: This file should ONLY be edited through the todo.ai script!

Tasks

  • #103 Joke task 5: Misaligned box error #joke #test

    Invent a playful error message for a misaligned box.

  • #102 Joke task 4: Linting ASCII art #joke #test

    Write a pun about linting ASCII art for crooked borders.

  • #101 Joke task 3: Box-drawing punchline #joke #test

    Come up with a punchline that personifies a box-drawing character.

  • #100 Joke task 2: Tabs vs spaces one-liner #joke #test

    Draft a one-liner about tabs vs spaces in flowcharts.

  • #99 Joke task 1: ASCII box pun #joke #test

    Write a short pun about ASCII boxes being "well-aligned" in life.

    • #79.3.7 Pin action SHAs: Pin all GitHub Actions to commit SHAs instead of tags

      DEFERRED: Security enhancement to pin all GitHub Actions to commit SHAs. Can be automated using pin-github-actions CLI tool and enforced with ensure-sha-pinned-actions. Dependabot already configured to manage SHA updates once pinned. Deferring to avoid complexity during initial uv migration. See UV_DESIGN.md section 4.6.1.

    • #79.3.5 Test CI workflows: Verify all workflows pass with uv

      CI workflows updated and YAML syntax validated. Actual testing requires pushing to GitHub and running workflows. Syntax validation passed for all 4 workflows. Ready for CI testing once pushed.

    • #58.7 Document: Update docs about code block behavior
    • #58.6 Verify: Test with user's example from issue #11
    • #58.5 Test: Add test cases for boxes in code blocks
    • #58.4 Implement: Add config option and restore code block scanning
    • #58.3 Design: Plan configuration option for include/exclude code blocks
    • #58.2 Analyze: Understand how code block detection was added
    • #58.1 Investigate: Review code changes between v1.2.1 and v1.3.0

Archived Tasks

  • #93 Harden uv setup to prevent dependency on system/Homebrew Python (2026-01-11)
    • #93.6 Update release.sh validation to check for uv-managed Python source (2026-01-11)
    • #93.5 Test hardened setup: verify venv creation uses uv-managed Python even when Homebrew Python is available (2026-01-11)
    • #93.4 Update documentation (DEVELOPMENT.md, README.md) to document uv hardening approach (2026-01-11)
    • #93.3 Update CI/CD workflows to use --managed-python flag in uv venv commands (2026-01-11)
    • #93.2 Add validation in setup.sh to verify venv uses uv-managed Python (not system/Homebrew) (2026-01-11)
    • #93.1 Update setup.sh to use explicit Python version with --managed-python flag (2026-01-11)
  • #86 Fix scheduled CI test failures and review Dependabot PRs (2026-01-11)
    • #86.6 Review and merge Dependabot PR #21 (actions/upload-artifact 5.0.0 → 6.0.0) (2026-01-11)
    • #86.5 Review and merge Dependabot PR #20 (astral-sh/setup-uv commit update) (2026-01-11)
    • #86.4 Review and merge Dependabot PR #19 (actions/cache 4.3.0 → 5.0.1) (2026-01-11)
    • #86.3 Close duplicate scheduled test failure issues (#18, #22, #23, #24) after fix is verified (2026-01-11)
    • #86.2 Test the scheduled workflow fix locally or via workflow_dispatch (2026-01-11)
    • #86.1 Fix Performance Benchmark job in scheduled.yml - use 'uv run' instead of 'python' (2026-01-11)
  • #85 CI/CD Hardening & Optimization - Implement audit findings (2025-12-14)
    • #85.4 Update Schedule: Add Python 3.13 and 3.14 to scheduled tests matrix (2025-12-14)
    • #85.3 Simplify Auto-merge: Remove wait-on-check-action and use native auto-merge (2025-12-14)
    • #85.2 Pin Actions: Pin all GitHub Actions to commit SHAs (2025-12-14)
    • #85.1 Refactor Workflows: Consolidate redundant checks in ci.yml and pr-checks.yml (2025-12-14)
  • #79 Migrate project to uv: Complete migration from venv/pip to uv package manager -p (2025-12-14)

    Complete uv migration: All phases (1-6) successfully completed. Project fully migrated from venv/pip/pyenv to uv. All CI/CD workflows, documentation, scripts, and Cursor rules updated. Version 2.2.0 released with uv migration. Zero dependencies verified. Developer setup tested. All implementation gaps addressed. Created docs/migration/UV_IMPLEMENTATION_GAP_ANALYSIS.md with audit findings: Documentation updates needed, CI workflow standardization (sync vs pip install), and Cursor rules refresh. See docs/migration/UV_ANALYSIS.md for complete analysis of current setup (venv, pip, pipx, Python version management, CI/CD, pre-commit hooks). See docs/migration/UV_DESIGN.md for detailed migration design with security and reliability improvements (lock file strategy, SHA pinning, permissions, native caching). Migration eliminates all venv/pip/pyenv usage in favor of uv, while maintaining full compatibility with existing workflows.

    • #79.6 Phase 6: Implementation Gaps - Address remaining documentation and workflow gaps (2025-12-14)

      Phase 6 complete. All implementation gaps addressed: CI workflows standardized (removed redundant uv pip install), developer documentation updated to use uv, and Cursor rules enhanced to explicitly prefer uv sync over uv pip install. All workflows now use strict lockfile enforcement.

      • #79.6.3 Standardize CI Workflows: Replace 'uv pip install' with 'uv sync --frozen --dev' in all workflows (2025-12-14)
      • #79.6.2 Update Cursor Rules: Refresh .cursor/rules to explicitly prefer uv commands (2025-12-14)
      • #79.6.1 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (2025-12-14)
    • #79.5 Phase 5: Testing and Release - Full testing and release new version (2025-12-14)

      Phase 5 complete. All testing and release tasks completed successfully: CI/CD workflows verified, release dry-run tested, zero dependencies verified, developer setup tested, and version 2.2.0 released. The uv migration is fully tested and published.

      • #79.5.5 Release new version: Publish migration as new version (2025-12-14)

        Release 2.2.0 published successfully. Package built with uv run python -m build (wheel and sdist), version changes committed, tag v2.2.0 pushed to GitHub. GitHub Actions is handling PyPI publishing and GitHub release creation. Migration to uv is complete and released.

      • #79.5.4 Test developer setup: Verify new developers can set up with uv (2025-12-14)

        Developer setup verified successfully. Ran ./scripts/test-setup.sh which: 1) Removed existing venv, 2) Verified prerequisites (uv, python3), 3) Ran setup.sh from scratch, 4) Verified venv created by uv, 5) Verified all packages and tools working (ascii-guard, pytest, ruff, mypy). All checks passed. New developers can successfully set up the project with uv.

      • #79.5.3 Verify zero deps: Ensure zero dependency verification still works (2025-12-14)

        Zero dependency verification works correctly with uv. Verified: 1) CI method (uv sync --frozen installs only ascii-guard), 2) pyproject.toml check (only tomli for Python 3.10), 3) stdlib-only imports (all modules import without deps), 4) Package works standalone. All checks pass.

      • #79.5.2 Test release dry-run: Test release process with --prepare flag (2025-12-14)

        Release dry-run test successful. Ran ./release/release.sh --prepare which: 1) Validated environment (uv, venv, build, gh CLI all OK), 2) Detected version bump (2.1.0 → 2.2.0, minor), 3) Generated release notes with AI summary and categorized commits, 4) Updated version files (pyproject.toml, init.py). Release process works correctly with uv. Build test with uv run python -m build verified.

      • #79.5.1 Test full CI/CD: Run all workflows and verify they pass (2025-12-14)

        CI/CD workflows verified and passing. All 4 workflows (ci.yml, pr-checks.yml, scheduled.yml, release.yml) have been updated to use uv and are running successfully. Recent runs show: ci.yml passing, scheduled tests passing. All workflows use uv sync --frozen --dev, uv venv, and uv run commands correctly.

    • #79.4 Phase 4: Scripts and Documentation - Update setup.sh, release.sh, and all docs (2025-12-14)

      Phase 4 complete. All scripts and documentation updated to use uv. Key changes: setup.sh uses uv venv/sync, release.sh checks uv and uses uv run, all docs updated with uv examples, Cursor rules updated to use uv instead of venv/pip.

      • #79.4.6 Update Cursor rules: Update venv references to uv where appropriate (2025-12-14)
      • #79.4.5 Update CONTRIBUTING.md: Update development setup to use uv (2025-12-14)
      • #79.4.4 Update docs/USAGE.md: Update developer setup examples to use uv (2025-12-14)
      • #79.4.3 Update README.md: Add uv installation instructions for developers (2025-12-14)
      • #79.4.2 Update release.sh: Convert to use uv sync and verify uv availability (2025-12-14)

        Add uv availability check. Replace pip install with 'uv sync --dev'. Keep all validation logic (uv venvs are compatible). Keep build commands (work with uv-installed packages). See UV_DESIGN.md section 4.8.

      • #79.4.1 Update setup.sh: Convert to use uv venv and uv sync (2025-12-14)

        Replace 'python3 -m venv .venv' with 'uv venv'. Replace 'pip install --upgrade pip' and 'pip install -e .[dev]' with 'uv sync --dev'. Add uv installation check. Keep pre-commit installation (works as-is). See UV_DESIGN.md section 4.7.

    • #79.3 Phase 3: CI/CD Migration - Update all GitHub Actions workflows (2025-12-14)

      Phase 3 complete. All 4 workflows updated to use uv. Key changes: Added permissions: contents: read, replaced setup-python with setup-uv, used native caching, replaced venv/pip with uv venv/sync, updated zero deps verification to uv pip list. Note: Action SHA pinning (79.3.7) is manual - Dependabot already configured to manage updates once pinned.

      • #79.3.10 Update zero dependency verification: Replace 'pip list' with 'uv pip list' in CI workflows (2025-12-14)

        Update CI workflows that verify zero dependencies: Replace 'pip list' with 'uv pip list' in verify-zero-dependencies job (ci.yml line 141) and release.yml. Same output format, minimal changes needed. See UV_DESIGN.md section 6.2.

      • #79.3.9 Configure Dependabot: Set up Dependabot to manage GitHub Actions SHA updates (2025-12-14)

        Dependabot is already configured in .github/dependabot.yml for GitHub Actions updates. It will automatically manage SHA updates once actions are pinned to SHAs. No additional configuration needed. See .github/dependabot.yml lines 6-23. Configure Dependabot to automatically manage GitHub Actions SHA updates. This automates security updates for pinned action SHAs. See UV_DESIGN.md section 4.6.1 and .github/dependabot.yml.

      • #79.3.8 Use native caching: Switch to enable-cache: true in setup-uv instead of manual cache (2025-12-14)

        Use 'enable-cache: true' in setup-uv action with 'cache-dependency-glob: uv.lock'. Replaces manual cache configuration. See UV_DESIGN.md section 5.3.

      • #79.3.6 Add workflow permissions: Set permissions: contents: read to all workflows (least privilege) (2025-12-14)

        Set 'permissions: contents: read' as default (least privilege). Only grant write permissions to specific jobs that need them (e.g., releases). See UV_DESIGN.md section 4.6.1.

      • #79.3.4 Update release.yml: Migrate release workflow to use uv (most critical) (2025-12-14)

        CRITICAL: Release workflow is most important - test thoroughly. Update validate-release, build-and-publish, and create-github-release jobs. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (use --frozen in CI). Keep build/twine commands (they work with uv-installed packages). See UV_DESIGN.md section 4.6 for CI/CD migration details.

      • #79.3.3 Update scheduled.yml: Migrate scheduled tests workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Use native caching. See UV_DESIGN.md section 4.6.

      • #79.3.2 Update pr-checks.yml: Migrate PR checks workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Use native caching. See UV_DESIGN.md section 4.6.

      • #79.3.1 Update ci.yml: Migrate main CI workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace pip cache with uv cache (~/.cache/uv). Replace 'python -m venv .venv' with 'uv venv'. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Remove 'pip upgrade' step. See UV_DESIGN.md section 4.6 for details.

    • #79.2 Phase 2: Local Development - Install uv and test locally (2025-12-14)

      Phase 2 complete. Note: uv sync --dev doesn't install dev dependencies automatically - need to use 'uv pip install -e .[dev]' after uv sync. This is expected behavior - uv sync only installs runtime deps, dev deps need explicit install. All tests passed: pre-commit, build, zero deps verification, frozen sync.

      • #79.2.9 Update .gitignore: Ensure uv.lock is tracked (not ignored) (2025-12-14)

        Check .gitignore to ensure uv.lock is NOT ignored. If any pattern matches it, add exclusion. uv.lock must be committed to repository for reproducible builds. See UV_DESIGN.md section 4.3.1.

      • #79.2.8 Pin Python version: Run uv python pin 3.14.2 to explicitly manage Python version (2025-12-14)

        Use 'uv python pin 3.14.2' to explicitly manage Python version. Ensures uv run always uses exact interpreter version, preventing inconsistent local environments. See UV_DESIGN.md section 4.1.

      • #79.2.7 Generate uv.lock: Run uv sync --dev to create lock file and commit to repo (2025-12-14)

        CRITICAL: Lock file ensures 100% reproducible builds. Run 'uv sync --dev' to generate uv.lock, then commit it. CI should use 'uv sync --frozen --dev' to fail if lock file is out of sync. See UV_DESIGN.md section 4.3.1.

      • #79.2.6 Test zero deps: Verify zero dependency verification works with uv (2025-12-14)
      • #79.2.5 Test build: Verify python -m build works with uv-installed packages (2025-12-14)
      • #79.2.4 Test pre-commit: Verify pre-commit hooks work with uv venv (2025-12-14)
      • #79.2.3 Test uv sync: Install dependencies with uv sync --dev (2025-12-14)
      • #79.2.2 Test uv venv: Create virtual environment with uv venv (2025-12-14)
      • #79.2.1 Install uv: Install uv locally and verify installation (2025-12-14)
    • #79.1 Phase 1: Preparation - Analysis and design documents completed (2025-12-14)
      • #79.1.2 Create design document: Design complete migration plan to uv (2025-12-14)
      • #79.1.1 Create analysis document: Analyze current venv, pip, pipx, Python version management (2025-12-14)
  • #78 Fix: Resolve issue #17 - fix command does not fix all detected errors -p (2025-12-12)
    • #78.6 Update validation document with final test results (2025-12-12)
    • #78.5 Add comprehensive test cases for both bug patterns (nested boxes and junction characters) (2025-12-12)
    • #78.4 Verify fixer handles all edge cases for nested box content with extra border characters (2025-12-12)
    • #78.3 Enhance fixer to adjust bottom border width when junction characters are present (2025-12-12)
    • #78.2 Fix border width calculation to correctly handle junction characters (▼, ┴, etc.) (2025-12-12)

      FIXED: Updated fixer to calculate top border width correctly (counting only HORIZONTAL_CHARS and JUNCTION_CHARS) and match bottom border width exactly. Also fixed linter.py to merge fixes when multiple boxes share the same line.

    • #78.1 Investigate why fixer reports fixing boxes but errors persist for border width mismatches (2025-12-12)

      Resolved persistent duplicate borders in nested boxes. Updated linter.py to detect '│ │' patterns (space-separated duplicates) near borders and fixer.py to remove them. Verified clean output in issue_17_nested_boxes.md. Updated validator to count non-space characters as part of border width, resolving mismatch with fixer which was already correctly handling visual width. User feedback: Fix must ensure (1) continuous borders with no spaces in middle, (2) no duplicate borders or extra corners. Current fix creates spaces where top border has non-border chars. Need to always make borders continuous regardless of validator errors. FIXED: Updated fixer to calculate top border width (counting only HORIZONTAL_CHARS and JUNCTION_CHARS) and match bottom border width exactly. Fixer now correctly handles cases where top border has non-border characters like ▼ that shouldn't be counted in width. Root cause identified: fixer builds bottom border from left_col to right_col (11 chars), but top border has only 8 horizontal/junction chars (▼ is not counted). Fixer needs to calculate top border width and match it exactly, not use right_col as endpoint.

  • #69 Design and implement well-defined Python API for ascii-guard -p (2025-12-12)
    • #69.20 Release: Prepare release notes for Python API feature (2025-12-12)
    • #69.19 Document: Add API reference documentation (2025-12-12)
    • #69.18 Document: Update FAQ.md to reference official API (2025-12-12)
    • #69.17 Document: Update USAGE.md with official Python API section (2025-12-12)
    • #69.16 Test: Verify backward compatibility with existing imports (2025-12-12)
    • #69.15 Test: Add integration tests for API usage patterns (2025-12-12)
    • #69.14 Test: Add unit tests for public API functions (2025-12-12)
    • #69.13 Implement: Add programmatic box detection API (2025-12-12)
    • #69.12 Implement: Update fix_file() API signature and documentation (2025-12-12)
    • #69.11 Implement: Update lint_file() API signature and documentation (2025-12-12)
    • #69.10 Implement: Export public API from init.py (2025-12-12)
    • #69.9 Review: Review and approve API design document before implementation (2025-12-12)
    • #69.8 Design: Write design document in docs/API_DESIGN.md for review (2025-12-12)
    • #69.7 Design: Document API versioning and stability guarantees (2025-12-12)
    • #69.6 Design: Define backward compatibility strategy for existing imports (2025-12-12)
    • #69.5 Design: Design API for programmatic box detection and validation (2025-12-12)
    • #69.4 Design: Design API for fix_file() - parameters, return types, error handling (2025-12-12)
    • #69.3 Design: Design API for lint_file() - parameters, return types, error handling (2025-12-12)
    • #69.2 Design: Define public API surface (what to export from init.py) (2025-12-12)
    • #69.1 Design: Analyze current internal API and identify stable functions (2025-12-12)

      Analysis complete. See docs/API_ANALYSIS.md for full findings.

  • #59 Investigate: Validate ignore markers functionality (2025-12-02)

    During testing of issue #11, ignore markers appeared to not work - boxes marked with were still being validated. Need to verify if this is expected behavior or a bug.

    • #59.6 Document: Update docs if behavior needs clarification (2025-12-02)

      Added troubleshooting section to docs/USAGE.md explaining common marker name mistakes (e.g., using -start suffix). Documented all three valid markers clearly.

    • #59.5 Fix: Implement or correct ignore marker behavior if broken (2025-12-02)

      No fix needed - ignore markers work correctly. Issue was confusion about marker names. Documentation is accurate.

    • #59.4 Review: Check test cases for ignore markers (task#55) (2025-12-02)

      Test cases in test_detector.py::TestIgnoreMarkers are comprehensive and correct. They use proper marker names and test block regions, single-next markers, empty lines handling, nested regions, and broken boxes.

    • #59.3 Review: Check detector.py for ignore marker implementation (2025-12-02)

      Implementation in detector.py is CORRECT. Markers: '' (start), '' (end), '' (single box). Function is_in_ignore_region() properly tracks regions.

    • #59.2 Test: Verify ignore markers work with boxes inside code blocks (2025-12-02)

      UPDATE: Ignore markers work correctly inside code blocks too when using correct marker names. CONFIRMED BUG: Ignore markers DO NOT work inside code blocks either. Same behavior as outside code blocks - all boxes detected and validated regardless of ignore markers.

    • #59.1 Test: Verify ignore markers work with boxes outside code blocks (2025-12-02)

      UPDATE: Ignore markers WORK CORRECTLY! Issue was user error - used wrong marker name. Correct: '' NOT ''. With correct markers, detected 2 boxes (not 3) and no errors. CONFIRMED BUG: Ignore markers DO NOT work outside code blocks. Detected 3 boxes when should have detected 2. The box between ignore-start/end markers was still validated and errors reported.

  • #57 Review and fix all open GitHub issues (2025-12-02)

    ✅ ALL ISSUES RESOLVED! Fixed 3 problems: (1) Python 3.10 tomllib detection, (2) Windows UTF-8 encoding, (3) Windows permission tests. All platforms now pass. Issues #12 and #13 were auto-closed. ✅ Python 3.10 issue FIXED and verified via CI. Windows failures need monitoring - if next scheduled run still fails on Windows, investigate separately. Issues #12/#13 may resolve themselves or reveal Windows-specific problem. Fixed Python 3.10 failure: test_stdlib_only.py was rejecting 'tomllib' import even though it only executes on Python 3.11+. Added tomllib to allowed modules list. This should fix failures on Python 3.10 (all platforms). Windows failures across all Python versions may be a separate issue - need to verify after this fix. Issues #12 & #13: Scheduled test failures are REAL issues. Cannot access detailed logs via gh CLI. Failures occur on: Python 3.10 (all platforms), All Windows runners (all Python versions). Local tests pass. Need to investigate actual failure logs from GitHub Actions web interface. Issues #12 & #13 are auto-generated scheduled test failures. These need separate investigation to determine if they're real failures or environment issues. Can be addressed in future work.

    • #57.7 Close fixed issues with reference to commits (2025-12-02)

      Closed GitHub issue #11 - verified as fixed in v1.5.0

    • #57.6 Verify fixes with CI/CD and local testing (2025-12-02)
    • #57.5 Fix issues: implement solutions and test (2025-12-02)

      Issue #11 verified as FIXED in v1.5.0 - boxes in code blocks ARE being detected correctly. Can close issue as resolved.

    • #57.4 Create subtasks for complex issues if needed (2025-12-02)
    • #57.3 Prioritize issues by severity and impact (2025-12-02)

      Priority 1 (HIGH): Issue #11 - Regression bug, boxes in code blocks not detected. Priority 2 (MEDIUM): Issues #12 & #13 - Scheduled test failures, need investigation

    • #57.2 Review each issue: understand problem and scope (2025-12-02)
    • #57.1 List all open GitHub issues (2025-12-02)

      Issue #11 is already FIXED in v1.5.0. Task #58 may not be needed - can archive after closing GitHub issue. Fixes GitHub issue #11 - Regression where boxes in markdown code blocks are not detected

  • #56 Review and merge Dependabot PRs (2025-12-02)
    • #56.6 Approve and merge passing PRs (2025-12-02)
    • #56.5 Run local tests if needed to verify changes (2025-12-02)

      Not needed - CI tests comprehensive and all passing

    • #56.4 If checks fail: investigate and fix issues (2025-12-02)

      No issues found - all CI checks passing

    • #56.3 Check CI/CD status for each PR (2025-12-02)
    • #56.2 Review each PR: check version changes and release notes (2025-12-02)
    • #56.1 List all open Dependabot PRs (2025-12-02)
  • #55 Add ignore markers for code blocks: allow marking ASCII boxes as exempt from validation (2025-12-02)
    • #55.10 Document: Add examples to README showing broken boxes with ignore markers (2025-12-02)
    • #55.9 Document: Update USAGE.md with ignore marker syntax and examples (2025-12-02)

      Document syntax, provide examples: (1) showing broken box for comparison, (2) testing edge cases, (3) examples in documentation without errors

    • #55.8 Test: Verify linter skips marked boxes, fixer doesn't touch them (2025-12-02)
    • #55.7 Test: Add test cases for ignore markers in code blocks and inline (2025-12-02)
    • #55.6 Implement: Ensure fixer respects ignore markers (2025-12-02)
    • #55.5 Implement: Modify detector to skip marked regions (2025-12-02)
    • #55.4 Implement: Add ignore marker detection in detector.py (2025-12-02)

      Modify detect_boxes() in detector.py to track ignore regions. Store line ranges to skip. See is_in_code_fence() pattern from Issue task#11

    • #55.3 Design: Decide scope - code blocks only, or any ASCII box? (2025-12-02)

      Decision: Ignore markers work ANYWHERE (not just code blocks). Provides maximum flexibility for all documentation scenarios. Decide: Should markers work only in markdown code blocks, or also for inline ASCII boxes? Consider use case: README examples, documentation with intentionally broken boxes

    • #55.2 Design: Define ignore marker syntax (HTML comments, directives, or special fences) (2025-12-02)

      Options: (1) HTML comments before/after blocks, (2) fence attributes like ```ascii-ignore, (3) inline directives. Consider both block-level and inline markers

    • #55.1 Investigate: Research comment/directive syntax for ignore markers in markdown (2025-12-02)

      Common patterns: HTML comment markers, special fence types, or attributes. Check eslint-disable, prettier-ignore patterns

  • #54 Achieve 100% test coverage across all modules -p (2025-11-19)

    Starting implementation: Working through subtasks from easiest to hardest (54.6 -> 54.1)

    • #54.9 Improve validator.py coverage (92% -> 100%): Test all validation branches (2025-11-19)

      Improved from 88% to 94% coverage. Remaining 6% involves complex branch conditions that are hard to reach Missing lines 57-56, 82, 105-110, 133-140, 181-188, 220-241, 259, 273. Test: all validation branch conditions

    • #54.8 Improve scanner.py coverage (93% -> 100%): Test error handling for file operations (2025-11-19)

      Improved from 93% to 97% coverage. Remaining 3% (lines 70-71) is unreachable code (Latin-1 decode cannot fail) Missing lines 65-71, 176-167. Test: binary file detection edge cases, large files, permission errors

    • #54.7 Improve patterns.py coverage (85% -> 100%): Test edge cases in pattern matching (2025-11-19)

      Improved from 85% to 89% coverage. Remaining 11% involves complex glob pattern edge cases that are difficult to trigger Missing lines 54-56, 119, 144-148, 156-158, 172-178, 175. Test: invalid patterns, edge cases in matching, path normalization

    • #54.6 Improve models.py coverage (96% -> 100%): Test Box width/height properties (2025-11-19)

      Missing lines 55, 60. Test: Box.width and Box.height properties

    • #54.5 Improve linter.py coverage (84% -> 100%): Test error handling paths (2025-11-19)

      Improved from 84% to 97% coverage. Remaining 3% is branch coverage edge cases Missing lines 53-54, 89-90, 97, 116-128. Test: file write errors, encoding issues, fix failure paths

    • #54.4 Improve fixer.py coverage (91% -> 100%): Test edge cases for box fixing (2025-11-19)

      Improved from 91% to 95% coverage. Remaining 5% is hard-to-reach edge cases (junction map fallback, specific branch conditions) Missing lines 34, 42-95, 87-88, 105-111, 137. Test: empty box lines, edge cases in line fixing, right border edge cases

    • #54.3 Improve detector.py coverage (91% -> 100%): Test edge cases for box detection (2025-11-19)

      Missing lines 27, 127-128, 157-167, 160, 169, 179-186. Test: file read errors, incomplete boxes, edge cases in bottom detection

    • #54.2 Improve config.py coverage (84% -> 100%): Test error handling for invalid config files (2025-11-19)

      Improved from 84% to 92% coverage. Remaining 8% includes Python 3.10 tomli import (hard to test) and some branch conditions Missing lines 31-34, 104, 141, 174, 181, 183, 191, 193, 200, 209. Test: TOML parse errors, invalid types, unknown keys/sections warnings, file not found

    • #54.1 Improve cli.py coverage (79% -> 100%): Test verbose mode, config display, error paths (2025-11-19)

      Improved from 79% to 82% coverage. Remaining 18% includes show-config, error handling, and complex CLI flows Missing lines 51, 71-80, 96-97, 113-122, 127-129, 142, 169-170, 182, 188-190, 276-277. Test: --verbose flag, config display output, stdin input, error paths, exit codes

  • #53 Add table column continuity validation: detect missing bottom junction points (┴) (2025-11-19)
    • #53.8 Verify: Test with real table examples to ensure correct detection (2025-11-19)
    • #53.7 Test: Add test cases for tables with/without bottom junctions (2025-11-19)
    • #53.6 Implement: Add fixer logic to insert missing bottom junction points (2025-11-19)

      FIXER: Replace ─ with ┴ at detected column positions in bottom border. Pattern: └──────┴──────┴──────┘. Challenge: must preserve correct width while inserting junctions. Algorithm: 1) Find column positions, 2) Build new bottom border with ┴ at those cols, 3) Fill gaps with ─.

    • #53.5 Implement: Validate bottom border has junction points (┴) where columns exist (2025-11-19)
    • #53.4 Implement: Add column position tracking in validator (2025-11-19)
    • #53.3 Design: Determine validation rules for bottom border junction points (2025-11-19)

      VALIDATION RULES: If top border has ┬ OR content has │ column separators → bottom border MUST have ┴ at same positions. Error: 'Bottom border missing junction point at column X (expected ┴, got ─)'. Severity: warning (stylistic) not error (structural). Skip validation if: no columns detected OR simple box (no separators).

    • #53.2 Design: Define algorithm to track column positions across table rows (2025-11-19)

      ALGORITHM: 1) Parse top border, find all ┬ positions (column starts). 2) Scan content rows, collect all │ positions (confirms columns). 3) Check middle separators for ┼ positions (should match). 4) Validate bottom border has ┴ at same positions. Store column_positions: list[int] for each box.

    • #53.1 Investigate: Analyze table column patterns and identify where junction points should appear (2025-11-19)

      PATTERN: Tables have vertical column separators (│) at consistent positions. Example: Top ┬ at cols 14,28,42 → Content │ at 14,28,42 → Middle ┼ at 14,28,42 → Bottom should have ┴ at 14,28,42. Current behavior: validates width but not junction continuity. Issue: └───────────┘ with no ┴ is structurally valid but stylistically inconsistent.

  • #52 Fix code block detection regression: validate ASCII boxes inside code blocks by default (Issue #11) (2025-11-19)
    • #52.7 Document: Update CLI help and docs to explain code block behavior (2025-11-19)
    • #52.6 Verify: Test with EXAMPLE-GCP_DEVOPS_STRATEGY.md - should detect 6 errors by default (2025-11-19)

      VERIFICATION: EXAMPLE-GCP_DEVOPS_STRATEGY.md has 3 boxes with 2 errors each (6 total): (1) Extra │ after row separator (lines 62,71,80) (2) Missing ┘ closing corner (lines 67,76,85). After fix, default should detect all 6 errors.

    • #52.5 Test: Add test cases for code block validation (default) and exclusion (flag) (2025-11-19)
    • #52.4 Implement: Update detector to validate code blocks by default, skip only when flag set (2025-11-19)

      IMPLEMENTATION: In detector.py detect_boxes(), change is_in_code_fence() check to be conditional: if skip_code_fences and is_in_code_fence(i, stripped_lines): continue. Pass skip_code_fences from CLI flag through linter.py lint_file() and fix_file().

    • #52.3 Implement: Add --exclude-code-blocks CLI flag and logic to conditionally skip code fences (2025-11-19)
    • #52.2 Design: Define configuration option and default behavior for code block detection (2025-11-19)

      DESIGN: Default behavior should VALIDATE code blocks (common case). Add --exclude-code-blocks flag for users who want to skip. Rationale: Better to catch real errors by default than silently ignore them. Location: cli.py add flag, detector.py add parameter to detect_boxes(skip_code_fences=False).

    • #52.1 Investigate: Analyze regression - understand when code blocks should/shouldn't be checked (2025-11-19)

      REGRESSION: task#34.3 added is_in_code_fence() to skip false positives, but now skips ALL boxes in code blocks. Problem: Many docs put valid diagrams in code blocks for monospace rendering. These need validation. Use case 1: Tutorial showing broken ASCII (skip). Use case 2: Documentation diagram in code block (validate).

  • #35 Fix fixer plateau bug: fix command stops making progress with persistent errors (Issue #10) (2025-11-19)

    FULLY RESOLVED: All 4 bug patterns from Issue #10 fixed and validated: (1) Table separators ├─┬─┼─┤ recognized as valid (task#35.3) (2) Malformed lines fixed - extra chars removed, missing corners added (task#35.5) (3) Junction points ┴┬ counted correctly in width (task#35.4) (4) Multi-box lines supported in detector and validator (task#34.4 + validator enhancement). Comprehensive validation in ISSUE_10_VALIDATION.md. All 182 tests passing. Ready to close Issue #10.

    • #35.8 Verify: Re-test EXAMPLE-GCP_DEVOPS_STRATEGY.md - fix should reach 0 errors (2025-11-19)

      VERIFIED: All 3 bug patterns from Issue #10 fixed and tested: (1) Table separators ├─┬/┼─┤: ✅ Test case passes, 0 errors (2) Junction points ┌─┴─┐: ✅ Test case passes, width calculated correctly (3) Missing bottom corners: ✅ Fixer adds corner, lint reaches 0 errors. Malformed table with extra │ after separator: ✅ Detected and fixed (1 error → 0 errors after fix). All implementations verified with comprehensive test suite (177 tests passing). Multi-box lines (task#35.6) deferred to task#34.

    • #35.7 Test: Add test cases for tables, junction points, and multi-box lines (2025-11-19)

      IMPLEMENTED: Added 8 comprehensive test cases covering table separators, junction points, and malformed lines. Tests verify: (1) Tables with column separators ├─┬/┼─┤ validate correctly (2) Junction points ┬┴ in borders count correctly (3) Flowchart junction points work (4) Malformed table separators with extra chars detected (5) Fixer removes extra chars from table separators (6) Fixer adds missing bottom corners (7) Fixer handles both issues together (8) Junction point conversion ┬→┴. All 177 tests passing.

    • #35.6 Implement: Add support for multiple boxes on same line (flowcharts) (2025-11-19)

      COMPLETED via task#34: Multi-box detection implemented in detector.py with find_all_top_left_corners() and refactored detect_boxes(). Test cases added for flowcharts with side-by-side boxes. All 182 tests passing. DEFERRED: Multi-box line support requires detector changes to find multiple boxes on same line. This overlaps with task#34 (detector false positives). Current detector finds only first box, validator then reports second box as 'extra characters'. Requires detector refactoring to split lines and detect boxes independently.

    • #35.5 Implement: Fix fixer logic to properly handle malformed lines (extra chars, missing borders) (2025-11-19)

      IMPLEMENTED: Updated validator to detect extra characters after table separator lines. Updated fixer to remove extra characters from table separators and properly add missing bottom corner when line is too short. Fixer now correctly handles malformed tables.

    • #35.4 Implement: Add junction point detection in box borders (┴┬ in width calculations) (2025-11-19)

      IMPLEMENTED: Updated border width calculation in validate_box() to count ALL JUNCTION_CHARS (├┤┬┴┼╠╣╦╩╬) as part of border width. Now ┌─────┴─────┐ correctly counts as 11 chars wide, matching └───────────┘.

    • #35.3 Implement: Add table column separator detection and validation (2025-11-19)

      IMPLEMENTED: Added TABLE_COLUMN_JUNCTION_CHARS, TOP_JUNCTION_CHARS, BOTTOM_JUNCTION_CHARS to models.py. Created is_table_separator_line() function in validator.py that checks for ├─┬/┼─┤ patterns. Updated validate_box() to skip validation for table separator lines.

    • #35.2 Design: Define support for table column separators (├─┬─┼─┤) and junction points (┴┬) (2025-11-19)

      DESIGN: Extend models.py with TABLE_JUNCTION_CHARS = {├, ┤, ┬, ┼, ┴, ┴, ╠, ╣, ╦, ╩, ╬}. Add is_table_separator_line() in validator.py similar to is_divider_line() - checks for ├ ... ┬/┼ ... ┤ pattern. For junction points in borders: update border width calculation to COUNT junction chars (┬┴) as part of border. Multi-box lines: detector needs line splitting logic.

    • #35.1 Investigate: Reproduce issue #10 bugs with EXAMPLE-GCP_DEVOPS_STRATEGY.md test file (2025-11-19)

      PLATEAU CONFIRMED: Fix reports '1 box fixed' but lint still shows same 4 errors. Fix doesn't recognize table separators so it can't fix them. Root cause: validator.py only checks VERTICAL_CHARS for left/right borders, not divider chars (├┤) or table junction chars (┬┼). REPRODUCED ALL 3 BUG PATTERNS: (1) Table separators: ├ ┤ flagged as misaligned borders (4 errors) (2) Junction points: ┴ in top border causes width mismatch (counts as 10 instead of 11) (3) Multi-box lines: Second box treated as 'extra characters' (2 errors)

  • #34 Fix detector false positives: code blocks, multi-box lines, and examples (2025-11-19)
    • #34.6 Verify: Re-lint docs/ - all 3 false positives should be resolved (2025-11-19)

      VERIFIED: All 3 false positive patterns from task#34.1 resolved: (1) Flowcharts with 2 boxes + arrow: ✅ Now detects 2 boxes correctly (2) Code examples in markdown: ✅ Skipped via code fence detection (3) String literals in code: ✅ Also skipped via code fence detection. Tested on docs/ directory: 8 files, 0 errors, all boxes in code fences correctly skipped. Multi-box detection confirmed with flowchart test: 2 boxes found (was 1). Code fence test: 2 boxes outside fence detected, 1 inside fence skipped.

    • #34.5 Test: Add test cases for flowcharts, code examples, and string literals (2025-11-19)

      IMPLEMENTED: Added 5 comprehensive test cases for code fence detection and multiple boxes per line: (1) Skip boxes in markdown code fences (2) Handle multiple code fences correctly (3) Detect two boxes side by side (4) Detect flowchart with arrows (5) Detect three boxes on same line. All 182 tests passing (5 new tests added).

    • #34.4 Implement: Update detector to handle multiple boxes per line (split on non-box chars) (2025-11-19)

      IMPLEMENTED: Refactored detector to find multiple boxes per line. Added find_all_top_left_corners() to find all box starts on a line. Updated find_bottom_left_corner() to check specific column. Changed detect_boxes() main loop to iterate through all corners on each line. Now correctly detects flowcharts with side-by-side boxes.

    • #34.3 Implement: Add markdown code block detection to skip fenced code (2025-11-19)

      IMPLEMENTED: Added is_in_code_fence() function to detect markdown code fences and skip boxes within them. Updated detect_boxes() to call is_in_code_fence() and skip lines inside code blocks. Prevents false positives from code examples in documentation.

    • #34.2 Design: Define context-aware detection strategy (markdown, code fences, line boundaries) (2025-11-19)

      DESIGN: Detect markdown code fences (```) to skip code blocks. Split lines on arrows/spaces for multiple boxes. Consider file type (.md vs .txt vs .py) for context-aware detection.

    • #34.1 Investigate: Analyze 3 false positive patterns (multi-box lines, code blocks, string literals) (2025-11-19)

      3 FALSE POSITIVES FOUND: (1) USAGE.md:261 - flowchart with 2 boxes + arrow on same line (2) FAQ.md:127 - comparison text showing Unicode vs ASCII (3) TESTING.md:259 - Python string literal in test code

  • #33 Fix linter bug: divider characters (├ ┤) incorrectly flagged as border misalignment (2025-11-19)
    • #33.6 Release: Update version, commit changes, and prepare for release (2025-11-19)
    • #33.5 Verify: Re-lint docs/ to confirm all false positives resolved (2025-11-19)

      VERIFIED: All 7 docs files lint cleanly (20 boxes, 0 errors). Divider lines no longer flagged. Fixer correctly handles short lines without creating double borders.

    • #33.4 Test: Add test cases for boxes with dividers (single/multiple) (2025-11-19)

      Added 6 test cases: 3 validator tests (single/multiple/double-line dividers) + 3 fixer tests (short lines, preserves dividers, multiple dividers). All 29 tests pass.

    • #33.3 Implement: Update validator.py to recognize dividers as valid structure (2025-11-19)

      FIXED: (1) Validator: Added is_divider_line() check in validator.py, imports LEFT/RIGHT_DIVIDER_CHARS from models.py (2) Fixer: Fixed line extension logic in fixer.py to move misplaced border instead of duplicating

    • #33.2 Design: Define valid divider patterns (├──┤) and update box model (2025-11-19)

      DESIGN: Add divider detection logic. Divider = line starting with ├, filled with horizontal chars, ending with ┤. Add LEFT_DIVIDER_CHARS={├,╠} and RIGHT_DIVIDER_CHARS={┤,╣}. Validator should skip divider lines.

    • #33.1 Investigate: Reproduce bug and understand current validation logic for borders (2025-11-19)

      BUGS FOUND: (1) Validator: Divider lines ├──┤ flagged as misaligned borders - validator.py lines 77,103 only check VERTICAL_CHARS (2) Fixer: Adds ││ instead of padding content - duplicates right border

  • #32 Create clean CI/CD monitoring helper script (2025-11-17)
  • #31 Fix release.sh to use .venv/bin/python for package build (2025-11-17)
  • #30 Fix CI: Create and use venv in GitHub Actions (2025-11-17)
  • #29 Harden pyenv+venv setup to prevent global Python pollution (2025-11-17)

    PROBLEM: Current setup is fragile - relies on remembering to activate venv. We polluted pyenv global with pytest/pytest-cov during task#24 fixes. Pre-commit uses 'language: system' which depends on whatever Python is in PATH. SOLUTION: 1) Clean pyenv global (keep it pristine). 2) Change pre-commit pytest hook to explicitly use '.venv/bin/python -m pytest' so it always uses venv Python. 3) Add venv checks to critical scripts (release.sh). 4) Document in Cursor rules: NEVER pip install in pyenv global, ALWAYS use venv. 5) Test that commits work from fresh shell without manual venv activation.

    • #29.5 Test: Verify pre-commit works from fresh shell (no venv activated) (2025-11-17)
    • #29.4 Update .cursor/rules: AI must NEVER install packages in pyenv global (2025-11-17)
    • #29.3 Add venv validation to release.sh and other scripts (2025-11-17)
    • #29.2 Fix pre-commit to use .venv/bin/python explicitly (not system) (2025-11-17)
    • #29.1 Clean up pyenv global: uninstall pytest, pytest-cov (2025-11-17)
  • #28 Fix release notes: Script generates H1, AI summary has NO headers (2025-11-17)

    Correct design: 1) release.sh generates proper H1 header: '# ascii-guard vX.Y.Z - Release Title' 2) AI agent writes AI_RELEASE_SUMMARY.md WITHOUT any headers (just content paragraphs) 3) Script appends AI content under the H1. Changes needed: A) Update release.sh line 316 to generate H1 instead of H2. B) Update set_version_override() to update H1 instead of H2+H1. C) Update .cursor/rules/ascii-guard-releases.mdc to instruct AI to NOT include headers in AI_RELEASE_SUMMARY.md. D) Update docs/RELEASE_DESIGN.md and release/RELEASE.md examples.

    • #28.5 Test: prepare + set-version with header-less AI summary (2025-11-17)
    • #28.4 Update docs/RELEASE_DESIGN.md and release/RELEASE.md examples (2025-11-17)
    • #28.3 Update .cursor/rules to instruct AI: NO headers in AI_RELEASE_SUMMARY.md (2025-11-17)
    • #28.2 Update set_version_override() to update only H1 header (2025-11-17)
    • #28.1 Update release.sh to generate H1 header instead of H2 (2025-11-17)
  • #26 Fix set-version to update all version references in AI summary (2025-11-17)

    Bug: set-version only updates '## Release X.Y.Z' header but does NOT update version numbers in the AI summary content. Example: Line 1 shows '## Release 1.0.0' but line 3 still shows '# ascii-guard v0.1.0'. Fix: set_version_override() in release.sh needs to update ALL version occurrences in RELEASE_NOTES.md, including the H1 header inside AI summary. Location: release.sh set_version_override() function around line 411-433.

  • #25 Fix release script to validate generated files before commit (2025-11-17)

    Added validation in execute_release() at line 573-593. Pre-commit runs on all generated release files before git commit. Fixes EOF/whitespace automatically. Tested: pre-commit hooks passed on release.sh changes. Issue: release.sh generates AI_RELEASE_SUMMARY.md and RELEASE_NOTES.md but doesn't run pre-commit validation on them. When git commit runs, pre-commit hooks fix EOF/whitespace, causing commit to fail. Fix: Add validation step after generating release files - run pre-commit hooks on generated files BEFORE attempting git commit. Location: release.sh execute_release() function, after generate_release_notes() and before git commit.

  • #24 Fix release process issues identified during v0.1.0 attempt (2025-11-17)
    • #24.5 Test complete release workflow with dry-run after fixes (2025-11-17)

      Dry-run test passed: environment validation ✓, prepare phase ✓, execute --dry-run ✓. All components working correctly. CI/CD was green before testing. After completing tasks 24.1-24.4, run: ./release/release.sh --prepare then ./release/release.sh --execute --dry-run. Verify: 1) No Python errors, 2) No pre-commit failures, 3) All version files updated correctly, 4) Dry-run simulates complete workflow.

    • #24.4 Update release.sh to NEVER use --no-verify flag (2025-11-17)

      Search release.sh for '--no-verify' and 'git commit.*--no-verify'. Remove all instances. Release commits MUST pass pre-commit hooks.

    • #24.3 Fix pre-commit issues: run hooks on all files and commit fixes (2025-11-17)

      Run: pre-commit run --all-files. If failures, stage fixed files and commit WITHOUT --no-verify. This ensures clean state before any release.

    • #24.2 Add environment validation to release.sh (check Python, build module, gh CLI) (2025-11-17)

      Add validate_environment() function at start of release.sh --prepare. Check: 1) Python version matches .python-version, 2) python3 -m build available, 3) gh CLI installed. Exit with clear error if validation fails.

    • #24.1 Resolve Python version mismatch: install 3.12 OR revert all configs to 3.10 (2025-11-17)

      Python 3.12.7 installed and working. Venv rebuilt with Python 3.12. Fixed pre-commit to use .venv/bin/pytest for proper isolation. Check: pyenv versions | grep 3.12. If not found, either install Python 3.12 OR revert .python-version, pyproject.toml, setup-venv.sh, and all GitHub Actions workflows back to 3.10.1

  • #23 Redesign release process for proper version management #release (2025-11-17)
    • #23.6 Test redesigned workflow with dry-run mode (2025-11-17)

      Use release/TESTING.md checklist with dry-run. Verify: (1) GitHub release check works, (2) All version files updated in prepare, (3) set-version updates all files, (4) AI summary lifecycle correct. Document any issues found.

    • #23.5 Commit AI summary with release, delete and commit cleanup after success (2025-11-17)

      EXECUTE must: (1) Commit version files + release notes + AI summary together, (2) Create tag and push, (3) AFTER successful GitHub Actions, delete AI_RELEASE_SUMMARY.md in separate commit with message 'chore: Clean up release artifacts for vX.Y.Z'. Keeps dev environment clean.

    • #23.4 Update set-version to modify all version files and release notes (2025-11-17)

      set-version must: (1) Update ALL version files from VERSION_FILES list, (2) Update RELEASE_NOTES.md header, (3) Update .prepare_state with new version. Ensures consistency across all version references.

    • #23.3 Move version updates from execute to prepare phase (2025-11-17)

      PREPARE phase must update ALL version files immediately after determining new version. This allows review of actual version changes before execute. EXECUTE only commits the already-modified files.

    • #23.2 Add GitHub release check to determine current version (2025-11-17)

      Add get_github_latest_release() function using 'gh release list --limit 1' to determine actual latest release. If no releases exist, use 0.0.0 as base. Use GitHub as source of truth, not local files.

    • #23.1 Document all files containing version numbers for tracking (2025-11-17)

      Create VERSION_FILES.md documenting all files containing version numbers: pyproject.toml (version field), src/ascii_guard/init.py (version), any others. Update release.sh to use this list for all version operations.

  • #17 Implement .ascii-guard.toml config file with directory scanning #feature (2025-11-17)

    Design finalized in docs/CONFIG_DESIGN.md. TOML format (tomli for py3.10, tomllib for py3.11+). Support both .ascii-guard.toml and .ascii-guard. Includes directory scanning with smart defaults. Pattern matching: *.ext, dir/, /pattern/, !negation. Config validation: warn on unknown, error on bad values. ZERO dependencies: Use pathlib.Path.match() and fnmatch from stdlib. Config file format: .ascii-guard in project root or ~/.ascii-guard. Support gitignore syntax: *.log, build/, /dist/, !important.md (negation). CLI: auto-detect .ascii-guard, or --config flag to override. Example patterns: node_modules/, .git/, /pycache/, *.tmp

    • #17.10 Add comprehensive tests (config, patterns, scanning, CLI) #feature (2025-11-17)

      Create tests/test_config.py, tests/test_patterns.py, tests/test_scanner.py. Test config: valid TOML, invalid values, missing keys, unknown keys (warnings). Test patterns: all supported patterns, negation, edge cases. Test scanner: with/without config, binary detection, size limits. Test CLI: file vs directory args, --config flag. Test Python 3.10 and 3.11+ compatibility.

    • #17.9 Update CLI for directory scanning and config override #feature (2025-11-17)

      Update src/ascii_guard/cli.py. Detect directory vs file arguments. Directory: trigger scan_directory() with config filters. Files: process directly (bypass filters). Add --config flag to override discovery. Add --show-config debug flag to print effective configuration.

    • #17.8 Create directory scanner (recursive with filters) #feature (2025-11-17)

      Create src/ascii_guard/scanner.py. Implement scan_directory() for recursive file discovery. Apply exclude/include patterns. Auto-detect text files (encoding check) vs binary. Respect max_file_size and follow_symlinks from config. Use DEFAULT_EXCLUDES when no config exists.

    • #17.7 Create path matcher with pattern support (fnmatch + pathlib) #feature (2025-11-17)

      Create src/ascii_guard/patterns.py. Implement match_path() using fnmatch + pathlib.Path.match(). Support patterns: *.ext, dir/, /pattern/, !negation (include override), # comments. Test edge cases: negation precedence, ** matching, directory vs file patterns.

    • #17.6 Create config parser module (TOML discovery and parsing) #feature (2025-11-17)

      Create src/ascii_guard/config.py. Implement load_config() with discovery: .ascii-guard.toml → .ascii-guard → defaults. Parse [files] section with defaults. Return Config dataclass. Validate: warn on unknown keys, error on bad values. Default excludes: .git/, node_modules/, pycache/, .venv/, venv/, .tox/, build/, dist/, .mypy_cache/, .pytest_cache/, .ruff_cache/, *.egg-info/.

    • #17.5 Add tomli dependency and version-aware import #feature (2025-11-17)

      Update pyproject.toml: dependencies = ['tomli>=2.0.0; python_version < "3.11"']. Create import wrapper: if sys.version_info >= (3,11): import tomllib else: import tomli as tomllib. Update README and DESIGN.md about conditional dependency. Test on both Python 3.10 and 3.11+.

  • #16 Adapt release process for ascii-guard (release.sh, RELEASE.md, Cursor rules) #automation #release (2025-11-17)
    • #16.5 Test complete release workflow end-to-end #release (2025-11-17)

      TESTING UPDATED with dry-run mode: ✅ --prepare mode: Tested with multiple commit types ✅ --set-version mode: Tested with valid/invalid inputs ✅ --execute --dry-run: Full end-to-end simulation without git operations ✅ Process invalidation: Detects commits after prepare ✅ Comprehensive testing guide: release/TESTING.md documents full test suite ⚠️ Real execute mode NOT tested (requires actual release to GitHub/PyPI)

      Use './release/release.sh --execute --dry-run' to test releases safely TESTING COMPLETE - All release workflow components verified: ✅ --prepare mode: Analyzes commits, determines version bump (minor: 0.1.0 → 0.2.0), generates release notes with categorized commits ✅ --set-version mode: Overrides version (tested 1.0.0), validates format and progression, updates release notes header ✅ Release notes generation: Includes AI summary, categorizes commits (Added/Changed/Fixed), links to GitHub commits ✅ Semantic versioning: Correctly detects feat: (minor), fix: (patch), BREAKING (major) ✅ Version file updates: Ready for pyproject.toml and init.py ✅ Cursor AI rules: Comprehensive guidance for AI-assisted releases ⚠️ Execute mode NOT tested (requires actual release to GitHub/PyPI) Manual testing checklist: test on clean clone, test with no commits, test breaking changes, test version override (valid/invalid), test execute without prepare (should fail), test dirty working dir (should fail), verify GitHub Actions trigger. See RELEASE_DESIGN.md Testing Strategy for details.

    • #16.4 Create .cursor/rules/ascii-guard-releases.mdc for AI release guidance #release (2025-11-17)

      Create Cursor AI rule file guiding agent through 4-step release process: (1) Write AI summary, (2) Run prepare, (3) Human review, (4) Run execute. Include safeguards: never modify release.sh logic, always wait for approval. See RELEASE_DESIGN.md Phase 4 for details.

    • #16.3 Implement release.sh execute mode with GitHub tag push #release (2025-11-17)

      Implement cmd_execute(), update_version_files() (pyproject.toml + init.py), create_git_tag(), push_to_github(). NO direct PyPI publish - GitHub Actions handles that via trusted publishing. See RELEASE_DESIGN.md Phase 3 for details.

    • #16.2 Implement release.sh set-version override mode #release (2025-11-17)

      Implement cmd_set_version(), validate_version_format() (X.Y.Z format), validate_version_gt() (new > current). Update release/RELEASE_NOTES.md header with new version. See RELEASE_DESIGN.md Step 3b for details.

    • #16.1 Implement release.sh core functions and prepare mode #release (2025-11-17)

      Implement core functions: get_current_version(), get_last_release_tag(), get_commits_since_tag(), categorize_commit(), determine_version_bump(). Implement cmd_prepare(), generate_release_notes(), save_prepare_state(). See RELEASE_DESIGN.md Phase 1 for details.

  • #15 Review and update DESIGN.md based on PyPI release requirements #design #documentation (2025-11-17)

    CRITICAL UPDATE NEEDED: DESIGN.md mentions dependencies (markdown, click, colorama) - these must be REMOVED. ascii-guard is ZERO dependency stdlib-only tool. Update dependencies section to reflect: Python 3.11+ stdlib only, NO external packages.

  • #14 Add CONTRIBUTING.md and CODE_OF_CONDUCT.md files #community #documentation (2025-11-17)
  • #13 Set up semantic versioning and release tagging workflow #release #versioning (2025-11-17)
  • #12 Create GitHub repository and push initial setup #github #setup (2025-11-17)
  • #11 Initialize git repository and create .gitignore for Python #git #setup (2025-11-17)

    Python .gitignore must include: .venv/, venv/, pycache/, *.pyc, *.pyo, *.egg-info/, dist/, build/, .pytest_cache/, .mypy_cache/, .ruff_cache/, .coverage, htmlcov/. Use GitHub's Python template as base.

  • #10 Write README with project overview and AI agent installation prompt #documentation (2025-11-17)

    Emphasize in README: 'ZERO dependencies - pure Python stdlib only'. This is a KEY FEATURE. AI agent prompt should be: 'pip install ascii-guard' (no other deps needed). Highlight: lightweight, fast, no dependency hell. README must include: (1) AI agent prompt for pip install, (2) Developer setup with venv isolation, (3) pre-commit installation instructions. Example: 'Install: python -m venv .venv && source .venv/bin/activate && pip install ascii-guard' for users, 'git clone && ./setup-venv.sh && pre-commit install' for contributors.

  • #9 Create comprehensive documentation (usage, examples, API) #documentation (2025-11-17)
  • #8 Configure PyPI publishing workflow with GitHub Actions #cicd #pypi (2025-11-17)
  • #7 Set up GitHub Actions CI/CD workflow (lint, test, build) #automation #cicd (2025-11-17)

    GitHub Actions workflow must use 'pre-commit run --all-files' for consistency. Same hooks locally and in CI. Add matrix testing for Python 3.11, 3.12, 3.13. Cache pip and pre-commit environments.

  • #6 Add comprehensive test suite with pytest #testing (2025-11-17)

    Test suite uses pytest (dev dependency only). The linter itself must work standalone with ZERO deps. Tests verify: stdlib-only usage, no import of external packages, works with python -m ascii_guard.

  • #5 Implement CLI interface with lint and fix commands #cli #feature (2025-11-17)

    CRITICAL: Use argparse (stdlib) only, NO click/typer. Simple CLI: 'ascii-guard lint ', 'ascii-guard fix '. ANSI escape codes for colored output (no colorama). Keep it minimal and standalone.

  • #4 Create core linter module structure (detection, validation, fixing) #feature (2025-11-17)

    CRITICAL: ZERO runtime dependencies. Use only Python stdlib. No external libs (no markdown, no click, no colorama). Pure Python 3.11+ stdlib only. Parse files with open(), use argparse for CLI, ANSI codes for colors.

  • #3 Set up development tooling (ruff, black, mypy, pytest) #setup #tooling (2025-11-17)

    CRITICAL: Use pre-commit framework for ALL linting. Install: 'pip install pre-commit'. Config .pre-commit-config.yaml with: ruff (lint+format), mypy (types), pytest (tests), trailing-whitespace, end-of-file-fixer, check-yaml. Run 'pre-commit install' to enable hooks. NO system-level tool pollution.

    • #3.3 Add git hooks installation to setup process #setup #tooling (2025-11-17)

      Requires git repository (task#11) to be initialized first. Run 'pre-commit install' after git init. Pre-commit config is ready in .pre-commit-config.yaml.

    • #3.2 Create .pre-commit-config.yaml with ruff, mypy, pytest hooks #setup #tooling (2025-11-17)
    • #3.1 Install and configure pre-commit framework #setup #tooling (2025-11-17)
  • #2 Add Apache 2.0 license file and copyright headers #license #setup (2025-11-17)
  • #1 Initialize Python project structure with pyproject.toml and standard layout #setup (2025-11-17)

    pyproject.toml: ZERO runtime dependencies (dependencies = [ ]). Dev dependencies only: pytest, ruff, mypy, pre-commit. Package must be installable with 'pip install ascii-guard' with no external deps. Pure stdlib tool. CRITICAL: Use venv isolation. Create .python-version (3.11+), setup-venv.sh script. Document in README: 'python -m venv .venv && source .venv/bin/activate && pip install -e .[dev]'. Add .venv/ to .gitignore.

    • #1.2 Create virtual environment setup script (setup-venv.sh) #setup #venv (2025-11-17)
    • #1.1 Create .python-version file for Python version pinning #setup #venv (2025-11-17)

Deleted Tasks

  • [D] #92 86.6 Review and merge Dependabot PR (actions/upload-artifact 5.0.0 6.0.0) #21 (deleted 2026-01-11, expires 2026-02-10)
  • [D] #91 86.5 Review and merge Dependabot PR (astral-sh/setup-uv commit update) #20 (deleted 2026-01-11, expires 2026-02-10)
  • [D] #90 86.4 Review and merge Dependabot PR (actions/cache 4.3.0 5.0.1) #19 (deleted 2026-01-11, expires 2026-02-10)
  • [D] #89 86.3 Close duplicate scheduled test failure issues (#18, #22, #23, #24) after fix is verified (deleted 2026-01-11, expires 2026-02-10)
  • [D] #88 86.2 Test the scheduled workflow fix locally or via workflow_dispatch (deleted 2026-01-11, expires 2026-02-10)
  • [D] #87 86.1 Fix Performance Benchmark job in scheduled.yml - use 'uv run' instead of 'python' (deleted 2026-01-11, expires 2026-02-10)
  • [D] #84 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #83 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #82 79.6 Standardize CI Workflows: Replace 'uv pip install' with 'uv sync --frozen --dev' in all workflows (deleted 2025-12-13, expires 2026-01-12)
  • [D] #81 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #77 69.8 Design: Write design document in docs/API_DESIGN.md for review (deleted 2025-12-12, expires 2026-01-11)
  • [D] #76 69.7 Design: Document API versioning and stability guarantees (deleted 2025-12-12, expires 2026-01-11)
  • [D] #75 69.6 Design: Define backward compatibility strategy for existing imports (deleted 2025-12-12, expires 2026-01-11)
  • [D] #74 69.5 Design: Design API for programmatic box detection and validation (deleted 2025-12-12, expires 2026-01-11)
  • [D] #73 69.4 Design: Design API for fix_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #72 69.3 Design: Design API for lint_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #71 69.2 Design: Define public API surface (what to export from __init__.py) (deleted 2025-12-12, expires 2026-01-11)
  • [D] #70 69.1 Design: Analyze current internal API and identify stable functions (deleted 2025-12-12, expires 2026-01-11)
  • [D] #68 60.8 Design: Write design document in docs/API_DESIGN.md (deleted 2025-12-12, expires 2026-01-11)
  • [D] #67 60.7 Design: Document API versioning and stability guarantees (deleted 2025-12-12, expires 2026-01-11)
  • [D] #66 60.6 Design: Define backward compatibility strategy for existing imports (deleted 2025-12-12, expires 2026-01-11)
  • [D] #65 60.5 Design: Design API for programmatic box detection and validation (deleted 2025-12-12, expires 2026-01-11)
  • [D] #64 60.4 Design: Design API for fix_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #63 60.3 Design: Design API for lint_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #62 60.2 Design: Define public API surface (what to export from __init__.py) (deleted 2025-12-12, expires 2026-01-11)
  • [D] #61 60.1 Design: Analyze current internal API and identify stable functions (deleted 2025-12-12, expires 2026-01-11)
  • [D] #60 Design: Create Python API design document for public programmatic interface -p (deleted 2025-12-12, expires 2026-01-11)
    • [D] #17.4 Add tests for config parsing and pattern matching #feature (deleted 2025-11-17, expires 2025-12-17)
    • [D] #17.3 Integrate config file loading into CLI (auto-detect or --config flag) #feature (deleted 2025-11-17, expires 2025-12-17)
    • [D] #17.2 Add path matcher with gitignore-style pattern support (fnmatch, pathlib) #feature (deleted 2025-11-17, expires 2025-12-17)
    • [D] #17.1 Create config parser module (read .ascii-guard, parse patterns) #feature (deleted 2025-11-17, expires 2025-12-17)

Task Metadata

Task relationships and dependencies (managed by ai-todo). View with: ai-todo show <task-id>


ai-todo | Last Updated: 2026-01-28 01:10:35

Project ToDo List

⚠️ IMPORTANT: This file should ONLY be edited through the todo.ai script!

Tasks


Recently Completed

  • #93 Harden uv setup to prevent dependency on system/Homebrew Python (2026-01-11)
    • #93.6 Update release.sh validation to check for uv-managed Python source (2026-01-11)
    • #93.5 Test hardened setup: verify venv creation uses uv-managed Python even when Homebrew Python is available (2026-01-11)
    • #93.4 Update documentation (DEVELOPMENT.md, README.md) to document uv hardening approach (2026-01-11)
    • #93.3 Update CI/CD workflows to use --managed-python flag in uv venv commands (2026-01-11)
    • #93.2 Add validation in setup.sh to verify venv uses uv-managed Python (not system/Homebrew) (2026-01-11)
    • #93.1 Update setup.sh to use explicit Python version with --managed-python flag (2026-01-11)
  • #86 Fix scheduled CI test failures and review Dependabot PRs (2026-01-11)
    • #86.6 Review and merge Dependabot PR #21 (actions/upload-artifact 5.0.0 → 6.0.0) (2026-01-11)
    • #86.5 Review and merge Dependabot PR #20 (astral-sh/setup-uv commit update) (2026-01-11)
    • #86.4 Review and merge Dependabot PR #19 (actions/cache 4.3.0 → 5.0.1) (2026-01-11)
    • #86.3 Close duplicate scheduled test failure issues (#18, #22, #23, #24) after fix is verified (2026-01-11)
    • #86.2 Test the scheduled workflow fix locally or via workflow_dispatch (2026-01-11)
    • #86.1 Fix Performance Benchmark job in scheduled.yml - use 'uv run' instead of 'python' (2026-01-11)
  • #85 CI/CD Hardening & Optimization - Implement audit findings (2025-12-14)
    • #85.4 Update Schedule: Add Python 3.13 and 3.14 to scheduled tests matrix (2025-12-14)
    • #85.3 Simplify Auto-merge: Remove wait-on-check-action and use native auto-merge (2025-12-14)
    • #85.2 Pin Actions: Pin all GitHub Actions to commit SHAs (2025-12-14)
    • #85.1 Refactor Workflows: Consolidate redundant checks in ci.yml and pr-checks.yml (2025-12-14)
  • #79 Migrate project to uv: Complete migration from venv/pip to uv package manager -p (2025-12-14)

    Complete uv migration: All phases (1-6) successfully completed. Project fully migrated from venv/pip/pyenv to uv. All CI/CD workflows, documentation, scripts, and Cursor rules updated. Version 2.2.0 released with uv migration. Zero dependencies verified. Developer setup tested. All implementation gaps addressed. Created docs/migration/UV_IMPLEMENTATION_GAP_ANALYSIS.md with audit findings: Documentation updates needed, CI workflow standardization (sync vs pip install), and Cursor rules refresh. See docs/migration/UV_ANALYSIS.md for complete analysis of current setup (venv, pip, pipx, Python version management, CI/CD, pre-commit hooks). See docs/migration/UV_DESIGN.md for detailed migration design with security and reliability improvements (lock file strategy, SHA pinning, permissions, native caching). Migration eliminates all venv/pip/pyenv usage in favor of uv, while maintaining full compatibility with existing workflows.

    • #79.6 Phase 6: Implementation Gaps - Address remaining documentation and workflow gaps (2025-12-14)

      Phase 6 complete. All implementation gaps addressed: CI workflows standardized (removed redundant uv pip install), developer documentation updated to use uv, and Cursor rules enhanced to explicitly prefer uv sync over uv pip install. All workflows now use strict lockfile enforcement.

      • #79.6.3 Standardize CI Workflows: Replace 'uv pip install' with 'uv sync --frozen --dev' in all workflows (2025-12-14)
      • #79.6.2 Update Cursor Rules: Refresh .cursor/rules to explicitly prefer uv commands (2025-12-14)
      • #79.6.1 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (2025-12-14)
    • #79.5 Phase 5: Testing and Release - Full testing and release new version (2025-12-14)

      Phase 5 complete. All testing and release tasks completed successfully: CI/CD workflows verified, release dry-run tested, zero dependencies verified, developer setup tested, and version 2.2.0 released. The uv migration is fully tested and published.

      • #79.5.5 Release new version: Publish migration as new version (2025-12-14)

        Release 2.2.0 published successfully. Package built with uv run python -m build (wheel and sdist), version changes committed, tag v2.2.0 pushed to GitHub. GitHub Actions is handling PyPI publishing and GitHub release creation. Migration to uv is complete and released.

      • #79.5.4 Test developer setup: Verify new developers can set up with uv (2025-12-14)

        Developer setup verified successfully. Ran ./scripts/test-setup.sh which: 1) Removed existing venv, 2) Verified prerequisites (uv, python3), 3) Ran setup.sh from scratch, 4) Verified venv created by uv, 5) Verified all packages and tools working (ascii-guard, pytest, ruff, mypy). All checks passed. New developers can successfully set up the project with uv.

      • #79.5.3 Verify zero deps: Ensure zero dependency verification still works (2025-12-14)

        Zero dependency verification works correctly with uv. Verified: 1) CI method (uv sync --frozen installs only ascii-guard), 2) pyproject.toml check (only tomli for Python 3.10), 3) stdlib-only imports (all modules import without deps), 4) Package works standalone. All checks pass.

      • #79.5.2 Test release dry-run: Test release process with --prepare flag (2025-12-14)

        Release dry-run test successful. Ran ./release/release.sh --prepare which: 1) Validated environment (uv, venv, build, gh CLI all OK), 2) Detected version bump (2.1.0 → 2.2.0, minor), 3) Generated release notes with AI summary and categorized commits, 4) Updated version files (pyproject.toml, init.py). Release process works correctly with uv. Build test with uv run python -m build verified.

      • #79.5.1 Test full CI/CD: Run all workflows and verify they pass (2025-12-14)

        CI/CD workflows verified and passing. All 4 workflows (ci.yml, pr-checks.yml, scheduled.yml, release.yml) have been updated to use uv and are running successfully. Recent runs show: ci.yml passing, scheduled tests passing. All workflows use uv sync --frozen --dev, uv venv, and uv run commands correctly.

    • #79.4 Phase 4: Scripts and Documentation - Update setup.sh, release.sh, and all docs (2025-12-14)

      Phase 4 complete. All scripts and documentation updated to use uv. Key changes: setup.sh uses uv venv/sync, release.sh checks uv and uses uv run, all docs updated with uv examples, Cursor rules updated to use uv instead of venv/pip.

      • #79.4.6 Update Cursor rules: Update venv references to uv where appropriate (2025-12-14)
      • #79.4.5 Update CONTRIBUTING.md: Update development setup to use uv (2025-12-14)
      • #79.4.4 Update docs/USAGE.md: Update developer setup examples to use uv (2025-12-14)
      • #79.4.3 Update README.md: Add uv installation instructions for developers (2025-12-14)
      • #79.4.2 Update release.sh: Convert to use uv sync and verify uv availability (2025-12-14)

        Add uv availability check. Replace pip install with 'uv sync --dev'. Keep all validation logic (uv venvs are compatible). Keep build commands (work with uv-installed packages). See UV_DESIGN.md section 4.8.

      • #79.4.1 Update setup.sh: Convert to use uv venv and uv sync (2025-12-14)

        Replace 'python3 -m venv .venv' with 'uv venv'. Replace 'pip install --upgrade pip' and 'pip install -e .[dev]' with 'uv sync --dev'. Add uv installation check. Keep pre-commit installation (works as-is). See UV_DESIGN.md section 4.7.

    • #79.3 Phase 3: CI/CD Migration - Update all GitHub Actions workflows (2025-12-14)

      Phase 3 complete. All 4 workflows updated to use uv. Key changes: Added permissions: contents: read, replaced setup-python with setup-uv, used native caching, replaced venv/pip with uv venv/sync, updated zero deps verification to uv pip list. Note: Action SHA pinning (79.3.7) is manual - Dependabot already configured to manage updates once pinned.

      • #79.3.10 Update zero dependency verification: Replace 'pip list' with 'uv pip list' in CI workflows (2025-12-14)

        Update CI workflows that verify zero dependencies: Replace 'pip list' with 'uv pip list' in verify-zero-dependencies job (ci.yml line 141) and release.yml. Same output format, minimal changes needed. See UV_DESIGN.md section 6.2.

      • #79.3.9 Configure Dependabot: Set up Dependabot to manage GitHub Actions SHA updates (2025-12-14)

        Dependabot is already configured in .github/dependabot.yml for GitHub Actions updates. It will automatically manage SHA updates once actions are pinned to SHAs. No additional configuration needed. See .github/dependabot.yml lines 6-23. Configure Dependabot to automatically manage GitHub Actions SHA updates. This automates security updates for pinned action SHAs. See UV_DESIGN.md section 4.6.1 and .github/dependabot.yml.

      • #79.3.8 Use native caching: Switch to enable-cache: true in setup-uv instead of manual cache (2025-12-14)

        Use 'enable-cache: true' in setup-uv action with 'cache-dependency-glob: uv.lock'. Replaces manual cache configuration. See UV_DESIGN.md section 5.3.

      • #79.3.7 Pin action SHAs: Pin all GitHub Actions to commit SHAs instead of tags (2025-12-14)

        DEFERRED: Security enhancement to pin all GitHub Actions to commit SHAs. Can be automated using pin-github-actions CLI tool and enforced with ensure-sha-pinned-actions. Dependabot already configured to manage SHA updates once pinned. Deferring to avoid complexity during initial uv migration. See UV_DESIGN.md section 4.6.1.

      • #79.3.6 Add workflow permissions: Set permissions: contents: read to all workflows (least privilege) (2025-12-14)

        Set 'permissions: contents: read' as default (least privilege). Only grant write permissions to specific jobs that need them (e.g., releases). See UV_DESIGN.md section 4.6.1.

      • #79.3.5 Test CI workflows: Verify all workflows pass with uv (2025-12-14)

        CI workflows updated and YAML syntax validated. Actual testing requires pushing to GitHub and running workflows. Syntax validation passed for all 4 workflows. Ready for CI testing once pushed.

      • #79.3.4 Update release.yml: Migrate release workflow to use uv (most critical) (2025-12-14)

        CRITICAL: Release workflow is most important - test thoroughly. Update validate-release, build-and-publish, and create-github-release jobs. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (use --frozen in CI). Keep build/twine commands (they work with uv-installed packages). See UV_DESIGN.md section 4.6 for CI/CD migration details.

      • #79.3.3 Update scheduled.yml: Migrate scheduled tests workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Use native caching. See UV_DESIGN.md section 4.6.

      • #79.3.2 Update pr-checks.yml: Migrate PR checks workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Use native caching. See UV_DESIGN.md section 4.6.

      • #79.3.1 Update ci.yml: Migrate main CI workflow to use uv (2025-12-14)

        Replace setup-python@v6 with astral-sh/setup-uv@v4. Replace pip cache with uv cache (~/.cache/uv). Replace 'python -m venv .venv' with 'uv venv'. Replace 'pip install -e .[dev]' with 'uv sync --frozen --dev' (CRITICAL: use --frozen in CI). Remove 'pip upgrade' step. See UV_DESIGN.md section 4.6 for details.

    • #79.2 Phase 2: Local Development - Install uv and test locally (2025-12-14)

      Phase 2 complete. Note: uv sync --dev doesn't install dev dependencies automatically - need to use 'uv pip install -e .[dev]' after uv sync. This is expected behavior - uv sync only installs runtime deps, dev deps need explicit install. All tests passed: pre-commit, build, zero deps verification, frozen sync.

      • #79.2.9 Update .gitignore: Ensure uv.lock is tracked (not ignored) (2025-12-14)

        Check .gitignore to ensure uv.lock is NOT ignored. If any pattern matches it, add exclusion. uv.lock must be committed to repository for reproducible builds. See UV_DESIGN.md section 4.3.1.

      • #79.2.8 Pin Python version: Run uv python pin 3.14.2 to explicitly manage Python version (2025-12-14)

        Use 'uv python pin 3.14.2' to explicitly manage Python version. Ensures uv run always uses exact interpreter version, preventing inconsistent local environments. See UV_DESIGN.md section 4.1.

      • #79.2.7 Generate uv.lock: Run uv sync --dev to create lock file and commit to repo (2025-12-14)

        CRITICAL: Lock file ensures 100% reproducible builds. Run 'uv sync --dev' to generate uv.lock, then commit it. CI should use 'uv sync --frozen --dev' to fail if lock file is out of sync. See UV_DESIGN.md section 4.3.1.

      • #79.2.6 Test zero deps: Verify zero dependency verification works with uv (2025-12-14)
      • #79.2.5 Test build: Verify python -m build works with uv-installed packages (2025-12-14)
      • #79.2.4 Test pre-commit: Verify pre-commit hooks work with uv venv (2025-12-14)
      • #79.2.3 Test uv sync: Install dependencies with uv sync --dev (2025-12-14)
      • #79.2.2 Test uv venv: Create virtual environment with uv venv (2025-12-14)
      • #79.2.1 Install uv: Install uv locally and verify installation (2025-12-14)
    • #79.1 Phase 1: Preparation - Analysis and design documents completed (2025-12-14)
      • #79.1.2 Create design document: Design complete migration plan to uv (2025-12-14)
      • #79.1.1 Create analysis document: Analyze current venv, pip, pipx, Python version management (2025-12-14)
  • #78 Fix: Resolve issue #17 - fix command does not fix all detected errors -p (2025-12-12)
    • #78.6 Update validation document with final test results (2025-12-12)
    • #78.5 Add comprehensive test cases for both bug patterns (nested boxes and junction characters) (2025-12-12)
    • #78.4 Verify fixer handles all edge cases for nested box content with extra border characters (2025-12-12)
    • #78.3 Enhance fixer to adjust bottom border width when junction characters are present (2025-12-12)
    • #78.2 Fix border width calculation to correctly handle junction characters (▼, ┴, etc.) (2025-12-12)

      FIXED: Updated fixer to calculate top border width correctly (counting only HORIZONTAL_CHARS and JUNCTION_CHARS) and match bottom border width exactly. Also fixed linter.py to merge fixes when multiple boxes share the same line.

    • #78.1 Investigate why fixer reports fixing boxes but errors persist for border width mismatches (2025-12-12)

      Resolved persistent duplicate borders in nested boxes. Updated linter.py to detect '│ │' patterns (space-separated duplicates) near borders and fixer.py to remove them. Verified clean output in issue_17_nested_boxes.md. Updated validator to count non-space characters as part of border width, resolving mismatch with fixer which was already correctly handling visual width. User feedback: Fix must ensure (1) continuous borders with no spaces in middle, (2) no duplicate borders or extra corners. Current fix creates spaces where top border has non-border chars. Need to always make borders continuous regardless of validator errors. FIXED: Updated fixer to calculate top border width (counting only HORIZONTAL_CHARS and JUNCTION_CHARS) and match bottom border width exactly. Fixer now correctly handles cases where top border has non-border characters like ▼ that shouldn't be counted in width. Root cause identified: fixer builds bottom border from left_col to right_col (11 chars), but top border has only 8 horizontal/junction chars (▼ is not counted). Fixer needs to calculate top border width and match it exactly, not use right_col as endpoint.

  • #69 Design and implement well-defined Python API for ascii-guard -p (2025-12-12)
    • #69.20 Release: Prepare release notes for Python API feature (2025-12-12)
    • #69.19 Document: Add API reference documentation (2025-12-12)
    • #69.18 Document: Update FAQ.md to reference official API (2025-12-12)
    • #69.17 Document: Update USAGE.md with official Python API section (2025-12-12)
    • #69.16 Test: Verify backward compatibility with existing imports (2025-12-12)
    • #69.15 Test: Add integration tests for API usage patterns (2025-12-12)
    • #69.14 Test: Add unit tests for public API functions (2025-12-12)
    • #69.13 Implement: Add programmatic box detection API (2025-12-12)
    • #69.12 Implement: Update fix_file() API signature and documentation (2025-12-12)
    • #69.11 Implement: Update lint_file() API signature and documentation (2025-12-12)
    • #69.10 Implement: Export public API from init.py (2025-12-12)
    • #69.9 Review: Review and approve API design document before implementation (2025-12-12)
    • #69.8 Design: Write design document in docs/API_DESIGN.md for review (2025-12-12)
    • #69.7 Design: Document API versioning and stability guarantees (2025-12-12)
    • #69.6 Design: Define backward compatibility strategy for existing imports (2025-12-12)
    • #69.5 Design: Design API for programmatic box detection and validation (2025-12-12)
    • #69.4 Design: Design API for fix_file() - parameters, return types, error handling (2025-12-12)
    • #69.3 Design: Design API for lint_file() - parameters, return types, error handling (2025-12-12)
    • #69.2 Design: Define public API surface (what to export from init.py) (2025-12-12)
    • #69.1 Design: Analyze current internal API and identify stable functions (2025-12-12)

      Analysis complete. See docs/API_ANALYSIS.md for full findings.

  • #59 Investigate: Validate ignore markers functionality (2025-12-02)

    During testing of issue #11, ignore markers appeared to not work - boxes marked with were still being validated. Need to verify if this is expected behavior or a bug.

    • #59.6 Document: Update docs if behavior needs clarification (2025-12-02)

      Added troubleshooting section to docs/USAGE.md explaining common marker name mistakes (e.g., using -start suffix). Documented all three valid markers clearly.

    • #59.5 Fix: Implement or correct ignore marker behavior if broken (2025-12-02)

      No fix needed - ignore markers work correctly. Issue was confusion about marker names. Documentation is accurate.

    • #59.4 Review: Check test cases for ignore markers (task#55) (2025-12-02)

      Test cases in test_detector.py::TestIgnoreMarkers are comprehensive and correct. They use proper marker names and test block regions, single-next markers, empty lines handling, nested regions, and broken boxes.

    • #59.3 Review: Check detector.py for ignore marker implementation (2025-12-02)

      Implementation in detector.py is CORRECT. Markers: '' (start), '' (end), '' (single box). Function is_in_ignore_region() properly tracks regions.

    • #59.2 Test: Verify ignore markers work with boxes inside code blocks (2025-12-02)

      UPDATE: Ignore markers work correctly inside code blocks too when using correct marker names. CONFIRMED BUG: Ignore markers DO NOT work inside code blocks either. Same behavior as outside code blocks - all boxes detected and validated regardless of ignore markers.

    • #59.1 Test: Verify ignore markers work with boxes outside code blocks (2025-12-02)

      UPDATE: Ignore markers WORK CORRECTLY! Issue was user error - used wrong marker name. Correct: '' NOT ''. With correct markers, detected 2 boxes (not 3) and no errors. CONFIRMED BUG: Ignore markers DO NOT work outside code blocks. Detected 3 boxes when should have detected 2. The box between ignore-start/end markers was still validated and errors reported.

  • #57 Review and fix all open GitHub issues (2025-12-02)

    ✅ ALL ISSUES RESOLVED! Fixed 3 problems: (1) Python 3.10 tomllib detection, (2) Windows UTF-8 encoding, (3) Windows permission tests. All platforms now pass. Issues #12 and #13 were auto-closed. ✅ Python 3.10 issue FIXED and verified via CI. Windows failures need monitoring - if next scheduled run still fails on Windows, investigate separately. Issues #12/#13 may resolve themselves or reveal Windows-specific problem. Fixed Python 3.10 failure: test_stdlib_only.py was rejecting 'tomllib' import even though it only executes on Python 3.11+. Added tomllib to allowed modules list. This should fix failures on Python 3.10 (all platforms). Windows failures across all Python versions may be a separate issue - need to verify after this fix. Issues #12 & #13: Scheduled test failures are REAL issues. Cannot access detailed logs via gh CLI. Failures occur on: Python 3.10 (all platforms), All Windows runners (all Python versions). Local tests pass. Need to investigate actual failure logs from GitHub Actions web interface. Issues #12 & #13 are auto-generated scheduled test failures. These need separate investigation to determine if they're real failures or environment issues. Can be addressed in future work.

    • #57.7 Close fixed issues with reference to commits (2025-12-02)

      Closed GitHub issue #11 - verified as fixed in v1.5.0

    • #57.6 Verify fixes with CI/CD and local testing (2025-12-02)
    • #57.5 Fix issues: implement solutions and test (2025-12-02)

      Issue #11 verified as FIXED in v1.5.0 - boxes in code blocks ARE being detected correctly. Can close issue as resolved.

    • #57.4 Create subtasks for complex issues if needed (2025-12-02)
    • #57.3 Prioritize issues by severity and impact (2025-12-02)

      Priority 1 (HIGH): Issue #11 - Regression bug, boxes in code blocks not detected. Priority 2 (MEDIUM): Issues #12 & #13 - Scheduled test failures, need investigation

    • #57.2 Review each issue: understand problem and scope (2025-12-02)
    • #57.1 List all open GitHub issues (2025-12-02)
  • [~] #58 Fix Issue #11: Restore ASCII box detection in markdown code blocks (Issue #11 already fixed in v1.5.0 - no implementation needed) (2025-12-02)

    Issue #11 is already FIXED in v1.5.0. Task #58 may not be needed - can archive after closing GitHub issue. Fixes GitHub issue #11 - Regression where boxes in markdown code blocks are not detected

    • #58.7 Document: Update docs about code block behavior (2025-12-02)
    • #58.6 Verify: Test with user's example from issue #11 (2025-12-02)
    • #58.5 Test: Add test cases for boxes in code blocks (2025-12-02)
    • #58.4 Implement: Add config option and restore code block scanning (2025-12-02)
    • #58.3 Design: Plan configuration option for include/exclude code blocks (2025-12-02)
    • #58.2 Analyze: Understand how code block detection was added (2025-12-02)
    • #58.1 Investigate: Review code changes between v1.2.1 and v1.3.0 (2025-12-02)
  • #56 Review and merge Dependabot PRs (2025-12-02)
    • #56.6 Approve and merge passing PRs (2025-12-02)
    • #56.5 Run local tests if needed to verify changes (2025-12-02)

      Not needed - CI tests comprehensive and all passing

    • #56.4 If checks fail: investigate and fix issues (2025-12-02)

      No issues found - all CI checks passing

    • #56.3 Check CI/CD status for each PR (2025-12-02)
    • #56.2 Review each PR: check version changes and release notes (2025-12-02)
    • #56.1 List all open Dependabot PRs (2025-12-02)
  • #55 Add ignore markers for code blocks: allow marking ASCII boxes as exempt from validation (2025-12-02)
    • #55.10 Document: Add examples to README showing broken boxes with ignore markers (2025-12-02)
    • #55.9 Document: Update USAGE.md with ignore marker syntax and examples (2025-12-02)

      Document syntax, provide examples: (1) showing broken box for comparison, (2) testing edge cases, (3) examples in documentation without errors

    • #55.8 Test: Verify linter skips marked boxes, fixer doesn't touch them (2025-12-02)
    • #55.7 Test: Add test cases for ignore markers in code blocks and inline (2025-12-02)
    • #55.6 Implement: Ensure fixer respects ignore markers (2025-12-02)
    • #55.5 Implement: Modify detector to skip marked regions (2025-12-02)
    • #55.4 Implement: Add ignore marker detection in detector.py (2025-12-02)

      Modify detect_boxes() in detector.py to track ignore regions. Store line ranges to skip. See is_in_code_fence() pattern from Issue task#11

    • #55.3 Design: Decide scope - code blocks only, or any ASCII box? (2025-12-02)

      Decision: Ignore markers work ANYWHERE (not just code blocks). Provides maximum flexibility for all documentation scenarios. Decide: Should markers work only in markdown code blocks, or also for inline ASCII boxes? Consider use case: README examples, documentation with intentionally broken boxes

    • #55.2 Design: Define ignore marker syntax (HTML comments, directives, or special fences) (2025-12-02)

      Options: (1) HTML comments before/after blocks, (2) fence attributes like ```ascii-ignore, (3) inline directives. Consider both block-level and inline markers

    • #55.1 Investigate: Research comment/directive syntax for ignore markers in markdown (2025-12-02)

      Common patterns: HTML comment markers, special fence types, or attributes. Check eslint-disable, prettier-ignore patterns

  • #54 Achieve 100% test coverage across all modules -p (2025-11-19)

    Starting implementation: Working through subtasks from easiest to hardest (54.6 -> 54.1)

    • #54.9 Improve validator.py coverage (92% -> 100%): Test all validation branches (2025-11-19)

      Improved from 88% to 94% coverage. Remaining 6% involves complex branch conditions that are hard to reach Missing lines 57-56, 82, 105-110, 133-140, 181-188, 220-241, 259, 273. Test: all validation branch conditions

    • #54.8 Improve scanner.py coverage (93% -> 100%): Test error handling for file operations (2025-11-19)

      Improved from 93% to 97% coverage. Remaining 3% (lines 70-71) is unreachable code (Latin-1 decode cannot fail) Missing lines 65-71, 176-167. Test: binary file detection edge cases, large files, permission errors

    • #54.7 Improve patterns.py coverage (85% -> 100%): Test edge cases in pattern matching (2025-11-19)

      Improved from 85% to 89% coverage. Remaining 11% involves complex glob pattern edge cases that are difficult to trigger Missing lines 54-56, 119, 144-148, 156-158, 172-178, 175. Test: invalid patterns, edge cases in matching, path normalization

    • #54.6 Improve models.py coverage (96% -> 100%): Test Box width/height properties (2025-11-19)

      Missing lines 55, 60. Test: Box.width and Box.height properties

    • #54.5 Improve linter.py coverage (84% -> 100%): Test error handling paths (2025-11-19)

      Improved from 84% to 97% coverage. Remaining 3% is branch coverage edge cases Missing lines 53-54, 89-90, 97, 116-128. Test: file write errors, encoding issues, fix failure paths

    • #54.4 Improve fixer.py coverage (91% -> 100%): Test edge cases for box fixing (2025-11-19)

      Improved from 91% to 95% coverage. Remaining 5% is hard-to-reach edge cases (junction map fallback, specific branch conditions) Missing lines 34, 42-95, 87-88, 105-111, 137. Test: empty box lines, edge cases in line fixing, right border edge cases

    • #54.3 Improve detector.py coverage (91% -> 100%): Test edge cases for box detection (2025-11-19)

      Missing lines 27, 127-128, 157-167, 160, 169, 179-186. Test: file read errors, incomplete boxes, edge cases in bottom detection

    • #54.2 Improve config.py coverage (84% -> 100%): Test error handling for invalid config files (2025-11-19)

      Improved from 84% to 92% coverage. Remaining 8% includes Python 3.10 tomli import (hard to test) and some branch conditions Missing lines 31-34, 104, 141, 174, 181, 183, 191, 193, 200, 209. Test: TOML parse errors, invalid types, unknown keys/sections warnings, file not found

    • #54.1 Improve cli.py coverage (79% -> 100%): Test verbose mode, config display, error paths (2025-11-19)

      Improved from 79% to 82% coverage. Remaining 18% includes show-config, error handling, and complex CLI flows Missing lines 51, 71-80, 96-97, 113-122, 127-129, 142, 169-170, 182, 188-190, 276-277. Test: --verbose flag, config display output, stdin input, error paths, exit codes

  • #53 Add table column continuity validation: detect missing bottom junction points (┴) (2025-11-19)
    • #53.8 Verify: Test with real table examples to ensure correct detection (2025-11-19)
    • #53.7 Test: Add test cases for tables with/without bottom junctions (2025-11-19)
    • #53.6 Implement: Add fixer logic to insert missing bottom junction points (2025-11-19)

      FIXER: Replace ─ with ┴ at detected column positions in bottom border. Pattern: └──────┴──────┴──────┘. Challenge: must preserve correct width while inserting junctions. Algorithm: 1) Find column positions, 2) Build new bottom border with ┴ at those cols, 3) Fill gaps with ─.

    • #53.5 Implement: Validate bottom border has junction points (┴) where columns exist (2025-11-19)
    • #53.4 Implement: Add column position tracking in validator (2025-11-19)
    • #53.3 Design: Determine validation rules for bottom border junction points (2025-11-19)

      VALIDATION RULES: If top border has ┬ OR content has │ column separators → bottom border MUST have ┴ at same positions. Error: 'Bottom border missing junction point at column X (expected ┴, got ─)'. Severity: warning (stylistic) not error (structural). Skip validation if: no columns detected OR simple box (no separators).

    • #53.2 Design: Define algorithm to track column positions across table rows (2025-11-19)

      ALGORITHM: 1) Parse top border, find all ┬ positions (column starts). 2) Scan content rows, collect all │ positions (confirms columns). 3) Check middle separators for ┼ positions (should match). 4) Validate bottom border has ┴ at same positions. Store column_positions: list[int] for each box.

    • #53.1 Investigate: Analyze table column patterns and identify where junction points should appear (2025-11-19)

      PATTERN: Tables have vertical column separators (│) at consistent positions. Example: Top ┬ at cols 14,28,42 → Content │ at 14,28,42 → Middle ┼ at 14,28,42 → Bottom should have ┴ at 14,28,42. Current behavior: validates width but not junction continuity. Issue: └───────────┘ with no ┴ is structurally valid but stylistically inconsistent.

  • #52 Fix code block detection regression: validate ASCII boxes inside code blocks by default (Issue #11) (2025-11-19)
    • #52.7 Document: Update CLI help and docs to explain code block behavior (2025-11-19)
    • #52.6 Verify: Test with EXAMPLE-GCP_DEVOPS_STRATEGY.md - should detect 6 errors by default (2025-11-19)

      VERIFICATION: EXAMPLE-GCP_DEVOPS_STRATEGY.md has 3 boxes with 2 errors each (6 total): (1) Extra │ after row separator (lines 62,71,80) (2) Missing ┘ closing corner (lines 67,76,85). After fix, default should detect all 6 errors.

    • #52.5 Test: Add test cases for code block validation (default) and exclusion (flag) (2025-11-19)
    • #52.4 Implement: Update detector to validate code blocks by default, skip only when flag set (2025-11-19)

      IMPLEMENTATION: In detector.py detect_boxes(), change is_in_code_fence() check to be conditional: if skip_code_fences and is_in_code_fence(i, stripped_lines): continue. Pass skip_code_fences from CLI flag through linter.py lint_file() and fix_file().

    • #52.3 Implement: Add --exclude-code-blocks CLI flag and logic to conditionally skip code fences (2025-11-19)
    • #52.2 Design: Define configuration option and default behavior for code block detection (2025-11-19)

      DESIGN: Default behavior should VALIDATE code blocks (common case). Add --exclude-code-blocks flag for users who want to skip. Rationale: Better to catch real errors by default than silently ignore them. Location: cli.py add flag, detector.py add parameter to detect_boxes(skip_code_fences=False).

    • #52.1 Investigate: Analyze regression - understand when code blocks should/shouldn't be checked (2025-11-19)

      REGRESSION: task#34.3 added is_in_code_fence() to skip false positives, but now skips ALL boxes in code blocks. Problem: Many docs put valid diagrams in code blocks for monospace rendering. These need validation. Use case 1: Tutorial showing broken ASCII (skip). Use case 2: Documentation diagram in code block (validate).

  • #35 Fix fixer plateau bug: fix command stops making progress with persistent errors (Issue #10) (2025-11-19)

    FULLY RESOLVED: All 4 bug patterns from Issue #10 fixed and validated: (1) Table separators ├─┬─┼─┤ recognized as valid (task#35.3) (2) Malformed lines fixed - extra chars removed, missing corners added (task#35.5) (3) Junction points ┴┬ counted correctly in width (task#35.4) (4) Multi-box lines supported in detector and validator (task#34.4 + validator enhancement). Comprehensive validation in ISSUE_10_VALIDATION.md. All 182 tests passing. Ready to close Issue #10.

    • #35.8 Verify: Re-test EXAMPLE-GCP_DEVOPS_STRATEGY.md - fix should reach 0 errors (2025-11-19)

      VERIFIED: All 3 bug patterns from Issue #10 fixed and tested: (1) Table separators ├─┬/┼─┤: ✅ Test case passes, 0 errors (2) Junction points ┌─┴─┐: ✅ Test case passes, width calculated correctly (3) Missing bottom corners: ✅ Fixer adds corner, lint reaches 0 errors. Malformed table with extra │ after separator: ✅ Detected and fixed (1 error → 0 errors after fix). All implementations verified with comprehensive test suite (177 tests passing). Multi-box lines (task#35.6) deferred to task#34.

    • #35.7 Test: Add test cases for tables, junction points, and multi-box lines (2025-11-19)

      IMPLEMENTED: Added 8 comprehensive test cases covering table separators, junction points, and malformed lines. Tests verify: (1) Tables with column separators ├─┬/┼─┤ validate correctly (2) Junction points ┬┴ in borders count correctly (3) Flowchart junction points work (4) Malformed table separators with extra chars detected (5) Fixer removes extra chars from table separators (6) Fixer adds missing bottom corners (7) Fixer handles both issues together (8) Junction point conversion ┬→┴. All 177 tests passing.

    • #35.6 Implement: Add support for multiple boxes on same line (flowcharts) (2025-11-19)

      COMPLETED via task#34: Multi-box detection implemented in detector.py with find_all_top_left_corners() and refactored detect_boxes(). Test cases added for flowcharts with side-by-side boxes. All 182 tests passing. DEFERRED: Multi-box line support requires detector changes to find multiple boxes on same line. This overlaps with task#34 (detector false positives). Current detector finds only first box, validator then reports second box as 'extra characters'. Requires detector refactoring to split lines and detect boxes independently.

    • #35.5 Implement: Fix fixer logic to properly handle malformed lines (extra chars, missing borders) (2025-11-19)

      IMPLEMENTED: Updated validator to detect extra characters after table separator lines. Updated fixer to remove extra characters from table separators and properly add missing bottom corner when line is too short. Fixer now correctly handles malformed tables.

    • #35.4 Implement: Add junction point detection in box borders (┴┬ in width calculations) (2025-11-19)

      IMPLEMENTED: Updated border width calculation in validate_box() to count ALL JUNCTION_CHARS (├┤┬┴┼╠╣╦╩╬) as part of border width. Now ┌─────┴─────┐ correctly counts as 11 chars wide, matching └───────────┘.

    • #35.3 Implement: Add table column separator detection and validation (2025-11-19)

      IMPLEMENTED: Added TABLE_COLUMN_JUNCTION_CHARS, TOP_JUNCTION_CHARS, BOTTOM_JUNCTION_CHARS to models.py. Created is_table_separator_line() function in validator.py that checks for ├─┬/┼─┤ patterns. Updated validate_box() to skip validation for table separator lines.

    • #35.2 Design: Define support for table column separators (├─┬─┼─┤) and junction points (┴┬) (2025-11-19)

      DESIGN: Extend models.py with TABLE_JUNCTION_CHARS = {├, ┤, ┬, ┼, ┴, ┴, ╠, ╣, ╦, ╩, ╬}. Add is_table_separator_line() in validator.py similar to is_divider_line() - checks for ├ ... ┬/┼ ... ┤ pattern. For junction points in borders: update border width calculation to COUNT junction chars (┬┴) as part of border. Multi-box lines: detector needs line splitting logic.

    • #35.1 Investigate: Reproduce issue #10 bugs with EXAMPLE-GCP_DEVOPS_STRATEGY.md test file (2025-11-19)

      PLATEAU CONFIRMED: Fix reports '1 box fixed' but lint still shows same 4 errors. Fix doesn't recognize table separators so it can't fix them. Root cause: validator.py only checks VERTICAL_CHARS for left/right borders, not divider chars (├┤) or table junction chars (┬┼). REPRODUCED ALL 3 BUG PATTERNS: (1) Table separators: ├ ┤ flagged as misaligned borders (4 errors) (2) Junction points: ┴ in top border causes width mismatch (counts as 10 instead of 11) (3) Multi-box lines: Second box treated as 'extra characters' (2 errors)

  • #34 Fix detector false positives: code blocks, multi-box lines, and examples (2025-11-19)
    • #34.6 Verify: Re-lint docs/ - all 3 false positives should be resolved (2025-11-19)

      VERIFIED: All 3 false positive patterns from task#34.1 resolved: (1) Flowcharts with 2 boxes + arrow: ✅ Now detects 2 boxes correctly (2) Code examples in markdown: ✅ Skipped via code fence detection (3) String literals in code: ✅ Also skipped via code fence detection. Tested on docs/ directory: 8 files, 0 errors, all boxes in code fences correctly skipped. Multi-box detection confirmed with flowchart test: 2 boxes found (was 1). Code fence test: 2 boxes outside fence detected, 1 inside fence skipped.

    • #34.5 Test: Add test cases for flowcharts, code examples, and string literals (2025-11-19)

      IMPLEMENTED: Added 5 comprehensive test cases for code fence detection and multiple boxes per line: (1) Skip boxes in markdown code fences (2) Handle multiple code fences correctly (3) Detect two boxes side by side (4) Detect flowchart with arrows (5) Detect three boxes on same line. All 182 tests passing (5 new tests added).

    • #34.4 Implement: Update detector to handle multiple boxes per line (split on non-box chars) (2025-11-19)

      IMPLEMENTED: Refactored detector to find multiple boxes per line. Added find_all_top_left_corners() to find all box starts on a line. Updated find_bottom_left_corner() to check specific column. Changed detect_boxes() main loop to iterate through all corners on each line. Now correctly detects flowcharts with side-by-side boxes.

    • #34.3 Implement: Add markdown code block detection to skip fenced code (2025-11-19)

      IMPLEMENTED: Added is_in_code_fence() function to detect markdown code fences and skip boxes within them. Updated detect_boxes() to call is_in_code_fence() and skip lines inside code blocks. Prevents false positives from code examples in documentation.

    • #34.2 Design: Define context-aware detection strategy (markdown, code fences, line boundaries) (2025-11-19)

      DESIGN: Detect markdown code fences (```) to skip code blocks. Split lines on arrows/spaces for multiple boxes. Consider file type (.md vs .txt vs .py) for context-aware detection.

    • #34.1 Investigate: Analyze 3 false positive patterns (multi-box lines, code blocks, string literals) (2025-11-19)

      3 FALSE POSITIVES FOUND: (1) USAGE.md:261 - flowchart with 2 boxes + arrow on same line (2) FAQ.md:127 - comparison text showing Unicode vs ASCII (3) TESTING.md:259 - Python string literal in test code

  • #33 Fix linter bug: divider characters (├ ┤) incorrectly flagged as border misalignment (2025-11-19)
    • #33.6 Release: Update version, commit changes, and prepare for release (2025-11-19)
    • #33.5 Verify: Re-lint docs/ to confirm all false positives resolved (2025-11-19)

      VERIFIED: All 7 docs files lint cleanly (20 boxes, 0 errors). Divider lines no longer flagged. Fixer correctly handles short lines without creating double borders.

    • #33.4 Test: Add test cases for boxes with dividers (single/multiple) (2025-11-19)

      Added 6 test cases: 3 validator tests (single/multiple/double-line dividers) + 3 fixer tests (short lines, preserves dividers, multiple dividers). All 29 tests pass.

    • #33.3 Implement: Update validator.py to recognize dividers as valid structure (2025-11-19)

      FIXED: (1) Validator: Added is_divider_line() check in validator.py, imports LEFT/RIGHT_DIVIDER_CHARS from models.py (2) Fixer: Fixed line extension logic in fixer.py to move misplaced border instead of duplicating

    • #33.2 Design: Define valid divider patterns (├──┤) and update box model (2025-11-19)

      DESIGN: Add divider detection logic. Divider = line starting with ├, filled with horizontal chars, ending with ┤. Add LEFT_DIVIDER_CHARS={├,╠} and RIGHT_DIVIDER_CHARS={┤,╣}. Validator should skip divider lines.

    • #33.1 Investigate: Reproduce bug and understand current validation logic for borders (2025-11-19)

      BUGS FOUND: (1) Validator: Divider lines ├──┤ flagged as misaligned borders - validator.py lines 77,103 only check VERTICAL_CHARS (2) Fixer: Adds ││ instead of padding content - duplicates right border

  • #17 Implement .ascii-guard.toml config file with directory scanning #feature (2025-11-17)

    Design finalized in docs/CONFIG_DESIGN.md. TOML format (tomli for py3.10, tomllib for py3.11+). Support both .ascii-guard.toml and .ascii-guard. Includes directory scanning with smart defaults. Pattern matching: *.ext, dir/, /pattern/, !negation. Config validation: warn on unknown, error on bad values. ZERO dependencies: Use pathlib.Path.match() and fnmatch from stdlib. Config file format: .ascii-guard in project root or ~/.ascii-guard. Support gitignore syntax: *.log, build/, /dist/, !important.md (negation). CLI: auto-detect .ascii-guard, or --config flag to override. Example patterns: node_modules/, .git/, /pycache/, *.tmp

    • #17.10 Add comprehensive tests (config, patterns, scanning, CLI) #feature (2025-11-17)

      Create tests/test_config.py, tests/test_patterns.py, tests/test_scanner.py. Test config: valid TOML, invalid values, missing keys, unknown keys (warnings). Test patterns: all supported patterns, negation, edge cases. Test scanner: with/without config, binary detection, size limits. Test CLI: file vs directory args, --config flag. Test Python 3.10 and 3.11+ compatibility.

    • #17.9 Update CLI for directory scanning and config override #feature (2025-11-17)

      Update src/ascii_guard/cli.py. Detect directory vs file arguments. Directory: trigger scan_directory() with config filters. Files: process directly (bypass filters). Add --config flag to override discovery. Add --show-config debug flag to print effective configuration.

    • #17.8 Create directory scanner (recursive with filters) #feature (2025-11-17)

      Create src/ascii_guard/scanner.py. Implement scan_directory() for recursive file discovery. Apply exclude/include patterns. Auto-detect text files (encoding check) vs binary. Respect max_file_size and follow_symlinks from config. Use DEFAULT_EXCLUDES when no config exists.

    • #17.7 Create path matcher with pattern support (fnmatch + pathlib) #feature (2025-11-17)

      Create src/ascii_guard/patterns.py. Implement match_path() using fnmatch + pathlib.Path.match(). Support patterns: *.ext, dir/, /pattern/, !negation (include override), # comments. Test edge cases: negation precedence, ** matching, directory vs file patterns.

    • #17.6 Create config parser module (TOML discovery and parsing) #feature (2025-11-17)

      Create src/ascii_guard/config.py. Implement load_config() with discovery: .ascii-guard.toml → .ascii-guard → defaults. Parse [files] section with defaults. Return Config dataclass. Validate: warn on unknown keys, error on bad values. Default excludes: .git/, node_modules/, pycache/, .venv/, venv/, .tox/, build/, dist/, .mypy_cache/, .pytest_cache/, .ruff_cache/, *.egg-info/.

    • #17.5 Add tomli dependency and version-aware import #feature (2025-11-17)

      Update pyproject.toml: dependencies = ['tomli>=2.0.0; python_version < "3.11"']. Create import wrapper: if sys.version_info >= (3,11): import tomllib else: import tomli as tomllib. Update README and DESIGN.md about conditional dependency. Test on both Python 3.10 and 3.11+.

    • [D] #17.4 Add tests for config parsing and pattern matching #feature (deleted 2025-11-17, expires 2025-12-17) (2025-11-17)
    • [D] #17.3 Integrate config file loading into CLI (auto-detect or --config flag) #feature (deleted 2025-11-17, expires 2025-12-17) (2025-11-17)
    • [D] #17.2 Add path matcher with gitignore-style pattern support (fnmatch, pathlib) #feature (deleted 2025-11-17, expires 2025-12-17) (2025-11-17)
    • [D] #17.1 Create config parser module (read .ascii-guard, parse patterns) #feature (deleted 2025-11-17, expires 2025-12-17) (2025-11-17)
  • #15 Review and update DESIGN.md based on PyPI release requirements #documentation #design (2025-11-17)

    CRITICAL UPDATE NEEDED: DESIGN.md mentions dependencies (markdown, click, colorama) - these must be REMOVED. ascii-guard is ZERO dependency stdlib-only tool. Update dependencies section to reflect: Python 3.11+ stdlib only, NO external packages.

  • #14 Add CONTRIBUTING.md and CODE_OF_CONDUCT.md files #documentation #community (2025-11-17)
  • #13 Set up semantic versioning and release tagging workflow #release #versioning (2025-11-17)
  • #9 Create comprehensive documentation (usage, examples, API) #documentation (2025-11-17)
  • #8 Configure PyPI publishing workflow with GitHub Actions #cicd #pypi (2025-11-17)
  • #7 Set up GitHub Actions CI/CD workflow (lint, test, build) #cicd #automation (2025-11-17)

    GitHub Actions workflow must use 'pre-commit run --all-files' for consistency. Same hooks locally and in CI. Add matrix testing for Python 3.11, 3.12, 3.13. Cache pip and pre-commit environments.

  • #6 Add comprehensive test suite with pytest #testing (2025-11-17)

    Test suite uses pytest (dev dependency only). The linter itself must work standalone with ZERO deps. Tests verify: stdlib-only usage, no import of external packages, works with python -m ascii_guard.

  • #5 Implement CLI interface with lint and fix commands #feature #cli (2025-11-17)

    CRITICAL: Use argparse (stdlib) only, NO click/typer. Simple CLI: 'ascii-guard lint ', 'ascii-guard fix '. ANSI escape codes for colored output (no colorama). Keep it minimal and standalone.

  • #4 Create core linter module structure (detection, validation, fixing) #feature (2025-11-17)

    CRITICAL: ZERO runtime dependencies. Use only Python stdlib. No external libs (no markdown, no click, no colorama). Pure Python 3.11+ stdlib only. Parse files with open(), use argparse for CLI, ANSI codes for colors.

  • #3 Set up development tooling (ruff, black, mypy, pytest) #setup #tooling (2025-11-17)

    CRITICAL: Use pre-commit framework for ALL linting. Install: 'pip install pre-commit'. Config .pre-commit-config.yaml with: ruff (lint+format), mypy (types), pytest (tests), trailing-whitespace, end-of-file-fixer, check-yaml. Run 'pre-commit install' to enable hooks. NO system-level tool pollution.

    • #3.3 Add git hooks installation to setup process #setup #tooling (2025-11-17)

      Requires git repository (task#11) to be initialized first. Run 'pre-commit install' after git init. Pre-commit config is ready in .pre-commit-config.yaml.

    • #3.2 Create .pre-commit-config.yaml with ruff, mypy, pytest hooks #setup #tooling (2025-11-17)
    • #3.1 Install and configure pre-commit framework #setup #tooling (2025-11-17)
  • #2 Add Apache 2.0 license file and copyright headers #setup #license (2025-11-17)
  • #1 Initialize Python project structure with pyproject.toml and standard layout #setup (2025-11-17)

    pyproject.toml: ZERO runtime dependencies (dependencies = [ ]). Dev dependencies only: pytest, ruff, mypy, pre-commit. Package must be installable with 'pip install ascii-guard' with no external deps. Pure stdlib tool. CRITICAL: Use venv isolation. Create .python-version (3.11+), setup-venv.sh script. Document in README: 'python -m venv .venv && source .venv/bin/activate && pip install -e .[dev]'. Add .venv/ to .gitignore.

    • #1.2 Create virtual environment setup script (setup-venv.sh) #setup #venv (2025-11-17)
    • #1.1 Create .python-version file for Python version pinning #setup #venv (2025-11-17)
  • #12 Create GitHub repository and push initial setup #setup #github (2025-11-17)
  • #11 Initialize git repository and create .gitignore for Python #setup #git (2025-11-17)

    Python .gitignore must include: .venv/, venv/, pycache/, *.pyc, *.pyo, *.egg-info/, dist/, build/, .pytest_cache/, .mypy_cache/, .ruff_cache/, .coverage, htmlcov/. Use GitHub's Python template as base.

  • #10 Write README with project overview and AI agent installation prompt #documentation (2025-11-17)

    Emphasize in README: 'ZERO dependencies - pure Python stdlib only'. This is a KEY FEATURE. AI agent prompt should be: 'pip install ascii-guard' (no other deps needed). Highlight: lightweight, fast, no dependency hell. README must include: (1) AI agent prompt for pip install, (2) Developer setup with venv isolation, (3) pre-commit installation instructions. Example: 'Install: python -m venv .venv && source .venv/bin/activate && pip install ascii-guard' for users, 'git clone && ./setup-venv.sh && pre-commit install' for contributors.

  • #16 Adapt release process for ascii-guard (release.sh, RELEASE.md, Cursor rules) #release #automation (2025-11-17)
    • #16.5 Test complete release workflow end-to-end #release (2025-11-17)

      TESTING UPDATED with dry-run mode: ✅ --prepare mode: Tested with multiple commit types ✅ --set-version mode: Tested with valid/invalid inputs ✅ --execute --dry-run: Full end-to-end simulation without git operations ✅ Process invalidation: Detects commits after prepare ✅ Comprehensive testing guide: release/TESTING.md documents full test suite ⚠️ Real execute mode NOT tested (requires actual release to GitHub/PyPI)

      Use './release/release.sh --execute --dry-run' to test releases safely TESTING COMPLETE - All release workflow components verified: ✅ --prepare mode: Analyzes commits, determines version bump (minor: 0.1.0 → 0.2.0), generates release notes with categorized commits ✅ --set-version mode: Overrides version (tested 1.0.0), validates format and progression, updates release notes header ✅ Release notes generation: Includes AI summary, categorizes commits (Added/Changed/Fixed), links to GitHub commits ✅ Semantic versioning: Correctly detects feat: (minor), fix: (patch), BREAKING (major) ✅ Version file updates: Ready for pyproject.toml and init.py ✅ Cursor AI rules: Comprehensive guidance for AI-assisted releases ⚠️ Execute mode NOT tested (requires actual release to GitHub/PyPI) Manual testing checklist: test on clean clone, test with no commits, test breaking changes, test version override (valid/invalid), test execute without prepare (should fail), test dirty working dir (should fail), verify GitHub Actions trigger. See RELEASE_DESIGN.md Testing Strategy for details.

    • #16.4 Create .cursor/rules/ascii-guard-releases.mdc for AI release guidance #release (2025-11-17)

      Create Cursor AI rule file guiding agent through 4-step release process: (1) Write AI summary, (2) Run prepare, (3) Human review, (4) Run execute. Include safeguards: never modify release.sh logic, always wait for approval. See RELEASE_DESIGN.md Phase 4 for details.

    • #16.3 Implement release.sh execute mode with GitHub tag push #release (2025-11-17)

      Implement cmd_execute(), update_version_files() (pyproject.toml + init.py), create_git_tag(), push_to_github(). NO direct PyPI publish - GitHub Actions handles that via trusted publishing. See RELEASE_DESIGN.md Phase 3 for details.

    • #16.2 Implement release.sh set-version override mode #release (2025-11-17)

      Implement cmd_set_version(), validate_version_format() (X.Y.Z format), validate_version_gt() (new > current). Update release/RELEASE_NOTES.md header with new version. See RELEASE_DESIGN.md Step 3b for details.

    • #16.1 Implement release.sh core functions and prepare mode #release (2025-11-17)

      Implement core functions: get_current_version(), get_last_release_tag(), get_commits_since_tag(), categorize_commit(), determine_version_bump(). Implement cmd_prepare(), generate_release_notes(), save_prepare_state(). See RELEASE_DESIGN.md Phase 1 for details.

  • #29 Harden pyenv+venv setup to prevent global Python pollution (2025-11-17)

    PROBLEM: Current setup is fragile - relies on remembering to activate venv. We polluted pyenv global with pytest/pytest-cov during task#24 fixes. Pre-commit uses 'language: system' which depends on whatever Python is in PATH. SOLUTION: 1) Clean pyenv global (keep it pristine). 2) Change pre-commit pytest hook to explicitly use '.venv/bin/python -m pytest' so it always uses venv Python. 3) Add venv checks to critical scripts (release.sh). 4) Document in Cursor rules: NEVER pip install in pyenv global, ALWAYS use venv. 5) Test that commits work from fresh shell without manual venv activation.

    • #29.5 Test: Verify pre-commit works from fresh shell (no venv activated) (2025-11-17)
    • #29.4 Update .cursor/rules: AI must NEVER install packages in pyenv global (2025-11-17)
    • #29.3 Add venv validation to release.sh and other scripts (2025-11-17)
    • #29.2 Fix pre-commit to use .venv/bin/python explicitly (not system) (2025-11-17)
    • #29.1 Clean up pyenv global: uninstall pytest, pytest-cov (2025-11-17)
  • #32 Create clean CI/CD monitoring helper script (2025-11-17)
  • #31 Fix release.sh to use .venv/bin/python for package build (2025-11-17)
  • #30 Fix CI: Create and use venv in GitHub Actions (2025-11-17)
  • #28 Fix release notes: Script generates H1, AI summary has NO headers (2025-11-17)

    Correct design: 1) release.sh generates proper H1 header: '# ascii-guard vX.Y.Z - Release Title' 2) AI agent writes AI_RELEASE_SUMMARY.md WITHOUT any headers (just content paragraphs) 3) Script appends AI content under the H1. Changes needed: A) Update release.sh line 316 to generate H1 instead of H2. B) Update set_version_override() to update H1 instead of H2+H1. C) Update .cursor/rules/ascii-guard-releases.mdc to instruct AI to NOT include headers in AI_RELEASE_SUMMARY.md. D) Update docs/RELEASE_DESIGN.md and release/RELEASE.md examples.

    • #28.5 Test: prepare + set-version with header-less AI summary (2025-11-17)
    • #28.4 Update docs/RELEASE_DESIGN.md and release/RELEASE.md examples (2025-11-17)
    • #28.3 Update .cursor/rules to instruct AI: NO headers in AI_RELEASE_SUMMARY.md (2025-11-17)
    • #28.2 Update set_version_override() to update only H1 header (2025-11-17)
    • #28.1 Update release.sh to generate H1 header instead of H2 (2025-11-17)
  • #26 Fix set-version to update all version references in AI summary (2025-11-17)

    Bug: set-version only updates '## Release X.Y.Z' header but does NOT update version numbers in the AI summary content. Example: Line 1 shows '## Release 1.0.0' but line 3 still shows '# ascii-guard v0.1.0'. Fix: set_version_override() in release.sh needs to update ALL version occurrences in RELEASE_NOTES.md, including the H1 header inside AI summary. Location: release.sh set_version_override() function around line 411-433.

  • #25 Fix release script to validate generated files before commit (2025-11-17)

    Added validation in execute_release() at line 573-593. Pre-commit runs on all generated release files before git commit. Fixes EOF/whitespace automatically. Tested: pre-commit hooks passed on release.sh changes. Issue: release.sh generates AI_RELEASE_SUMMARY.md and RELEASE_NOTES.md but doesn't run pre-commit validation on them. When git commit runs, pre-commit hooks fix EOF/whitespace, causing commit to fail. Fix: Add validation step after generating release files - run pre-commit hooks on generated files BEFORE attempting git commit. Location: release.sh execute_release() function, after generate_release_notes() and before git commit.

  • #24 Fix release process issues identified during v0.1.0 attempt (2025-11-17)
    • #24.5 Test complete release workflow with dry-run after fixes (2025-11-17)

      Dry-run test passed: environment validation ✓, prepare phase ✓, execute --dry-run ✓. All components working correctly. CI/CD was green before testing. After completing tasks 24.1-24.4, run: ./release/release.sh --prepare then ./release/release.sh --execute --dry-run. Verify: 1) No Python errors, 2) No pre-commit failures, 3) All version files updated correctly, 4) Dry-run simulates complete workflow.

    • #24.4 Update release.sh to NEVER use --no-verify flag (2025-11-17)

      Search release.sh for '--no-verify' and 'git commit.*--no-verify'. Remove all instances. Release commits MUST pass pre-commit hooks.

    • #24.3 Fix pre-commit issues: run hooks on all files and commit fixes (2025-11-17)

      Run: pre-commit run --all-files. If failures, stage fixed files and commit WITHOUT --no-verify. This ensures clean state before any release.

    • #24.2 Add environment validation to release.sh (check Python, build module, gh CLI) (2025-11-17)

      Add validate_environment() function at start of release.sh --prepare. Check: 1) Python version matches .python-version, 2) python3 -m build available, 3) gh CLI installed. Exit with clear error if validation fails.

    • #24.1 Resolve Python version mismatch: install 3.12 OR revert all configs to 3.10 (2025-11-17)

      Python 3.12.7 installed and working. Venv rebuilt with Python 3.12. Fixed pre-commit to use .venv/bin/pytest for proper isolation. Check: pyenv versions | grep 3.12. If not found, either install Python 3.12 OR revert .python-version, pyproject.toml, setup-venv.sh, and all GitHub Actions workflows back to 3.10.1

  • #23 Redesign release process for proper version management #release (2025-11-17)
    • #23.6 Test redesigned workflow with dry-run mode (2025-11-17)

      Use release/TESTING.md checklist with dry-run. Verify: (1) GitHub release check works, (2) All version files updated in prepare, (3) set-version updates all files, (4) AI summary lifecycle correct. Document any issues found.

    • #23.5 Commit AI summary with release, delete and commit cleanup after success (2025-11-17)

      EXECUTE must: (1) Commit version files + release notes + AI summary together, (2) Create tag and push, (3) AFTER successful GitHub Actions, delete AI_RELEASE_SUMMARY.md in separate commit with message 'chore: Clean up release artifacts for vX.Y.Z'. Keeps dev environment clean.

    • #23.4 Update set-version to modify all version files and release notes (2025-11-17)

      set-version must: (1) Update ALL version files from VERSION_FILES list, (2) Update RELEASE_NOTES.md header, (3) Update .prepare_state with new version. Ensures consistency across all version references.

    • #23.3 Move version updates from execute to prepare phase (2025-11-17)

      PREPARE phase must update ALL version files immediately after determining new version. This allows review of actual version changes before execute. EXECUTE only commits the already-modified files.

    • #23.2 Add GitHub release check to determine current version (2025-11-17)

      Add get_github_latest_release() function using 'gh release list --limit 1' to determine actual latest release. If no releases exist, use 0.0.0 as base. Use GitHub as source of truth, not local files.

    • #23.1 Document all files containing version numbers for tracking (2025-11-17)

      Create VERSION_FILES.md documenting all files containing version numbers: pyproject.toml (version field), src/ascii_guard/init.py (version), any others. Update release.sh to use this list for all version operations.

Deleted Tasks

  • [D] #92 86.6 Review and merge Dependabot PR #21 (actions/upload-artifact 5.0.0 6.0.0) (deleted 2026-01-11, expires 2026-02-10)
  • [D] #91 86.5 Review and merge Dependabot PR #20 (astral-sh/setup-uv commit update) (deleted 2026-01-11, expires 2026-02-10)
  • [D] #90 86.4 Review and merge Dependabot PR #19 (actions/cache 4.3.0 5.0.1) (deleted 2026-01-11, expires 2026-02-10)
  • [D] #89 86.3 Close duplicate scheduled test failure issues (#18, #22, #23, #24) after fix is verified (deleted 2026-01-11, expires 2026-02-10)
  • [D] #88 86.2 Test the scheduled workflow fix locally or via workflow_dispatch (deleted 2026-01-11, expires 2026-02-10)
  • [D] #87 86.1 Fix Performance Benchmark job in scheduled.yml - use 'uv run' instead of 'python' (deleted 2026-01-11, expires 2026-02-10)
  • [D] #81 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #83 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #82 79.6 Standardize CI Workflows: Replace 'uv pip install' with 'uv sync --frozen --dev' in all workflows (deleted 2025-12-13, expires 2026-01-12)
  • [D] #84 79.6 Update Developer Documentation: Replace legacy venv/pip instructions in DEVELOPMENT.md, USAGE.md, CI_CD.md (deleted 2025-12-13, expires 2026-01-12)
  • [D] #60 Design: Create Python API design document for public programmatic interface -p (deleted 2025-12-12, expires 2026-01-11)
  • [D] #77 69.8 Design: Write design document in docs/API_DESIGN.md for review (deleted 2025-12-12, expires 2026-01-11)
  • [D] #76 69.7 Design: Document API versioning and stability guarantees (deleted 2025-12-12, expires 2026-01-11)
  • [D] #75 69.6 Design: Define backward compatibility strategy for existing imports (deleted 2025-12-12, expires 2026-01-11)
  • [D] #74 69.5 Design: Design API for programmatic box detection and validation (deleted 2025-12-12, expires 2026-01-11)
  • [D] #73 69.4 Design: Design API for fix_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #72 69.3 Design: Design API for lint_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #71 69.2 Design: Define public API surface (what to export from __init__.py) (deleted 2025-12-12, expires 2026-01-11)
  • [D] #70 69.1 Design: Analyze current internal API and identify stable functions (deleted 2025-12-12, expires 2026-01-11)
  • [D] #68 60.8 Design: Write design document in docs/API_DESIGN.md (deleted 2025-12-12, expires 2026-01-11)
  • [D] #67 60.7 Design: Document API versioning and stability guarantees (deleted 2025-12-12, expires 2026-01-11)
  • [D] #66 60.6 Design: Define backward compatibility strategy for existing imports (deleted 2025-12-12, expires 2026-01-11)
  • [D] #65 60.5 Design: Design API for programmatic box detection and validation (deleted 2025-12-12, expires 2026-01-11)
  • [D] #64 60.4 Design: Design API for fix_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #63 60.3 Design: Design API for lint_file() - parameters, return types, error handling (deleted 2025-12-12, expires 2026-01-11)
  • [D] #62 60.2 Design: Define public API surface (what to export from __init__.py) (deleted 2025-12-12, expires 2026-01-11)
  • [D] #61 60.1 Design: Analyze current internal API and identify stable functions (deleted 2025-12-12, expires 2026-01-11)

Last Updated: Sun Jan 11 22:36:15 CET 2026 Maintenance: Use todo.ai script only

Task Metadata

Task relationships and dependencies (managed by todo.ai tool). View with: ./todo.ai show <task-id>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment