Skip to content

conformance: provider-tool inventory rows, not_run disclosure, smoke coverage vocabulary - #62

Open
Coldaine wants to merge 2 commits into
mainfrom
feat/conformance-provider-tool-coverage
Open

conformance: provider-tool inventory rows, not_run disclosure, smoke coverage vocabulary#62
Coldaine wants to merge 2 commits into
mainfrom
feat/conformance-provider-tool-coverage

Conversation

@Coldaine

@Coldaine Coldaine commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

User description

Summary

Implements the unchecked tasks of plans/2026-08-10-live-provider-conformance.md:

  • Provider-tool rows in the shared inventory: scripts/provider-pass-through.mjs now carries REQUIRED_PROVIDER_TOOLS (tavily.map, brave.webSearch, exa.contents, firecrawl.map) with native runners, exercised through the ColdSearch tool call CLI leg and compared against native HTTP, using the same Gate 0 status vocabulary.
  • Machine-readable per-row output: tool rows emit one row each in results.jsonl.
  • Explicit not_run: added to ALLOWED_STATUSES; coverage summaries (harness summary.md and the smoke reporter) explicitly list supported-but-omitted rows as not_run with totals. A green workflow never implies all supported integrations passed.
  • smoke.mjs coverage vocabulary: emits a smoke-only provider/path coverage table; rows that only ran smoke stay not_run in conformance vocabulary and are never reported as a native-vs-ColdSearch pass. Exit semantics unchanged (non-zero only when a check that ran fails).
  • Canary summary: canary.yml tees the smoke coverage table into $GITHUB_STEP_SUMMARY; still scheduled/manual-only, non-gating.
  • Docs: docs/contributing/testing.md gains the scoped manual commands (path- and tool-scoped); docs/contributing/ci.md describes the smoke-only table and not_run.
  • Offline tests: row selection, one-JSONL-row-per-tool, all-rows-one-allowed-status (incl. not_run), summary discloses blocked/not_run without passes, secret/signed-URL redaction, smoke coverage vocabulary, canary non-gating.

Validation

  • npm run typecheck — pass
  • npm run test:docs — pass
  • npm test — 251/251 pass
  • node scripts/provider-pass-through.mjs --list — full matrix (13 paths + 4 tools)
  • Scoped offline exercise: 17 rows (4 waived + 13 not_run), exit 0, baseline untouched

Closes the remaining tasks of the live-provider conformance plan.


CodeAnt-AI Description

Expand provider conformance coverage and disclose untested integrations

What Changed

  • Adds conformance rows for four provider tools: Tavily Map, Brave webSearch, Exa contents, and Firecrawl Map, including native-versus-ColdSearch comparisons.
  • Scoped runs and machine-readable evidence now include every supported row, marking unselected rows as not_run instead of silently omitting or passing them.
  • Live smoke reports a separate smoke-only coverage table with totals, while keeping smoke results out of native conformance pass counts.
  • Corrects Tavily Map result counting, verifies raw provider details and tool registration, and keeps secrets, signed URLs, and raw bodies out of saved evidence.
  • Adds scoped tool-run documentation and tests for inventory selection, status reporting, redaction, coverage totals, and non-gating canary behavior.

Impact

✅ Four provider tools included in conformance checks
✅ Clear distinction between tested, skipped, blocked, and untested integrations
✅ Safer conformance evidence without exposed credentials or signed URLs

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Copilot AI lite review requested due to automatic review settings August 11, 2026 16:46
@codeant-ai

codeant-ai Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Incremental review completed a02ae62 Aug 14, 2026 · 00:36 00:37
✅ Reviewed your PR f9d7fdc Aug 11, 2026 · 16:47 16:50

@codeant-ai

codeant-ai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai Bot added the size:XL This PR changes 500-999 lines, ignoring generated files label Aug 11, 2026
@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing

Comment thread scripts/provider-pass-through.mjs Outdated
),
"native Tavily map"
);
const items = (data.urls || []).map((url) => ({ title: "", url, content: "", source: "tavily" }));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggestion: The Tavily Map response is read from urls, but the provider tool contract and the existing substrate summary use raw.results for this endpoint. Valid Tavily Map responses therefore produce zero native items and zero ColdSearch items, causing the conformance row to fail despite a successful provider call. Read the endpoint's actual result array consistently in both native and ColdSearch normalization. [api mismatch]

Severity Level: Major ⚠️
- ❌ Tavily Map conformance rows falsely fail.
- ⚠️ Full-matrix runs report zero valid Map results.
- ⚠️ Native-versus-ColdSearch parity cannot be measured.

Fix in Cursor Fix in VSCode Claude

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** scripts/provider-pass-through.mjs
**Line:** 787:787
**Comment:**
	*Api Mismatch: The Tavily Map response is read from `urls`, but the provider tool contract and the existing substrate summary use `raw.results` for this endpoint. Valid Tavily Map responses therefore produce zero native items and zero ColdSearch items, causing the conformance row to fail despite a successful provider call. Read the endpoint's actual result array consistently in both native and ColdSearch normalization.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Comment thread scripts/provider-pass-through.mjs Outdated
Comment on lines +1027 to +1038
function makeColdSearchToolResult(target, output) {
const raw = output.raw && typeof output.raw === "object" ? output.raw : {};
const items = toolRawItems(target, raw);
return {
ok: output.ok === true,
catalogued: output.catalogued === true,
result_count: items.length,
sample: sampleToolItems(items),
items,
provider: output.provider,
tool: output.tool,
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggestion: The tool-call result drops the CLI's raw provider payload before evidence is written. src/tools/substrate.ts explicitly returns raw provider detail for tool calls, but this object retains only derived items and identity fields, so publicResult and results.jsonl cannot preserve or inspect the raw pass-through response. Include the raw payload, subject to the existing redaction path, in the returned result. [incomplete implementation]

Severity Level: Major ⚠️
- ❌ Tool evidence loses raw provider payloads.
- ⚠️ results.jsonl cannot inspect provider-specific fields.
- ⚠️ Debugging provider-tool parity requires rerunning live calls.

Fix in Cursor Fix in VSCode Claude

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** scripts/provider-pass-through.mjs
**Line:** 1027:1038
**Comment:**
	*Incomplete Implementation: The tool-call result drops the CLI's `raw` provider payload before evidence is written. `src/tools/substrate.ts` explicitly returns raw provider detail for tool calls, but this object retains only derived `items` and identity fields, so `publicResult` and `results.jsonl` cannot preserve or inspect the raw pass-through response. Include the raw payload, subject to the existing redaction path, in the returned result.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR expands the live-provider conformance and smoke reporting surface by adding catalogued provider-tool inventory rows, making “not run” coverage explicit, and publishing a smoke-only coverage table (including tools) into the scheduled canary workflow summary.

Changes:

  • Add REQUIRED_PROVIDER_TOOLS inventory rows and support selecting/running tool rows (--tool) in the Gate 0 pass-through harness, with not_run disclosure and per-row JSONL output.
  • Extend the smoke script to emit a provider/path/tool coverage table that keeps conformance status at not_run while reporting smoke outcomes.
  • Add/extend tests and documentation to codify the new status vocabulary and coverage semantics; update the canary workflow to tee smoke output into the GitHub step summary.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
test/smoke-coverage.test.mjs Adds unit coverage for the smoke-only coverage table semantics and row seeding.
test/provider-pass-through-script.test.mjs Expands harness tests for tool rows, not_run, JSONL emission, redaction, and canary workflow triggers.
scripts/validate-docs.mjs Adjusts baseline summary validation to tolerate status-vocabulary evolution (e.g., not_run).
scripts/smoke.mjs Adds coverage row construction and rendering for smoke-only reporting, with explicit not_run conformance semantics.
scripts/provider-pass-through.mjs Implements provider-tool inventory rows, selection (--tool), tool-native runners, not_run disclosure, and updated evidence rendering.
docs/contributing/testing.md Documents scoped manual conformance commands for path and tool rows and explains not_run.
docs/contributing/ci.md Updates CI/canary documentation to describe smoke-only coverage reporting and not_run semantics.
.github/workflows/canary.yml Publishes smoke output (including coverage table) into $GITHUB_STEP_SUMMARY while preserving exit semantics.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 258 to 264
function inputForTarget(target) {
if (target.tool) {
return TOOL_INPUTS[`${target.provider}.${target.tool}`]();
}
if (target.path === "search") {
return { query: SEARCH_QUERY };
}
Comment thread scripts/provider-pass-through.mjs Outdated
Comment on lines +1199 to +1203
let nativeResult;
try {
nativeResult = await nativeRunners[target.provider](target);
nativeResult = isTool
? await nativeToolRunners[targetId(target)](target)
: await nativeRunners[target.provider](target);
Comment on lines 45 to +54
- name: Live smoke test
run: node scripts/smoke.mjs
# Publish totals and the smoke-only provider/path coverage table in the
# workflow summary, even when a check fails (the job still goes red), so
# a green workflow cannot be read as "all supported integrations passed".
run: |
set +e
node scripts/smoke.mjs 2>&1 | tee smoke-output.txt
status=${PIPESTATUS[0]}
cat smoke-output.txt >> "$GITHUB_STEP_SUMMARY"
exit $status

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f9d7fdc18c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/provider-pass-through.mjs Outdated
Comment on lines +787 to +789
const items = (data.urls || []).map((url) => ({ title: "", url, content: "", source: "tavily" }));
return makeNativeToolResult(target, items, {
native_shape: ["urls[]"],

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 Badge Parse Tavily Map results from the correct field

When a keyed tavily.map conformance row runs, both new legs read urls, but the existing Tavily tool implementation treats Map responses as raw.results (src/tools/substrate.ts:91-94). A successful response therefore becomes two empty result sets and is always reported as fail, so the newly documented scoped Tavily Map check cannot produce valid evidence. Parse data.results/raw.results using the response's actual item shape.

AGENTS.md reference: AGENTS.md:L16-L16

Useful? React with 👍 / 👎.

Comment thread scripts/provider-pass-through.mjs Outdated
hasUrlOrTitleOverlap(nativeResult.items, coldResult.items),
"native and ColdSearch tool results overlap by URL or title"
));
detailLoss.push("ColdSearch tool call output preserves provider raw detail; the tool summary is a lossy derived view.");

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 Badge Verify raw preservation before declaring tool conformance

For any provider-tool response that retains URL/title data but loses other provider-specific fields, this comparison still passes: makeColdSearchToolResult reduces output.raw to selected items, the native runner also discards its raw payload, and the checks only compare counts plus URL/title overlap. This unconditional note then records that raw detail was preserved even though the harness never tested it, allowing precisely the raw-detail regression these conformance rows are meant to detect. Retain and compare the native and ColdSearch raw payloads, or add an explicit preservation check before emitting this claim.

AGENTS.md reference: AGENTS.md:L16-L16

Useful? React with 👍 / 👎.

Comment thread scripts/smoke.mjs
Comment on lines +273 to +284
const rows = buildCoverageRows(checkResults);
const lines = [
"## Provider/Path Coverage (smoke-only)",
"",
"These are CLI-only smoke results. Each check executes the ColdSearch CLI with no",
"provider-native leg and no comparison, so no row below is a native-vs-ColdSearch",
"conformance pass: every supported row stays `not_run` in conformance vocabulary.",
"The Smoke column reports the CLI-only outcome: pass / fail / skip / not covered.",
"",
"| Row | Conformance | Smoke |",
"|---|---|---|",
...rows.map((entry) => `| ${coverageRowId(entry.row)} | ${entry.conformance} | ${entry.smoke} |`),

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 Badge Derive published totals from the coverage rows

When the agent check runs or skips, the preceding counters include that coverage: null check, while they omit every unsupported-by-smoke inventory row, including all provider-tool rows. For example, with zero secrets the summary reports 1 passed, 9 skipped, but the table contains 17 inventory rows whose actual smoke breakdown is 1 pass, 8 skips, and 8 not covered. Because the workflow now advertises these as the coverage-table totals, readers cannot reconcile them with the rows; calculate totals from buildCoverageRows() or explicitly label the existing counters as check totals and add inventory-row totals.

AGENTS.md reference: AGENTS.md:L13-L14

Useful? React with 👍 / 👎.

Comment on lines +1097 to +1099
checks.push(check(nativeResult.result_count > 0, "native returned non-empty results"));
checks.push(check(coldResult.ok, "ColdSearch tool call succeeded"));
checks.push(check(coldResult.result_count > 0, "ColdSearch tool call returned non-empty raw results"));

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 Badge Require provider-tool rows to remain catalogued

If one of these inventory profiles is removed or renamed, generic tool call dispatch still forwards the now-uncatalogued provider endpoint and can return ok, non-empty results, and matching URLs, so this conformance row still reports pass even though makeColdSearchToolResult captured catalogued: false. This defeats the stated purpose of catalogued provider-tool inventory rows and would let registry/dispatch drift go unnoticed; include coldResult.catalogued === true in the comparison.

AGENTS.md reference: AGENTS.md:L9-L10

Useful? React with 👍 / 👎.

Comment thread scripts/validate-docs.mjs Outdated
Comment on lines +311 to +312
const usedStatuses = [...new Set(rows.map((row) => row.status))];
for (const status of usedStatuses) {

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 Badge Keep validating the baseline's established status vocabulary

When the historical summary accidentally drops a zero-count status such as fail, blocked_provider, or waived_by_user, this new loop no longer reports drift because none of those values occurs in the current JSONL rows. Only the newly introduced not_run status is legitimately absent from this historical baseline; restricting validation to used statuses also removes coverage for the established vocabulary that the baseline already enumerates. Validate the pre-existing statuses unconditionally and exempt only statuses introduced after the snapshot.

AGENTS.md reference: AGENTS.md:L14-L14

Useful? React with 👍 / 👎.

- Tavily Map rows parse the endpoint's result array from raw.results,
  matching the substrate map summary; a valid Map response no longer
  reports zero items (CodeAnt Major + Codex P1).
- Tool rows disclose raw_preserved and compareToolTarget checks it, so
  the raw-detail claim is verified instead of assumed. Provider raw detail
  stays at the CLI/redaction boundary and is not re-persisted into
  evidence, preserving the no-scraped-bodies evidence isolation rule
  (CodeAnt Major, Codex P1).
- compareToolTarget also requires coldResult.catalogued, so a registry
  row removed or renamed can no longer pass by generic dispatch
  (Codex P2).
- inputForTarget and native runner dispatch throw clear errors for
  missing entries instead of TypeErrors (Copilot).
- canary.yml pins shell: bash for the PIPESTATUS step (Copilot).
- smoke.mjs publishes coverage-row totals via coverageTotals() and labels
  the raw check counters, so the summary reconciles with the table
  (Codex P2).
- validate-docs.mjs validates the baseline's established status
  vocabulary unconditionally and exempts only post-baseline statuses,
  so a dropped status cannot hide (Codex P2).
@codeant-ai

codeant-ai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai Bot added size:XL This PR changes 500-999 lines, ignoring generated files and removed size:XL This PR changes 500-999 lines, ignoring generated files labels Aug 14, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a02ae62661

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1052 to +1055
raw_preserved:
Boolean(output.raw) &&
typeof output.raw === "object" &&
Object.keys(output.raw).length > 0,

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 Badge Compare raw payloads before marking them preserved

When provider-tool dispatch drops provider-specific fields but retains any non-empty object—such as only results—this check still marks raw_preserved true, and the remaining URL/title checks can report the row as passing. Fresh evidence in this revision is the new raw_preserved implementation, which tests only Object.keys(output.raw).length > 0 while the native runners discard their original payloads, so it cannot verify the documented requirement that raw contain the provider-native payload or a faithful subset; retain both payloads and compare their relevant fields/schema before declaring conformance.

AGENTS.md reference: AGENTS.md:L16-L16

Useful? React with 👍 / 👎.

Comment on lines +843 to +844
const links = data.links || data.data || [];
const items = links.map((url) => ({ title: "", url, content: "", source: "firecrawl" }));

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 Badge Unwrap Firecrawl map link objects

When Firecrawl v2 returns its successful Map response with links entries shaped as { url, title, description }, this code stores each entire entry object in the normalized url field. The ColdSearch-side parser does the same at toolRawItems, so both result counts are nonzero but normalizedUrl rejects the object values and the URL/title overlap check always fails; extract link.url and the optional title instead so a valid firecrawl.map run can produce conformance evidence.

AGENTS.md reference: AGENTS.md:L16-L16

Useful? React with 👍 / 👎.

Comment on lines +1115 to +1117
checks.push(check(nativeResult.result_count > 0, "native returned non-empty results"));
checks.push(check(coldResult.ok, "ColdSearch tool call succeeded"));
checks.push(check(coldResult.result_count > 0, "ColdSearch tool call returned non-empty raw results"));

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 Badge Validate the tool result provenance envelope

When tool call returns the correct raw results but mislabels provider or tool, or omits meta, this comparison still passes because it checks only ok, result content, raw presence, and catalogue membership. The documented provider-tool contract requires provider, tool, ok, raw, and meta, and these fields provide the provenance needed to audit the evidence; preserve meta in makeColdSearchToolResult and check all three envelope fields against the selected target before assigning pass.

AGENTS.md reference: AGENTS.md:L16-L16

Useful? React with 👍 / 👎.

@kilo-code-bot

kilo-code-bot Bot commented Aug 14, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 2
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

CRITICAL

File Line Issue
scripts/provider-pass-through.mjs 844 Firecrawl Map links entries shaped as {url,title,description} are stored wholesale as the url field; normalizedUrl (line 285) rejects non-string values, so a valid firecrawl.map run always fails the URL/title overlap check. The same defect is in toolRawItems at line 1026.
scripts/provider-pass-through.mjs 1055 raw_preserved (line 1052–1055) only checks Object.keys(output.raw).length > 0; native runners discard raw payloads, so this cannot verify that output.raw contains the provider-native response or a faithful subset — false confidence in raw-detail preservation.

WARNING

File Line Issue
scripts/provider-pass-through.mjs 1117 compareToolTarget does not verify coldResult.provider/coldResult.tool match the selected target, and makeColdSearchToolResult drops meta from the ToolCallResult envelope; a misrouted or mislabeled tool call could pass conformance.
Files Reviewed (8 files)
  • scripts/provider-pass-through.mjs - 3 issues
  • .github/workflows/canary.yml - 0 issues
  • scripts/smoke.mjs - 0 issues
  • scripts/validate-docs.mjs - 0 issues
  • docs/contributing/testing.md - 0 issues
  • docs/contributing/ci.md - 0 issues
  • test/provider-pass-through-script.test.mjs - 0 issues
  • test/smoke-coverage.test.mjs - 0 issues

Commit a02ae62 resolved the first-round findings (Tavily Map field parsing, inputForTarget/nativeToolRunners dispatch guards, shell: bash pinning, catalogued check, coverageTotals, validate-docs vocabulary). The three findings above remain in the current HEAD and were also flagged by prior review comments; they cross the "No lossy normalization" (G4) and "Audit First" pillars by allowing false pass/fail outcomes in provider-tool conformance rows.

Fix these issues in Kilo Cloud


Reviewed by laguna-s-2.1:free · Input: 705.9K · Output: 85.5K · Cached: 2.5M

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL This PR changes 500-999 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants