Skip to content

fix(product): worker python is the product's env; advisor-cap text; skip defers (I-114 to I-118) - #71

Merged
NewMe505 merged 4 commits into
mainfrom
fix/69-graphcalc-s5
Oct 30, 2026
Merged

NewMe505 merged 4 commits into
mainfrom
fix/69-graphcalc-s5

Conversation

@NewMe505

@NewMe505 NewMe505 commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Summary

The bugs behind the graphcalc run's S5, where P4 halted twice on its environment and never on the math. Built by three parallel agents (one per fix, owned files); then an independent review of the whole diff, whose three findings are fixed here too.

Closes #69

Plan vs. done

Bug Fix Regression evidence (fails on main)
I-114: a Claude Code worker turn's python was SCIO's own environment, so P4 could not import the approved sympy with_interpreter_first: the product interpreter's directory first on PATH (VIRTUAL_ENV set), for the worker's claude -p calls, every LocalSandbox.exec command and the local app start; the Windows bare-word lookup uses that PATH (review); BACKEND_NOTE says python is the product's test_worker_turn_runs_with_the_product_interpreter_first_on_path, test_every_local_command_runs_with_the_product_interpreter_first_on_path, test_a_bare_command_word_resolves_through_the_product_first_path (Windows)
I-115: advisor cap hit (2/3, step S1a) when the per-step cap fired the halt names the cap that fired test_halt_reason_names_the_per_step_cap_when_the_total_has_headroom
I-116: skip dropped a feature for good the owner's decision, skip defers: skipped stays open; FeatureRun.milestone, so a skip finishes a feature only in its own milestone; per-milestone cost counts its own runs; the release refuses while a feature is not done; the PR closes only passed features' issues; PRODUCT.md is re-read inside the progress commit (review) and at the release stop (review); older skips are stamped when a milestone closes (review) test_a_skipped_feature_is_deferred_to_the_next_milestone_not_dropped (end to end), test_closing_a_milestone_stamps_runs_recorded_before_the_milestone_field, test_a_feature_added_at_the_release_stop_holds_the_release, and four more in the ledger entry
I-117: a subagent's edit through a shell script with \n nothing damaged; guardrail 17 extended —
I-118: the full check caught a shutil.which fake left at one argument after the review fix the fake takes path; guardrail 38 the fixed test

Guardrails 35 to 37 (20 to 34 are PR #70's, so neither renumbers).

Test evidence

ruff check . && ruff format --check . && mypy && python -m pytest && python scripts/check_docs.py && python -m evals.runner --suite regression --provider fake --trials 5 --min-pass-pow-k 1.0
401 passed, 18 skipped in 879 s; docs-check: 0 problem(s); pass@1 1.00 pass^5 1.00 (10 tasks)   # on 8748b41, serial, clean worktree

CI on 8748b41 (run 40647941438): checks 413 passed, 6 skipped (the new Windows-only test skips on Linux); docker-live 15 of 15.
After merging main (the dashboard, #70; shared-file conflicts kept both sides): local check on f784381 500 passed, 18 skipped, pass^5 1.00; CI (run 41089330746) checks 512 passed, 6 skipped, docker-live 15 of 15.

Docs updated

  • README (skip defers; status line)
  • docs/ARCHITECTURE.md (the feature loop's skip)
  • ADR (0011 amended: skip defers, the owner's decision)
  • CHANGELOG [Unreleased]
  • Docstrings for changed public APIs
  • N/A: no user-facing or architectural change

Continuous improvement

Risk notes

  • LocalSandbox.exec now gives every product command the product's interpreter first on PATH; SCIO's own tools stay after it.
  • The worker tests stop at the process boundary: on the next live run, the coder's python -c "import sys; print(sys.executable)" should point under .scio/sandbox.
  • Merging after feat(dashboard): a live, read-only dashboard: scio dashboard (#68) #70 touches the same shared files (CHANGELOG, ledger, LESSONS_LEARNED); guardrail numbers do not collide.

🤖 Generated with Claude Code

NewMe505 and others added 3 commits October 27, 2026 22:41
…kip defers (#69)

I-114: a Claude Code worker turn, LocalSandbox.exec and the local app
start run with the product interpreter's directory first on PATH
(with_interpreter_first), so `python` is the product's environment with
its approved dependencies, not SCIO's own under uv run.
I-115: the advisor-cap halt names the cap that fired: the run's total or
one call per step.
I-116 (the owner's decision): skip defers a feature. It stays open, a
skip finishes it only in its own milestone (FeatureRun.milestone),
per-milestone costs count their own runs, the release refuses while a
feature is not done, the PR closes only passed features' issues, and
update_progress re-reads PRODUCT.md before it routes.
I-117: a subagent's shell-script edit, logged; guardrail 17 extended.
Guardrails 35 to 37 (20 to 34 are taken by PR #70).

Built by three parallel agents with owned files; integration, the
LocalSandbox and app-start sweep, docs and ledger by the orchestrator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An independent review of bb3ae7e found:
- a skip recorded by older code (milestone None) finished its feature in
  every later milestone, looping plan, pass-over and escalation; closing
  a milestone now stamps such runs (ProductBuildState.runs_stamped)
- update_progress re-read PRODUCT.md after its commit, so a release cut
  next tagged a main that disagreed with it; the re-read now happens
  inside the progress commit, which includes PRODUCT.md, and release
  re-checks PRODUCT.md after the human's release decision
- on Windows a bare command word resolved against SCIO's PATH, not the
  product-first one; resolve_command takes the command's PATH

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The I-114 review fix passes `path=` to shutil.which; the one test that
fakes it for resolve_command took one argument. Ledger I-118 and
guardrail 38.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@NewMe505
NewMe505 marked this pull request as ready for review October 30, 2026 15:57
Conflicts in the shared files, resolved by keeping both sides: the
CHANGELOG's Fixed entries, the README status line (the dashboard is
merged now), the ledger (I-114 to I-118, then I-120 to I-139), the
guardrails (rule 17 merges I-117 and I-131; 20 to 34 are the
dashboard's, 35 to 38 this branch's), and two appended build tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@NewMe505 NewMe505 mentioned this pull request Oct 30, 2026
2 tasks done
@NewMe505
NewMe505 merged commit 6e9da94 into main Oct 30, 2026
2 checks passed
NewMe505 added a commit that referenced this pull request Oct 30, 2026
PR #71's three fixes (I-114 to I-116) ship in 0.9.0: they stay under [0.9.0], the README status line lists issue #69 among the released graphcalc fixes, and the release date moves to the day of the tag. Guardrails 35 to 38 follow the dashboard's 20 to 34; the ledger runs I-114 to I-118, then I-120 to I-139.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

fix: worker python is SCIO's env; advisor-cap text; skip drops a feature (graphcalc S5)

1 participant