Three categories of issues identified in a deep audit:
- Code correctness bugs — 8 code examples in new testing-patterns-* skills and existing skills that won't compile or run, plus 1 missing
ctx.QueryAsync()in transactions-dotnet. - Coverage gaps — KV Range Scan missing from 6 sdk-patterns-* skills; analytics write-back body content missing from 7 analytics skills; broken file reference; false statement about PHP/Ruby testcontainers support.
- New skill coverage — Field-Level Encryption (FLE) has zero coverage despite being supported by 6 SDKs. Requires 1 concept skill + 9 language skills (6 full, 3 "not supported" stubs).
- Shared file completeness —
shared/server/durability.mdandshared/server/subdocument.mdmissing examples for 5–6 languages.
File: skills/testing-patterns-rust/SKILL.md line 83
let doc: serde_json::Value = result.content().unwrap(); // WRONGGetResult has content_as::<T>(), not content(). Fix:
let doc: serde_json::Value = result.content_as().unwrap();File: skills/testing-patterns-rust/SKILL.md lines 54–66
Cli::default() + docker.run() was removed in testcontainers 0.15. Fix to use AsyncRunner:
testcontainers = "0.20"
testcontainers-modules = { version = "0.5", features = ["couchbase"] }use testcontainers::runners::AsyncRunner;
let node = Couchbase::default().start().await.unwrap();
let port = node.get_host_port_ipv4(11210).await.unwrap();File: skills/testing-patterns-rust/SKILL.md line 61
Uses ClusterOptions::default().authenticator(PasswordAuthenticator::new(...)) — this builder method doesn't exist. Correct API (from server-connection-rust):
use couchbase::authenticator::{Authenticator, PasswordAuthenticator};
use couchbase::options::cluster_options::ClusterOptions;
ClusterOptions::new(Authenticator::PasswordAuthenticator(
PasswordAuthenticator::new("Administrator", "password")
))File: skills/testing-patterns-php/SKILL.md line 76
ClusterOptions::build() is not a PHP SDK method. Correct API (from server-connection-php):
$options = new \Couchbase\ClusterOptions();
$options->credentials('Administrator', 'password');
new \Couchbase\Cluster('couchbase://localhost:' . $port, $options);File: skills/testing-patterns-scala/SKILL.md line 74
ClusterOptions.create() is the Java SDK factory. Scala uses the case class constructor (from server-connection-scala):
ClusterOptions(PasswordAuthenticator("Administrator", "password"))File: skills/testing-patterns-ruby/SKILL.md line 66
Function-call syntax is invalid. Correct API (from server-connection-ruby):
options = Couchbase::Options::Cluster.new
options.authenticate('Administrator', 'password')
Couchbase::Cluster.connect("couchbase://localhost:#{port}", options)File: skills/search-scala/SKILL.md lines 99, 102, 115, 119
Seq[Double]should beArray[Float]VectorQuery.create()is the Java factory; Scala usesVectorQuery("field", vector)Fix (matchingsearch-scala/examples/examples.md):
val queryVector: Array[Float] = Array(0.1f, 0.2f /*, ... 1536 dims */)
VectorQuery("embedding_field", queryVector).numCandidates(3)File: skills/sdk-patterns-rust/SKILL.md line 114
DecrementOptions is used but only IncrementOptions is imported. Add:
use couchbase::options::kv_options::{IncrementOptions, DecrementOptions};File: skills/transactions-dotnet/SKILL.md — ## SQL++ Transactions section
The section shows raw BEGIN TRANSACTION; ... COMMIT TRANSACTION; SQL — a different mechanism from the SDK transaction lambda. Replace with ctx.QueryAsync() matching the pattern in Python/Go:
await cluster.Transactions().RunAsync(async (ctx) => {
await ctx.QueryAsync(
"UPDATE `myapp`._default.accounts SET balance = balance - $1 WHERE META().id = $2",
new TransactionQueryOptions().Parameter(100).Parameter("acct_alice")
);
await ctx.QueryAsync(
"UPDATE `myapp`._default.accounts SET balance = balance + $1 WHERE META().id = $2",
new TransactionQueryOptions().Parameter(100).Parameter("acct_bob")
);
});File: skills/sdk-patterns-python/SKILL.md line 112
See [references/bulk-ops.md](references/bulk-ops.md) for chunked bulk get and KV range scan.
references/bulk-ops.md does not exist. Remove the broken link; the sentence can stand alone or reference sdk-patterns-go for the range scan pattern.
File: skills/testing-patterns/SKILL.md line 62
For CI pipelines or languages without testcontainers support (PHP, Ruby):
Both testing-patterns-php and testing-patterns-ruby have full testcontainers sections. Change to:
For CI pipelines or when a real cluster is preferred over testcontainers:
KV Range Scan is supported by Java, .NET, Node.js, Scala, PHP, Ruby (Server 7.6+) but none of these skills have a section for it. Add a ## KV Range Scan section to each, using the Go skill as the reference pattern. Each section should show:
- Prefix scan (all keys starting with a prefix)
- Range scan (lexicographic range)
- Note: requires Server 7.6+; operates on key order, not field values
Affected skills: sdk-patterns-java, sdk-patterns-dotnet, sdk-patterns-nodejs, sdk-patterns-scala, sdk-patterns-php, sdk-patterns-ruby
API names per language:
- Java:
collection.scan(new PrefixScan("user::"), ScanOptions.scanOptions()) - .NET:
collection.ScanAsync(new PrefixScan("user::"), ScanOptions.Default) - Node.js:
collection.scan(new PrefixScan("user::"), { idsOnly: false }) - Scala:
collection.scan(PrefixScan("user::"), ScanOptions()) - PHP:
$collection->scan(new PrefixScan("user::"), new ScanOptions()) - Ruby:
collection.scan(Couchbase::PrefixScan.new("user::"), Couchbase::Options::Scan.new)
Also add KV range scan discovery triggers for these 6 languages to discovery.yaml.
All 7 analytics skills (python, java, go, dotnet, nodejs, scala, php) have a routing edge to transactions-<lang> but no body content explaining the pattern before routing. Add a ## Writing Results Back section to each, showing:
- Brief explanation: use transactions for atomic write-back, or individual KV upserts for non-atomic
- A short code example (upsert loop, matching the language)
- Link to
transactions-<lang>for the full transactional pattern
Covers:
- What FLE is: client-side encryption of specific document fields before writing to Couchbase
- Supported SDKs: Python, Java, Go, .NET, Node.js, PHP
- Not supported: Rust SDK 1.0, Scala, Ruby SDK 3.x
- Key concepts:
CryptoManager,KeyProvider, annotated fields,EncryptedField - When to use vs server-side encryption at rest
- Link to language-specific skills
skills/fle-python/SKILL.md— full contentskills/fle-java/SKILL.md— full contentskills/fle-go/SKILL.md— full contentskills/fle-dotnet/SKILL.md— full contentskills/fle-nodejs/SKILL.md— full contentskills/fle-php/SKILL.md— full contentskills/fle-rust/SKILL.md— "not supported" stub (Rust SDK 1.0)skills/fle-scala/SKILL.md— "not supported" stub (Scala SDK)skills/fle-ruby/SKILL.md— "not supported" stub (Ruby SDK 3.x)
Each supported language skill covers:
- Dependencies / package setup
CryptoManager+KeyProvidersetup- Encrypting a field on write (upsert)
- Decrypting on read (get)
- Annotating model classes (where applicable)
Each unsupported stub covers:
- Clear statement that FLE is not supported
- Alternative: server-side encryption at rest (available in Server 8.x for all SDKs)
- Link to
securityskill
Add discovery.yaml entries and routing.yaml edges for all 10 skills.
Currently has Python, Java, Node.js, Go. Add sections for the 5 missing languages showing the durability option in a upsert/replace call.
Currently has Node.js, Java, Go in the Language Examples section. Add the 6 missing languages.
bash scripts/validate-skills.shexits 0 with 0 failures and 0 warnings.- All 9 code bugs (A1–A9) are fixed — no non-compiling examples.
sdk-patterns-{java,dotnet,nodejs,scala,php,ruby}each have a## KV Range Scansection.analytics-{python,java,go,dotnet,nodejs,scala,php}each have a## Writing Results Backsection with a code example.skills/fle/SKILL.mdexists with concept content.- 9
skills/fle-{lang}/SKILL.mdfiles exist (6 full, 3 stubs). shared/server/durability.mdhas examples for all 9 languages.shared/server/subdocument.mdhas examples for all 9 languages.testing-patterns/SKILL.mdno longer falsely claims PHP/Ruby lack testcontainers support.sdk-patterns-python/SKILL.mdhas no broken file reference.
- Fix A1–A3: testing-patterns-rust — fix
content_as, testcontainers API, ClusterOptions API - Fix A4: testing-patterns-php — fix
ClusterOptions::build() - Fix A5: testing-patterns-scala — fix
ClusterOptions.create() - Fix A6: testing-patterns-ruby — fix
Couchbase::Options::Cluster()syntax - Fix A7: search-scala — fix
Seq[Double]→Array[Float]andVectorQuery.create()→VectorQuery() - Fix A8: sdk-patterns-rust — add
DecrementOptionsimport - Fix A9: transactions-dotnet — replace SQL syntax with
ctx.QueryAsync()example - Fix B1: sdk-patterns-python — remove broken
references/bulk-ops.mdlink - Fix B2: testing-patterns concept skill — fix false PHP/Ruby testcontainers statement
- Add KV Range Scan to 6 sdk-patterns- skills + discovery triggers* (Group C)
- Add Writing Results Back to 7 analytics skills (Group D)
- Create FLE concept skill + 9 language skills + discovery.yaml + routing.yaml (Group E)
- Run sync-handoffs.sh --apply
- Add missing language examples to shared/server/durability.md (Group F1)
- Add missing language examples to shared/server/subdocument.md (Group F2)
- Run validate-skills.sh — confirm 0 failures, 0 warnings
Seven issues were identified in a PM review of the agent skill pack. They fall into three categories:
- Correctness bugs — routing sends users to wrong skills or skills lack body content explaining SDK limitations, causing AI agents to give wrong answers (e.g. Rust/Ruby users receiving Python transaction code).
- Missing routing edges — 8 of 9
server-querying-*skills lack a direct path tocolumnar-analytics, forcing a detour through deprecated skills on Server 8.x. - Quality issues — mid-list blank lines in
discovery.yamltrigger lists, a double---insearch-concepts/SKILL.md, and ambiguoususe_whenwording inanalytics-*skills.
Affected files: routing.yaml, skills/server-querying-rust/SKILL.md, skills/server-querying-ruby/SKILL.md
Problem: Both server-querying-rust and server-querying-ruby have a routing edge:
condition: user asks about transactions or ACID operations
to: error-handling
error-handling then tries to hand off to transactions-<lang>, but neither transactions-rust nor transactions-ruby exist. Rust SDK 1.0 and Ruby SDK 3.x do not support distributed ACID transactions (confirmed in references/sdk-feature-matrix.md).
Requirements:
- Remove both
server-querying-rust → error-handlingandserver-querying-ruby → error-handlingrouting edges (the transaction-condition ones). - Add a
## Transactionssection toskills/server-querying-rust/SKILL.mdbody explaining:- Rust SDK 1.0 does not support distributed ACID transactions.
- Recommended alternative: optimistic locking with CAS (link to
sdk-patterns-rust).
- Add a
## Transactionssection toskills/server-querying-ruby/SKILL.mdbody explaining:- Ruby SDK 3.x does not support distributed ACID transactions.
- Recommended alternative: optimistic locking with CAS (link to
sdk-patterns-ruby).
- Remove the two routing edges from the cycle allowlist in
scripts/validate-skills.shif they appear there (stale-entry check would fail otherwise). - Run
sync-handoffs.sh --applyafter routing changes.
Affected file: routing.yaml
Problem: Only server-querying-python has a direct edge to columnar-analytics. The other 8 languages route through the deprecated analytics-<lang> skill (deprecated since Server 8.0) before reaching columnar-analytics.
Requirements:
- Add
server-querying-<lang> → columnar-analyticsedges for: java, go, dotnet, nodejs, rust, scala, php, ruby. - Use the same condition as Python:
"user is on Server 8.x and asks about columnar or OLAP queries". - Run
sync-handoffs.sh --applyafter routing changes.
Finding 3 — server-connection-rust and server-connection-ruby lack body explanation for unsupported transactions (P1)
Affected files: skills/server-connection-rust/SKILL.md, skills/server-connection-ruby/SKILL.md
Problem: discovery.yaml routes cold-start queries like "transactions Rust Couchbase" to server-connection-rust. The limitation is only in the compatibility frontmatter field — not in the skill body. An AI agent loading the skill may not surface the frontmatter note.
Requirements:
- Add a
## Transactionssection toskills/server-connection-rust/SKILL.mdbody:- State that Rust SDK 1.0 does not support distributed ACID transactions.
- Suggest CAS-based optimistic locking as the alternative (brief inline note + link to
sdk-patterns-rust).
- Add a
## Transactionssection toskills/server-connection-ruby/SKILL.mdbody:- State that Ruby SDK 3.x does not support distributed ACID transactions.
- Suggest CAS-based optimistic locking as the alternative (brief inline note + link to
sdk-patterns-ruby).
Affected file: skills/analytics-ruby/SKILL.md
Problem: All other analytics-* skills have a routing edge and body content for "write results back to operational collections transactionally." analytics-ruby has neither — Ruby SDK 3.x has no transactions. A user asking about transactional write-back from analytics gets no guidance.
Requirements:
- Add a
## Writing Results Backsection toskills/analytics-ruby/SKILL.md:- Ruby SDK 3.x does not support distributed ACID transactions.
- To write analytics results back to the operational store, use individual KV upsert operations — see
sdk-patterns-ruby.
Affected file: discovery.yaml
Problem: The 5 transactions-* skills (Python, Java, Go, .NET, Node.js) have genuine mid-list blank lines splitting their trigger sequences. All other skill blocks have end-of-block blank lines (harmless style). The user has requested removing all blank lines inside any trigger list for safety with strict parsers.
Requirements:
- Remove all blank lines that appear between trigger items (between
- "..."lines within atriggers:block) across all skills indiscovery.yaml. - End-of-block blank lines (between the last trigger item and the next
- skill:entry) are also to be removed. - The blank line separating
- skill:entries from each other should be preserved.
Affected file: skills/search-concepts/SKILL.md
Problem: Lines 38–40 contain two consecutive --- horizontal rules between the shared-reference note and the ## RAG Pipeline section. Some parsers treat --- as a YAML frontmatter delimiter and may truncate the skill body.
Requirements:
- Remove one of the two consecutive
---lines (keep one as a section separator).
Affected file: discovery.yaml
Problem: All 8 analytics-* skills say "writing <Lang> Analytics queries against Couchbase Server 7.x and earlier". Users on Server 7.6 (current LTS) may not know whether to use analytics-* or columnar-analytics.
Requirements:
- Change all 8
analytics-*use_whenvalues to:"writing <Lang> Analytics queries on Couchbase Server 7.x (CBAS — not available on Server 8.x)". - The language name in each entry stays as-is (Python, Java, Go, .NET, Node.js, Scala, Ruby, PHP).
bash scripts/validate-skills.shexits 0 with 0 failures and 0 warnings.server-querying-rustandserver-querying-rubyhave no routing edge toerror-handlingfor transaction queries.- Both
server-querying-rustandserver-querying-rubySKILL.md bodies contain a## Transactionssection explaining the limitation and suggesting CAS. - Both
server-connection-rustandserver-connection-rubySKILL.md bodies contain a## Transactionssection. analytics-rubySKILL.md body contains a## Writing Results Backsection explaining no transaction support and suggesting KV upserts.- All 8
server-querying-<lang>skills (excluding Python) have acolumnar-analyticsrouting edge. - No blank lines appear between trigger items in any
triggers:block indiscovery.yaml. skills/search-concepts/SKILL.mdhas only one---between the shared-reference note and## RAG Pipeline.- All 8
analytics-*use_whenvalues contain"(CBAS — not available on Server 8.x)".
- Fix routing.yaml — remove wrong Rust/Ruby transaction edges (Finding 1)
- Fix routing.yaml — add columnar-analytics edges for 8 languages (Finding 2)
- Run sync-handoffs.sh --apply
- Fix validate-skills.sh allowlist — check for and remove any stale cycle entries from deleted edges
- Add
## Transactionssection to server-querying-rust/SKILL.md (Finding 1) - Add
## Transactionssection to server-querying-ruby/SKILL.md (Finding 1) - Add
## Transactionssection to server-connection-rust/SKILL.md (Finding 3) - Add
## Transactionssection to server-connection-ruby/SKILL.md (Finding 3) - Add
## Writing Results Backsection to analytics-ruby/SKILL.md (Finding 4) - Fix discovery.yaml — remove blank lines inside trigger lists (Finding 5)
- Fix search-concepts/SKILL.md — remove duplicate
---(Finding 6) - Fix discovery.yaml — update analytics- use_when wording* (Finding 7)
- Run validate-skills.sh — confirm 0 failures, 0 warnings
Product feedback identified 8 structural and quality issues with the repository as consumed by AI code assistants. This spec covers all 8. Finding 2 (routing consumption contract) is explicitly skipped — it's the platform's responsibility.
Finding: eval.sh --execute exits with an error. The eval contract (expect/reject/code_block fields) is defined but never executed.
Decision: Wire --execute to the Anthropic API via curl. Requires ANTHROPIC_API_KEY env var.
eval.sh --execute --model MODELcallsapi.anthropic.com/v1/messagesfor each eval case- System prompt: load the skill's
SKILL.mdcontent as the system message - User message: the case's
inputfield - Assertions run against the response text:
- All
expectterms must appear (case-insensitive substring match) - No
rejectterms may appear (case-insensitive substring match) - If
code_block: LANGis set, a fenced code block of that language must appear (```LANG) - If
thresholdis set, only that manyexpectterms need to match (not all)
- All
- Output per case:
PASSorFAILwith which terms failed - Exit code: 0 if all cases pass, 1 if any fail
--skill SKILLflag limits to one skill (already implemented for dry-run)--model MODELflag (required for --execute); default suggestion:claude-3-5-haiku-20241022- Clear error if
ANTHROPIC_API_KEYis not set
eval.sh --execute --model claude-3-5-haiku-20241022 --skill getting-startedruns 3 cases and reports PASS/FAILeval.sh --dry-runstill works unchanged- Missing
ANTHROPIC_API_KEYprints a clear error and exits 2 - Script is self-contained (bash + curl only, no Python/Node deps)
Finding: No automated check that all 9 language variants in a family cover the same sections. transactions-python/go/dotnet are missing ctx.query() examples; section names vary across the matrix.
Decision: Warn only (don't fail). Define canonical required-section lists per family in the validator.
transactions-* (7 skills: python, java, go, dotnet, nodejs, scala, php):
## Bank Transfer ExampleOR## Basic Transaction(either accepted)## SQL++(prefix match — covers "SQL++ Transactions", "SQL++ Inside a Transaction")## Error Handling## Design Rules
server-connection-* (9 skills):
## The One RuleOR## Connect(either accepted — Rust/Scala/PHP/Ruby use Connect)## Singleton(prefix match)## Sub-Document## DurabilityOR## Error Handling(either accepted — Rust/PHP/Ruby use Error Handling)
sdk-patterns-* (9 skills):
## CAS## Bulk Operations## Atomic Counters## Error Handling
validate-skills.shemits awarn(notfail) for each missing canonical section- All 90 skills currently pass with 0 failures after the check is added
- The check is implemented as a new
validate_section_coverage()function called from the main loop
Finding: transactions-python and transactions-go have ## SQL++ Transactions sections but show only bare BEGIN TRANSACTION SQL — no ctx.query() SDK call inside the lambda. Java, Node.js, Scala, PHP all have it.
Fix: Add ctx.query() example to the SQL++ section in both files, matching the pattern already in transactions-java and transactions-nodejs.
transactions-python/SKILL.mdSQL++ section showsctx.query(...)inside the lambdatransactions-go/SKILL.mdSQL++ section showsctx.Query(...)inside the lambda- Both still show the bare
BEGIN TRANSACTIONalternative
Finding: error-handling uses Java-style exception names and JavaScript code. A Go developer gets DocumentNotFoundException (Java) instead of gocb.ErrDocumentNotFound.
Decision: Add a ## Common Errors section to each of the 9 server-connection-* skills listing the language-specific error class names for the 6 most common errors.
| Concept | Python | Java | Go | .NET | Node.js | Rust | Scala | PHP | Ruby |
|---|---|---|---|---|---|---|---|---|---|
| Doc not found | DocumentNotFoundException |
DocumentNotFoundException |
gocb.ErrDocumentNotFound |
DocumentNotFoundException |
DocumentNotFoundError |
ErrorKind::KeyNotFound |
DocumentNotFoundException |
DocumentNotFoundException |
DocumentNotFoundException |
| Doc exists | DocumentExistsException |
DocumentExistsException |
gocb.ErrDocumentExists |
DocumentExistsException |
DocumentExistsError |
ErrorKind::KeyExists |
DocumentExistsException |
DocumentExistsException |
DocumentExistsException |
| CAS mismatch | CasMismatchException |
CasMismatchException |
gocb.ErrCasMismatch |
CasMismatchException |
CasMismatchError |
ErrorKind::CasMismatch |
CasMismatchException |
CasMismatchException |
CasMismatchException |
| Unambiguous timeout | UnambiguousTimeoutException |
UnambiguousTimeoutException |
gocb.ErrUnambiguousTimeout |
UnambiguousTimeoutException |
UnambiguousTimeoutError |
ErrorKind::UnambiguousTimeout |
UnambiguousTimeoutException |
UnambiguousTimeoutException |
UnambiguousTimeoutException |
| Ambiguous timeout | AmbiguousTimeoutException |
AmbiguousTimeoutException |
gocb.ErrAmbiguousTimeout |
AmbiguousTimeoutException |
AmbiguousTimeoutError |
ErrorKind::AmbiguousTimeout |
AmbiguousTimeoutException |
AmbiguousTimeoutException |
AmbiguousTimeoutException |
| Temporary failure | TemporaryFailureException |
TemporaryFailureException |
gocb.ErrTemporaryFailure |
TemporaryFailureException |
TemporaryFailureError |
ErrorKind::TemporaryFailure |
TemporaryFailureException |
TemporaryFailureException |
TemporaryFailureException |
Each server-connection-* skill gets a ## Common Errors section with:
- A table of the 6 errors with their language-specific class name, cause, and whether it's safe to retry
- A brief code example showing try/catch for the most common case (DocumentNotFoundException)
- All 9
server-connection-*skills have a## Common Errorssection - Each section uses the correct language-specific error class names
validate-skills.shpasses with 0 failures
Finding: testing-patterns is a single skill covering all 9 languages, inconsistent with the rest of the matrix (transactions-, search-, etc. are all per-language).
Decision: Split into testing-patterns-python, testing-patterns-java, testing-patterns-go, testing-patterns-dotnet, testing-patterns-nodejs, testing-patterns-rust, testing-patterns-scala, testing-patterns-php, testing-patterns-ruby.
Keep testing-patterns as a concept/entry-point skill (like search-concepts) that explains the strategies and routes to the language-specific skills.
testing-patterns (concept skill — keep, slim down):
- Remove all language-specific code
- Keep: strategy overview (unit vs integration), test data management, scope/collection isolation pattern, Docker Compose CI setup
- Add variant handoff to all 9 language-specific skills
- Update
references/mock-examples.md→ move toshared/server/testing-mock-examples.md(referenced by all 9 language skills)
testing-patterns-LANG (9 new skills):
- Frontmatter: name, summary, compatibility (SDK version)
## Unit Testing— mock example for that language (fromreferences/mock-examples.md)## Integration Testing— testcontainers example for that language## Common Errors in Tests— what errors to expect and how to handle them in tests- Handoff back to
testing-patterns(concept) and toserver-connection-LANG examples/examples.mdwith 3 cases: unit mock, integration test, test isolation
shared/server/testing-mock-examples.md:
- Move content from
skills/testing-patterns/references/mock-examples.md - Referenced by all 9 language skills
testing-patterns:priority: primary, existing triggers- Each
testing-patterns-LANG:priority: secondary, language-specific triggers (e.g."unit test Couchbase Python","mock Couchbase collection Python","pytest Couchbase")
testing-patterns→testing-patterns-LANG(variant edges, one per language)- Each
testing-patterns-LANG→testing-patterns(topic: "user asks about testing concepts") - Each
testing-patterns-LANG→server-connection-LANG(topic: "user asks about connection setup") getting-started→testing-patterns(already exists)local-dev-setup→testing-patterns(already exists)
- 9 new skill directories created, each passing
validate-skills.sh testing-patternsconcept skill slimmed to <150 lines, no language-specific codeshared/server/testing-mock-examples.mdexists and is referenced by all 9 language skillsdiscovery.yamlhas entries for all 10 skills (1 concept + 9 language)validate-skills.shpasses with 0 failures and 0 warningsscripts/sync-handoffs.sh --applyruns clean
Finding: All 90 skills have last_verified: "2026-05" set in bulk. The existing staleness check uses git commit date, not the last_verified field value. The field is meaningless if it's never checked.
Status check: The validator already checks last_verified at line 148 — verify what it actually does and whether it's sufficient. If it already warns on stale last_verified field values, this issue may be partially resolved.
Fix: Ensure the validator:
- Warns if
last_verifiedis missing - Warns if
last_verifiedvalue is >6 months old (parse YYYY-MM, compare to today) - The existing git-commit-date check (180 days) is separate and complementary — keep both
- Validator warns if
last_verified: "2024-01"(>6 months old) - Validator does not warn for
last_verified: "2026-05"(current) - Both checks (field value + git commit date) are active
Finding: All 8 analytics-* language skills have use_when: "writing X Analytics queries against Couchbase Server 6.x–7.x (legacy CBAS)". Server 7.6 is current LTS — calling it "legacy" is wrong.
Fix: Update all 8 use_when entries in discovery.yaml to remove "legacy CBAS" and replace with "for Server 7.x and earlier".
Also update README.md which says > Rust SDK 1.0 does not support the Analytics service. Skills below target Server 6.x–7.x (legacy CBAS).
- All 8
analytics-*use_whenentries say "for Server 7.x and earlier" (not "legacy CBAS") README.mdanalytics note updatedvalidate-skills.shpasses with 0 failures
- Issue 8 —
discovery.yaml+README.mdwording fix (2 minutes, zero risk) - Issue 4 — Add
ctx.query()totransactions-pythonandtransactions-go - Issue 7 — Verify/fix
last_verifiedfield staleness check in validator - Issue 3 — Add section-coverage validator check
- Issue 5 — Add
## Common Errorsto all 9server-connection-*skills - Issue 6 — Split
testing-patternsinto 9 language skills + concept skill - Issue 1 — Implement
eval.sh --executevia Anthropic API curl - Validate —
bash scripts/validate-skills.sh, confirm 0 failures 0 warnings