Skip to content

fix(k9,deed): route --- per the coordination grammar; align IANA drafts - #1232

Merged
hyperpolymath merged 5 commits into
mainfrom
claude/exciting-noether-dzrfrr
Oct 13, 2026
Merged

hyperpolymath merged 5 commits into
mainfrom
claude/exciting-noether-dzrfrr

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

Summary

The --- contradiction. The K9 contract's dialect discriminator (K9-E005) routed any file whose first line is --- to k9-coordination, with or without the K9! magic. The coordination grammar (v1.1.1, ruling D318) requires the magic and has no --- production. So every such file was routed to a grammar that could only reject it, and a plain YAML file with a .k9 suffix was reported as "out of scope" instead of failing K9-E005.

  • K9-CONTRACT-SPEC.adoc: a --- file is now routed to k9-coordination only when it has the magic line (where the grammar then rejects it). Without the magic it is unclaimed.
  • k9-validate.sh: implements the same rule. The self-test now asserts all four cases: --- or key:, each with and without the magic line. A mutation check confirmed the new assertion fails against the old rule.

IANA drafts brought in line with their specs:

Draft Was Now
vnd.k9 (Rev 3) "parsers MUST accept CR+LF" LF only, matching K9-E003
vnd.k9 "Nickel syntax"; "standard Nickel tooling can parse K9 files" The K9! line is envelope, not Nickel; envelope-strip rule
vnd.k9 version = "K9 specification version" pedigree.schema_version
vnd.k9 k9-svc/ links (dead); v1.0.0-alpha 1-formats/k9/; normative K9-CONTRACT-SPEC v1.0.0
vnd.k9 cites k9-scan / k9-sign tools k9-validate.sh (the other two don't exist)
vnd.k9 claims .k9 with no mention of coordination Shared .k9 extension and magic recorded as an open decision that blocks filing
vnd.deed (Rev 2) "parsers MUST accept a BOM" BOM is INVALID, matching the spec's lexical rule and the ABNF
vnd.deed spec v0.1.0 at deed/ (dead) v0.2.2 / ABNF v1.1.0 at 1-formats/deed/
vnd.deed cites a :media-type: attribute the current spec lacked attribute restored to DEED-GRAMMAR-SPEC.adoc

Also changed:

  • SPEC.adoc now warns that its freedesktop *.k9 glob mislabels coordination.k9.
  • .machine_readable/svc/k9/README.adoc drops the withdrawn vnd.k9+nickel and the dead k9-svc/ links.

Lock repair fix (scripts/prune-stale.sh), needed to get main green again. #1231 bumped four actions without regenerating actions.lock, and main has been red on the lock checks since. Running the repair chain to fix that exposed a bug: when a stale ref exists but no workflow was deleted (the normal Dependabot case), prune-stale.sh's deleted-workflow pass read an empty list via NR == FNR. That condition then held for every line of the lock, so it wrote the lock back empty, and --verify-local failed with "dependency lockfile version is required". The pass now tells the list apart by FILENAME. A new regression case in scripts/tests/prune-stale-test.sh fails before the fix (0 lines left) and passes after (15/15). On this repo's lock, the fixed script prunes exactly the 18 refs #1231 orphaned. The regenerated actions.lock follows in a separate commit.

Open, for owner ruling

The coordination dialect needs either its own subtype (e.g. application/vnd.k9.coordination) or a parameter on vnd.k9. The drafts record this as undecided and block filing until it is ruled on.

Not changed: the repo's own coordination.k9 still opens with ---, so under the coordination grammar it is non-conforming. Its verdict is unchanged by this PR, and fixing it is left as a separate dogfood-conformance item.

Testing

  • k9-validate.sh --self-test: all assertions pass, including the 4 new ones.
  • k9-validate.sh --fixtures: 6 positive, 21 negative, 0 failures. CI runs the 2 L2 controls with Nickel and they pass.
  • L0 verdicts on all 39 committed .k9 / .k9.ncl files are identical before and after.
  • scripts/check-canon-lockstep.sh: passes.
  • Lock tooling: prune-stale 15/15, close-lock 9/9, regen-dependabot-locks 34/34, check-lock-sync 10/10, update-actions-lock pass.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GqfpQtLuMczxtgG1U9PkLW

The K9 contract's dialect discriminator routed a first line of `---` to
k9-coordination with or without the K9! magic. The coordination grammar
(v1.1.1, ruling D318) requires the magic and has no `---` production, so
every such file was routed to a grammar that could only reject it, and a
plain YAML file with a .k9 suffix was waved through as "out of scope"
instead of failing K9-E005. A `---` file is now routed only with the
magic (to be rejected there) and is unclaimed without it. The validator
matches, with self-test assertions for all four magic/no-magic cases. No
committed .k9 / .k9.ncl file changes verdict.

IANA drafts brought up to date with the specs they register:

vnd.k9 (registration .txt and form-ready .adoc, Revision 3):
- LF-only line endings; the old "MUST accept CR+LF" contradicted K9-E003
- the K9! line is envelope, not Nickel (envelope-strip rule)
- `version` parameter names pedigree.schema_version
- links moved from the retired k9-svc/ path to 1-formats/k9/, citing the
  normative K9-CONTRACT-SPEC
- non-existent k9-scan/k9-sign replaced by k9-validate.sh
- the .k9 extension and K9! magic shared with coordination.k9 recorded
  as an OPEN DECISION (subtype vs parameter) that blocks filing

vnd.deed (Revision 2):
- a leading BOM is INVALID, as the spec and ABNF say (the draft said
  parsers MUST accept it)
- cites spec v0.2.2 / ABNF v1.1.0 at 1-formats/deed/
- restores the :media-type: attribute the draft cites to the current spec

Also: SPEC.adoc warns that its freedesktop glob mislabels coordination.k9,
and svc/k9/README.adoc drops the withdrawn vnd.k9+nickel and dead
k9-svc/ links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GqfpQtLuMczxtgG1U9PkLW
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 17 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 94992860-d455-4fac-bacd-05b261434398
📥 Commits

Reviewing files that changed from the base of the PR and between 5d71a96 and 7a2d919.

⛔ Files ignored due to path filters: 1
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing: 3
  • 1-formats/k9/tools/k9-validate.sh
  • scripts/prune-stale.sh
  • scripts/tests/prune-stale-test.sh

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 4a0e0922-8113-4987-b518-2278ba55ae4a
📥 Commits

Reviewing files that changed from the base of the PR and between 9164d76 and 5d71a96.

📒 Files selected for processing: 8
  • .machine_readable/svc/k9/README.adoc
  • 1-formats/deed/docs/iana/application-vnd.deed-registration.txt
  • 1-formats/deed/spec/DEED-GRAMMAR-SPEC.adoc
  • 1-formats/k9/IANA-MEDIA-TYPE-APPLICATION.adoc
  • 1-formats/k9/SPEC.adoc
  • 1-formats/k9/docs/iana/application-vnd.k9-registration.txt
  • 1-formats/k9/spec/K9-CONTRACT-SPEC.adoc
  • 1-formats/k9/tools/k9-validate.sh

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout: 24
  • GitHub Check: Call CI Pipeline / Rust / Detect Cargo.toml
  • GitHub Check: Call CI Pipeline / Nickel
  • GitHub Check: Call CI Pipeline / Secret scanning / gitleaks
  • GitHub Check: analyze-js / analyze
  • GitHub Check: governance / Workflow security linter
  • GitHub Check: governance / Trusted-base reduction policy
  • GitHub Check: governance / Security policy checks
  • GitHub Check: governance / Language / package anti-pattern policy
  • GitHub Check: ci / Detect mix.exs
  • GitHub Check: scan / gitleaks
  • GitHub Check: analyze-actions / analyze
  • GitHub Check: governance / Check Workflow Staleness
  • GitHub Check: scan / rust-secrets
  • GitHub Check: Repo self-tests
  • GitHub Check: Standards map integrity
  • GitHub Check: Verify CLAIMS.a2ml + conformance
  • GitHub Check: Canon / spine lockstep
  • GitHub Check: AffineScript Verify
  • GitHub Check: Reject non-v7 UUID literals
  • GitHub Check: Lockfile self-consistency
  • GitHub Check: Report non-canonical JSON (report-only)
  • GitHub Check: K9-SVC contractile validation
  • GitHub Check: lint
  • GitHub Check: semgrep-cloud-platform/scan
⚠️ CI failures not shown inline: 3

GitHub Actions: Actions Lockfile Gate / 0_uses ⊆ actions.lock.txt: fix(k9,deed): route --- per the coordination grammar; align IANA drafts

Conclusion: failure

View job details

##[group]Run bash .githooks/validate-actions-lock.sh
 �[36;1mbash .githooks/validate-actions-lock.sh�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333�[0m
     normalised to: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9�[0m
     normalised to: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: dtolnay/rust-toolchain@e2a55d2ffb04f378e9626c28d38b36d230d1e12f�[0m
     normalised to: dtolnay/rust-toolchain@e2a55d2ffb04f378e9626c28d38b36d230d1e12f
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25�[0m
     normalised to: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25
 �[0;31m[validate-actions-lock] 4 ref(s) missing from the lockfile�[0m
     Regenerate with the LOCKFILE ONLY, and verify the *.yml diff is empty:
       gh actions-lock <workflow paths> --no-migrate-local-actions --no-narrow
       git diff --stat -- '.github/workflows/*.yml'   # MUST be empty
 ##[error]Process completed with exit code 1.

GitHub Actions: Lock Sync Gate / 0_actions.lock is in sync with the workflow YAML.txt: fix(k9,deed): route --- per the coordination grammar; align IANA drafts

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mtest -x scripts/check-lock-sync.sh \�[0m
 �[36;1m  || { echo "::error::scripts/check-lock-sync.sh missing or not executable"; exit 1; }�[0m

GitHub Actions: Lock Self-Check / 0_Lockfile self-consistency.txt: fix(k9,deed): route --- per the coordination grammar; align IANA drafts

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1msha="$(git rev-parse HEAD)"�[0m
 �[36;1m# State the population. A gate that does not say what it examined�[0m
 �[36;1m# cannot report that it examined the wrong thing.�[0m
 �[36;1mecho "Commit under test: $sha"�[0m
 �[36;1mecho "Event: pull_request"�[0m
 �[36;1m# On `pull_request` this is the MERGE PREVIEW, i.e. the content that�[0m
 �[36;1m# would land on main, which is exactly the content callers will pin.�[0m
 �[36;1mbash scripts/lock-selfcheck.sh "$sha"�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Commit under test: efac41967b27cee30f2c7edbd6fb736c3ecb06dc
 Event: pull_request
 ==============================================================
 SHA efac41967b27   +0000
      Merge 5d71a968d653e72ceab8e053bd0a98ec50f60571 into 9164d76efef88f5173fdb717b231618a2d3c701a
   workflows at this SHA: 59   lockfile keys: 50 workflow(s), 107 pair(s)
   action refs used: 195   reusable-workflow calls (not lock-keyed): 3
   VERDICT: POISON — 18 action ref(s) used but NOT keyed in this SHA's own lock.
            Any caller pinned here dies at startup with 0 jobs and no stated reason.
              .github/workflows/apply-workflow-pins.yml
                uses  actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
                lock keys for this workflow: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1
              .github/workflows/apply-workflow-pins.yml
                uses  step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25
                lock keys for this workflow: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6...
🧰 Additional context used
🪛 LanguageTool
1-formats/k9/docs/iana/application-vnd.k9-registration.txt

[formatting] ~14-~14: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...EN DECISION: coordination.k9) is settled, because the File extension(s) field claims ".k9...

(COMMA_BEFORE_BECAUSE)

[uncategorized] ~15-~15: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ...(s) field claims ".k9", which a second, differently-bodied format also uses. Prepared: 2026-10-13...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

[style] ~50-~50: Consider an alternative for the overused word “exactly”.
Context: ...TF-8 text with no NUL octet. Line 1 is exactly the three octets "K9!" (0x4B 0x39 0x2...

(EXACTLY_PRECISELY)

[formatting] ~53-~53: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...LF file is non-conforming (rule K9-E003), because a CR in the magic line would make it ...

(COMMA_BEFORE_BECAUSE)

[style] ~88-~88: Would you like to use the Oxford spelling “authorization”? The spelling ‘authorisation’ is also correct.
Context: ...-formed REQUEST for privilege, not an authorisation. See "Security considerations" in the ...

(OXFORD_SPELLING_Z_NOT_S)

🔇 Additional comments: 8
1-formats/deed/spec/DEED-GRAMMAR-SPEC.adoc: 1

4-4: LGTM!

1-formats/deed/docs/iana/application-vnd.deed-registration.txt: 1

15-15: LGTM!

Also applies to: 96-98, 106-107, 109-109, 121-121, 188-189, 213-214, 216-216, 220-220, 235-245, 288-289

1-formats/k9/spec/K9-CONTRACT-SPEC.adoc: 1

262-262: LGTM!

Also applies to: 266-277, 1140-1140

1-formats/k9/tools/k9-validate.sh: 1

293-304: LGTM!

Also applies to: 312-312, 858-876

1-formats/k9/IANA-MEDIA-TYPE-APPLICATION.adoc: 1

10-20: LGTM!

Also applies to: 75-80, 86-99, 214-230, 236-241, 251-251, 260-260, 301-304, 350-353, 366-367, 389-390

1-formats/k9/docs/iana/application-vnd.k9-registration.txt: 1

13-19: LGTM!

Also applies to: 40-45, 50-60, 85-89, 102-113, 116-123, 129-129, 138-138, 159-163, 193-197, 215-225

1-formats/k9/SPEC.adoc: 1

489-498: LGTM!

.machine_readable/svc/k9/README.adoc: 1

133-133: LGTM!

Also applies to: 172-172, 177-180, 192-192

📝 Summary

Summary by CodeRabbit

  • Documentation
    • Updated the K9 and DEED specifications and registration guidance, including links, media-type details and encoding requirements.
    • Clarified that DEED files with a leading UTF-8 BOM must be rejected, and that K9 files require LF-only line endings and a specific first line.
    • K9 media-type filing remains on hold pending a decision about the shared .k9 extension and K9! marker.
  • Bug Fixes
    • K9 validation now distinguishes coordination files with --- and K9! magic from unclaimed files without the magic.

The changes update K9 dialect classification and registration details, including the filing status. They also revise the DEED registration’s BOM rule and references, and set the DEED grammar document’s media type.

Changes: K9 format

Layer / File(s) Summary
K9 dialect classification
1-formats/k9/spec/K9-CONTRACT-SPEC.adoc, 1-formats/k9/tools/k9-validate.sh
The contract and validator classify files that begin with --- as coordination only when they have K9! magic. Files without the magic are unclaimed. Validator self-tests cover both outcomes.
K9 registration and publication details
1-formats/k9/IANA-MEDIA-TYPE-APPLICATION.adoc, 1-formats/k9/docs/iana/application-vnd.k9-registration.txt, 1-formats/k9/SPEC.adoc, .machine_readable/svc/k9/README.adoc
The registration documents specify encoding and version details, describe the shared .k9 extension and K9! magic, and identify the unresolved coordination-dialect decision as a filing blocker. They update specification and validator references. The K9 specification and README update related warnings and links.

DEED registration

Layer / File(s) Summary
DEED grammar and registration
1-formats/deed/spec/DEED-GRAMMAR-SPEC.adoc, 1-formats/deed/docs/iana/application-vnd.deed-registration.txt
The grammar document sets the application/vnd.deed media type. The registration declares a leading UTF-8 BOM invalid, updates the specification and grammar versions, and moves related references.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Suggested reviewers: joshuajewell

Merge Risk: ⚪ Minimal · up to 5d71a

The reviewed changes have no established merge-blocking risk; normal checks are sufficient.

### Architecture Summary

Architecture risk: 🔵 Low · up to 5d71a

The change affects 1 system.

Changed systems: 1-formats

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — 1-formats (service) was modified; 7 changed files map to changed impact.

Before / after behavior

  • observed — Modified behavior in 1-formats/deed/docs/iana/application-vnd.deed-registration.txt: The submission date changes from Revision 1, prepared 2026-09-14, to Revision 2, prepared 2026-10-13.
  • observed — Modified behavior in 1-formats/deed/docs/iana/application-vnd.deed-registration.txt: The BOM rule changes from permitting and requiring parsers to accept and silently consume a leading U+FEFF to declaring it invalid and requiring rejection.
  • observed — Modified behavior in 1-formats/deed/docs/iana/application-vnd.deed-registration.txt: The primary specification reference changes from v0.1.0 to v0.2.2 DRAFT, and the formal grammar is now identified as ABNF v1.1.0 and normative for parsing.
  • observed — Modified behavior in 1-formats/deed/docs/iana/application-vnd.deed-registration.txt: The reference-implementation link moves from the retired deed/ path to 1-formats/deed/.
Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 1 files. (7 skipped: 7… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly identifies both primary changes: the K9 discriminator routing fix and the alignment of the IANA drafts.
Description check Passed The description is directly related to the changeset. It explains the K9 routing change, validator updates, and K9 and DEED IANA draft alignment.
Full details: Docstring Coverage

Explanation

Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 1 files. (7 skipped: 7 unsupported.)

✨ Finishing Touches
📝 Generate docstrings
🛠️ Fix failing CI checks
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the magic line,
Then sorts each file in turn.
The K9 notes get paths anew,
While DEED’s BOM rules change.
Two formats find their fields in place,
And hops the rabbit home.

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38468050155

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

hyperpolymath commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner Author

Resolved in 7a2d919. All four actions-lock checks now pass: uses ⊆ actions.lock, governance / Actions lockfile verify, Lockfile self-consistency and actions.lock is in sync with the workflow YAML.

Cause. #1231 (Dependabot) bumped step-security/harden-runner, actions/upload-artifact, dtolnay/rust-toolchain and actions/download-artifact in the workflow YAML without regenerating actions.lock, so main went red at 9164d76.

Why the automatic repair didn't fix it:

  1. scripts/prune-stale.sh wrote the lock back empty whenever a stale ref existed but no workflow had been deleted, which is exactly the Dependabot case. Fixed in 51ff593, with a regression test.
  2. gh actions-lock cannot see refs used inside local composite actions (Lock repair chain drops composite-action edges, and --verify-local accepts the result #1122). It dropped the asana/push-signed-commits and actions/setup-python@v2 records that .github/actions/signed-push needs. Both were restored unchanged from the previous lock.

Follow-up, not in this PR. .github/actions/signed-push depends on Asana/push-signed-commits, a Python action that has no licence file, uses the tag-pinned actions/setup-python@v2 and runs an unpinned pip install. It can be replaced with a gh api graphql createCommitOnBranch step, which scripts/regen-dependabot-locks.sh already uses.


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Completed: Fix pre-merge checks in PR #1232 — View commit e737d70

@hyperpolymath
hyperpolymath marked this pull request as ready for review October 13, 2026 21:17
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Completed: Generate docstrings for PR #1232 — View commit 08f2507

@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 13, 2026 21:18
@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 13, 2026 21:21
@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38469924272

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

@coderabbitai

coderabbitai Bot commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Add Carrot credits or activate Agent usage billing to use Autofix

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

✅ Coding Agent task started: View task and status

The task will inspect the CI failures, validate its fix, and commit the fix to this branch automatically.

Note: Fixing CI failures is a beta feature and may encounter errors. Expect some limitations and changes as we gather feedback and continue to improve it.

⏭️ Checks skipped: 4 · already failing on `main` (not caused by this PR)
  • GitHub Actions: Actions Lockfile Gate / 0_uses ⊆ actions.lock.txt
  • GitHub Actions: Lock Sync Gate / 0_actions.lock is in sync with the workflow YAML.txt
  • GitHub Actions: Lock Self-Check / 0_Lockfile self-consistency.txt
  • GitHub Actions: Governance / 0_governance _ Validate Hypatia Baseline.txt

@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38470102024

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 13, 2026 21:26
The deleted-workflow pass reads gone.txt first and told it apart with
`NR == FNR`. gone.txt is usually empty, and then NR == FNR holds for every
line of the lock, so the whole lock was swallowed and written back empty.
The next --verify-local fails with "dependency lockfile version is
required". It hit any run with a stale ref and no deleted workflow, which
is exactly a Dependabot action bump, so the regen chain could never repair
the #1231 drift.

Tell the first file apart by FILENAME instead. Adds the missing regression
case (stale ref, no deleted workflow): 0 lines left before the fix, whole
lock kept and only the stale ref pruned after. On this repo's lock the
fixed script prunes exactly the 18 refs #1231 orphaned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GqfpQtLuMczxtgG1U9PkLW
@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38471279094

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Regenerated with gh actions-lock and the repair chain (relock-sha-keys,
complete-job-refs, close-lock, prune-stale). The asana/push-signed-commits
and actions/setup-python@v2 records, used only by the local composite
.github/actions/signed-push and invisible to gh actions-lock (#1122), were
restored unchanged from the previous lock.
@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38473359759

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

@hyperpolymath
hyperpolymath merged commit 4c101fb into main Oct 13, 2026
60 of 62 checks passed
@hyperpolymath
hyperpolymath deleted the claude/exciting-noether-dzrfrr branch October 13, 2026 21:49
@sonarqubecloud

Copy link
Copy Markdown

hyperpolymath added a commit that referenced this pull request Oct 13, 2026
…ative signed-push (#1233)

Follow-up to #1232. This PR covers its three open items, each in its own
commit, plus two fix-ups.

## 1. `application/vnd.k9.coordination` (owner ruling 2026-10-13: own
subtype, not a parameter)
- New registration draft:
`2-protocols/k9-coordination/docs/iana/application-vnd.k9.coordination-registration.txt`.
The format is pure data, with a YAML-like body governed by its own ABNF,
and uses the `.k9` extension.
- `vnd.k9` registration (Revision 4) and its form-ready copy:
  - the open decision is settled;
  - the type claims only `.k9.ncl`;
  - it is ready to file alongside the companion type.
- MIME recipes in `SPEC.adoc`:
- The two types get separate freedesktop entries. Filename globs decide
the type; for files with no extension, a nested `metadata:` match tells
the two apart. Checked against every committed `.k9` and `.k9.ncl` file.
  - A UTI is added for the new type.
  - A note says `mime.types` cannot express `.k9.ncl`.
- The K9 contract spec and the coordination spec now name each dialect's
media type.

## 2. Coordination grammar v1.2.0; the repo's own `coordination.k9`
conforms
(Owner ruling: extend the grammar for what belongs, move the rest out.)
- New `coordination-k9-grammar_v1.2.abnf` adds two optional sections:
`build_commands` and `innervation` (afferent / efferent / reflex). The
change is additive, so every v1.1.1 file is still valid.
- The v1.1 file stays, marked superseded, so existing links resolve.
Every in-repo reference now points to v1.2.
- The root `coordination.k9` now parses under v1.2.0. I checked this
with an ABNF parser (apg-js), and the file correctly fails v1.1.
  - Before this change, it failed at its `---` line.
- **Moved out:** `ports`, `verisimdb_port` and `crg_grade`. A2ML is
retired, so neither fact went into a `.a2ml` file:
    - The VeriSimDB port is already set in `.verisimdb/config.toml`.
- The CRG grade (B) belongs in a root `READINESS.md` under the CRG spec,
and `just crg-grade` reads it from there. This repo has no
`READINESS.md` yet, so the `coordination.k9` header comment records the
grade and where it belongs.
  - **Stale facts corrected:**
    - the languages now match the tree;
    - the protected entries for the deleted `a2ml/` and `lol/` are gone;
    - the banned-language lines follow the current policy.
- **Flagged, not changed:** the `pmpl-license-only` invariant
contradicts this repo's MPL-2.0 classification. Licence content is
flag-only.
- The generator's parser reads the new file. As a side effect,
`consumers` now parses as a list instead of a string.

## 3. `signed-push` without `Asana/push-signed-commits`
The Asana action is written in Python and has no licence file. It also
uses the tag-pinned `setup-python@v2` and runs an unpinned `pip
install`. It is replaced by
`.github/actions/signed-push/push-verified.sh`, which uses bash, `gh`
and `jq` to call `createCommitOnBranch`.
- **Same contract as before:**
  - the remote branch must exist and must not have diverged;
- commits are replayed oldest first with their messages, and each call
names the head it expects;
  - the local branch is reset to the remote afterwards.
- **Stricter than before:**
  - binary files are pushed intact;
- merges, symlinks, submodules and mode changes are refused before
anything is sent;
  - the pushed tree is compared with the local one.
- **Tests:** `scripts/tests/signed-push-test.sh` runs 13 cases against a
stub GitHub, with no shellcheck warnings. Writing it caught a real
partial-push bug in my first draft, which is now fixed. A mutant that
stops sending deletions fails 4 cases.
- **Lock entries left in place:** the now-unused
`asana/push-signed-commits` and `actions/setup-python@v2` records are
not hand-edited out of `actions.lock`. All lock gates pass with them
present, and the next tool regeneration drops them.
- **Not changed: the regen job's composite guard (#1122).**
`prune-stale` still cannot see refs that a workflow reaches through a
local action, so action bumps here still need a hand-run regeneration.
Relaxing the guard safely needs a live check of how GitHub validates
locks for local composites.

## Testing
- ABNF: `minimal.k9`, the spec's new examples and the root
`coordination.k9` pass v1.2. Negative controls fail.
- `k9-validate.sh --self-test` and the `validate-k9` hook pass.
- Script tests: `signed-push-test` 13/13, `validate-sha-pins-test` 22/22
(with mikefarah yq), `descriptile-policy-test` 11/11. The docstring scan
shows 100% on the new code.
- Lock gates pass: `validate-actions-lock` and `check-lock-sync`. These
also pass: `check-workflow-duplicate-keys`, `check-standards-map`,
`check-canon-lockstep`.
- Full shell suite: 77 of 81 files pass locally. The other 4 fail
identically on `main` here, because this sandbox lacks KYAML-capable yq,
the JCS tool and Ruby. CI is the authority for those four:
`check-actions-lock-gate`, `check-ijson-jcs`, `kyaml-format` and
`science-ci-security`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01GqfpQtLuMczxtgG1U9PkLW

---
_Generated by [Claude
Code](https://claude.ai/code/session_01GqfpQtLuMczxtgG1U9PkLW)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants