From asi
Provides guidance on Nickel configuration language for gradual typing, contracts, dynamic sufficiency verification, type-safe configs, transformations, and CLI usage. Useful for config validation pipelines.
npx claudepluginhub plurigrid/asi --plugin asiThis skill uses the workspace's default tool permissions.
Gradual typing + contracts for configuration that composes correctly.
Defines typed configuration schemas using Nickel language with gradual typing and contracts. Validates YAML/JSON/TOML inputs, merges configurations, and exports to JSON/YAML/TOML formats.
Guides Design-by-Contract (DbC) development with formal preconditions, postconditions, invariants across languages. Use for public APIs, state invariants, untrusted inputs, AI-generated code guardrails.
Analyzes projects for config files in JSON, YAML, TOML, ENV formats. Validates correctness, detects security issues like exposed secrets, ensures env consistency, and generates schemas.
Share bugs, ideas, or general feedback.
Gradual typing + contracts for configuration that composes correctly.
A Nickel config is dynamically sufficient when:
# 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
|]
Import from workspace:
let contracts = import ".topos/nickel/contracts/transformation-contracts.ncl"
Available contracts:
TransformationPattern - rename/refactor operationsTransformationStrategy - checkpoint + rollback + validationBalancedTernarySelector - GF(3) strategy selection (seed 1069)ValidationResult - gate pass/fail with exit codes# 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
# 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
| 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 |
# 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
Trit: 0 (ERGODIC - synthesis/validation)
Home: Prof
Poly Op: ⊗
Color: #FFFF00
Triadic pairing:
dune-analytics (+1) - expanding/queryingnickel (0) - contract validationsicp (-1) - foundational evaluation# 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