Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Add new core business logic functions to Catalyst-Relay. Use when creating pure functions, ADT operations, or library-consumable code.
.claude/skills/aiskillstore-add-core-function/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 13% | 0% |
Each core function gets its own file. No multi-function files.
Location: src/core/{domain}/{function}.ts
core/adt/
├── index.ts # Barrel exports
├── types.ts # Shared types (AdtRequestor, ObjectConfig)
├── helpers.ts # Internal helpers (not exported from barrel)
│
├── craud/
│ ├── read.ts → readObject()
│ ├── create.ts → createObject()
│ └── ...
│
└── discovery/
├── packages.ts → getPackages()
└── ...Files must follow this hierarchy (no circular dependencies):
types.ts (shared types, no imports from package)
↓
helpers.ts (internal utilities, imports types)
↓
subfolder files (import ../types and ../helpers)
↓
index.ts (barrel exports, imports from subfolders)Relative path patterns:
../types — shared types../helpers — shared helpers../../utils/xml — core utilities../../../types/result — global typestypescript// src/core/adt/discovery/packages.ts import type { AdtRequestor } from '../types'; import type { AsyncResult } from '../../../types/result'; export interface Package { name: string; description: string; } export async function getPackages( requestor: AdtRequestor, filter?: string ): AsyncResult<Package[]> { // Implementation const response = await requestor.get('/packages', { params: { filter } }); if (response.error) { return [null, response.error]; } return [parsePackages(response.data), null]; } // Internal helper (not exported) function parsePackages(xml: string): Package[] { // ... }
Use Go-style error tuples:
typescriptimport type { AsyncResult } from '../../../types/result'; // Returns [data, null] on success, [null, error] on failure export async function someOperation(): AsyncResult<Data> { // ... }
Add to index.ts for public API:
typescript// src/core/adt/index.ts // Types export type { AdtRequestor, ObjectConfig } from './types'; // Discovery export { getPackages } from './discovery/packages'; export { getTree } from './discovery/tree'; // CRAUD export { readObject } from './craud/read'; export { createObject } from './craud/create';
Helpers not exported from barrel go in helpers.ts:
typescript// src/core/adt/helpers.ts import type { AdtRequestor } from './types'; // Internal - not exported from index.ts export function buildObjectUri(name: string, extension: string): string { // ... }
- [ ] Create function file in src/core/{domain}/{subfolder}/
- [ ] Define types at top of file or in ../types.ts
- [ ] Use AsyncResult return type for async functions
- [ ] Follow import hierarchy (no circular deps)
- [ ] Export from index.ts if public API
- [ ] Put internal helpers in helpers.ts
- [ ] Run typecheck: bun run typecheck| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,974 | 13,664 | -24% | 1 | 1 | 0% | 3,757 | 2,759 | -27% | 0 | 0 | — |
case-02 | fail→pass | 17,740 | 9,745 | -45% | 1 | 1 | 0% | 2,686 | 2,868 | +7% | 0 | 0 | — |
case-03 | fail→pass | 15,917 | 9,661 | -39% | 1 | 1 | 0% | 3,166 | 2,857 | -10% | 0 | 0 | — |
case-04 | pass→pass | 23,215 | 14,192 | -39% | 1 | 1 | 0% | 2,247 | 2,612 | +16% | 0 | 0 | — |
case-05 | pass→pass | 17,882 | 8,316 | -53% | 1 | 1 | 0% | 2,392 | 2,496 | +4% | 0 | 0 | — |
case-06 | pass→pass | 19,340 | 12,004 | -38% | 1 | 1 | 0% | 2,838 | 3,562 | +26% | 0 | 0 | — |
case-11 | fail→pass | 20,808 | 13,715 | -34% | 1 | 1 | 0% | 2,771 | 1,963 | -29% | 0 | 0 | — |
case-07 | fail→pass | 28,183 | 13,093 | -54% | 1 | 1 | 0% | 2,174 | 2,453 | +13% | 0 | 0 | — |
case-08 | fail→pass | 20,632 | 11,733 | -43% | 1 | 1 | 0% | 2,323 | 2,205 | -5% | 0 | 0 | — |
case-09 | pass→pass | 12,052 | 12,860 | +7% | 1 | 1 | 0% | 2,437 | 2,473 | +1% | 0 | 0 | — |
case-10 | pass→pass | 10,186 | 9,793 | -4% | 1 | 1 | 0% | 2,021 | 1,735 | -14% | 0 | 0 | — |
case-12 | fail→pass | 16,287 | 4,261 | -74% | 1 | 1 | 0% | 2,146 | 1,636 | -24% | 0 | 0 | — |
case-13 | pass→pass | 8,852 | 9,892 | +12% | 1 | 1 | 0% | 1,546 | 1,741 | +13% | 0 | 0 | — |
case-14 | fail→pass | 9,706 | 4,487 | -54% | 1 | 1 | 0% | 1,637 | 1,761 | +8% | 0 | 0 | — |
case-15 | fail→pass | 8,423 | 11,127 | +32% | 1 | 1 | 0% | 1,728 | 2,082 | +20% | 0 | 0 | — |
case-16 | pass→pass | 12,180 | 12,057 | -1% | 1 | 1 | 0% | 2,082 | 2,163 | +4% | 0 | 0 | — |
case-17 | fail→pass | 8,733 | 2,895 | -67% | 1 | 1 | 0% | 638 | 1,436 | +125% | 0 | 0 | — |
case-18 | pass→pass | 16,870 | 12,055 | -29% | 1 | 1 | 0% | 2,046 | 2,448 | +20% | 0 | 0 | — |
case-19 | fail→pass | 10,727 | 3,901 | -64% | 1 | 1 | 0% | 1,981 | 1,673 | -16% | 0 | 0 | — |
case-20 | fail→pass | 30,209 | 2,868 | -91% | 1 | 1 | 0% | 5,241 | 1,267 | -76% | 0 | 0 | — |
case-21 | fail→fail | 11,035 | 6,088 | -45% | 1 | 1 | 0% | 2,155 | 2,155 | 0% | 0 | 0 | — |
case-22 | pass→pass | 18,122 | 12,641 | -30% | 1 | 1 | 0% | 2,412 | 2,236 | -7% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +55 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.