Skip to content

refactor(compute): remove global mutable state from compute_executor [OMN-738] - #189

Merged
jonahgabriel merged 3 commits into
mainfrom
jonah/omn-738-remove-global-mutable-state-from-compute_executorpy
Dec 14, 2025
Merged

jonahgabriel merged 3 commits into
mainfrom
jonah/omn-738-remove-global-mutable-state-from-compute_executorpy

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Dec 14, 2025 •

Copy link
Copy Markdown
Contributor

Summary

  • Remove global _validation_warning_emitted variable that violated the module's "pure and stateless" principle
  • Warning deduplication now handled by Python's built-in warnings module
  • Add test coverage for validation step warning emission
  • Update documentation to reflect the fix

Changes

File Change
src/omnibase_core/utils/compute_executor.py Remove global state, simplify warning emission
tests/unit/utils/test_compute_executor.py Add TestValidationStepWarning test class
docs/architecture/CONTRACT_DRIVEN_NODECOMPUTE_V1_0.md Update "Known Limitation" → "Note"

Test plan

  • All 12 compute_executor tests pass
  • All 878 utils/compute tests pass
  • mypy strict mode passes
  • No references to _validation_warning_emitted remain in codebase

Linear

Closes OMN-738

Summary by CodeRabbit

  • Documentation

    • Clarified how validation warnings are emitted and deduplicated.
  • Refactor

    • Changed validation warning emission to occur on each validation invocation (relying on standard deduplication).
  • Tests

    • Added tests verifying validation warnings are emitted and that validation steps remain pass-through.
  • Chores

    • CI workflow updated: shortened quick validation, removed smoke-test job, and reorganized test phases and job dependencies.

✏️ Tip: You can customize this high-level summary in your review settings.

…[OMN-738]

Remove the `_validation_warning_emitted` global variable that violated
the module's "pure and stateless" principle. Warning deduplication is
now handled by Python's built-in warnings module.

Changes:
- Remove global `_validation_warning_emitted` variable and TODO comment
- Simplify `execute_validation_step` to use warnings.warn() directly
- Add test for validation step warning emission
- Update documentation to reflect the fix
@coderabbitai

coderabbitai Bot commented Dec 14, 2025 •

Copy link
Copy Markdown
Contributor

Walkthrough

Documentation text and runtime code were adjusted so validation steps emit a UserWarning on each invocation (relying on Python's warnings deduplication); a global one-time warning flag was removed, a unit test was added to assert the warning and pass-through behavior, and the CI workflow was restructured (removed the smoke-test job, renamed phases, and changed test timings/dependencies).

Changes

Cohort / File(s) Summary
Docs
docs/architecture/CONTRACT_DRIVEN_NODECOMPUTE_V1_0.md
Rewrote note about validation warnings: states validation steps emit UserWarning and Python's warnings module handles deduplication; removed mentions of module-level state and refactor TODOs.
Compute executor
src/omnibase_core/utils/compute_executor.py
Removed global one-time flag and its conditional guard; now emits the validation UserWarning unconditionally on each validation-step invocation; execution behavior otherwise unchanged.
Tests
tests/unit/utils/test_compute_executor.py
Added TestValidationStepWarning to assert a UserWarning is emitted when executing a validation step and that the step returns the input unchanged.
CI workflow
.github/workflows/test.yml
Restructured workflow: removed the Quick smoke-test job, renamed/resequenced phases (Phase 2 → "Full Test Suite"), shortened quick validation duration, updated job dependencies (removed smoke-test from needs), and adjusted test-summary logic to drop smoke-test references.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • CI workflow changes are broad and affect job ordering, dependencies, and reporting — review for unintended dependency regressions and required secrets/runners.
  • Inspect compute_executor.py to ensure no remaining references to the removed guard flag and confirm behavior for multiple validation calls.
  • Verify the new unit test uses a stable warning pattern across supported Python versions and that CI runs include the test changes.

Poem

🐰 I nudged a warning, set it free to spring,
Each validation now hums — a one-time bell no more.
Python keeps echoes tidy, I hop and sing,
Tests clap their paws, CI dances across the floor. 🥕

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: removing global mutable state (the _validation_warning_emitted variable) from compute_executor, which aligns with the PR objectives and primary modifications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch jonah/omn-738-remove-global-mutable-state-from-compute_executorpy

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 436391d and 559d3aa.

📒 Files selected for processing (1)
  • .github/workflows/test.yml (7 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-12-13T20:59:19.537Z
Learnt from: CR
Repo: OmniNode-ai/omnibase_core PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-13T20:59:19.537Z
Learning: Applies to tests/**/*.py : Run tests with CI performance expectations: average 2m58s per split across 20 parallel runners, with acceptable range 2m30s-3m30s and critical threshold >4m30s

Applied to files:

  • .github/workflows/test.yml
📚 Learning: 2025-12-13T20:59:19.537Z
Learnt from: CR
Repo: OmniNode-ai/omnibase_core PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-13T20:59:19.537Z
Learning: Applies to src/omnibase_core/**/*.py : Achieve and maintain pyright basic mode compliance with 0 errors (targets Python 3.12)

Applied to files:

  • .github/workflows/test.yml
📚 Learning: 2025-12-13T20:59:19.537Z
Learnt from: CR
Repo: OmniNode-ai/omnibase_core PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-13T20:59:19.537Z
Learning: Applies to src/omnibase_core/**/*.py : Achieve and maintain 100% mypy strict mode compliance with 0 errors across all source files

Applied to files:

  • .github/workflows/test.yml
📚 Learning: 2025-12-13T20:59:19.537Z
Learnt from: CR
Repo: OmniNode-ai/omnibase_core PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-13T20:59:19.537Z
Learning: Applies to **/*.py : Lint code using `poetry run ruff check` to detect issues and apply auto-fixes with `poetry run ruff check --fix`

Applied to files:

  • .github/workflows/test.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: claude-review
🔇 Additional comments (3)
.github/workflows/test.yml (3)

26-26: Phase timing expectations align well with learnings.

Phase 1 reduced from ~5-10 min to ~2-3 min matches the expected quick validation threshold. Phase 2 target of ~3 min per split aligns with the learning guideline (average 2m58s per split, acceptable range 2m30s-3m30s).

Also applies to: 34-34, 61-62


65-65: Smoke-test removal executed consistently across all dependencies and checks.

Job dependency chain correctly updated: test-parallel now depends on [lint, pyright, exports-validation] (fail-fast optimization), and test-summary aggregation logic properly reflects all current jobs without smoke-test references. The conditional logic in test-summary (lines 563-569) is sound and covers all required jobs.

Also applies to: 549-549, 563-569


147-147: Phase 1 validation job comments clarified and consistent.

Updated comments for lint, pyright, and exports-validation jobs now explicitly note they are Phase 1 jobs with fail-fast optimization. This resolves the earlier feedback about smoke-test scope (now moot since job is removed) and provides clearer documentation of the three-phase orchestration.

Also applies to: 201-201, 248-248


Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claude Bot commented Dec 14, 2025

Copy link
Copy Markdown

PR Review: Remove Global Mutable State from compute_executor

Summary

✅ Excellent refactoring! This PR successfully removes global mutable state while maintaining functionality and improving code quality.


Strengths

1. Adherence to Pure Function Principles ⭐

  • Removes the _validation_warning_emitted global variable that violated the "pure and stateless" principle
  • Leverages Python's built-in warnings module for deduplication (which uses a defaultdict internally)
  • Maintains thread safety and deterministic behavior

2. Code Quality Improvements

  • Reduced complexity: Removed 10 lines of global state management
  • Cleaner code: Eliminated global keyword and conditional logic
  • Better separation of concerns: Warning deduplication is now Python's responsibility, not ours

3. Comprehensive Test Coverage ✅

  • New TestValidationStepWarning test class with clear documentation
  • Tests both warning emission AND pass-through behavior
  • Uses pytest.warns() context manager correctly
  • Flexible regex pattern handles message variations

4. Documentation Updates

  • Changed "Known Limitation" → "Note" (more accurate now)
  • Removed TODO comment that's now resolved
  • Updated explanation to reflect the new approach

Code Quality Assessment

Thread Safety ✅

  • Before: Global mutable state created potential thread safety issues (though minor)
  • After: Fully stateless, Python's warnings module handles deduplication safely

Performance ✅

  • No performance impact - warning deduplication is still handled efficiently
  • Python's warnings module uses a registry that's optimized for this use case

Maintainability ✅

  • Simpler code is easier to understand and maintain
  • Removes the need for developers to track global state
  • Aligns with project's "pure and stateless" architecture principles

Testing Verification

The new test is well-structured:

with pytest.warns(UserWarning, match="pass-through.*v1.1|v1.1.*pass-through"):
    result = execute_validation_step(step, {"test": "data"})
assert result == {"test": "data"}

Strengths:

  • Tests warning emission
  • Verifies pass-through behavior
  • Uses flexible regex for message matching
  • Has clear documentation
  • Proper timeout marker (5s)

Minor Observations

1. Warning Deduplication Behavior

Python's warnings module deduplicates by (message, category, filename, lineno). This means:

  • ✅ Same validation step called multiple times → warning shown once
  • ⚠️ Different code paths calling the same warning → may show multiple times

Current behavior is acceptable for v1.0, but if you want session-level deduplication (one warning per Python process), consider:

warnings.warn(..., UserWarning, stacklevel=2)
warnings.simplefilter('once', UserWarning)  # Add to module initialization

Recommendation: Current approach is fine - leave as-is unless users report warning spam.


Security & Performance

  • ✅ No security concerns: Removes mutable global state
  • ✅ No performance impact: Warning emission is already negligible
  • ✅ No breaking changes: External behavior unchanged

Test Coverage

Based on the PR description:

  • ✅ 12/12 compute_executor tests pass
  • ✅ 878/878 utils/compute tests pass
  • ✅ mypy strict mode passes
  • ✅ No references to _validation_warning_emitted remain

Verified: Ran gh pr diff and grep - no remaining references to the old global variable.


Alignment with CLAUDE.md

✅ Follows all project conventions:

  • Uses Poetry for dependency management
  • Maintains mypy strict mode compliance
  • Follows error handling patterns (though not applicable here)
  • Proper test markers (@pytest.mark.unit, @pytest.mark.timeout)
  • Clear documentation updates

Recommendation

✅ APPROVE - This PR is ready to merge.

Rationale:

  1. Successfully removes global mutable state
  2. Maintains all functionality
  3. Improves code quality and maintainability
  4. Comprehensive test coverage
  5. Proper documentation updates
  6. No breaking changes
  7. Aligns with project architecture principles

Nice work on this cleanup! This is exactly the kind of refactoring that improves long-term code health. 🎉


Reviewed by: Claude Sonnet 4.5 (AI Code Reviewer)
Review Date: 2025-12-14
Linear: OMN-738

The smoke test runs ~2400 tests in ~5 min. The 5 min timeout was
causing job cancellation during post-cleanup phase after tests passed.
Added 3 min buffer to prevent race condition.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cd180fc and 436391d.

📒 Files selected for processing (1)
  • .github/workflows/test.yml (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-12-13T20:59:19.537Z
Learnt from: CR
Repo: OmniNode-ai/omnibase_core PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-13T20:59:19.537Z
Learning: Applies to tests/**/*.py : Run tests with CI performance expectations: average 2m58s per split across 20 parallel runners, with acceptable range 2m30s-3m30s and critical threshold >4m30s

Applied to files:

  • .github/workflows/test.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: claude-review
🔇 Additional comments (1)
.github/workflows/test.yml (1)

55-55: Verify timeout increase is proportional to test changes.

The smoke-test timeout increased from 5 to 8 minutes (60% increase). While removing global mutable state and adding warning deduplication shouldn't significantly impact test execution time, please confirm this buffer accounts for any performance overhead from the new TestValidationStepWarning test or if it's purely precautionary. Based on the learnings, tests should average ~2m58s; 8 minutes provides adequate headroom.

Comment thread .github/workflows/test.yml Outdated
@claude

claude Bot commented Dec 14, 2025

Copy link
Copy Markdown

Code Review: PR #189 - Remove Global Mutable State from compute_executor

Summary

This PR successfully removes the global _validation_warning_emitted variable and relies on Python's built-in warning deduplication mechanism. This is a high-quality refactoring that improves code quality and thread safety.


✅ Strengths

1. Architectural Improvement

  • Eliminates global mutable state: Restores the module's "pure and stateless" principle
  • Thread safety: Removes potential race conditions in multi-threaded environments
  • Simplicity: Leverages Python's standard library instead of custom state management

2. Code Quality

  • Clean implementation: The refactored code is simpler and more maintainable (7 lines vs 17 lines)
  • Proper comment: Correctly explains that Python's warnings module handles deduplication automatically
  • Follows project conventions: Adheres to CLAUDE.md guidelines on error handling and thread safety

3. Test Coverage

  • New test class: TestValidationStepWarning provides explicit coverage for warning emission
  • Robust test: Uses pytest.warns() with flexible regex matching for message validation
  • Verifies behavior: Confirms both warning emission AND pass-through functionality

4. Documentation Updates

  • Accurate reflection: Updated CONTRACT_DRIVEN_NODECOMPUTE_V1_0.md from "Known Limitation" to "Note"
  • Removed TODO: Eliminated v1.1 refactoring TODO since the issue is now resolved

5. CI Configuration

  • Realistic timeout: Increased smoke test timeout from 5 to 8 minutes with clear rationale
  • Good documentation: Comment explains the ~2400 test count and ~5min runtime

🔍 Technical Analysis

Python Warnings Deduplication Behavior

Python's warnings module automatically deduplicates warnings based on:

  • Message text
  • Warning category
  • Source file location (filename:lineno)

Key behavior:

  • Default filter is 'default' which shows each unique warning once per source location
  • Thread-safe: The warnings filter registry is protected by internal locks
  • No global state needed: Deduplication is handled transparently

This means the new implementation is correct and thread-safe by design.


💡 Minor Observations

1. Warning Deduplication in Tests

The new test uses pytest.warns() which captures warnings. Be aware that in parallel test execution (pytest-xdist with -n4), each worker process has its own warnings filter state. This is correct behavior - each worker should see the warning once.

2. Potential Edge Case: Warning Filters

If users configure custom warning filters (via warnings.filterwarnings() or PYTHONWARNINGS env var), the warning may be suppressed or shown multiple times. However, this is:

  • ✅ Expected behavior - users controlling warnings should get their configured behavior
  • ✅ Not a bug - Python's warnings system is designed to be user-configurable
  • ✅ Better than global state - Global state would prevent user configuration

📊 Test Plan Verification

From PR description:

  • ✅ All 12 compute_executor tests pass
  • ✅ All 878 utils/compute tests pass
  • ✅ mypy strict mode passes
  • ✅ No references to _validation_warning_emitted remain

Recommendation: Verify CI passes with 20-split parallel execution to ensure no test isolation issues.


🎯 Overall Assessment

LGTM with high confidence. This PR:

  1. ✅ Solves the problem: Removes global mutable state
  2. ✅ Improves thread safety: Module is now truly "pure and stateless"
  3. ✅ Simplifies code: Fewer lines, clearer intent
  4. ✅ Maintains behavior: Warning still emitted, deduplication still works
  5. ✅ Well-tested: New test provides explicit coverage
  6. ✅ Well-documented: Documentation accurately reflects changes
  7. ✅ Follows conventions: Adheres to CLAUDE.md patterns

📋 Checklist (All items satisfied)

  • ✅ Code quality: Excellent - simpler, clearer, more maintainable
  • ✅ Potential bugs: None identified
  • ✅ Performance: Neutral (warnings module is already optimized)
  • ✅ Security: N/A (no security-sensitive changes)
  • ✅ Test coverage: Improved (new test class added)
  • ✅ Thread safety: Significantly improved (global state removed)
  • ✅ Documentation: Accurate and complete

🚀 Recommendation

APPROVE - This is a well-executed refactoring that improves code quality, thread safety, and maintainability while preserving existing behavior.

Closes: OMN-738
Reviewed by: Claude Code Assistant (claude-sonnet-4-5)

Removed smoke-test job that ran 2400 tests redundantly (same tests
are in the 20 parallel splits). This eliminates:
- 5 min of redundant test execution
- Timeout race condition on cleanup

New flow:
- Phase 1: lint, pyright, exports-validation (~2-3 min, parallel)
- Phase 2: test-parallel (12,198 tests / 20 splits)
- Phase 3: test-summary
@claude

claude Bot commented Dec 14, 2025

Copy link
Copy Markdown

Code Review - PR #189

✅ Overall Assessment: APPROVED

This is an excellent refactoring that successfully eliminates global mutable state while maintaining functionality. The changes align well with the project's architectural principles and improve code quality.


🎯 Strengths

1. Architectural Improvement

  • ✅ Removes global state violation: Eliminates _validation_warning_emitted global variable that violated the module's "pure and stateless" principle
  • ✅ Leverages Python built-ins: Uses Python's warnings module for automatic deduplication, which is the idiomatic approach
  • ✅ Maintains thread safety: The module remains fully thread-safe and concurrent-use friendly

2. Code Quality

  • ✅ Cleaner implementation: Removes 9 lines of boilerplate (global variable + conditional logic)
  • ✅ Simplifies logic: Warning emission is now straightforward - the warnings module handles deduplication automatically
  • ✅ Better separation of concerns: No need to track state for a cross-cutting concern (warning deduplication)

3. Testing

  • ✅ New test coverage: Added TestValidationStepWarning class with proper validation
  • ✅ Comprehensive test: Verifies both warning emission AND pass-through behavior
  • ✅ Flexible regex matching: match="pass-through.*v1.1|v1.1.*pass-through" handles message variations

4. Documentation

  • ✅ Updated architecture doc: Changed from "Known Limitation" to "Note" - accurately reflects the improved state
  • ✅ Removed TODO: Eliminates the v1.1 refactoring TODO since the issue is now resolved

5. CI Optimization (Bonus)

  • ✅ Removed smoke-test job: Eliminated redundant 5-minute job that duplicated lint/type checks
  • ✅ Faster fail-fast: Phase 1 now completes in ~2-3 minutes instead of ~5-10 minutes
  • ✅ Consistent documentation: Updated all references to remove smoke-test from dependency chains

🔍 Code Analysis

Thread Safety (CRITICAL for this module)

The change actually improves thread safety:

Before: Global _validation_warning_emitted could theoretically cause race conditions in multi-threaded scenarios (though warnings module has its own synchronization).

After: Pure function that relies only on Python's warnings module, which handles thread-safe deduplication internally using warnings.filters.

Warning Deduplication Behavior

Python's warnings module deduplicates by:

  • (filename, lineno, category, message) tuple
  • Default filter is 'default' which shows each unique warning once per location

This is actually superior to the global boolean approach because:

  1. ✅ Thread-safe out of the box
  2. ✅ More granular (per-location, not global)
  3. ✅ User-configurable via warnings.filterwarnings()
  4. ✅ Standard Python idiom

📊 Test Coverage

New Test: test_validation_step_emits_warning

with pytest.warns(UserWarning, match="pass-through.*v1.1|v1.1.*pass-through"):
    result = execute_validation_step(step, {"test": "data"})

assert result == {"test": "data"}  # Verify pass-through

Excellent test design:

  • Uses pytest.warns() context manager (correct approach)
  • Flexible regex handles message variations
  • Verifies both warning AND functionality
  • 5-second timeout prevents hangs

🚀 Performance Impact

Before

  • Global variable check: O(1) but with thread contention risk
  • Warning emitted: Once per process

After

  • No global state: Pure function
  • Warning emitted: Once per unique (file, line, message) - same effective behavior
  • Net impact: Negligible performance change, improved maintainability

🎨 Code Style & Conventions

✅ Follows CLAUDE.md conventions:

  • Pure and stateless functions (compute_executor.py lines 9-11)
  • No global mutable state
  • Thread-safe design
  • Proper use of Python standard library

✅ Type hints: Function signatures maintain existing type annotations

✅ Documentation: Inline comments explain the change clearly


🔒 Security Considerations

No security concerns. This is a pure refactoring that:

  • Removes mutable global state (security improvement)
  • No new attack surface
  • No changes to data flow or validation logic

🧪 Suggested Verification (Optional)

If you want to verify the deduplication behavior works as expected across multiple calls:

# Test that warnings module deduplicates properly
def test_multiple_validation_steps_deduplicate_warning():
    """Verify warnings are deduplicated across multiple validation calls."""
    step = ModelComputePipelineStep(
        step_name="test_validation",
        step_type=EnumComputeStepType.VALIDATION,
        validation_config=ModelValidationStepConfig(schema_ref="test_schema"),
    )
    
    # First call: warning emitted
    with pytest.warns(UserWarning):
        execute_validation_step(step, {"test": "data"})
    
    # Subsequent calls: warning filtered by default 'default' filter
    with warnings.catch_warnings(record=True) as w:
        execute_validation_step(step, {"test": "data"})
        execute_validation_step(step, {"test": "data"})
        # Warnings module deduplicates - should be 0 new warnings
        assert len(w) == 0

Note: This is optional - the current test is sufficient. Just sharing for educational purposes.


📝 Minor Observations

CI Workflow Changes

The removal of the smoke-test job is a smart optimization:

  • Eliminates 5-10 minute redundant job
  • lint job already runs mypy strict mode
  • pyright job already checks type errors
  • Smoke tests were just a subset of what lint/pyright already do

Rationale from diff:

-  # Phase 1 - Quick Validation (parallel, ~5-10 min):
-  #   - smoke-test: Basic import/syntax checks
+  # Phase 1 - Quick Validation (parallel, ~2-3 min):
   #   - lint: Code quality (ruff format, ruff check, mypy strict)

This aligns with the project's CI performance benchmarks (see CLAUDE.md CI Performance Benchmarks section).


✅ Final Recommendation

APPROVE - This PR is ready to merge.

Checklist:

  • ✅ Removes global mutable state (primary objective)
  • ✅ Maintains functionality (pass-through + warning)
  • ✅ Adds test coverage
  • ✅ Updates documentation
  • ✅ Improves thread safety
  • ✅ Follows project conventions
  • ✅ No security concerns
  • ✅ CI optimizations are sound
  • ✅ No references to removed global variable remain

Impact: Low-risk refactoring with architectural improvement and CI performance gain.


Great work on this cleanup! 🎉 The code is now more maintainable, thread-safe, and aligned with Python best practices.

@jonahgabriel
jonahgabriel merged commit b335645 into main Dec 14, 2025
29 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-738-remove-global-mutable-state-from-compute_executorpy branch December 14, 2025 16:57
jonahgabriel added a commit that referenced this pull request Dec 14, 2025
…s-before-v050

Fix fingerprint version format regression introduced in main:
- Remove 'v' prefix from contract fingerprints (e.g., "v1.1.0:hash" → "1.1.0:hash")
- The test spec explicitly requires NO 'v' prefix per test_contract_v110_fields.py
- Commit b4eb25a on main incorrectly added 'v' prefix claiming it was required
- The test regex r"\d+\.\d+\.\d+" does not allow 'v' prefix

Also cleaned up:
- Remove empty tests/unit/models/service/ directory
- Remove duplicate src/omnibase_core/models/service/ directory (canonical is services/)

Merges changes from:
- PR #187: Replace print statements with structured logging
- PR #189: Remove global mutable state from compute_executor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant