.Net: fix: prevent duplicate "null" in JSON Schema type arrays for nullable parameters
Use value equality to avoid duplicate null entries in strict JSON Schema type arrays, with three regression tests.
The clearest proof that we read agent frameworks closely is the fixes we have landed in them. 4 merged pull requests below fix concrete AI/framework defects. Each links to the public PR. The full record also includes maintenance, typing, documentation, and workflow integrations.
Upstream contributionsVerified 2026-09-09 UTC4 AI/framework fixes46 merged code and documentation contributions
Anthropic’s API rejects forced tool_choice when extended thinking is enabled. LangChain’s bind_tools() could forward a forced tool choice while thinking was enabled, producing a 400 response. Ported the guard the structured-output path already had.
The truncation reducer was calling extract_range, a summarization helper that filters out system and developer messages. System prompts were being dropped with no warning. Ported Microsoft’s own .NET fix to the Python SDK.
Use value equality to avoid duplicate null entries in strict JSON Schema type arrays, with three regression tests.
Reject an empty Evaluate devset with a descriptive ValueError before metric-summary division, with a regression test.
46 merged upstream code and documentation contributions total. Beyond the 4 fixes above, 42 more across PyTorch Ignite, Optuna, React Router (56k ★), Nuxt (60k ★), MobX (28k ★), Cloudflare Workers SDK (4.4k ★), Sentry, ngrx, TSDoc, and others (maintenance and typing modernization). The count excludes 5 community-list submissions from 51 external merged pull requests returned by Browse merged pull requests by roli-lpci on GitHub.
Roli Bosch reported that vector queries could return entries from another namespace sharing a hyphenated prefix. A Griptape maintainer fixed the matching logic and added a regression test, explicitly citing the report. The maintainer's fix merged on 13 July 2026. Hermes contributed the report; the maintainer authored the merged fix.
How these fixes get made: the case studies explain the defect, regression evidence, attribution and exact upstream outcome.
One row per authored PR, verified against the upstream PR endpoint and changed files. Roli Bosch contributes under roli-lpci; the Hermes Labs attribution identifies our founder and credits earlier reporters and maintainers where relevant. Own-account and Hermes organization PRs are excluded.
Download the canonical structured ledger (JSON). The 46 merged engineering/documentation PRs comprise 41 code, workflow, typing or maintenance changes and 5 documentation-only changes. They include the 4 framework fixes and the accepted Rule Audit integration; these subsets must not be added again.
| Class | Merged | Open | Closed, unmerged |
|---|---|---|---|
| AI/framework fixes | 4 | 14 | 8 |
| Other bug fixes | 5 | 9 | 3 |
| Maintenance and compatibility | 27 | 25 | 25 |
| Typing | 2 | 0 | 0 |
| Documentation | 5 | 10 | 3 |
| External integrations | 2 | 7 | 2 |
| Documentation/ecosystem listings | 5 | 14 | 5 |
| Research/index submissions | 0 | 4 | 1 |
| Features | 1 | 2 | 0 |
The earlier 33 total was a dated engineering/documentation subtotal. DSPy #9978 (26 August 2026) and mcs-agent-analyser #31 (3 September 2026) bring it to 35. The raw GitHub merged total also includes four community listings. Neither listings nor research-index entries count as merged code. Dates below are merge, closure or submission dates according to status.
Recursively copy mutable contents of file tuples to prevent multipart encoding from mutating caller headers.
Copy schemas before strict/additionalProperties removal so caller schemas and disk-cache keys remain stable.
Accumulate registered function descriptions from the live AgentBuilder system message instead of overwriting it from static configuration.
Allocate independent streaming tool-call dictionaries and prevent empty streaming names from overwriting the function name.
Preserve the first system/developer message during Python chat-history truncation and handle the target_count=1 boundary.
Use the existing safe formatter for literal braces in customized ReActAgent prompts and warn about missing tool placeholders.
Add retry token budgeting, separate validator data in prompts, and repair allow_override behavior; tests accompany the proposal. No general injection-prevention claim.
Drop forced tool_choice with a warning when Anthropic extended thinking is enabled; preserve auto and unaffected requests.
Use value equality to avoid duplicate null entries in strict JSON Schema type arrays, with three regression tests.
Keep GEPA feedback text consistent with the module-level score when a predictor-level score is overridden.
Keep role-converted tool results separate from genuine user messages while preserving ordinary same-role merging.
Convert Redis cosine distance to similarity (1 - distance); regression asserts distances 0.1/0.4 yield scores 0.9/0.6. Closed without merge; maintainer acknowledged the conversion in a broader sweep.
Guard choices-less chunks during stream assembly and respect Model Armor fail_on_error during assembly failures; the original commit includes six regression cases. Closed without merge.
Reject an empty Evaluate devset with a descriptive ValueError before metric-summary division, with a regression test.
Reject FIFO and other non-regular write targets before opening them to avoid blocking the async event loop.
Reject rename_columns collisions with untouched columns to prevent duplicate Arrow column names and inaccessible data.
Copy caller context dictionaries before adding internal keys in seven public transformation functions.
Find an unquoted tasks-array bracket across streamed chunks so brackets in preceding strings do not silently discard tasks.
Avoid stale indexes while deleting multiple FieldReAsk items from a list.
Handle explicit None arguments when merging legacy function_call deltas so streamed generation output is retained.
Raise a descriptive RuntimeError when speaker-selection streaming finishes without a CreateResult.
Use exact namespace matching to prevent vector results from leaking across hyphen-prefixed namespaces. The author closed this PR after the behavior was fixed upstream.
Preserve metadata while combining streamed text content.
Return usable non-streaming completions with token_usage=None when providers omit usage metadata.
Exclude errored trials from benchmark denominators and render all-error aggregates as N/A, retaining completed/error counts.
Normalize symbolic target notation in math scoring so equivalent plain-text and LaTeX targets receive consistent verdicts.
fix(ui): use sidebar background color for chat session panel
Allocate independent metadata dictionaries as a defensive change; the PR does not establish an active runtime mutation path.
Latent aliasing hazard: the PR explicitly reports no current CallbackManager mutation path. Preserved as a defensive patch, excluded from the substantive runtime-fix count.
Repair drifted Nepal impact-layer endpoints and add browser GeoJSON health checks.
Accumulate assistant content in the streaming tool example so the next tool round replays the text actually emitted.
Collect successful pending backend results after another engine fails while preserving timeout/error classification.
Persist the scheduled profile and replace duplicate queued entries when rescheduling a content/channel pair.
Render queued prompt enqueue records at their original timestamp with explicit labels, preserving later delivery as a separate event.
Use completed async-response conversion when logging to SQLite, retaining the precompletion await-required error.
Require Cake's Bash LLM judge to parse the complete response as strict JSON, allowing only one optional plain or json Markdown fence, so trailing or malformed content fails closed while tool-argument repair remains separate.
Report invocation wall time separately from cumulative, potentially overlapping tool work and scheduled retry delays; remove unsupported exclusive-remainder and wall-share columns while retaining measurable activity from incomplete invocations.
Reject lossy tool-argument JSON repair that could discard extra objects, doubled braces, or provider markup after a valid prefix, while preserving complete valid JSON and raw-control-character escaping.
Resolve fixture actors through the existing governed handle and reject unknown fixture keys or invalid actor values in the Python and TypeScript policy-test runners.
Add explicit per-call PERSON exclusions in Python and TypeScript so known organization names can bypass only the optional PERSON heuristic while other enabled detectors continue to run.
Restore retry and backoff options when recursively removing files after the earlier rimraf-to-fs.rm migration, preserving force behavior and error propagation.
Merge caller-provided TypeScript permission scopes over AgentOS's secure baseline while preserving explicit overrides and the registered-binding auto-grant.
Show path and network remediation guidance only when supervised diagnostics contain corresponding path or network-denial evidence, without changing sandbox enforcement.
Make all reported findings return exit code 1 across four previously inconsistent security-skill engines, with a shared minimum-severity filter governing both reports and exit decisions.
fix: use context.filename for ESLint 10 compatibility
fix(eslint-plugin-mobx): replace deprecated context.getSourceCode() for ESLint 10 compat
fix(eslint-plugin-tsdoc): replace deprecated ESLint APIs for v10 compatibility
fix: replace deprecated ESLint context methods for v10 compatibility
fix: replace deprecated context.getSourceCode() for ESLint 10 compatibility
feat(eslint-plugin): add ESLint v10 compatibility
fix: add ESLint v10 to peerDependencies
fix: replace deprecated context.getFilename() for ESLint 10 compatibility
fix: add ESLint 10 compatibility
Enable ruff rule `UP`
Replace mkdirp with native fs.mkdirSync({ recursive: true })
fix(custom-resources): replace deprecated url.parse() with WHATWG URL API
chore(deps): replace chalk with native util.styleText
fix: replace deprecated url.parse() with WHATWG URL API
chore: replace rimraf with native fs.rm()
chore(deps): replace del-cli with Node.js built-in fs.rmSync
infra: replace flake8 with ruff for linting (closes #466)
Migrate from Flake8/Black/isort to Ruff (fixes #1055)
chore: replace rimraf with native fs.rmSync
chore: replace chalk and lodash with picocolors and native code
chore: replace flake8, black and isort with ruff
feat: replace axios with native fetch API
chore(deps): replace chalk with picocolors
chore: replace glob with native node:fs globSync
chore(deps): replace lodash with native JS equivalents
chore: replace micromatch with picomatch
chore(remix): Replace glob with native recursive fs walk
chore(remix): replace yargs with native util.parseArgs
ref(sveltekit): Replace recast + @babel/parser with acorn
chore: replace number-allocator with inline Set-based implementation
chore: replace chalk with picocolors
chore: replace fs-extra with native Node.js fs APIs
chore(deps): replace chalk with native util.styleText
chore: remove lodash dependency, use native deepEqual
chore(create-cloudflare): remove unused chalk dependency
chore: replace `is-builtin-module` with native `node:module` `isBuiltin`
chore: replace lodash.debounce with inline implementation
fix(eslint-plugin): replace deprecated context.getSourceCode() with context.sourceCode
chore: replace is-ci with native process.env.CI check
chore: replace mkdirp with native fs.mkdirSync
chore(jest-changed-files): replace execa with native node:child_process
chore(jest-core, jest-watcher): replace ansi-escapes with inline ANSI sequences
chore(jest-util): replace `slash` with inline implementation
chore(jest-util): replace p-limit with inline implementation
chore: replace chalk with picocolors and remove rimraf
refactor: replace p-limit with inline concurrency limiter
chore(repo): remove `is-ci` dependency
refactor: replace rimraf with native fs.rmSync
chore: migrate remaining chalk usage to miniChalk utility
chore: replace chalk with picocolors
chore: replace glob with tinyglobby
chore(deps): remove prettysize dependency
Replace chalk with picocolors
Remove strip-ansi dependency
chore: replace mkdirp with native fs.promises.mkdir
meta: replace trivial lodash functions with native equivalents
chore: replace strip-ansi, mkdirp, uuid with Node.js native APIs
chore: replace fs-extra with native Node.js fs
chore: replace fs-extra with native Node.js fs in tests
Replace lodash-es get/memoize with native equivalents
chore: replace fs-extra with native node:fs
build(deps): replace chalk with picocolors
chore: replace fs-extra with native node:fs
chore: replace fs-extra with native Node.js fs APIs
chore: replace fs-extra with native node:fs
build(deps): replace fs-extra with native node:fs
Replace globby with glob
Replace `globby` and `fast-glob` with `tinyglobby`
chore(deps): replace chalk with picocolors
chore(deps): replace fast-glob with tinyglobby
chore(deps): remove rimraf devDependency
chore: replace chalk with picocolors
chore(deps): replace chalk with picocolors
fix: reorder system prompt sections to maximize Anthropic prefix caching
Prompt-ordering/cache optimization proposal. No measured cache improvement established by this audit; excluded from substantive defect totals.
Flag multipolygon type on nodes and ways
Clarify worker heartbeat timeout documentation
Run the existing offline evaluation-harness and session-metrics fixture suites in CI and the full local fixture aggregate for code-affecting changes.
replace typing hints in ignite/handlers/tqdm_logger.py
Simplify Union type alias in optuna/samplers/_cmaes.py
docs: fix trailing comma in zh html/template code example
docs: add shared/ directory to Nuxt 4 upgrade guide
fix: use dict format for tool call arguments in few-shot examples
fix: align few-shot observation examples with runtime format
docs: improve instruction clarity in update-docs SKILL.md
docs: explain templates and fragments together
docs: explain source verification in schema extraction tutorial
docs: explain temporary storage for large database operations
Document that Trio subprocess APIs call subprocess.Popen from a worker thread and therefore inherit applicable per-thread operating-system state from that worker.
Document shell completion setup
Document hash-bearing project detail pages for manually hosted package indexes and point readers to the Simple Repository API and dumb-pypi.
Document and test async startup hooks
Document a copyable Sphinx-Needs configuration for rendering nested portin and portout needs inside a parent needflow block.
Document compressed file usage and optional codecs
docs: align category example and release claim with current sources
Add a worked groundwater-observation sampling example that preserves measured values and original timestamps rather than interpolating to a regular index.
Document that an explicit same-named deepagents `subagents` entry with `tools: []` stops inheritance of the parent's custom tools, while framework middleware tools (e.g. deepagents filesystem tools) remain and need separate confinement.
Require Nono provenance evidence - output naming Nono, or a successful `nono why --self` result with status DENIED - before pack guidance recommends sandbox permission remediation, route unconfirmed permission errors to a non-sandbox diagnosis, and stop inferring active profiles, across twelve harness packs.
hermeneutic: init at 0.1.8
Closed-unmerged packaging proposal. GitHub reports contradictory/capped changed-file data, so technical acceptance and code contribution are intentionally uncounted.
ci: upgrade lintlang to 0.5.0
test: cover current Little Canary gate contract
Add the pinned Rule Audit v0.1.3 pre-commit hook for two judge prompts in an external repository.
docs: add instruction-quality pre-commit gate
ci: run configured LintLang hook
feat(examples): add local Hermeneutic wording assertion
Repair the Little Canary adapter to use SecurityPipeline, preserve advisory behavior, and distinguish completed, degraded, unavailable, and failed screening.
Run the previously accepted Rule Audit pre-commit hook in CI for two existing judge prompts.
Map degraded Little Canary results to ERROR instead of PASS while preserving fail-open behavior, structural-block precedence, raw status fields, and compatibility with older verdict objects.
Add a bounded, deterministic, offline Instruction Audit section to reports over analysed Copilot Studio bot instructions.
Add hermeneutic to Observability section
Add hermes-rubric to Observability section
Add hermes-labs-ai/fidelis to Knowledge & Memory.
Add csv-quality-gate to Testing
docs: add quick-gate-python to Tools
Add little-canary to LLM Red-Teaming & Guardrails
Add hermes-jailbench to Prompt Injection & Jailbreak Detection
Add quick-gate-js to Tools
Refresh LintLang listing
Add LintLang to Static Analysis & Linters
Update LintLang entry
Add LintLang
Add HermesGate
Add LintLang to verification tools
Add LintLang for Language Agnostic
Add project: lintlang
Add LintLang for Language Agnostic.
fix(registry): correct Hermes Rubric license and metadata
List Fidelis Memory in Knowledge & Memory with its repository, Glama badge, PyPI installation, initialization, and MCP-client registration paths.
Add Fidelis Memory MCP
Add lintlang (AI_LINTLANG) to External Plugins Catalog
Add Agent Gorgon audit-only guardrail
List the released Hermes Rubric Inspect scorer in the Inspect AI extensions gallery with a link to its installation and usage documentation.
Add Fidelis Memory to Hermes Agent's optional MCP catalog with a version-pinned uvx launch command and documented local-daemon setup and data-sharing boundaries.
Add Precise Records on agent telemetry validity
Add two Hermes Labs papers on auditability and model self-report
Add Behavioral Canarying technical note (Little Canary)
Add The Generative Horizon to Position Papers
Add two epistemic-failure papers to Truthfulness (Bosch, 2026)
Add NoHandoffTermination condition for Swarm teams
fix: extend output_text to include code_interpreter and shell output
Proposed extension of output_text beyond message output; the existing message-only API behavior is explicit. Counted as a feature proposal, not a verified framework defect.
Add cake debug skills to report selected skill-catalog XML size, approximate token count, and description lengths with advisory thresholds, without changing prompt rendering or skill filtering.
34 source-backed fixes remain open or closed without merge. Their patches and regression artifacts preserve the technical contribution; upstream adoption is stated separately. This audit inspects published evidence and does not claim a fresh execution of every historical test.
Recursively copy mutable contents of file tuples to prevent multipart encoding from mutating caller headers.
Copy schemas before strict/additionalProperties removal so caller schemas and disk-cache keys remain stable.
Accumulate registered function descriptions from the live AgentBuilder system message instead of overwriting it from static configuration.
Allocate independent streaming tool-call dictionaries and prevent empty streaming names from overwriting the function name.
Use the existing safe formatter for literal braces in customized ReActAgent prompts and warn about missing tool placeholders.
Add retry token budgeting, separate validator data in prompts, and repair allow_override behavior; tests accompany the proposal. No general injection-prevention claim.
Keep GEPA feedback text consistent with the module-level score when a predictor-level score is overridden.
Keep role-converted tool results separate from genuine user messages while preserving ordinary same-role merging.
Convert Redis cosine distance to similarity (1 - distance); regression asserts distances 0.1/0.4 yield scores 0.9/0.6. Closed without merge; maintainer acknowledged the conversion in a broader sweep.
Guard choices-less chunks during stream assembly and respect Model Armor fail_on_error during assembly failures; the original commit includes six regression cases. Closed without merge.
Reject FIFO and other non-regular write targets before opening them to avoid blocking the async event loop.
Reject rename_columns collisions with untouched columns to prevent duplicate Arrow column names and inaccessible data.
Copy caller context dictionaries before adding internal keys in seven public transformation functions.
Find an unquoted tasks-array bracket across streamed chunks so brackets in preceding strings do not silently discard tasks.
Avoid stale indexes while deleting multiple FieldReAsk items from a list.
Handle explicit None arguments when merging legacy function_call deltas so streamed generation output is retained.
Raise a descriptive RuntimeError when speaker-selection streaming finishes without a CreateResult.
Use exact namespace matching to prevent vector results from leaking across hyphen-prefixed namespaces. The author closed this PR after the behavior was fixed upstream.
Preserve metadata while combining streamed text content.
Return usable non-streaming completions with token_usage=None when providers omit usage metadata.
Exclude errored trials from benchmark denominators and render all-error aggregates as N/A, retaining completed/error counts.
Repair drifted Nepal impact-layer endpoints and add browser GeoJSON health checks.
Normalize symbolic target notation in math scoring so equivalent plain-text and LaTeX targets receive consistent verdicts.
Accumulate assistant content in the streaming tool example so the next tool round replays the text actually emitted.
Collect successful pending backend results after another engine fails while preserving timeout/error classification.
Persist the scheduled profile and replace duplicate queued entries when rescheduling a content/channel pair.
Render queued prompt enqueue records at their original timestamp with explicit labels, preserving later delivery as a separate event.
Use completed async-response conversion when logging to SQLite, retaining the precompletion await-required error.
Repair the Little Canary adapter to use SecurityPipeline, preserve advisory behavior, and distinguish completed, degraded, unavailable, and failed screening.
Resolve fixture actors through the existing governed handle and reject unknown fixture keys or invalid actor values in the Python and TypeScript policy-test runners.
Add explicit per-call PERSON exclusions in Python and TypeScript so known organization names can bypass only the optional PERSON heuristic while other enabled detectors continue to run.
Restore retry and backoff options when recursively removing files after the earlier rimraf-to-fs.rm migration, preserving force behavior and error propagation.
Map degraded Little Canary results to ERROR instead of PASS while preserving fail-open behavior, structural-block precedence, raw status fields, and compatibility with older verdict objects.
Merge caller-provided TypeScript permission scopes over AgentOS's secure baseline while preserving explicit overrides and the registered-binding auto-grant.
Mem0 #5250 closed without merge. Its maintainer acknowledged the conversion in #5391; the case study preserves the earlier community work and the original patch’s missing clamp. Griptape #2243 likewise remains unmerged; the maintainer authored the accepted fix #2244.
Code, documentation, and workflow contributions, ordered by their public merge date.
NovaCode37/claude-security-skills
travisennis/cake
nolabs-ai/nono-packs
nolabs-ai/nono
travisennis/cake
travisennis/cake
Back to the open-source catalog.