mirror of
https://github.com/norandom/OpenUltraSAST.git
synced 2026-10-16 03:49:26 +00:00
feat(slots): Phase 3 task 6.3 — model-disabled, slot-contracted deterministic stages
Express the deterministic scan stages as model-disabled processors carrying work in
named slots under a read/write allow-list validated on every lifecycle hook.
- slot_contract.py (zero-dep): SlotContractError, SlotContractMixin (reads_slots/
writes_slots/skip_model=True, validates reads pre-hook and writes post-hook),
SlotPipeline (runs stages in order, enforces the model-disabled invariant, emits
stage_start/stage_end lifecycle hooks). Preserves the ProcessorSpec.reads/writes
provenance discipline without forcing deterministic stages through HarnessX's agent
loop ("bridge, do not map").
- stage_processors.py: Preprocess/EntryPoint/Rank/QuickFindings/PolicyScoring/Score as
skip_model slot processors; run_quick_pipeline is byte-identical to the quick path.
host_under_harnessx is the lazy, capability-gated bridge that disables the model on
HarnessX's BeforeModelEvent.skip_model (proven against the real API when the extra
is present).
- 8.4 zero-dep guard hardened: now hermetic (subprocess) and covers the two new
modules; the module-level import scan flags only column-0 imports so the intended
lazy import inside host_under_harnessx is allowed.
The sync HarnessRuntime stays the top-level driver (design "stays through Phase 4");
these slot processors are the model-disabled representation, ready for Phase 5.
tests/test_slot_contract.py (8 tests). 153 passed, 3 skipped; ruff + mypy clean;
detection gate PASS.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
bebfc72cf7
commit
b9caeeb835
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"feature_name": "harnessx-self-improving-rulesets",
|
||||
"created_at": "2026-06-22T10:07:18Z",
|
||||
"updated_at": "2026-06-22T16:20:00Z",
|
||||
"updated_at": "2026-06-22T16:45:00Z",
|
||||
"language": "en",
|
||||
"phase": "implementation",
|
||||
"approvals": {
|
||||
|
||||
@@ -138,7 +138,7 @@ This plan splits the fused regex layer into three governed owners (rules detect,
|
||||
- _Boundary: Packaging Configuration_
|
||||
- _Depends: 5.1_
|
||||
|
||||
- [ ] 6. Adopt HarnessX at the hunter loop and verifier
|
||||
- [x] 6. Adopt HarnessX at the hunter loop and verifier
|
||||
- [x] 6.1 Run the hunter pool stage on a real HarnessX agent loop
|
||||
- Run the hunter pool stage on a real HarnessX run loop with the control, tool, and observability processors registered in the hunter sub-harness, invoked from the existing hunter-pool stage callback.
|
||||
- Confine all asynchronous execution to this single stage so the deterministic stages remain synchronous.
|
||||
@@ -154,10 +154,11 @@ This plan splits the fused regex layer into three governed owners (rules detect,
|
||||
- _Boundary: HxScanOrchestrator_
|
||||
- _Depends: 6.1_
|
||||
|
||||
- [ ] 6.3 (P) Run deterministic stages as model-disabled HarnessX processors with slot contracts
|
||||
- [x] 6.3 (P) Run deterministic stages as model-disabled HarnessX processors with slot contracts
|
||||
- Run each deterministic stage under HarnessX with model invocation disabled so no deterministic stage incurs a model call.
|
||||
- Preserve each stage's declared read/write slot allow-list and validate slot access on every lifecycle hook.
|
||||
- Observable completion: deterministic stages execute under HarnessX with no model calls and a slot-contract violation is raised on undeclared slot access, proven by a slot-contract test.
|
||||
- Implemented zero-dep in `slot_contract.py` (`SlotContractMixin`/`SlotPipeline`, validates reads/writes per lifecycle hook, enforces `skip_model`) + `stage_processors.py` (the deterministic stages as `skip_model` slot processors; `run_quick_pipeline` is byte-identical to the quick path). Per "bridge, do not map", the sync `HarnessRuntime` stays the top-level driver and these slot processors are the model-disabled representation; `host_under_harnessx` is the lazy, capability-gated bridge that disables the model on HarnessX's `BeforeModelEvent.skip_model`. Module names differ from the design's `harness/{slot_contract,processors}.py` because `harness` is a module, not a package. Tests: `tests/test_slot_contract.py`.
|
||||
- _Requirements: 1.5, 1.6_
|
||||
- _Boundary: HxScanOrchestrator_
|
||||
- _Depends: 6.1_
|
||||
|
||||
Reference in New Issue
Block a user