Skip to content

feat: expand capability taxonomy and projections - #22

Merged
aditzel merged 6 commits into
mainfrom
feat/capability-taxonomy-0.8.0
Mar 9, 2026
Merged

feat: expand capability taxonomy and projections#22
aditzel merged 6 commits into
mainfrom
feat/capability-taxonomy-0.8.0

Conversation

@aditzel

@aditzel aditzel commented Mar 8, 2026

Copy link
Copy Markdown
Owner

Summary

  • expand the canonical capability taxonomy with database, observability, messaging, payments, and design_workspace
  • add rich namespace classification diagnostics, adapter projection config, and transitional design policy compatibility
  • add a captured official Figma MCP fixture test and prepare the branch for release as 0.8.0

Testing

  • bun test
  • bun run build
  • bun run lint

Co-authored-by: Codex codex@openai.com

Summary by CodeRabbit

  • New Features

    • Added five canonical capabilities: observability, messaging, payments, database, design_workspace.
    • Added adapter-projection support with configurable adapter profiles, per-namespace overrides, and projection mode.
    • Added facet override config to tune classification.
    • Status command verbose mode now shows per-namespace classifications and adapter projections.
  • Documentation

    • Added capability taxonomy design doc and updated README and architecture docs with examples and migration notes.
  • Tests

    • Expanded classification, projection, semantic, CLI status, and Figma integration tests; added Figma fixture.

aditzel and others added 3 commits March 7, 2026 22:10
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
@coderabbitai

coderabbitai Bot commented Mar 8, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 727a9260-9fb0-4c9d-8fde-7320a547b361

📥 Commits

Reviewing files that changed from the base of the PR and between 4866ee4 and fab9590.

📒 Files selected for processing (1)
  • tests/capability-classification.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/capability-classification.test.ts

Walkthrough

Adds a layered capability taxonomy (v0.8.0): canonical CapabilityIds, richer NamespaceClassification with facets/evidence/confidence/runner-up data, facet/capability override config, an adapter projection layer mapping classifications to adapter-specific buckets, plus docs, tests, schema, and status output integration.

Changes

Cohort / File(s) Summary
Documentation & Versioning
CHANGELOG.md, README.md, docs/ARCHITECTURE.md, docs/capability-taxonomy-design.md, package.json
Release notes, new taxonomy design doc, README examples for adapterProjection and facet remapping, and package version bump to 0.8.0.
Core Capability Classification
src/capabilities/inference.ts, src/capabilities/semantic-classifier.ts
Adds new capabilities (observability,messaging,payments,database,design_workspace), rich NamespaceClassification types (facets, evidence, runner-up, confidence), new classification APIs (classifyNamespace(s), inferNamespaceFacets, grouping helpers), semantic prior boosts, expanded patterns, and scoring/evidence plumbing.
Adapter Projection Layer
src/capabilities/projection.ts
New module implementing adapter projection types and functions (AdapterProjectionResult, projectNamespaceClassification(s)), profile scoring/normalization, per-adapter config (namespace overrides, fallback), and resolution/fallback logic.
Configuration Schema & Exports
src/config/schema.ts, src/config/index.ts
Introduces facetOverrides in dynamic tool surface, defines AdapterProjection schemas/types and defaults, and re-exports adapter projection types from config index.
Status Runner & Output
src/status/runner.ts
Status pipeline now computes classifications and optional adapterProjection, extends StatusResult shape, and adds verbose status formatting to include per-namespace classifications and projection details.
Security Policy Matching
src/security/policy.ts
Adds internal POLICY_SCOPE_ALIASES and updates pattern matching to consider legacy/alias scopes during policy evaluation.
Utilities & Metadata
src/utils/capability-meta.ts
Extends capability summary/title mappings to include the five new capabilities.
Tests & Fixtures
tests/..., tests/fixtures/figma-mcp-tools.json
Adds/updates tests for classification, semantic priors, facet/capability overrides, adapter projection behavior, config parsing, policy aliasing, status verbose output, and a Figma tools fixture.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Classifier as CapabilityClassifier
    participant FacetRunner as FacetInference
    participant Config as Config/Overrides
    participant Projector as AdapterProjector
    participant Status as StatusRunner

    Client->>Classifier: classifyNamespace(namespace, tools, options)
    Classifier->>Classifier: score patterns, build evidence
    Classifier->>FacetRunner: inferNamespaceFacets(namespace, tools, facetOverrides)
    FacetRunner-->>Classifier: facets + evidence
    Classifier->>Config: apply capability/facet overrides
    Config-->>Classifier: adjusted classification
    Classifier-->>Client: NamespaceClassification (canonical, facets, confidence, runnerUp)

    Client->>Projector: projectNamespaceClassification(adapterId, classification, adapterConfig)
    Projector->>Projector: score profiles, normalize scores
    alt adapter namespace override
        Projector-->>Client: AdapterProjectionResult (adapter_override)
    else matched profile
        Projector-->>Client: AdapterProjectionResult (matched_profile)
    else fallback
        Projector-->>Client: AdapterProjectionResult (fallback / canonical)
    end

    Status->>Classifier: classifyNamespaces(inventories, options)
    Classifier-->>Status: NamespaceClassification[]
    Status->>Projector: projectNamespaceClassifications(adapterId, classifications, config)
    Projector-->>Status: AdapterProjectionResult[]
    Status-->>Client: StatusResult (routers, classifications, adapterProjection)
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: expand capability taxonomy and projections' accurately captures the main objective: adding new capabilities (database, observability, messaging, payments, design_workspace) and introducing the adapter projection feature.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/capability-taxonomy-0.8.0

Comment @coderabbitai help to get the list of available commands and usage tips.

@sentry

sentry Bot commented Mar 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.04494% with 78 lines in your changes missing coverage. Please review.
✅ Project coverage is 69.84%. Comparing base (43141fe) to head (fab9590).

Files with missing lines Patch % Lines
src/capabilities/projection.ts 65.45% 38 Missing ⚠️
src/status/runner.ts 52.56% 37 Missing ⚠️
src/capabilities/inference.ts 99.28% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #22      +/-   ##
==========================================
+ Coverage   68.76%   69.84%   +1.07%     
==========================================
  Files         111      112       +1     
  Lines       11844    12520     +676     
==========================================
+ Hits         8145     8744     +599     
- Misses       3699     3776      +77     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@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: 75ce97a640

ℹ️ 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 src/capabilities/projection.ts
Comment thread src/capabilities/inference.ts

@coderabbitai coderabbitai 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.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
README.md (1)

220-237: ⚠️ Potential issue | 🟡 Minor

Keep the public capability list exhaustive.

This section says MCP² exposes one router per non-empty capability, but ai_media_generation is still part of the canonical taxonomy elsewhere in the PR. Leaving it out here makes the list look complete when it isn't.

📝 Suggested doc fix
 - `design_workspace`
+- `ai_media_generation`
 - `hosting_deploy`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 220 - 237, The public capability list under "Tool API
(Capability Routers)" is missing the ai_media_generation capability; update the
bullet list (the set that currently includes `code_search`, `docs`, ...
`general`) to include `ai_media_generation` so the README matches the canonical
taxonomy used elsewhere in the PR and remains exhaustive.
src/capabilities/semantic-classifier.ts (1)

178-205: ⚠️ Potential issue | 🟠 Major

Don't return boosted ranking scores as confidence.

Line 183 adds the prior directly to cosine similarity, and Lines 199-205 then expose that adjusted score as confidence. That can push confidence above 1 and makes classifyBatch() thresholding depend on the heuristic boost rather than the underlying embedding similarity. Keep a separate ranking score here, or at least clamp the exported confidence before returning it.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/capabilities/semantic-classifier.ts` around lines 178 - 205, The code
currently adds prior boosts to the cosine similarity and returns that boosted
value as confidence; instead compute raw similarity =
EmbeddingGenerator.cosineSimilarity(signalResult.embedding, refEmb) separately
and use boostedScore = rawSimilarity + (priorBoosts[capId] ?? 0) for ranking
only (keep scores array entries with both rawSimilarity and boostedScore), sort
by boostedScore, but set the returned confidence to a clamped rawSimilarity
(e.g., clamp(rawSimilarity, 0, 1) or map from [-1,1] to [0,1]) for both best and
runnerUp so exported confidence reflects the underlying embedding similarity not
the heuristic boost; update references around computePriorBoosts,
referenceEmbeddings, and the returned object (capability, confidence, runnerUp)
accordingly.
🧹 Nitpick comments (1)
tests/capability-inference.test.ts (1)

98-191: Move these cases out of the misclassification-regression block.

These assertions now encode the desired canonical outputs, but the enclosing suite/comment still says it tracks the current wrong heuristic results. Keeping them here will make future failures harder to interpret.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/capability-inference.test.ts` around lines 98 - 191, The tests that
assert correct canonical outputs (the tests named "Sentry: classified as
observability", "Slack: classified as messaging", "Stripe: classified as
payments", "Prisma: classified as database", "shadcn: correctly classified as
docs (fixed — was design)", and "Supabase: classified as database") should be
removed from the misclassification-regression suite and placed into a normal
passing-spec suite (or top-level tests) that validates inferNamespaceCapability
directly; update or remove the surrounding comment that labels them as tracking
the current wrong heuristic. Locate calls to inferNamespaceCapability(...) and
the corresponding expect(...).toBe(...) assertions and move those test blocks
into a new or existing describe/test group that reflects they are
expected-correct canonical behaviors. Ensure the misclassification-regression
block only contains tests that intentionally assert the known-broken outputs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/capabilities/inference.ts`:
- Around line 153-155: The current regex patterns in the observability
capability (the pattern property for capability: "observability") and the other
similar capability entries use raw substring matches that falsely match short
tokens inside unrelated namespaces; update these patterns to use separator-aware
matching (e.g., require word boundaries or common separators like ^, $, ., /, -,
_, or whitespace around short tokens) so tokens like "log", "dm", "ui" only
match as standalone segments rather than inside words; locate the pattern
properties in the observability capability and the other two similar entries and
replace the simple substring alternation with separator-aware variants for each
short token.
- Around line 80-85: The capabilityOverrideSources property in
NamespaceClassificationOptions currently allows any
CapabilityClassificationSource (including "heuristic" and "semantic") but needs
to be restricted to only the override variants so values are assignable to
ClassificationEvidenceSource where they are later reused (see usage around the
evidence array and source propagation). Update the type of
capabilityOverrideSources to only permit override-only variants (e.g., constrain
to Extract<CapabilityClassificationSource, "user_override" |
"computed_override"> or directly to ClassificationEvidenceSource), so the values
stored in capabilityOverrideSources are type-compatible with the evidence
construction code (identify the NamespaceClassificationOptions interface and the
usage that reads capabilityOverrideSources into evidence/source).

In `@src/capabilities/projection.ts`:
- Around line 91-103: The filter currently only excludes null scores, allowing
score === 0 (or negative) to be treated as a match; update the predicate used
when building ranked (and the similar block at 105-125) to treat non-positive
scores as "no match" by filtering entries where score is a number and > 0 (e.g.,
change the type guard from entry.score !== null to entry.score != null &&
entry.score > 0), so that profiles with score <= 0 fall through to
fallbackBucket and matched_profile is not returned with confidence: 0; ensure
you use the existing scoreProfile function and keep the ranking/sort logic
unchanged.

In `@src/status/runner.ts`:
- Around line 58-61: collectStatus() currently always includes the
adapterProjection property (possibly set to undefined), which violates
exactOptionalPropertyTypes for StatusResult.adapterProjection; change
collectStatus() to only include adapterProjection in the returned object when a
real value exists (e.g., use a conditional spread or add the property inside an
if block) so that adapterProjection is omitted entirely when undefined; update
any related return expressions in collectStatus() and ensure the type remains
StatusResult.

In `@tests/capability-classification.test.ts`:
- Around line 112-123: The "general" AdapterCapabilityProfile literal is missing
the required prefersFacets and rejectsFacets arrays; update the object with both
properties (e.g., prefersFacets: [] and rejectsFacets: []) so it conforms to
AdapterCapabilityProfile. Locate the object with id "general" in
tests/capability-classification.test.ts and add appropriate empty or specific
facet arrays for prefersFacets and rejectsFacets to satisfy TypeScript type
checking.

---

Outside diff comments:
In `@README.md`:
- Around line 220-237: The public capability list under "Tool API (Capability
Routers)" is missing the ai_media_generation capability; update the bullet list
(the set that currently includes `code_search`, `docs`, ... `general`) to
include `ai_media_generation` so the README matches the canonical taxonomy used
elsewhere in the PR and remains exhaustive.

In `@src/capabilities/semantic-classifier.ts`:
- Around line 178-205: The code currently adds prior boosts to the cosine
similarity and returns that boosted value as confidence; instead compute raw
similarity = EmbeddingGenerator.cosineSimilarity(signalResult.embedding, refEmb)
separately and use boostedScore = rawSimilarity + (priorBoosts[capId] ?? 0) for
ranking only (keep scores array entries with both rawSimilarity and
boostedScore), sort by boostedScore, but set the returned confidence to a
clamped rawSimilarity (e.g., clamp(rawSimilarity, 0, 1) or map from [-1,1] to
[0,1]) for both best and runnerUp so exported confidence reflects the underlying
embedding similarity not the heuristic boost; update references around
computePriorBoosts, referenceEmbeddings, and the returned object (capability,
confidence, runnerUp) accordingly.

---

Nitpick comments:
In `@tests/capability-inference.test.ts`:
- Around line 98-191: The tests that assert correct canonical outputs (the tests
named "Sentry: classified as observability", "Slack: classified as messaging",
"Stripe: classified as payments", "Prisma: classified as database", "shadcn:
correctly classified as docs (fixed — was design)", and "Supabase: classified as
database") should be removed from the misclassification-regression suite and
placed into a normal passing-spec suite (or top-level tests) that validates
inferNamespaceCapability directly; update or remove the surrounding comment that
labels them as tracking the current wrong heuristic. Locate calls to
inferNamespaceCapability(...) and the corresponding expect(...).toBe(...)
assertions and move those test blocks into a new or existing describe/test group
that reflects they are expected-correct canonical behaviors. Ensure the
misclassification-regression block only contains tests that intentionally assert
the known-broken outputs.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7ebd5d73-2c0e-4dd3-864e-5e76f64d8538

📥 Commits

Reviewing files that changed from the base of the PR and between 43141fe and 75ce97a.

📒 Files selected for processing (21)
  • CHANGELOG.md
  • README.md
  • docs/ARCHITECTURE.md
  • docs/capability-taxonomy-design.md
  • package.json
  • src/capabilities/inference.ts
  • src/capabilities/projection.ts
  • src/capabilities/semantic-classifier.ts
  • src/config/index.ts
  • src/config/schema.ts
  • src/security/policy.ts
  • src/status/runner.ts
  • src/utils/capability-meta.ts
  • tests/capability-classification.test.ts
  • tests/capability-inference.test.ts
  • tests/capability-meta.test.ts
  • tests/config.test.ts
  • tests/figma-classification.test.ts
  • tests/fixtures/figma-mcp-tools.json
  • tests/security-policy.test.ts
  • tests/status-runner.test.ts

Comment thread src/capabilities/inference.ts
Comment thread src/capabilities/inference.ts Outdated
Comment thread src/capabilities/projection.ts
Comment thread src/status/runner.ts
Comment thread tests/capability-classification.test.ts
Co-authored-by: Codex <codex@openai.com>

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/capability-classification.test.ts`:
- Around line 91-128: The adapter config object literal used in the test (the
object with keys mode, fallbackBucket, capabilities) is missing the required
namespaceBucketOverrides property; add a namespaceBucketOverrides field to that
same config literal (matching the shape used in the second test) so the
TypeScript compiler is satisfied—e.g., include an object mapping any relevant
namespaces to bucket names under the key namespaceBucketOverrides alongside
mode, fallbackBucket, and capabilities.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: abbb12c0-0d3d-458e-aee9-84553cfd163b

📥 Commits

Reviewing files that changed from the base of the PR and between 75ce97a and c90b492.

📒 Files selected for processing (5)
  • src/capabilities/inference.ts
  • src/capabilities/projection.ts
  • src/status/runner.ts
  • tests/capability-classification.test.ts
  • tests/capability-inference.test.ts

Comment thread tests/capability-classification.test.ts
Co-authored-by: Codex <codex@openai.com>

@coderabbitai coderabbitai 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.

🧹 Nitpick comments (2)
tests/capability-classification.test.ts (2)

188-204: Decouple the semantic mock from reference-text copy.

embedBatch() is keying off literal snippets like "structured design workspace files" and "visual design artifacts". That makes this test fail on copy-only edits to the reference texts, even if the classifier behavior is still correct. Prefer mapping from stable capability identifiers/constants instead of hard-coded substrings.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/capability-classification.test.ts` around lines 188 - 204, The mock
embedBatch in fakeGenerator currently matches on hard-coded substrings
("structured design workspace files", "visual design artifacts") making tests
fragile; change it to map inputs to vectors using stable capability
identifiers/constants (e.g., CAP_DESIGN_WORKSPACE, CAP_VISUAL_DESIGN) or an
explicit text->vector map keyed by exact capability tokens rather than
substrings, update the test reference texts to use those constants/tokens, and
have embedBatch return designWorkspaceVector, designVector or otherVector based
on that identifier lookup so copy-only edits to descriptive text won't break the
test.

84-166: Add a direct test for namespaceBucketOverrides precedence.

Both projection cases pass namespaceBucketOverrides: {}, so the highest-precedence branch in src/capabilities/projection.ts never runs here. That leaves the new override behavior unprotected even though it is part of this PR.

🧪 Suggested coverage
 describe("adapter projection", () => {
+  test("prefers namespace bucket overrides over profile scoring", () => {
+    const classification = classifyNamespace("pencil", PENCIL_TOOLS);
+
+    const projection = projectNamespaceClassification("gateway", classification, {
+      mode: "projected",
+      fallbackBucket: "general",
+      capabilities: [
+        {
+          id: "design",
+          title: "Design Analysis",
+          summary: "Analyze screenshots, diagrams, and visual diffs.",
+          acceptsCanonical: ["design_workspace"],
+          prefersFacets: [],
+          rejectsFacets: [],
+        },
+      ],
+      namespaceBucketOverrides: { pencil: "general" },
+    });
+
+    expect(projection.bucket).toBe("general");
+    expect(projection.source).toBe("adapter_override");
+  });
+
   test("can project a canonical design_workspace classification away from screenshot-analysis design buckets", () => {

As per coding guidelines, "For new features: Write a failing test first, then implement until it passes."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/capability-classification.test.ts` around lines 84 - 166, The new
behavior for namespaceBucketOverrides isn't covered by tests; add a test that
calls projectNamespaceClassification with a non-empty namespaceBucketOverrides
mapping (e.g., {"pencil": "design"}) and a capabilities list, then assert the
projection selects the override bucket
(expect(projection.bucket).toBe("design")) and that the projection.source
indicates the override branch (e.g., "namespace_override" or whatever the code
sets) to ensure the highest-precedence override path in
projectNamespaceClassification is exercised.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/capability-classification.test.ts`:
- Around line 188-204: The mock embedBatch in fakeGenerator currently matches on
hard-coded substrings ("structured design workspace files", "visual design
artifacts") making tests fragile; change it to map inputs to vectors using
stable capability identifiers/constants (e.g., CAP_DESIGN_WORKSPACE,
CAP_VISUAL_DESIGN) or an explicit text->vector map keyed by exact capability
tokens rather than substrings, update the test reference texts to use those
constants/tokens, and have embedBatch return designWorkspaceVector, designVector
or otherVector based on that identifier lookup so copy-only edits to descriptive
text won't break the test.
- Around line 84-166: The new behavior for namespaceBucketOverrides isn't
covered by tests; add a test that calls projectNamespaceClassification with a
non-empty namespaceBucketOverrides mapping (e.g., {"pencil": "design"}) and a
capabilities list, then assert the projection selects the override bucket
(expect(projection.bucket).toBe("design")) and that the projection.source
indicates the override branch (e.g., "namespace_override" or whatever the code
sets) to ensure the highest-precedence override path in
projectNamespaceClassification is exercised.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a663bb5c-66da-497a-8696-3b5685c9f720

📥 Commits

Reviewing files that changed from the base of the PR and between c90b492 and 4866ee4.

📒 Files selected for processing (1)
  • tests/capability-classification.test.ts

Co-authored-by: Codex <codex@openai.com>
@aditzel

aditzel commented Mar 9, 2026

Copy link
Copy Markdown
Owner Author

Addressed the latest CodeRabbit nitpicks in fab9590.

  • Added direct coverage for namespace bucket override precedence in the projection tests.
  • Refactored the semantic-classifier test mock to key off stable capability IDs instead of reference-text copy.

Validated locally with bun test, bun run build, bun run lint, bun test --coverage, bun run coverage:check, and bun run eval:routing --strict.

@aditzel
aditzel merged commit 41144bf into main Mar 9, 2026
9 checks passed
@aditzel
aditzel deleted the feat/capability-taxonomy-0.8.0 branch March 9, 2026 22:42
@coderabbitai coderabbitai Bot mentioned this pull request Mar 12, 2026
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.

1 participant