Commit Graph
3703 Commits
Author SHA1 Message Date
haelyra e76ea52ae3 test(security): bind fixture reads and mutations to private descriptors 2026-10-10 19:11:12 -04:00
haelyra 9aa9003e1b ci: account for PowerShell CRLF in strict PCRE2 probe 2026-10-10 19:04:00 -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 a0dacd2282 ci: allow bounded completion of the full Windows test matrix 2026-10-10 18:57:18 -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 630edba97e fix(pi): regenerate the curated profile after source integration 2026-10-10 18:39:09 -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
haelyra 8044679227 fix(pi): classify new provider and orchestration resources 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 38c7d89b3e docs(carriers): normalize reconciliation note spacing 2026-10-10 18:22:15 -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
haelyraandJason Colapietro 01b0202c86 fix(deps): close current URI and Markdown toolchain advisories
Carry the fast-uri patch proposed in https://github.com/affaan-m/ECC/pull/3454 and apply the remaining compatible Markdown/KaTeX/TOML advisory fixes. Regenerate npm and Yarn4.9.2 locks without unrelated resolution changes.

Co-authored-by: Jason Colapietro <55137770+JasonColapietro@users.noreply.github.com>
2026-10-10 18:10:21 -04:00
haelyra 0cd541812e test(opencode): exercise installed discovery without activating inert barrel 2026-10-10 18:10:21 -04:00
montjeffrey f7bc750326 fix(carriers): close the object-literal, spread and extra-argument false negatives
- Record whether each `{` opens a block or an object literal from the
  token before it; only a block's `}` lets a regex follow, so `{} / 2`
  divides again while `if (ok) {} /re/` stays a regex.
- Match regex-preceding keywords only when no member dot precedes them,
  so `a.of / 2` divides.
- Exempt the last dot of a spread from the member-call guard, so
  `...require('./x')` is a module load.
- Resolve a call's first argument up to its first top-level comma, so
  `require('./x', null)` and `import('./x.json', { with })` name `./x`.
  `import(path.join(__dirname, ...))`, previously skipped silently, now
  warns as dynamic.

Rescanning all 802 repository JavaScript files against the previous head
changes no result. The real registry is unchanged: 35/35 resolved, zero
failures or warnings. The design doc records the fix and states the gate's
scope: static relative specifiers in planned JavaScript only.
2026-10-10 18:00:51 -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 79f327f6c9 docs(carriers): record the member-call and nested-argument fixes 2026-10-10 18:00:50 -04:00
montjeffrey a54c8df98b fix(carriers): ignore member calls named require or import, and warn on deeply nested arguments
- Call patterns now skip a require/import preceded by a dot, with or
  without whitespace or optional chaining, so records.require('./label')
  and obj?.import('./x') are method calls rather than module loads.
- Replace the one-level dynamic-argument pattern with a balanced-paren
  scan over the string-free skeleton, so require(path.join(__dirname,
  getName())) and require(a(b(c()))) are reported as dynamic.

Rescanning all 802 repository JavaScript files against the previous head
changes 6 results, each a newly reported dynamic argument nested deeper
than one level (docker eval checks and one test); no specifier or package
result changes. The real registry is unchanged: 35/35 resolved, zero
failures or warnings.
2026-10-10 18:00:50 -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 d9fe97171d docs(carriers): record the third closure review follow-up 2026-10-10 18:00:50 -04:00
montjeffrey 498da59b3c fix(carriers): follow Node's CommonJS candidates, see regex after a block, ignore non-import from
- An extensionless require now tries only the path, .js, .json, and a
  directory's index.js/index.json, as Node does; .cjs and .mjs must be
  named, so require('./helper') no longer passes on helper.cjs alone.
- Treat `}` as a statement boundary, so a regex after a block is read as
  a regex and cannot swallow a later require.
- Decide whether a paren opens a condition from the token before the
  keyword, ignoring whitespace, so `obj.\nif(x) / 2` and
  `obj?. while(x) / 2` stay method calls followed by division.
- Record which slots came from template literals and skip them for
  static `from` and side-effect `import`, which accept only a quoted
  string; a tagged template named `from` is no longer an import.
  A template passed to import() is still a dependency.

Rescanning all 802 repository JavaScript files against dd14493e changes
no result, and the real registry still reports 35/35 resolved with zero
failures or warnings.
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 a1d9eeed2f docs(carriers): record the second closure review follow-up 2026-10-10 18:00:50 -04:00
montjeffrey a22c65aa6a fix(carriers): resolve imports exactly, reject backslash separators, see regex after a condition
- Track whether each relative specifier arrives through require or
  through import()/static import, and resolve the import forms by exact
  path. Node's ESM resolver adds no extension and rejects directory
  imports even from a CommonJS file, so import('./helper') and
  import('./data') no longer pass on helper.js or data/index.json alone.
  require keeps the CommonJS extension and index candidates.
- Stop normalizing backslashes in relative specifiers. Linux and macOS
  read them as filename characters, so require('./lib\helper.js') now
  fails as non-portable-separator instead of resolving to lib/helper.js.
- Record whether each closing paren ends an if/while/for/with condition,
  so a `/` right after one starts a regex. A method named `if` and calls
  nested inside a condition still read as division.

extractReferences gains an `imports` list. Rescanning all 802 repository
JavaScript files against the previous scanner changes no result, and the
real registry still reports 35/35 resolved with zero failures.
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 bf729d56ba docs(carriers): record the closure review follow-up 2026-10-10 18:00:50 -04:00
montjeffrey 40e426eafc fix(carriers): keep keyword patterns from spanning an interpolation 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 cd83d3ce22 fix(carriers): match spaced calls, cook escapes, treat Windows and file URLs as absolute 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 9d08271638 feat(carriers): flag absolute and package imports a carrier cannot ship 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 4814561d1a docs(carriers): record the runtime-closure gate slice 2026-10-10 18:00:49 -04:00
montjeffrey d3e6ce84cd feat(carriers): validate carrier runtime closure in CI 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