v0.5.0 polish + validation sprint - #2
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
This PR wraps up the v0.5.0 “polish + validation” sprint by strengthening CI validation, tightening end-user diagnostics (AdapterError messages), and expanding repo documentation/templates/examples ahead of marketing publication.
Changes:
- Expand CI to a 6-cell OS/Python matrix (Ubuntu/Windows × 3.11/3.12/3.13) and add Python 3.13 classifier metadata.
- Polish multiple AdapterError sites (DDS-only remediation, Cyclone/Fast DDS diagnostics, BagService error surfacing) and add regression tests that pin key substrings/tokens.
- Add/refresh “repo polish” docs (SECURITY/CONTRIBUTING/TROUBLESHOOTING/MIGRATION), plus a new
examples/walkthrough set and GitHub templates.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
tests/test_dds_helpers.py |
Adds substring/token regression tests for DDS_ONLY_ERROR_MSG. |
tests/test_bag_service.py |
Adds tests asserting BagService errors surface exception type + message. |
src/topicforge/services/inspector.py |
Replaces TODO with a permanent design note for list_topics validation asymmetry. |
src/topicforge/services/bag_service.py |
Improves rosbags-required guidance and includes exception type in AdapterError messages. |
src/topicforge/adapters/dds_fast/adapter.py |
Enhances Fast DDS participant init failure diagnostics. |
src/topicforge/adapters/dds_cyclone/adapter.py |
Enhances Cyclone DDS discovery/peek errors with domain/topic context and exception type. |
src/topicforge/adapters/common/dds_helpers.py |
Rewrites DDS_ONLY_ERROR_MSG with explicit CompositeAdapter remediation + affected tool list. |
SECURITY.md |
Adds a security policy and threat model documentation. |
README.md |
Updates badges, positioning, tool tables, and configuration docs to reflect v0.4.0 surface. |
pyproject.toml |
Adds Python 3.13 classifier. |
examples/README.md |
Introduces runnable mock-mode example index and how-to. |
examples/01-discover-ros2-stack.md |
Adds an end-to-end mock walkthrough for ROS2 graph discovery. |
examples/02-debug-qos-mismatch.md |
Adds a mock walkthrough for DDS QoS mismatch diagnosis. |
examples/03-analyze-recording.md |
Adds a mock walkthrough for bag analysis + bag sample peek. |
examples/04-monitor-topic-frequency.md |
Adds a mock walkthrough for topic metrics + participant lifecycle events. |
docs/TROUBLESHOOTING.md |
Adds a troubleshooting guide keyed off polished AdapterError messages. |
docs/TESTING.md |
Updates testing guide from 5 tools to 11 tools and adds a tool-surface callout. |
docs/projet-file/audit-followup-triage-v0.2.0.md |
Refreshes audit triage status through v0.5.0 decisions. |
docs/MIGRATION_v0.3_to_v0.4.md |
Adds migration guide documenting v0.4.0 tool/env/schema expansions. |
docs/DDS_QUICKSTART.md |
Updates quickstart to CompositeAdapter + _decode_status story. |
CONTRIBUTING.md |
Adds contribution guidelines and development/testing contract. |
CHANGELOG.md |
Populates [Unreleased] with the v0.5.0 sprint breakdown. |
.github/workflows/ci.yml |
Expands CI matrix to include Windows and Python 3.13. |
.github/PULL_REQUEST_TEMPLATE.md |
Adds a structured PR template with compatibility checklist. |
.github/ISSUE_TEMPLATE/feature_request.yml |
Adds a feature request issue form with scope/tier prompts. |
.github/ISSUE_TEMPLATE/config.yml |
Disables blank issues and adds support links. |
.github/ISSUE_TEMPLATE/bug_report.yml |
Adds a bug report issue form with structured repro fields. |
Comments suppressed due to low confidence (1)
tests/test_bag_service.py:128
- Same issue as above:
tmp_pathis apathlib.Pathfixture, not apytest.TempPathFactory, and the current type annotation forces an unnecessarytype: ignorewhen using/path joining. UsePath(or switch totmp_path_factoryif needed).
def test_bag_service_peek_surfaces_exception_type_in_error(
monkeypatch: pytest.MonkeyPatch, tmp_path: pytest.TempPathFactory
) -> None:
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+105
to
+107
| def test_bag_service_analyze_surfaces_exception_type_in_error( | ||
| monkeypatch: pytest.MonkeyPatch, tmp_path: pytest.TempPathFactory | ||
| ) -> None: |
| """The message names every ROS2-side tool a DDS-only adapter cannot serve, | ||
| so the LLM caller does not need to introspect the protocol to know what is | ||
| blocked.""" | ||
| for tool in ("list_topics", "get_topic_info", "sample_messages", "analyze_bag"): |
| f"Fast DDS DomainParticipant creation returned None on domain " | ||
| f"{domain_id}. Likely an ABI mismatch between the `fastdds` Python " | ||
| f"binding and the installed Fast DDS core library — pin " | ||
| f"`fastdds>=2.6.1,<3` and reinstall, or check the FastDDS_DEFAULT_PROFILES_FILE " |
Comment on lines
+119
to
+123
| > Fast DDS DomainParticipant creation returned None on domain `{id}`. | ||
| > Likely an ABI mismatch between the `fastdds` Python binding and the | ||
| > installed Fast DDS core library — pin `fastdds>=2.6.1,<3` and | ||
| > reinstall, or check the `FastDDS_DEFAULT_PROFILES_FILE` env var if | ||
| > you set one. |
| binding wheels frequently desynchronize with system-installed Fast | ||
| DDS native libraries, and the v0.4.0 wording masked the cause behind | ||
| a bare `"returned None"`. New message points at the pyproject pin | ||
| (`fastdds>=2.6.1,<3`) and the `FastDDS_DEFAULT_PROFILES_FILE` env |
| attributes: | ||
| label: Quick checks | ||
| options: | ||
| - label: I've read [docs/TROUBLESHOOTING.md](../blob/main/docs/TROUBLESHOOTING.md) and my error isn't covered there. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the v0.5.0 polish-and-validation sprint — the last sprint before marketing publication. See
CHANGELOG.md[Unreleased]for the full per-sub-milestone breakdown.Summary
No new MCP tool, no schema change, no env-var rename. Three sub-milestones :
{ubuntu-latest, windows-latest} × {3.11, 3.12, 3.13}(6 cells, fail-fast: false). Python 3.13 classifier added.services/inspector.py:76TODO retired as WONT-FIX,audit-followup-triage-v0.2.0.mdfully re-walked (B6 / B9 / B10 CLOSED, B1-B5 / B7 / B8 DEFER).MIGRATION_v0.3_to_v0.4.md/TROUBLESHOOTING.md/examples/(4 walkthroughs), repo polish files (CONTRIBUTING.md,SECURITY.md, ISSUE_TEMPLATEs, PR_TEMPLATE).Test plan
python -m pytest -q→ 399 passed, 24 skipped (was 394 baseline + 5 new tests)python -m ruff check src tests→ cleanpython -m ruff format --check src tests→ cleanBackward-compatibility checklist
tests/test_telemetry.py)DDS_ONLY_ERROR_MSGsubstring tokens preserved ("DDS observability only","TOPICFORGE_DDS_BACKEND","TOPICFORGE_MODE") — existingpytest.raises(match=...)contracts honoredNotes for the maintainer
[Unreleased]section is fully populated. The version bump +v0.5.0tag are deliberate manual steps after final review (same pattern as v0.4.0).CODE_OF_CONDUCT.mdintentionally skipped this sprint — pointer-only via CONTRIBUTING.md if you want the Contributor Covenant link added later._decode_status="full"outside the README hedge wording.