Skip to content

fix(examples): isolate Python API demos from caller queues - #168

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/156-isolated-python-examples
Sep 19, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/156-isolated-python-examples

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Running Python API demonstrations from a project could discover its real .planfile and add sample tickets. Every executable demo and imported example now uses a disposable store; nested demonstrations share it and cleanup restores the caller's directory even after exceptions. The runner covers all seven scripts without installing packages or calling external sync.

Align examples and TicketLogger with the current name API, demonstrate analytics through supported methods, and surface DSL errors. Existing project tickets remain untouched. Governed ownership prerequisite: #167. Native ticket PLF-081; delivery ticket-156. Closes #165.

Validation: 701 tests passed, 6 optional tests skipped; 10 new regressions execute actual demos from a sentinel project and verify byte-for-byte queue preservation, cleanup and logger persistence. Changed-scope Ruff and governance pass. Protected hosted/OneDev checks and independent Validator approval remain required before merge.

@ifuri-validator-agent ifuri-validator-agent 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.

Validator approval after policy checks for exact head e586e3a5a90f8c917be6d596f9fa5a5723f553b1.

Ticket: ticket-156
Correlation ID: local-semcod-planfile-pr-168-ticket-156
Model: zai/glm-5.3
Reviewed diff chunks: 4
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 4 diff chunk(s). Chunk 1 of 4 shows examples updated to the new name/project_dir/base_dir API, with an isolated_demo decorator ensuring disposable stores so demos cannot write to a real project's .planfile. All required protected checks passed; no code or security concerns in this chunk. | Chunk 2 of the Python API examples refactor. Examples now run against disposable, isolated demo stores instead of a discovered real project store, DSL failures are surfaced instead of printed as success, and ticket field usage is aligned with the current name API. All required checks (ci-loop, notify, freshness, both governance checks, tests on 3.10/3.13) pass; the observational onedev/local-verify check also passes. No defects visible in this chunk. | Chunk adds a disposable-store helper for Python API examples, aligns TicketLogger with the name argument, updates the shell runner, and adds regression tests that execute each demo from a sentinel project and verify byte-for-byte queue preservation and cleanup. The contextmanager correctly restores cwd and the ContextVar even on failure, and nested demos share one store. All required protected checks (ci-loop, notify, freshness, governance, tests on 3.10/3.13) pass; onedev/local-verify is observational and also passing. Test coverage matches the stated acceptance criteria. | Final diff chunk adds regression tests for demo_store cleanup semantics (cwd restoration, store removal on exception, nested store reuse) and TicketLogger behavior (error/warning naming, context persistence, catch_errors re-raise). All required protected checks pass; PR body reports 701 tests passing with only optional skips. No blocking or security concerns in visible code.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: not_required; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.

Actual PR impact radar

Exact range: 45546de9ed645a2e92c1f9ff8c855a645f0c3c57...e586e3a5a90f8c917be6d596f9fa5a5723f553b1
Change digest: b780874950a72af0a0c15a02749a0edee603aea7b0b952c6b40764f7e15b1a49
Score: 72/100 (L), estimated 165 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":404,"base_sha":"45546de9ed645a2e92c1f9ff8c855a645f0c3c57","binary_files":0,"categories":{"code":10,"configuration":1,"docs":2,"tests":1},"change_digest":"b780874950a72af0a0c15a02749a0edee603aea7b0b952c6b40764f7e15b1a49","comparison":"45546de9ed645a2e92c1f9ff8c855a645f0c3c57...e586e3a5a90f8c917be6d596f9fa5a5723f553b1","deletions":214,"file_count":14,"files":["examples/python-api/01_basic_usage.py","examples/python-api/02_ticket_management.py","examples/python-api/03_integration.py","examples/python-api/03_integration_simple.py","examples/python-api/04_advanced_filtering.py","examples/python-api/04_analytics_simple.py","examples/python-api/05_dsl_usage.py","examples/python-api/README.md","examples/python-api/demo_store.py","examples/python-api/run_all.sh","planfile/extensions/__init__.py","project/ticket-156/README.md","project/ticket-156/intent.json","tests/test_python_api_examples.py"],"head_sha":"e586e3a5a90f8c917be6d596f9fa5a5723f553b1","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":5,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":165,"within_budget":false},"impact":{"components":["examples","hosted","planfile","project","tests"],"files":["examples/python-api/01_basic_usage.py","examples/python-api/02_ticket_management.py","examples/python-api/03_integration.py","examples/python-api/03_integration_simple.py","examples/python-api/04_advanced_filtering.py","examples/python-api/04_analytics_simple.py","examples/python-api/05_dsl_usage.py","examples/python-api/README.md","examples/python-api/demo_store.py","examples/python-api/run_all.sh","hosted/OneDev","planfile/extensions/__init__.py","project/ticket-156/README.md","project/ticket-156/intent.json","tests/test_python_api_examples.py"],"public_interfaces":["examples/python-api/01_basic_usage.py","examples/python-api/02_ticket_management.py","examples/python-api/03_integration.py","examples/python-api/03_integration_simple.py","examples/python-api/04_advanced_filtering.py","examples/python-api/04_analytics_simple.py","examples/python-api/05_dsl_usage.py","examples/python-api/README.md","examples/python-api/demo_store.py","examples/python-api/run_all.sh"],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":72,"split":{"parts":[{"estimated_minutes":20,"name":"Define contract and acceptance boundary","scope":["examples/python-api/01_basic_usage.py","examples/python-api/02_ticket_management.py","examples/python-api/03_integration.py","examples/python-api/03_integration_simple.py","examples/python-api/04_advanced_filtering.py","examples/python-api/04_analytics_simple.py","examples/python-api/05_dsl_usage.py","examples/python-api/README.md","examples/python-api/demo_store.py","examples/python-api/run_all.sh"]},{"estimated_minutes":27,"name":"Implement examples","scope":["examples"]},{"estimated_minutes":27,"name":"Implement hosted","scope":["hosted"]},{"estimated_minutes":27,"name":"Implement planfile","scope":["planfile"]},{"estimated_minutes":27,"name":"Implement project","scope":["project"]},{"estimated_minutes":27,"name":"Implement tests","scope":["tests"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-156"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-156: fix(examples): isolate Python API demos from caller queues</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,21 105,51 79,85 54,78 39,56" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 165m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-156-5721
TICKET ticket-156
HEAD_SHA e586e3a5a90f8c917be6d596f9fa5a5723f553b1
CORRELATION_ID local-semcod-planfile-pr-168-ticket-156
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["notify=PASS","test (3.13)=PASS","governance / enforce=PASS","ci-loop=PASS","test (3.10)=PASS","governance / remote lifecycle=PASS","freshness=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["ci-loop","notify","freshness","governance / remote lifecycle","governance / enforce","test (3.10)","test (3.13)"]
INPUT required_checks_source = "protected registry + GitHub applied rules (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/planfile","pull_request":168,"head_sha":"e586e3a5a90f8c917be6d596f9fa5a5723f553b1","base_sha":"45546de9ed645a2e92c1f9ff8c855a645f0c3c57","diff_sha256":"e42bbd13c927fe32b484c2a4693b45dcfbac3922f6e9090d8f7ba7effa50eb9c"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["examples/python-api/01_basic_usage.py","examples/python-api/02_ticket_management.py","examples/python-api/03_integration.py","examples/python-api/03_integration_simple.py","examples/python-api/04_advanced_filtering.py","examples/python-api/04_analytics_simple.py","examples/python-api/05_dsl_usage.py","examples/python-api/README.md","examples/python-api/demo_store.py","examples/python-api/run_all.sh","planfile/extensions/__init__.py","project/ticket-156/README.md","project/ticket-156/intent.json","tests/test_python_api_examples.py"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"not_required","reason":null,"review_sha256":null,"unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"45546de9ed645a2e92c1f9ff8c855a645f0c3c57","head_sha":"e586e3a5a90f8c917be6d596f9fa5a5723f553b1","change_digest":"b780874950a72af0a0c15a02749a0edee603aea7b0b952c6b40764f7e15b1a49","score":72,"complexity":"L","estimated_minutes":165,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "zai/glm-5.3"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit 3c261d6 into main Sep 19, 2026
8 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/156-isolated-python-examples branch September 19, 2026 16:42
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.

Run Python API demos in an isolated store and align examples with current API

1 participant