Skip to content

standards' own 20 Nickel files: 20 unformatted, 5 typecheck failures, gate never self-applied #986

Description

@hyperpolymath

Summary

standards tracks 36 .ncl files — 16 k9 contracts, 20 genuine Nickel.
Measured against the repo's own pinned toolchain, all 20 fail nickel format --check and 5 fail nickel typecheck with real errors (zero of them
skipped for untracked imports — these are genuine failures, not missing inputs).

This is invisible today because ci-pipeline.yml is workflow_call:-only and
standards has no self-caller, so the Nickel gate it publishes has never run
against the repo that publishes it. The debt becomes a hard red the moment a
self-caller is added.

Measured

Pinned nickel 1.18.0 (the sha256-verified binary ci-pipeline.yml installs),
run with the #985 gate at edac0d6a:

Nickel files: 20 (k9 contracts excluded: 16)
format errors: 20
typecheck errors: 5
typecheck skipped (untracked import): 0

The 5 typecheck failures — 2 distinct bugs, 5 copies

Bug 1 — %{ … } used outside a string (3 byte-identical copies, md5 d7cb1b97)

  • 1-formats/a2ml/agentic/ncl/lib/os_detect.ncl
  • 1-formats/a2ml/neurosym/ncl/lib/os_detect.ncl
  • rhodium-standard-repositories/satellites/rsr-deployer/ncl/lib/os_detect.ncl
os = %{ "os" } | default = "linux",
     ^ error: unexpected token

%{ } is Nickel string interpolation and is only valid inside a string
literal. As written this file has never parsed as Nickel. It reads as if a
templating placeholder was intended.

Bug 2 — record contract written with : instead of | (2 identical copies, md5 244108a5)

  • rhodium-standard-repositories/satellites/palimpsest-license/config.ncl
  • rhodium-standard-repositories/satellites/palimpsest-license/config/config.ncl
present : Bool,
^^^^^^^ error: statically typed field without a definition

Nickel's own diagnostic names the cure: "Did you mean to use | instead of :,
for example when defining a record contract?"

Why this is filed, not fixed

Both are source changes, not configuration, and the standing constraint on
this work is to add and repair pipeline configuration without modifying
existing core logic or source files
. The formatting half (20 files) is
mechanical and semantics-preserving — nickel pprint-ast is byte-identical
before and after, proven on 22 files across two other repos — but it is still the
owner's call whether it lands here.

Acceptance criteria

  1. os_detect.ncl either parses as Nickel or stops claiming to be Nickel — if it
    is a template, it should not carry a bare .ncl suffix that a *.ncl glob
    will collect. (A suffix is not a format — the same root cause as ci-pipeline.yml Nickel job globs *.k9.ncl and generated-input .ncl: 20 of 29 template files can never pass #982.)
  2. The 3 copies are de-duplicated, or all 3 fixed together; today they drift as
    one bug in three places.
  3. config.ncl uses | for its record contract, and the 2 copies are reconciled.
  4. nickel format --check passes over all 20 genuine .ncl.
  5. nickel typecheck passes over all 20, or any exclusion is disclosed by name
    with its reason
    per the ci-pipeline.yml Nickel job globs *.k9.ncl and generated-input .ncl: 20 of 29 template files can never pass #982 acceptance criteria.
  6. A self-caller for ci-pipeline.yml exists on standards, so the gate this
    repo publishes is enforced against this repo. Without it, 1–5 can silently
    regress.

Related: #982 (the gate fix, #985), #976 (the denominator bug).

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions