Skip to content

V0.9.2/one prompt eval - #41

Closed
gimlichael wants to merge 36 commits into
mainfrom
v0.9.2/one-prompt-eval
Closed

V0.9.2/one prompt eval#41
gimlichael wants to merge 36 commits into
mainfrom
v0.9.2/one-prompt-eval

Conversation

@gimlichael

Copy link
Copy Markdown
Member

This pull request updates the AGENTS.md documentation to clarify and refine the rules around evaluation package execution, especially regarding explicit user-directed evals using the yolo or auto modifiers. The changes introduce a narrowly-scoped, one-shot external Eval Orchestrator handoff flow, and tighten the requirements for model/harness selection and agent roles during eval preparation and execution. The documentation now more clearly distinguishes between routine/manual and explicitly authorized automated eval handoffs, and details the technical and policy boundaries for each.

Explicit Eval Handoff Flow:

  • Added a new section describing an optional, explicitly authorized one-shot external Eval Orchestrator handoff for eval requests with yolo or auto, detailing when and how this handoff is allowed, and the technical steps for invoking it using scripts/eval-request.ps1 and Invoke-EvalRequest.

Eval Preparation and Execution Rules:

  • Clarified that normal eval requests result in package preparation and manual handoff, while explicit yolo/auto requests authorize the one-shot external handoff. Updated the preparation and execution sections to reflect this distinction and to specify that only the explicit modifier can trigger automatic handoff. [1] [2] [3]
  • Updated agent role definitions and restrictions to specify that the preparer context cannot execute its own package, but a fresh external Orchestrator authorized by the user may do so for that package only.

Model/Harness Selection and Discovery:

  • Tightened requirements for harness/model selection: discovery is only performed when the user has not supplied a harness, and never without an explicit runner. The documentation now prohibits reconfirmation of supplied runners and clarifies the handling of OpenCode selectors and repository defaults.

Skill-Creator Integration:

  • Updated the skill-creator section to reflect the new explicit handoff flow, clarifying that repository-side validation remains deterministic, and only the explicitly user-directed external executor performs model-backed evaluation and reporting.

aicia-bot and others added 4 commits September 7, 2026 21:04
Adds guidance for optional one-shot external handoff when user explicitly requests evaluation with yolo/auto modifier. Clarifies the boundary between preparation (deterministic) and execution (external handoff). Updates roles for preparer and executor, specifying when explicit eval requests authorize automatic handoff versus manual handoff. Normalizes harness naming and improves model discovery guidance.
Introduces eval-request.ps1 helper script that provides deterministic, model-free eval request workflow for agents. Handles decision logic between manual handoff (preparation-only) and external handoff (with explicit yolo/auto authorization). Includes comprehensive test coverage exercising all runner/model normalization paths and handoff state transitions. Adds PassThru parameter to prepare-skill-evals.ps1 for returning prepared prompt paths. Adds runner normalization to handle user-facing names (GitHub Copilot, Copilot CLI). Integrates validator coverage for eval request workflow in validate-skill-templates.ps1.
Updates repository README to document the eval request workflow and optional one-shot external handoff feature. Clarifies when and how explicit yolo/auto modifiers authorize automatic delegation to external Eval Orchestrators. Reflects the deterministic preparation model and handoff boundaries for agents preparing skill evaluation packages.
@gimlichael gimlichael self-assigned this Sep 7, 2026
@greptile-apps

greptile-apps Bot commented Sep 7, 2026

Copy link
Copy Markdown

RetriggerConfidence Score: 1/5

The PR is not yet safe to merge because isolation can miss out-of-projection accesses, and two earlier one-shot lifecycle defects remain unresolved.

Fix All in CodexFindings

  1. P1 Security Relative Paths Bypass Isolation
  2. P1 Forced Retry Erases Reservation
  3. P1 Terminal Result Is Unbound
  4. P2 Prohibited Temporary Git History
Fix with agent prompt
### Issue 1
scripts/eval-runners/runner-common.ps1:440-444
If a captured path is home-relative, such as `~/secret.txt`, or Windows drive-relative, such as `C:..\..\Windows\System32`, it matches none of the absolute-path branches. This code instead appends its segments to the projection base, so the Copilot and OpenCode boundary checks treat an actual out-of-projection access as inside and do not record an isolation contradiction.

**How this was verified:** The parser handles only slash-rooted, drive-rooted, and UNC paths specially, then joins every other path to the projection base before the Copilot and OpenCode checks decide whether the access is inside.

### Issue 2
scripts/eval-request.ps1:undefined-327
When `Invoke-EvalRequest` is retried with the same `Iteration` and `Force` preparation options, it reruns preparation before checking the handoff reservation. Because `Force` deletes and recreates the iteration directory containing `.external-handoff-started`, `Get-EvalHandoff` returns `external_handoff` again for the same path. After a timeout or interrupted launch, this can delete active execution state and dispatch a second model-backed evaluation despite the one-shot guarantee.

### Issue 3
scripts/eval-request.ps1:239-265
`Update-ExternalEvalOrchestratorState` marks the lifecycle as terminal based only on the caller-supplied status. Although it checks the separate wait handle, it accepts a missing terminal result or one whose handle and status do not match the transition. A host adapter can therefore report completion for the wrong task-or without any result-and stop waiting on the retained handle before the real evaluation outcome arrives. Require terminal transitions to include a result bound to the retained handle and matching terminal status.

### Issue 4
scripts/eval-git-workspace.ps1:35-49
This helper renames a branch, checks out a temporary feature branch, stages changes, and creates throwaway commits. The repository directive explicitly forbids temporary Git repositories, test branches, and throwaway commits. This repository requirement must be satisfied before merging, either by representing the fixture without this prohibited workflow or by intentionally narrowing the directive.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

  • Adds deterministic preparation, reservation, and external-Orchestrator lifecycle helpers.
  • Extends runner isolation, grading, result finalization, and reporting contracts.
  • Adds extensive PowerShell regression and conformance tests.
  • Refines repository guidance for model selection, automated handoff authorization, and isolated Git fixtures.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Explicit eval request] --> B[Prepare and validate package]
  B --> C{Yolo or auto authorized?}
  C -- No --> D[Manual prompt handoff]
  C -- Yes --> E{Fresh Orchestrator available?}
  E -- No --> D
  E -- Yes --> F[Reserve one-shot handoff]
  F --> G[Delegate fresh Orchestrator]
  G --> H[Execute paired arms]
  H --> I[Freeze execution evidence]
  I --> J[Analyze and grade]
  J --> K[Finalize report]
Loading

Reviews (16) · Last reviewed commit: "♻️ extract path utilities and add contai..."

Comment thread scripts/eval-request.ps1
if ($Preparation.ContainsKey('CollectResults')) { throw 'An eval request prepares packages; CollectResults is a separate forensic workflow.' }
$arguments = $Preparation.Clone()
$arguments.PassThru = $true
$paths = @(& (Join-Path $PSScriptRoot 'prepare-skill-evals.ps1') @arguments)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Forced Retry Erases Reservation

When Invoke-EvalRequest is retried with the same Iteration and Force preparation options, it reruns preparation before checking the handoff reservation. Because Force deletes and recreates the iteration directory containing .external-handoff-started, Get-EvalHandoff returns external_handoff again for the same path. After a timeout or interrupted launch, this can delete active execution state and dispatch a second model-backed evaluation despite the one-shot guarantee.

Prompt To Fix With AI
This is a comment left during a code review.
Path: scripts/eval-request.ps1
Line: 68

Comment:
**Forced Retry Erases Reservation**

When `Invoke-EvalRequest` is retried with the same `Iteration` and `Force` preparation options, it reruns preparation before checking the handoff reservation. Because `Force` deletes and recreates the iteration directory containing `.external-handoff-started`, `Get-EvalHandoff` returns `external_handoff` again for the same path. After a timeout or interrupted launch, this can delete active execution state and dispatch a second model-backed evaluation despite the one-shot guarantee.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Codex

Add safeguards to prevent -Force from replacing eval packages that have already started handoff or execution. This protects the one-shot eval workflow from accidental data loss. New tests validate that the guard works correctly and that packages remain unchanged when Force is rejected.
Rename ExternalOrchestratorAvailable to CanDelegateFreshOrchestrator for semantic clarity about what capability is being tested. Add compatibility alias to preserve existing call sites. Formally document GitHub Copilot CLI task + general-purpose agent delegation as a valid external-orchestrator capability. Add guard to prevent Copilot from replacing the repository-defined default model with a subjective stronger choice. Update all tests and validators to match the new naming and expectations.
Add comprehensive authentication validation and fail-closed behavior to the GitHub Copilot runner. The runner now detects when supported non-interactive authentication sources are unavailable (explicit tokens or trusted GitHub CLI fallback) and terminates evaluation preemptively rather than attempting execution without required auth. New test scenarios cover fresh-context environments and missing auth states. Updated handoff prompt generation documents that authentication incompatibility is terminal for the package iteration, preventing suggestions for runner switching or Phase 1 retries.
Update eval-runners README to explain Copilot authentication requirements and fail-closed behavior. Documents the fresh-context authentication testing strategy, the GitHub CLI token fallback mechanism, and the fail-closed incompatibility policy that prevents evaluation execution when required non-interactive authentication sources are unavailable.
Comment thread scripts/eval-runners/github-copilot/runner.ps1
Update repository documentation with eval infrastructure details, workspace git scenario support, Copilot eval worker projection requirements, and grading contract specifications. These changes reflect improvements to the portable eval handoff and runner integrity requirements.
Implement boundary violation detection for Copilot eval workers with physical projection outside package ancestry. Add isolation.ps1 support, enhance grading contract to enforce source-backed assertion evidence, update eval schema with new requirements, and fix git environment variable preservation in eval workspace initialization. Add eval-git-workspace.ps1 to support declarative git scenario setup for evaluations with staged commits and repository history.
Add comprehensive eval cases for dotnet-change-impact skill including test fixtures for API compatibility analysis, breaking change detection, and version impact assessment. Evaluation cases cover .NET library scenarios with fixture files demonstrating package changes and dependency impacts.
Test deterministic package preparation for dotnet-change-impact eval 9 with real git repository staging. Validates paired git history consistency, feature branch setup, default branch fallback resolution, meaningful API diffs, and safety checks for declarative git scenarios including path-traversal rejection.
Enhanced git-visual-commits to fully document scope rules for tracked, staged, unstaged, deleted, renamed, and non-ignored untracked files including contents of new directories. Extracted detailed grouping examples and release-adjacent splitting guidance to a new references/grouping-examples.md for better maintainability. Added three new test cases (26–28) covering untracked file discovery, path reconciliation with hidden status, and explicit scope narrowing.
Updated validate-skill-templates.ps1 to check for the new references/grouping-examples.md file and verify its content contains the release-adjacent splitting rules and repo-aligned grouping examples that were extracted from SKILL.md.
Updated README.md to document new git-visual-commits capabilities: full inventory of tracked, staged, unstaged, and non-ignored untracked files; individual file enumeration inside new directories; exact path reconciliation before staging; and final remaining-change verification. Updated skill table description to reflect these improvements.
Comment on lines +35 to +49
Invoke-ScenarioGit -Arguments @('branch', '-m', [string]$Scenario.base_branch)
# Local tracking refs and symbolic HEAD exercise default resolution
# without a network remote or paths back to the package.
Invoke-ScenarioGit -Arguments @('update-ref', "refs/remotes/origin/$($Scenario.base_branch)", 'HEAD')
Invoke-ScenarioGit -Arguments @('symbolic-ref', 'refs/remotes/origin/HEAD', "refs/remotes/origin/$($Scenario.base_branch)")
Invoke-ScenarioGit -Arguments @('checkout', '-b', [string]$Scenario.feature_branch, '--quiet')
foreach ($commit in $Scenario.commits) {
foreach ($file in $commit.files.PSObject.Properties) {
$path = [IO.Path]::GetFullPath((Join-Path $RepoDirectory $file.Name))
if (-not $path.StartsWith([IO.Path]::GetFullPath($RepoDirectory) + [IO.Path]::DirectorySeparatorChar, [StringComparison]::OrdinalIgnoreCase)) { throw 'Git scenario path escaped repo.' }
if ($null -eq $file.Value) { if (Test-Path -LiteralPath $path) { Remove-Item -LiteralPath $path -Force } }
else { [void][IO.Directory]::CreateDirectory((Split-Path -Parent $path)); [IO.File]::WriteAllText($path, $file.Value, [Text.UTF8Encoding]::new($false)) }
}
Invoke-ScenarioGit -Arguments @('add', '-A')
Invoke-ScenarioGit -Arguments @('commit', '--quiet', '-m', [string]$commit.message)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Prohibited Temporary Git History

This helper renames a branch, checks out a temporary feature branch, stages changes, and creates throwaway commits. The repository directive explicitly forbids temporary Git repositories, test branches, and throwaway commits. This repository requirement must be satisfied before merging, either by representing the fixture without this prohibited workflow or by intentionally narrowing the directive.

Context Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: scripts/eval-git-workspace.ps1
Line: 35-49

Comment:
**Prohibited Temporary Git History**

This helper renames a branch, checks out a temporary feature branch, stages changes, and creates throwaway commits. The repository directive explicitly forbids temporary Git repositories, test branches, and throwaway commits. This repository requirement must be satisfied before merging, either by representing the fixture without this prohibited workflow or by intentionally narrowing the directive.

**Context Used:** AGENTS.md ([source](https://github.com/codebeltnet/agentic/blob/main/AGENTS.md))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Codex

Add proper handling for Unix-style temporary directories and environment variables. Runner now respects RunPath property for projected inputs that use /tmp directly. Tests isolate TMPDIR alongside TEMP/TMP, and GitHub CLI config path is now platform-aware to handle Unix vs Windows conventions correctly.
Comment thread scripts/eval-runners/runner-common.ps1
gimlichael and others added 5 commits September 8, 2026 23:10
Make explicit GH_CONFIG_DIR authoritative during trusted GitHub CLI token resolution for Copilot runs. If that selected configuration cannot resolve a token, preflight now fails closed instead of silently probing other config roots or ambient identity.

Add deterministic regressions that prove explicit GH_CONFIG_DIR success, explicit GH_CONFIG_DIR fail-closed behavior, no fallback probing to alternate configs, and no token value leakage in evidence or output.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Clarify that temporary Git repos, branches, and throwaway commits are forbidden in the real source working tree while deterministic synthetic Git history remains allowed only inside isolated disposable eval fixtures under approved workspace roots.

Keep the rule narrow by preserving the existing anti-pollution guardrails and adding deterministic wording checks so this distinction remains explicit across AGENTS, README, and validation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace ambiguous yes/no/possible answers in Compatibility Impact section with explicit categorical values: Compatible, Breaking, or Potentially breaking. This eliminates self-contradictory answers and clarifies the interpretation of each category for skill users.

Simplify the eval prompt to be tool-agnostic, improving evaluation consistency across different harnesses.
Add support for independent analyzer/grader configuration in the evaluation framework, allowing the same validator to grade results from different AI providers. This enables more flexible and reusable evaluation infrastructure.

Implement shell environment isolation for Codex runner execution with sanitized PATH, SystemRoot, ComSpec, and PATHEXT variables. Enhance GitHub Copilot runner with improved boundary violation tracking and execution control. Update eval-grading-contract and validation scripts to support the new analyzer profile schema. Extend generate-eval-report with enhanced metadata handling for benchmark execution models.
Update test fixtures and test suites to support new evaluation framework capabilities: analyzer/grader configuration, shell environment isolation, and runner boundary validation. Enhance copilot-help fixtures and add comprehensive validation for runner conformance, codex paths, copilot boundaries, and integrity finalization.
Comment thread scripts/eval-runners/github-copilot/isolation.ps1 Outdated
gimlichael and others added 2 commits September 9, 2026 20:54
Phase 2 grading now runs through a package-local controller that validates analyzer identity, freezes provenance, and derives grading.json before finalization. This also closes the deterministic CI regressions with target-platform path string construction and separate offline catalog injection for executor and analyzer model validation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The README and runner contract documentation now describe the independent analyzer default, Phase 2 controller, evidence refs, grading freeze, and separate executor/analyzer cost reporting.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread scripts/eval-runners/invoke-phase2-analyzer.ps1
Comment thread scripts/eval-runners/invoke-phase2-analyzer.ps1
gimlichael and others added 2 commits September 9, 2026 21:11
Eval-request regression coverage now supplies the analyzer catalog fixture separately from the executor catalog, matching the preparation contract on CI hosts without Copilot installed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The analyzer-model negative now asserts the fail-closed preparation invariant without depending on host-specific PowerShell error formatting.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread scripts/validate-skill-templates.ps1
gimlichael and others added 3 commits September 9, 2026 21:30
The validation matrix timeout now accommodates the deterministic Phase 2 controller suites that CI must run to prove analyzer provenance and finalization enforcement.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This update improves the eval runner system to better handle transcript artifacts and strengthen validation checks. Changes include staging transcript artifacts when assertions require transcript-domain evidence, enhancing phase2 analysis with transcript event parsing, and tightening contract validation for candidate instruction hashes in with_skill runs.
This update improves the test infrastructure supporting eval runners and strengthens validation logic. Changes include refactoring test scenarios for better terminal state handling and timeout conditions, enhancing validator checks for analyzer model diagnostics, and maintaining test infrastructure alignment with eval runner improvements.
Comment thread scripts/eval-request.ps1
Comment thread scripts/eval-runners/invoke-phase2-analyzer.ps1 Outdated
aicia-bot and others added 7 commits September 10, 2026 01:55
Tighten explicit eval handoff provenance to require a prepared package, preserve transcript artifact identity during Phase 2 staging, and require exact transcript locators so transcript grading fails closed on ambiguous or cross-artifact evidence.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Persist the final RUN-THIS.prompt.md SHA-256 in the prepared manifest and verify it before any handoff reservation. This makes prompt tampering fail closed while preserving normal manual and yolo handoff flows.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Document the new explicit state machine for eval handoff decisions, including confirmation_required, dispatch_immediately, and max_new_external_orchestrators fields. Clarify that external_handoff authorization is complete and does not require further user confirmation. Explain the orchestrator handle lifecycle and bounded wait semantics for remaining running state.
Add New-EvalHandoffDecision function to construct machine-readable handoff decisions with explicit state fields: confirmation_required, dispatch_immediately, max_new_external_orchestrators, and same_handle_required. Add Assert-ExternalEvalHandoffDecision to validate decisions meet the one-shot handoff contract. Update helper descriptions to reflect explicit state machine semantics and New-ExternalEvalOrchestratorState / Update-ExternalEvalOrchestratorState lifecycle management. Include corresponding test updates for new decision validation.
Add validation enhancements to skill template checking script to support updated eval request and decision workflow validation.
Add new boundary context and validation functions to isolation.ps1 for detecting and validating worker data boundaries. Implement Unix-style path resolution and path info extraction in runner-common.ps1 to support cross-platform isolation checks. Enhance phase2-analyzer with allowed artifact tracking and execution role metadata. Improve github-copilot runner isolation handling and opencode runner conformance support.
Add comprehensive test suite for eval-runner isolation and conformance validation. test-copilot-boundaries.ps1 validates GitHub Copilot CLI boundary enforcement. test-integrity-finalization.ps1 verifies execution freeze and result integrity. test-orchestration.ps1 tests runner coordination and phase workflows. test-runner-conformance.ps1 validates runner protocol compliance and worker isolation contracts.
Comment thread scripts/eval-request.ps1
Comment on lines +239 to +265
status = 'completed'
terminal = $true
native_handle = $expectedHandle
wait_count = $waitCount
same_handle_required = $true
pending_wait_action = 'none'
max_new_external_orchestrators = 0
terminal_result = $TerminalResult
reason = 'The same external Eval Orchestrator reached a true terminal completed state.'
}
}
'failed' {
return [pscustomobject][ordered]@{
schema = 'codebeltnet/agentic/eval-orchestrator-lifecycle/1'
prompt_path = $promptPath
status = 'failed'
terminal = $true
native_handle = $expectedHandle
wait_count = $waitCount
same_handle_required = $true
pending_wait_action = 'none'
max_new_external_orchestrators = 0
terminal_result = $TerminalResult
reason = 'The same external Eval Orchestrator reached a true terminal failed state.'
}
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Terminal Result Is Unbound

Update-ExternalEvalOrchestratorState marks the lifecycle as terminal based only on the caller-supplied status. Although it checks the separate wait handle, it accepts a missing terminal result or one whose handle and status do not match the transition. A host adapter can therefore report completion for the wrong task—or without any result—and stop waiting on the retained handle before the real evaluation outcome arrives. Require terminal transitions to include a result bound to the retained handle and matching terminal status.

Prompt To Fix With AI
This is a comment left during a code review.
Path: scripts/eval-request.ps1
Line: 239-265

Comment:
**Terminal Result Is Unbound**

`Update-ExternalEvalOrchestratorState` marks the lifecycle as terminal based only on the caller-supplied status. Although it checks the separate wait handle, it accepts a missing terminal result or one whose handle and status do not match the transition. A host adapter can therefore report completion for the wrong task—or without any result—and stop waiting on the retained handle before the real evaluation outcome arrives. Require terminal transitions to include a result bound to the retained handle and matching terminal status.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Codex

Refactor path handling across eval runners by extracting common utilities into runner-common.ps1. Adds Get-ObservedPathSegments, Resolve-ObservedPathSegments, Join-ObservedPath, New-ObservedPathInfo, Get-ObservedParentPath, and Get-ObservedRelativePath functions to centralize path logic and improve maintainability. Replace inline path resolution in github-copilot/isolation.ps1 and opencode/runner.ps1 to use these utilities. Add comprehensive test coverage in test-runner-conformance.ps1 for path containment across Windows, Unix, and UNC styles.
Comment on lines +440 to +444
if ([string]::IsNullOrWhiteSpace($BasePath)) { return $null }
$baseInfo = Get-ObservedPathInfo -Path $BasePath
if ($null -eq $baseInfo) { return $null }
$segments = Resolve-ObservedPathSegments -BaseSegments @($baseInfo.Segments) -PathSegments (Get-ObservedPathSegments -PathText $trimmed)
return New-ObservedPathInfo -Style ([string]$baseInfo.Style) -Root ([string]$baseInfo.Root) -Segments $segments -Raw $trimmed -Absolute $false

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 security Relative Paths Bypass Isolation

If a captured path is home-relative, such as ~/secret.txt, or Windows drive-relative, such as C:..\..\Windows\System32, it matches none of the absolute-path branches. This code instead appends its segments to the projection base, so the Copilot and OpenCode boundary checks treat an actual out-of-projection access as inside and do not record an isolation contradiction.

How this was verified: The parser handles only slash-rooted, drive-rooted, and UNC paths specially, then joins every other path to the projection base before the Copilot and OpenCode checks decide whether the access is inside.

Prompt To Fix With AI
This is a comment left during a code review.
Path: scripts/eval-runners/runner-common.ps1
Line: 440-444

Comment:
**Relative Paths Bypass Isolation**

If a captured path is home-relative, such as `~/secret.txt`, or Windows drive-relative, such as `C:..\..\Windows\System32`, it matches none of the absolute-path branches. This code instead appends its segments to the projection base, so the Copilot and OpenCode boundary checks treat an actual out-of-projection access as inside and do not record an isolation contradiction.

**How this was verified:** The parser handles only slash-rooted, drive-rooted, and UNC paths specially, then joins every other path to the projection base before the Copilot and OpenCode checks decide whether the access is inside.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Codex

@gimlichael

Copy link
Copy Markdown
Member Author

Closing this for now.

The work in this PR has been valuable in exposing several real challenges around portable, isolated, model-backed skill evaluation across Copilot, Codex, and OpenCode. We made meaningful progress on runner isolation, deterministic validation, execution evidence, model locking, and reproducibility.

However, the latest end-to-end runs have also shown that the orchestration and proof machinery is becoming disproportionately complex. We are starting to spend more effort making the evaluation framework evaluate itself than evaluating the skills it was created for.

Rather than continue adding more guards, state transitions, and runner-specific exceptions, I want to stop here and reassess the approach.

The next step will be to explore whether an existing, more scalable evaluation framework or established pattern can give us the guarantees we need without reinventing the wheel. If we return to a custom implementation, it should be materially simpler than the architecture in this PR and build on the lessons learned here.

So this is not necessarily the end of the idea, but it is the end of this iteration.

Closing PR #41 without merging.

@gimlichael gimlichael closed this Sep 10, 2026
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.

2 participants