Skip to content

fix(embedding): preserve multiline descriptions in catalogs - #191

Merged
chrisknvidia merged 1 commit into
NVIDIA:mainfrom
rioyu123:codex/catalog-multiline-descriptions
Oct 12, 2026
Merged

chrisknvidia merged 1 commit into
NVIDIA:mainfrom
rioyu123:codex/catalog-multiline-descriptions

Conversation

@rioyu123

@rioyu123 rioyu123 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Valid multiline skill descriptions can be embedded successfully but fail when the Tier 2 catalog is saved: catalog validation rejects their line breaks as control characters.

This change allows LF, CR and tabs in catalog descriptions without changing the extracted text. Names, IDs, paths and other metadata keep their existing validation; other control characters, format characters and surrogates are still rejected. Catalog structure and embedding behavior are unchanged.

The tests follow a real SKILL.md through extraction, indexing, save/load and a similarity query, with a fixed embedding client. They also cover whitespace preservation and continued rejection of unsafe text. One existing long line was wrapped by Ruff.

Verification

  • I am familiar with the Contributing Guidelines
  • Added or updated focused tests
  • Updated documentation for user-visible changes (no usage changes)
  • Ran make lint
  • Ran make test
  • Ran make build
  • Did not add credentials, private datasets, or proprietary benchmark content

Seven regression cases fail on unchanged main; the other 12 are controls that already pass. The embedding suite passes on Linux (243 passed, 2 skipped) and Windows (220 passed, 25 skipped).

The final Linux make test run, using an isolated temporary directory, reports 11,237 passed, 51 skipped, 9 deselected and 2 failed. Both failures also occur on unchanged main: a runtime-discovery test finds the host's /usr/bin/codex, and a bridge test needs port 18080, which is already occupied. Neither involves catalog validation. make lint, scoped Ruff formatting and make build pass.

AI assistance: implemented with Codex and reviewed with Claude.

Release Impact

  • No user-visible release note needed
  • Updated CHANGELOG.md

@chrisknvidia chrisknvidia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for this PR, Looks good to me!

@chrisknvidia
chrisknvidia merged commit 49b2b43 into NVIDIA:main Oct 12, 2026
17 checks passed
rng1995 added a commit that referenced this pull request Oct 14, 2026
Brings in #184, #187 (SkillSpector version in the HTML report), #188
(GPT-6.1 Sol / Claude Opus 5.5 defaults, reasoning effort, structured
output, token sizing, refusal fallback), #191 (multiline catalog
descriptions), #193 (Docker agent bootstrap) and #199 (per-step token
runtime-failure detection). Conflicts:

- .gitleaks.toml: keep every allowlist from both sides (the PR's three
  history allowlists and main's Bedrock model ID allowlist).
- CHANGELOG.md: every entry from both sides under Unreleased, one Added,
  Changed, Fixed and Security heading each; the shared docs entry once.
- deduplication/intra_skill/intra_skill_validator.py: the client keeps the
  PR's LLM_VERIFY_MAX_TOKENS and gains main's medium reasoning effort.
- deduplication/intra_skill/llm_analyzer.py: the PR's bounded prompt and
  verdict parsing, with main's structured-output schema request.
- embedding/registry.py: keep the PR's _embed_texts refactor (main only
  reformatted the old loop); main's multiline-description check merged.
- inference/__init__.py: export both sides' names.
- reporting/html.py: the PR's run-status tables plus main's SkillSpector
  version helper; is_tier2_validator_name stays in run_status.py.
- tier3/eval_core/llm_judge.py: drop _is_native_openai_chat_url (removed
  by main) and _configured_secret_values (moved by the PR).
- tier3/harbor/collector.py: keep the PR's shared-metric pass lift and
  main's judge-model helpers; _compute_lift takes main's per-trial rewards
  and the PR's keyword-only N/A lists, and its overall uses the paired
  scores with the PR's N/A-aware basket check; lift.json keeps the PR's
  _paired_lift.
- tier3/harbor/local_agents.py: the PR's SkillEvaluatorCodex (subagent
  rollouts, setup network errors) now extends main's bootstrap-aware
  installed_agents.SkillEvaluatorCodex; NVIDIA Build Claude Code keeps
  SetupNetworkErrorAgent on main's SkillEvaluatorClaudeCode.
- tier3/harbor/runner.py: imports from both sides; Docker uses main's
  DOCKER_AGENT_IMPORT_PATHS, other Harbor backends the PR's
  HARBOR_AGENT_IMPORT_PATHS; agent kwargs from main's _harbor_agent_kwargs.
- tier3/harbor/templates/eval.py: the PR's skill-metric N/A helpers and
  allow_not_applicable judges, with main's 16,384-token judge ceiling and
  judge_model_used / reasoning effort / fallback provenance.
- utils/tool_runner.py: main's pinned SkillSpector v2.12.0 hint plus the
  PR's scanner hints.
- validators/security.py: imports from both sides.
- tests/inference/test_llm_client.py: keep both sides' tests.
- tests/test_harbor_local_mode.py: main's parametrized Docker route check
  plus the PR's Codex subclass assertion.
- tests/tier3/test_judge_parse_robustness.py: the PR's partial-salvage
  assertions plus main's new provenance and refusal tests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Narendran Raghavan <[email protected]>
chrisknvidia pushed a commit that referenced this pull request Oct 30, 2026
Brings in #184, #187 (SkillSpector version in the HTML report), #188
(GPT-6.1 Sol / Claude Opus 5.5 defaults, reasoning effort, structured
output, token sizing, refusal fallback), #191 (multiline catalog
descriptions), #193 (Docker agent bootstrap) and #199 (per-step token
runtime-failure detection). Conflicts:

- .gitleaks.toml: keep every allowlist from both sides (the PR's three
  history allowlists and main's Bedrock model ID allowlist).
- CHANGELOG.md: every entry from both sides under Unreleased, one Added,
  Changed, Fixed and Security heading each; the shared docs entry once.
- deduplication/intra_skill/intra_skill_validator.py: the client keeps the
  PR's LLM_VERIFY_MAX_TOKENS and gains main's medium reasoning effort.
- deduplication/intra_skill/llm_analyzer.py: the PR's bounded prompt and
  verdict parsing, with main's structured-output schema request.
- embedding/registry.py: keep the PR's _embed_texts refactor (main only
  reformatted the old loop); main's multiline-description check merged.
- inference/__init__.py: export both sides' names.
- reporting/html.py: the PR's run-status tables plus main's SkillSpector
  version helper; is_tier2_validator_name stays in run_status.py.
- tier3/eval_core/llm_judge.py: drop _is_native_openai_chat_url (removed
  by main) and _configured_secret_values (moved by the PR).
- tier3/harbor/collector.py: keep the PR's shared-metric pass lift and
  main's judge-model helpers; _compute_lift takes main's per-trial rewards
  and the PR's keyword-only N/A lists, and its overall uses the paired
  scores with the PR's N/A-aware basket check; lift.json keeps the PR's
  _paired_lift.
- tier3/harbor/local_agents.py: the PR's SkillEvaluatorCodex (subagent
  rollouts, setup network errors) now extends main's bootstrap-aware
  installed_agents.SkillEvaluatorCodex; NVIDIA Build Claude Code keeps
  SetupNetworkErrorAgent on main's SkillEvaluatorClaudeCode.
- tier3/harbor/runner.py: imports from both sides; Docker uses main's
  DOCKER_AGENT_IMPORT_PATHS, other Harbor backends the PR's
  HARBOR_AGENT_IMPORT_PATHS; agent kwargs from main's _harbor_agent_kwargs.
- tier3/harbor/templates/eval.py: the PR's skill-metric N/A helpers and
  allow_not_applicable judges, with main's 16,384-token judge ceiling and
  judge_model_used / reasoning effort / fallback provenance.
- utils/tool_runner.py: main's pinned SkillSpector v2.12.0 hint plus the
  PR's scanner hints.
- validators/security.py: imports from both sides.
- tests/inference/test_llm_client.py: keep both sides' tests.
- tests/test_harbor_local_mode.py: main's parametrized Docker route check
  plus the PR's Codex subclass assertion.
- tests/tier3/test_judge_parse_robustness.py: the PR's partial-salvage
  assertions plus main's new provenance and refusal tests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Narendran Raghavan <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants