nickel
Nickel configuration language with gradual typing, contracts, and dynamic sufficiency verification. Use for type-safe configs, transformation contracts, and validation pipelines.
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install plurigrid-asi-nickel
Repository
Skill path: skills/nickel
Nickel configuration language with gradual typing, contracts, and dynamic sufficiency verification. Use for type-safe configs, transformation contracts, and validation pipelines.
Open repositoryBest for
Primary workflow: Ship Full Stack.
Technical facets: Full Stack, Testing.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: plurigrid.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install nickel into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/plurigrid/asi before adding nickel to shared team environments
- Use nickel for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: nickel
description: Nickel configuration language with gradual typing, contracts, and dynamic sufficiency verification. Use for type-safe configs, transformation contracts, and validation pipelines.
version: 1.0.0
---
# Nickel Configuration Language
Gradual typing + contracts for configuration that composes correctly.
## Dynamic Sufficiency
A Nickel config is **dynamically sufficient** when:
1. **Structural**: Contract coverage is complete (all fields typed)
2. **Computational**: Same outputs for all valid inputs
3. **Semantic**: Olog types preserved through transformations
```nickel
# Sufficiency levels (from dynamic_sufficiency.jl)
let SufficiencyLevel = [|
'NOT_SUFFICIENT, # Different behavior
'WEAKLY_SUFFICIENT, # Same structure, different labels
'COMPUTATIONALLY_SUFFICIENT, # Same outputs
'SEMANTICALLY_SUFFICIENT # Same olog meaning
|]
```
## Core Contracts
Import from workspace:
```nickel
let contracts = import ".topos/nickel/contracts/transformation-contracts.ncl"
```
Available contracts:
- `TransformationPattern` - rename/refactor operations
- `TransformationStrategy` - checkpoint + rollback + validation
- `BalancedTernarySelector` - GF(3) strategy selection (seed 1069)
- `ValidationResult` - gate pass/fail with exit codes
## Gradual Typing Pattern
```nickel
# Untyped (dynamic) - simple configs
{ name = "example", count = 42 }
# Typed block - contract enforcement
let typed_config : { name: String, count: Number } =
{ name = "example", count = 42 }
# Contract annotation - runtime validation
let validated = config | TransformationStrategy
```
## Idempotent Contracts
```nickel
# Good: applying twice yields same result
let Positive = std.contract.from_predicate (fun x => x > 0)
5 | Positive | Positive # ✓ idempotent
# Key property for dynamic sufficiency:
# ∀c: Contract, ∀x: (x | c) | c ≡ x | c
```
## Workspace Integration
| Path | Purpose |
|------|---------|
| `.topos/nickel/contracts/` | Reusable contract library |
| `.topos/nickel/examples/` | Transformation examples |
| `environment-specs/environments.ncl` | Flox env specs |
| `seth-rs/nickel/` | Pipeline + telemetry modules |
## CLI Usage
```bash
# Evaluate config
nickel eval config.ncl
# Type-check without eval
nickel typecheck config.ncl
# Export to JSON
nickel export config.ncl --format json
# REPL
nickel repl
```
## GF(3) Integration
```
Trit: 0 (ERGODIC - synthesis/validation)
Home: Prof
Poly Op: ⊗
Color: #FFFF00
```
Triadic pairing:
- `dune-analytics` (+1) - expanding/querying
- `nickel` (0) - contract validation
- `sicp` (-1) - foundational evaluation
## Dynamic Sufficiency Verification
```nickel
# Verify sufficiency between two configs
let verify_sufficiency = fun cfg1 cfg2 =>
let fields1 = std.record.fields cfg1 in
let fields2 = std.record.fields cfg2 in
if std.array.all (fun f => std.array.elem f fields2) fields1
then 'COMPUTATIONALLY_SUFFICIENT
else 'NOT_SUFFICIENT
```