Skip to content

chore(sanctify-php): resync vendored copy from upstream main fa9bd386 - #1185

Merged
hyperpolymath merged 2 commits into
mainfrom
sync/sanctify-php-upstream
Oct 6, 2026
Merged

hyperpolymath merged 2 commits into
mainfrom
sync/sanctify-php-upstream

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

This resyncs the vendored sanctify-php copy (rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/) from upstream hyperpolymath/sanctify-php main fa9bd386.

Since #1181 the shared Haskell job builds every package that detect counts, so this copy now gets compiled. It cannot even resolve. It held 37 of upstream's 182 files, and its .cabal pins base ^>=4.17 (GHC 9.4) while the job's GHC ships base-4.22. Upstream has since relaxed that bound to base >=4.17. Owner ruling (2026-10-06, in session): resync from upstream, rather than excluding the package or leaving it red.

The resync is scoped; nothing upstream was copied wholesale:

  • In: every path the copy already tracked, made identical to upstream. Paths upstream deleted are deleted here too: 5 ISSUE_TEMPLATEs, comprehensive-quality.yml, and LICENSE.txt (upstream ships LICENSE). Also added is what the .cabal needs to build: src/, app/, bench/, test/*.hs and LICENSE.
  • Kept at the old vendored version. Upstream's copy fails one of this repo's own gates, and editing vendored content to pass it is not ours to do. Neither file plays any part in the build.
    • .github/dependabot.yml: no SPDX header upstream (validate-spdx).
    • .claude/CLAUDE.md: upstream still names the retired 6a2/ path (check-canonical-names).
  • Out:
    • .machine_readable/: it holds a retired 6a2/ dir, plus K9 contractiles that would enter this repo's K9 gates.
    • Upstream's 13 newer workflows and .github/hooks.
    • test/fixtures and test-plugins: deliberately vulnerable PHP.
    • www/ and docs/.

The vendored .hs and .cabal files are upstream code, not written here. So any docstring-coverage score on them describes upstream.

Type of change

  • 🐛 Bug fix (non-breaking change that fixes an issue): it unblocks Call CI Pipeline / Haskell on main.
  • ✨ New feature: no
  • 💥 Breaking change: no; the vendored copy has no consumers in this repo.
  • 🕳️ Soundness fix: no checker or proof changes.
  • 📖 Documentation: no
  • 🧹 Refactor: no
  • ⚡ Performance: no
  • 🔧 Build / CI / tooling

📌 New pins

  • Head SHA: 092806946ca6e87875b032968e0cc3295977cc11
  • No changes to this repo's own workflow uses: refs, its actions.lock, lockfiles or container digests.
  • The nested (non-running) vendored workflows now carry upstream's SHA pins, and every uses: in them is a 40-hex SHA. Debtfile vendored-mirror-unpinned-actions falls from 42 to 40.

How has this been verified?

  • Pre-commit suite: passed, including gitleaks, SPDX, SHA pins, actions-lock coverage, K9 ("no K9 files to check") and canonical names. The Haskell lint gate skipped, because neither fourmolu nor hlint is installed.
  • scripts/run-debtfile.sh:
    • todo-fixme-markers holds at 84;
    • vendored-mirror-unpinned-actions is paid down from 42 to 40;
    • gate-scripts-without-tests (33 > 32) and the expired shell-scripts-missing-spdx acceptance are red identically on origin/main ebfcd98b, measured in a detached worktree, so they are not introduced here.
  • scripts/check-lock-sync.sh and scripts/check-allowed-actions.sh: rc=0, both on this tree and on main.
  • Build: there is no local cabal, so this PR's own Call CI Pipeline / Haskell run is the build test. Upstream's own Haskell CI is no predictor: its last 30 runs were 25 failures, 3 cancellations and 2 startup failures. Its last run that actually built (564bcde3) failed on a module-name mismatch, which is fixed at fa9bd386; upstream main itself has never been built in CI.

Checklist

  • My commits are signed (git commit -S).
  • I ran the project's own checks locally and they pass. The listed Debtfile reds are pre-existing on main.
  • New files carry the correct SPDX. Every added .hs file carries upstream's own header, unchanged; no licence text or header was edited.
  • Docs are updated, and no public claim now overstates what the code does. This PR changes no docs.
  • I have not introduced a soundness hole.

Notes for reviewers

  • If this PR's Haskell run is still red, the cause will be upstream package code or third-party bounds against the unpinned latest GHC. I will defer it below with an issue rather than patch sanctify-php inside standards; code fixes belong upstream.
  • Whether standards should vendor this package at all is a separate question. It is recorded in dev-notes/inbox/findings.md, not decided here.

Deferred red checks

Filled in once this PR's own run completes.

🤖 Generated with Claude Code

https://claude.ai/code/session_012kgrMQRhSmZMBbF9Ui1zBw

The vendored copy under rhodium-standard-repositories/.../cccp/satellites/
sanctify-php was 37 files and far behind upstream hyperpolymath/sanctify-php
(182 files). Since #1181 the Haskell job builds every tracked package, and
this copy cannot resolve: its .cabal pins base ^>=4.17 (GHC 9.4) while the
job's GHC ships base-4.22. Upstream has since relaxed that to base >=4.17.

Scoped resync, source = upstream origin/main fa9bd386 (read via git show,
not a working tree):

In:
  - every path the copy already tracked, made identical to upstream
  - deleted where upstream deleted them: 5 ISSUE_TEMPLATEs,
    comprehensive-quality.yml, LICENSE.txt (upstream ships LICENSE)
  - what the .cabal needs to build: src/, app/, bench/, test/*.hs, LICENSE

Kept at the old vendored version, because upstream's copy fails one of this
repo's own gates and editing vendored content to pass it is not ours to do.
Neither plays any part in the build:
  - .github/dependabot.yml: upstream's has no SPDX header (validate-spdx)
  - .claude/CLAUDE.md: upstream's still names the retired 6a2/ path
    (check-canonical-names, AGENTS.md section 2a)

Out, deliberately:
  - .machine_readable/ (holds a retired 6a2/ dir; and K9 contractiles
    that would enter standards' own K9 gates)
  - upstream's 13 newer workflows and .github/hooks
  - test/fixtures and test-plugins (deliberately vulnerable PHP)
  - www/, docs/

Local gates on this tree: Debtfile todo-fixme holds at 84,
vendored-mirror-unpinned-actions falls 42 -> 40; check-lock-sync and
check-allowed-actions pass. (gate-scripts-without-tests and the expired
shell-scripts-missing-spdx acceptance are red on main too.)

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

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

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 43 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: a379ca63-049e-48a0-a563-9d5867878280
📥 Commits

Reviewing files that changed from the base of the PR and between 89d778d and a1663c3.

📒 Files selected for processing (45)
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/ISSUE_TEMPLATE/bug_report.md
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/ISSUE_TEMPLATE/custom.md
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/ISSUE_TEMPLATE/documentation.md
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/ISSUE_TEMPLATE/feature_request.md
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/ISSUE_TEMPLATE/question.md
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/codeql.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/comprehensive-quality.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/generator-generic-ossf-slsa3-publish.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/governance.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/haskell.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/mirror.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/php-security.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/scorecard.yml
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.gitignore
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/LICENSE
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/LICENSE.txt
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/README.adoc
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/app/Main.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/bench/Main.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/sanctify-php.cabal
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/AST.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Analysis/Advanced.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Analysis/DeadCode.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Analysis/Security.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Analysis/Taint.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Analysis/Types.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Emit.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Parser.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Parser/Lexer.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Parser/Token.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Report.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Ruleset.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Transform/Sanitize.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Transform/Strict.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/Transform/TypeHints.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/WordPress/Constraints.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/src/Sanctify/WordPress/Security.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/AspectSpec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/E2ESpec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/Main.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/ParserSpec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/PropertySpec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/SecuritySpec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/Spec.hs
  • rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/test/TransformSpec.hs
  • Autopilot · 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

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

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

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

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
== 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] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

@coderabbitai

coderabbitai Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Add Carrot credits or activate Agent usage billing to use Autopilot

@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 6, 2026 21:08
@hyperpolymath
hyperpolymath disabled auto-merge October 6, 2026 21:09
@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 6, 2026 21:09
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

K9 contract conformance

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

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
== 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] debt rhodium-standard-repositories/rsr-compliance-checklist.k9.ncl (fail) — K9-N001 K9-S004 K9-S005 K9-S014 (grandfathered; touching it makes it blocking)
[validate-k9] 14 conforming, 1 grandfathered (layer all, contract v1.0.0)

@hyperpolymath
hyperpolymath merged commit 7d51f30 into main Oct 6, 2026
63 of 65 checks passed
@hyperpolymath
hyperpolymath deleted the sync/sanctify-php-upstream branch October 6, 2026 21:11
hyperpolymath added a commit to hyperpolymath/sanctify-php that referenced this pull request Oct 6, 2026
…107)

## Summary

Fixes a one-line defect that stops `sanctify-php` from compiling at all.
Line 6 of `src/Sanctify/Parser.hs` was `//! verified alternatives.`, a
Rust-style doc comment inside the Haskell header comment. GHC reads it
as code, so the module header never parses:

```
Sanctify/Parser.hs:6:1: error: [GHC-58481]
    parse error on input ‘//!’
```

Under cabal this shows up as `File name does not match module name: Saw
‘Main’, Expected ‘Sanctify.Parser’` (GHC-28623). That is how it failed
when hyperpolymath/standards built its vendored copy of this repo
(hyperpolymath/standards#1185, run 37531109754). The line becomes `--
verified alternatives.`, which continues the comment's sentence.

Closes # (no issue filed. Found while building the standards vendored
copy.)

## Type of change

- [x] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ New feature: none.
- [ ] 💥 Breaking change: no. One comment line changes.
- [ ] 🕳️ Soundness fix: not a checker false-negative.
- [ ] 📖 Documentation: no docs change. The fix is to a source comment.
- [ ] 🧹 Refactor: no.
- [ ] ⚡ Performance: no.
- [ ] 🔧 Build / CI / tooling: no CI files change.

## 📌 New pins

Head SHA: **`4317025d5b0a01924ad0457ff3498ddffa8d0844`**. No pins are
added or changed.

## How has this been verified?

These checks used local GHC 9.6.6 with the library stanza's flags:
`-XGHC2021 -XOverloadedStrings -XLambdaCase -XDerivingStrategies
-XDeriveGeneric -XDeriveAnyClass`.

- **Before** (`main` `fa9bd38`): `ghc -fno-code Sanctify/Parser.hs` →
`Sanctify/Parser.hs:6:1: error: [GHC-58481] parse error on input ‘//!’`.
- **After** (this branch), the same command:
  - `Sanctify.AST` typechecks.
- `Sanctify.Parser` parses and stops only at `Could not find module
‘Text.Megaparsec’`. That package is not installed on the machine that
ran the check.
- `git grep -nE '^\s*(//|/\*)' -- '*.hs'` on `main` finds this line and
no other.

**Horizon of this check:** it shows that the header and the whole of
`Parser.hs` parse. It does **not** show that the package builds. No full
`cabal build` ran locally, because neither cabal nor the dependencies
were available. This repo's CI has **no Haskell build job** either: its
checks on this PR are governance, scanning and lint only. So nothing has
compiled the package end to end yet.

## Checklist

- [x] My commits are **signed** (`git commit -S`). `git log
--format=%G?` → `G`.
- [ ] I ran the project's own checks/tests locally and they pass: no.
There is no local cabal, so the tests could not run. Only the GHC parse
check above was run.
- [ ] New files carry the correct `SPDX-License-Identifier`: no new
files. The file keeps its `MPL-2.0` header.
- [x] Docs are updated, and no public claim now overstates what the code
does. No docs make claims about this.
- [x] I have not introduced a soundness hole: one comment line changes.

## Deferred red checks

Both reds already fail on `main` (`fa9bd38`). This PR does not touch
either one:

- `governance / Actions lockfile verify`: deferred to #108 (3 stale
`actions.lock` entries).
- `governance / Licence consistency`: deferred to #109 (`LICENSE`
MPL-2.0 vs `.cabal` PMPL). This needs an owner decision.

## Notes for reviewers

When this lands, hyperpolymath/standards can re-sync its vendored copy
under
`rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/`.
Since standards#1184, standards' own CI does not build that copy,
because nested-only Haskell is reported as unsupported. So nothing there
is red in the meantime.

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

https://claude.ai/code/session_012kgrMQRhSmZMBbF9Ui1zBw

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Oct 6, 2026
## Summary

Corrects the Haskell build step's comment, and its guard's error text,
in `.github/workflows/ci-pipeline.yml`. Since #1184 both describe a
detect probe that no longer exists.

#1181 and #1184 merged opposite answers to #1161:

- #1181 made the build step generate a `cabal.project` for every tracked
package, because detect counted `*.cabal` at any depth.
- #1184, merged after it, narrowed detect to a root `cabal.project` or a
root `*.cabal`. It reports nested-only Haskell as **unsupported**.

On 2026-10-06 the owner ruled that #1184's root-only detect stands. This
PR brings the build step's text into line with that ruling.

Two pieces of text were false on `main`:

- **The comment.** It said the probe "counts `*.cabal` at ANY depth" and
that narrowing it "would have hidden nested Haskell instead".
- **The `::error::` text.** It said "detected (*.hs or stack.yaml)".
Detect no longer counts either.

Closes # (none. This follows up #1161, #1181 and #1184.)

## Type of change

- [ ] 🐛 Bug fix: no behaviour changes.
- [ ] ✨ New feature: none.
- [ ] 💥 Breaking change: no. Comment and message text only.
- [ ] 🕳️ Soundness fix: no checker logic changes. The text it corrects
did misdescribe a gate.
- [x] 📖 Documentation (in-workflow comment and error text)
- [ ] 🧹 Refactor: nothing is restructured.
- [ ] ⚡ Performance: not affected.
- [x] 🔧 Build / CI / tooling (the file is the shared CI pipeline)

## 📌 New pins

Head SHA: **`949302ecfb4568295c36e6a7dfe9317f0a821ba1`**. No pins are
added or changed: no `uses:`, `actions.lock`, lockfile or digest edits.

## How has this been verified?

- `git diff --stat origin/main` → 1 file, comment and `::error::` text
only. The second commit (`949302ec`) takes CodeRabbit's point: a root
`cabal.project` listing only nested packages also turns the job on, so
the step does not always have a root package. Every changed line is a
`#` comment or the quoted `::error::` string.
- `ruby -e 'YAML.load_file(...)'` on the edited workflow parses with rc
0.
- `bash scripts/check-lock-sync.sh` → `actions.lock is in sync`. `bash
scripts/check-allowed-actions.sh` → rc 0.
- I read the new text against `main`'s detect step:
  - L159 is `N_HASKELL=$(count 'cabal.project' ':(glob)*.cabal')`.
- L232–238 probe nested Haskell as unsupported only when `N_HASKELL` is
0.
- So the `else` branch runs only with a root `*.cabal`. It then lists
`.` plus each nested package directory, which is what the new comment
says.

## Checklist

- [x] My commits are **signed** (`git commit -S`). `git log
--format=%G?` → `G`.
- [x] I ran the project's own checks/tests locally and they pass:
lock-sync and allowed-actions. The commit-msg hook accepted the message
with one length warning.
- [ ] New files carry the correct `SPDX-License-Identifier`: no new
files. The existing header is unchanged.
- [x] Docs are updated, and no public claim now overstates what the code
does. That is the whole point of this PR.
- [x] I have not introduced a soundness hole: the logic is untouched.

## Deferred red checks

Both reds already fail on `main` (`7d51f30f`). This PR does not touch
either one:

- `Registry + topology in sync`: deferred to #1161 (registry drift on
main).
- `Repo self-tests`: deferred to #1161. The failing suite is
`build-registry-test.sh`, which reports `FAIL: repository ledger
drifted`. That is the same drift.

## Notes for reviewers

- On `main`, standards' own Haskell is now skipped and listed as
unsupported. So the vendored sanctify-php (#1185) is not built here.
- Upstream sanctify-php `main` also does not compile:
`src/Sanctify/Parser.hs` line 6 is `//! verified alternatives.`. A
separate one-line upstream fix PR is being opened. Re-syncing this copy
afterwards is a later step.

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

https://claude.ai/code/session_012kgrMQRhSmZMBbF9Ui1zBw

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Oct 7, 2026
<!--
SPDX-License-Identifier: CC-BY-SA-4.0
Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
-->
## Summary

`Repo self-tests` is red on `main` at 9f68971. Exactly 1 of the 80 test
files fails.

- **Decisive log lines** (run 37541637242, job 112536053286):
  - `FAIL: repository ledger drifted (exit 1)`
- `❌ stale ledger entry
rhodium-standard-repositories/satellites/cccp/satellites/sanctify-php/.github/workflows/comprehensive-quality.yml:2
— no inline Python left; delete the line`
- Then `##[error]scripts/tests/check-inline-python-test.sh failed (exit
1)` and `ERROR: 1 of 80 test file(s) failed.`
- **Cause.** #1185 (7d51f30) resynced the vendored sanctify-php copy
from upstream fa9bd386. That removed the 2 inline-Python lines from its
`comprehensive-quality.yml`. `.machine_readable/inline-python-allow.txt`
is a shrink-only ledger, and it treats a count that has fallen as stale.
Its header says: "Fixing debt therefore means lowering or deleting its
line in the same change."
- **Fix.** Delete that one ledger line. The ledger gets smaller. Nothing
is added and no count goes up.

No issue is filed for this. It is the follow-up #1185 needed.

## Type of change

- [ ] 🐛 Bug fix (non-breaking change that fixes an issue). Not ticked:
no code changes, only one ledger line.
- [ ] ✨ New feature: no.
- [ ] 💥 Breaking change: no.
- [ ] 🕳️ Soundness fix: no.
- [ ] 📖 Documentation: no.
- [x] 🧹 Refactor / tech debt (behaviour-preserving): records debt that
#1185 already paid off.
- [ ] ⚡ Performance: no.
- [x] 🔧 Build / CI / tooling: makes `Repo self-tests` pass again.

## 📌 New pins

- Head SHA: **353ba5d5621ef2e2a255079e5be3e3bc459814fd**
- None. No `uses:` ref, `actions.lock` entry, lockfile record or
container digest is added or changed.

## How has this been verified?

Each command was run locally in the worktree.

- **Before the change, at 9f68971.** `bash
scripts/tests/check-inline-python-test.sh` reproduced the CI failure:
`FAIL: repository ledger drifted (exit 1)`, the same stale-entry line,
then `check-inline-python: 23 passed, 1 failed`.
- **After the change.** The same command printed `PASS: repository
ledger is exact — ✅ inline-python: 14 ledgered line(s) across 10
file(s), none new, none grown, none stale.` and `check-inline-python: 24
passed, 0 failed`.
- **The gate on its own.** `bash scripts/check-inline-python.sh` printed
the same ✅ line and returned rc=0.
- **Positive control.** The "before" run is the control: with the line
present, the gate fails. The test file also kills its own mutants
(`mutant killed (no-stale-check)` and `mutant killed (no-dash-c)`), and
both passed in the run above.
- **Debt ratchet.** `bash scripts/check-debt-ratchet.sh origin/main`
printed all 8 entries `unchanged` and `Debt ratchet: OK.`, rc=0.
- **Exemption ratchet.** `bash scripts/check-exemption-ratchet.sh
origin/main` printed its 5 watched ledgers `unchanged` and `Exemption
ratchet: OK.`, rc=0. `inline-python-allow.txt` is not one of those
ledgers. Its own gate is shrink-only, and a deletion is what that gate
asks for. No `Ratchet-exception` line is needed.
- **Pre-commit hook.** The repo's hook passed during `git commit`.
- **Full suite, the command the check runs.** `bash
scripts/run-shell-test-suite.sh` (from `self-test.yml`) at 353ba5d
printed `All 80 test file(s) passed.`, rc=0.
- **Not yet verified:** the CI run on this branch.

## Checklist

- [x] My commits are **signed** (`git commit -S`): `%G?` = `G`.
- [x] I ran the project's own checks/tests locally and they pass: the
full 80-file suite (`scripts/run-shell-test-suite.sh`) and both
ratchets, as above.
- [x] New files carry the correct `SPDX-License-Identifier`: this PR
adds no new files.
- [x] Docs are updated, and no public claim now overstates what the code
does: no docs are affected.
- [x] I have not introduced a soundness hole: the ledger only shrinks.

## Notes for reviewers

- Any future resync of a vendored satellite that removes inline Python
will trip the same test. The ledger line has to be deleted in the same
PR as the resync.

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

https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm

Co-authored-by: Claude Opus 5.5 <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.

1 participant