Commit Graph
1631 Commits
Author SHA1 Message Date
haelyraand646826 7b4e7828ce fix: redact escaped quoted credentials in observation records
Carry forward the bounded serialized-quote defect identified by PR 2786. Metadata-only observation consent remains separate; exclude the broader provider lifecycle head.

Co-authored-by: 646826 <646826@gmail.com>
2026-10-11 02:05:50 -04:00
haelyra 7f226d069c fix: prevent stranded observation counter locks after process death 2026-10-11 02:05:20 -04:00
haelyra 807c98aff6 fix: preserve cheap native context routing from PR 2740 2026-10-11 02:02:55 -04:00
haelyra 43febb9ada fix: preserve opt-in GateGuard contract questions from PR 3497 2026-10-11 02:00:27 -04:00
haelyra bd96347002 fix: preserve target-scoped GateGuard search credit from PR 3496 2026-10-11 01:57:34 -04:00
haelyra 7bcb8dabee feat: preserve passive scoped coordination receipts from PR 3128 2026-10-11 01:55:20 -04:00
montjeffrey 161713edce test(gateguard): pin the original four code questions and an opt-in external-contract question
8a7d6129 added the external-contract question for every code change that
handles data and updated the pinned tests to match, including the legacy
test "code condensed Edit hint for an unknown profile is unchanged". Its own
evaluation then found the gated arm did not improve (25 to 23 of 48), so the
question has no evidence behind it as a default.

- Restore the test expectations 8a7d6129 changed: questionIdsFor, the
  byte-identical code text for src/a.py, the condensed hints, and the hook
  question lists default to data-schema without external-contract.
- Add questionIdsFor/condensedHintFor cases with { externalContract: true }.
- Add hook cases: GATEGUARD_EXTERNAL_CONTRACT_QUESTION=1/true/ON asks it
  beside data-schema and in the unknown-profile set, never without data;
  unset, 0, false and off keep the original four.

Against main: target-class 5 failures, fact-force 10 failures.
2026-10-11 00:45:00 -04:00
montjeffrey 9faa6b76d2 test(gateguard): pin searches that never saw the target and Unicode line terminators
Each of these is credited on main, reproduced against upstream 2d515e4f:

- rg -t py / -T js / --type-not js, fd -e py, and the Grep tool's
  type: "py" credit an Edit of tokenizer.js. Type and extension values
  are skipped as plain value flags, so they never filter.
- Glob **/tokenizer.py, rg tokenizer src/*.py, and
  git grep tokenizer -- '*.py' credit tokenizer.js. The Glob pattern is
  never a filter, and a glob operand scopes as its literal directory.
- Glob **/tokenizer.js, find -name tokenizer.js, rg -g tokenizer.js and
  Grep glob: "tokenizer.js" credit tokenizer.js, although each search
  could only find the target itself.
- An Edit of "// note<U+2028>foo(1);" to "// note<U+2028>foo(2);" passes
  as comment-only, although JavaScript ends the comment at U+2028 and
  foo(2) runs.

Scenario 21-bypass-filter-forms adds ten must-deny steps and four
controls. Four hook controls that asserted exact-name lookups still
credit (find -name widget.py, Grep glob widget.py, Get-ChildItem
-Filter widget.py) now assert the lookup is denied; each keeps its
original purpose, that the exclusion parser leaves a positive include
alone, through a wildcard include (widget.*).
2026-10-10 23:38:47 -04:00
haelyra f614e82ae5 fix(session): preserve alias identity when its store is unreadable 2026-10-10 20:38:40 -04:00
haelyra a87957ea5e test(session): pass alias fault controls as data to fixed preload 2026-10-10 20:28:19 -04:00
haelyra 33a91492e8 test(session): pass calendar fixture inputs as data
Replace JSON-interpolated child JavaScript with fixed preload and summarizer programs. Pass paths and dates through dedicated fixture environment variables; use a fixed quoted exec wrapper so configured executable and script paths remain data. Preserve real Date.now, deadlines, calendar rollover, captured resume metadata and no-next-day duplicate assertions. Actual13/0 Node18.20.8, Node20.20.2 with Bun setting and Node24.9.0; actual13/0 with spaces/apostrophes/literal dollar in fixture paths; next-day negative control12/1; lint and diff checks pass. Addresses CodeQL393/394/395 without suppression or dismissal.
2026-10-10 20:27:31 -04:00
haelyra 3f3309c93e test(session): exercise fallback persistence across calendar rollover
The Stop hook captures its session filename date before waiting for a slow summary, while the fixture previously recomputed it after timeout. Advance only the fixture calendar when the fake summarizer starts and assert persistence under the captured date, matching resume metadata, and no next-day duplicate. Keep Date.now, child delay and lifecycle deadlines unchanged. Actual workflow baseline and corrected fixture13/0; mismatched-day lookup negative control12/1; Node20 with Bun setting and Node18.20.8 both13/0; lint and diff checks pass.
2026-10-10 20:14:22 -04:00
haelyra 0a181df218 fix(session): preserve optional startup context and independent history reads 2026-10-10 20:14:22 -04:00
haelyra 068d93251e fix(state): retry Windows sharing reads without dropping published aliases 2026-10-10 19:54:09 -04:00
haelyra 6f02de840b test(profiles): seed feedback through the canonical session producer 2026-10-10 19:33:54 -04:00
haelyra e259e06c75 fix(plan-canvas): reconcile profile resolver and retain invalid feedback queues 2026-10-10 19:19:30 -04:00
haelyra 0b07708137 fix(plan-canvas): validate feedback IPC locator and request shape 2026-10-10 19:15:51 -04:00
haelyra 872df03e1f fix(hooks): enforce literal formatter invocation at spawn boundaries 2026-10-10 19:13:24 -04:00
haelyra e76ea52ae3 test(security): bind fixture reads and mutations to private descriptors 2026-10-10 19:11:12 -04:00
haelyra 740fc4fa88 Merge refreshed PR #3491 request-model deduplication follow-up 2026-10-10 18:59:17 -04:00
haelyra 24de70a507 fix(fs): retry bounded Windows atomic rename sharing failures 2026-10-10 18:58:54 -04:00
haelyra a0ae95231d fix(codex): canonicalize native Windows task paths before dispatch 2026-10-10 18:56:12 -04:00
haelyra ad176030e7 test(settings): allow quarantine recovery retry on slower filesystems 2026-10-10 18:56:03 -04:00
haelyra d34d022bc5 test(gateguard): expect native directory keys on Windows 2026-10-10 18:56:03 -04:00
haelyra 19a1b62f35 fix(eval): preserve session ownership and frozen intent inputs 2026-10-10 18:53:22 -04:00
haelyra 74aace4071 fix(opencode): preserve CommonJS runtime scope and user script ownership 2026-10-10 18:53:22 -04:00
haelyra 6d813fe308 fix(qwen): normalize indentless lists and validate converted frontmatter 2026-10-10 18:47:48 -04:00
haelyra a062b22a35 fix(ci): provision real ripgrep for secret-scanner workflow checks
Verify PCRE2 on every hosted test platform and coverage runner. Preserve dependency PATH for real scanner delegates and report missing prerequisites explicitly, keeping production fail-closed behavior and hermetic missing/error controls intact.
2026-10-10 18:41:02 -04:00
haelyra a2dbcdb2e0 fix(eval): reject resume symlinks without no-follow support 2026-10-10 18:38:26 -04:00
haelyra 1d13881b1e test(gateguard): scope transcript byte counts to live descriptors 2026-10-10 18:38:26 -04:00
haelyra 7682bb5b49 fix(adapters): bound parsing and publish review artifacts safely 2026-10-10 18:38:26 -04:00
haelyra b327efcad3 test(transcript): isolate the extracted reader missing-file probe 2026-10-10 18:38:26 -04:00
haelyra d6dc05a12b fix(tests): keep transcript and hook fixtures in private temp roots
Isolate spawned Stop hooks through TMPDIR/TMP/TEMP, open transcript fixtures exclusively with private modes, and derive intentional stale-race fixture identity from its opened descriptor.
2026-10-10 18:38:26 -04:00
Dante 6acaf769b9 fix(cost-tracker): retain model across duplicate usage blocks 2026-10-11 06:24:18 +08:00
haelyra fa26ba0673 fix(qwen): reject unrepresentable empty tool authority before writes 2026-10-10 18:23:42 -04:00
haelyra 5cf5262760 fix(qwen): preserve explicit empty agent tool allowlists 2026-10-10 18:23:42 -04:00
haelyra 3c5ae57a2e Merge remote-tracking branch 'refs/remotes/review/catalog-current' into integration/ecc-043-20261010 2026-10-10 18:21:56 -04:00
haelyra 8b76be1dbe Merge refreshed PR #3457: preserve current source ancestry and new regression cases 2026-10-10 18:13:55 -04:00
haelyra 0cd541812e test(opencode): exercise installed discovery without activating inert barrel 2026-10-10 18:10:21 -04:00
montjeffrey 56d4ff4331 test(carriers): pin object-literal division, spread requires and extra arguments
Three open review findings still pass the gate with a missing dependency,
each reproduced against the real registry:

- const ratio = {} / 2; require('../x') -- `}` is treated as a statement
  boundary, so the division reads as a regex that swallows the require.
  a.of / 2 does the same through the keyword list.
- [...require('../x')] -- the member-call guard reads the last dot of the
  spread as member access and skips the call.
- require('../x', null) -- a literal counts only when the call closes right
  after it, so the specifier is demoted to a dynamic warning, which never
  fails.

14 cases, 11 failing. Controls that already pass: a regex after a function
body, a class body and a nested block.
2026-10-10 18:00:51 -04:00
montjeffrey 7497de02ab test(carriers): pin member calls and deeply nested computed arguments
Two first-round review findings were never addressed, and both reproduce
on the current head:

- records.require('./label'), obj?.import('./x') and obj . require('./y')
  are method calls, but the call pattern's word boundary is satisfied by
  the dot, so a self-contained object method fails every projection for a
  file the script never loads.
- The dynamic-argument pattern allows one level of nested parentheses, so
  require(path.join(__dirname, getName())) produces no dynamic warning
  while require(getName()) does.

Control: a genuine require beside the member calls is still a dependency.
2026-10-10 18:00:50 -04:00
montjeffrey 21784add5d test(carriers): pin CommonJS require candidates, regex after a block, and non-import from
Review on dd14493e found four more ways the closure gate misjudges a
carrier, each reproduced against that head:

- require('./helper') resolves when only helper.cjs or helper.mjs is
  planned, but Node's CommonJS search tries only .js, .json and .node.
- In `if (ok) {} /"/.test(text); require(...)` the regex after the block
  is read as division and its quote swallows the require.
- `obj.\nif(x) / 2` is a method call, but the condition check only saw
  the character immediately before `if`, so the division read as a regex
  and swallowed a later require. Introduced by the previous fix.
- A tagged template named `from` was recorded as an import; with exact
  import resolution it now fails a carrier that never loads that path.
  Introduced by the previous fix.

Controls: an extensionless require still resolves to a .json file, and a
template literal passed to import() is still a dependency.
2026-10-10 18:00:50 -04:00
montjeffrey df82e75a4c test(carriers): pin exact import resolution, portable separators, and regex after a condition
Review on aec97150 found four ways the closure gate passes a carrier that
fails at run time. Each is reproduced here against the current head:

- import('./helper') with only helper.js planned is accepted, but Node's
  ESM resolver does no extension search.
- import('./data') with only data/index.json (or index.js) planned is
  accepted, but Node rejects directory imports even from CommonJS.
- require('./lib\helper.js') with lib/helper.js planned is accepted
  because backslashes were normalized, but Linux and macOS read the
  backslash as part of the filename.
- In `if (ok) /['"]/.test(text); require('./missing')` the regex after
  the condition's closing paren is read as division, its quote opens a
  fake string, and the require disappears.

Controls that must keep passing: an exact import() of a planned file, an
extensionless require through the CommonJS search, and division after a
method named `if` or a call nested inside a condition. extractReferences
gains an `imports` list so the resolver can tell the two forms apart.
2026-10-10 18:00:50 -04:00
montjeffrey 50d59dd1f9 test(carriers): an interpolated from identifier is not an import 2026-10-10 18:00:50 -04:00
montjeffrey 4cd7741e74 test(carriers): cover spaced calls, escaped specifiers, Windows paths and index.json 2026-10-10 18:00:50 -04:00
montjeffrey d606375366 test(carriers): flag absolute and package imports a carrier cannot ship 2026-10-10 18:00:49 -04:00
montjeffrey be604c073a test(carriers): pin scanner edge cases and share one registry run 2026-10-10 18:00:49 -04:00
montjeffrey ca739b11d8 test(carriers): pin runtime closure checks 2026-10-10 18:00:32 -04:00
haelyra e4db30b583 test(context): remove obsolete path binding from advice fixture 2026-10-10 17:57:18 -04:00
haelyra be230bd85c feat: integrate reviewed adapters, conversion and GateGuard improvements 2026-10-10 17:53:23 -04:00