Skip to content

theory: AntiEcho × IsArgmin tropical decomposition#72

Merged
hyperpolymath merged 2 commits into
mainfrom
theory/antiecho-tropical-decompose
May 20, 2026
Merged

theory: AntiEcho × IsArgmin tropical decomposition#72
hyperpolymath merged 2 commits into
mainfrom
theory/antiecho-tropical-decompose

Conversation

@hyperpolymath
Copy link
Copy Markdown
Owner

Summary

Cashes the headline claim from /tmp/echo-types-exploration/coecho.md §3 ("Resolution of the EchoTropical tension") at the structural level: TropEcho / IsArgmin decompose into Echo evidence + a Π-quantified complement bound, with an AntiEcho-flavoured corollary exposing that bound as a Π of negative data over the candidate set.

New module proofs/agda/AntiEchoTropical.agda. Neither AntiEcho.agda (from #69) nor EchoTropical.agda is modified — the bridge stays isolated so PR scope is tight.

Headline theorem (both directions, both round-trips refl, packaged as _↔_)

antiecho-tropical-decompose :
   (y : ℕ)  TropEcho y ↔ (Echo score y × ( z  y ≤ score z))

The forward direction projects (x , p , bnd) ↦ ((x , p) , bnd) — pure Σ-re-association because the optimality factor ∀ z → y ≤ score z doesn't depend on x. The backward direction undoes it. Both round-trips are definitionally refl. No decidability, no funext, no path algebra. Packaged via stdlib Function.Bundles._↔_ and mk↔ₛ′, matching the convention from Echo-comp-iso / cancel-iso.

IsArgmin-level restatement (the per-element identity)

isargmin-decompose :
   (x : Candidate) (y : ℕ) 
  IsArgmin x y ↔ ((score x ≡ y) × ( z  y ≤ score z))

IsArgmin IS the product by definition, so the iso to the product is the identity. Pinned for callers thinking in IsArgmin-shaped terms.

AntiEcho-flavoured corollary (the Π-bound as a Π of misses)

The optimality factor ∀ z → y ≤ score z is equivalent on ℕ to the AntiEcho-shaped statement "no candidate witnesses a value strictly below y":

optimality-as-antiecho-flavour-to   : ( z  y ≤ score z)  ( z  score z < y  ⊥)
optimality-as-antiecho-flavour-from : ( z  score z < y  ⊥)  ( z  y ≤ score z)

with the small order-conversion lemmas ≤⇒¬< / ¬<⇒≤ shipped in-module. Composite version (Echo + Π-of-negation):

tropdecomp-antiecho-to   : TropEcho y  Echo score y × ( z  score z < y  ⊥)
tropdecomp-antiecho-from : Echo score y × ( z  score z < y  ⊥)  TropEcho y

This is the Π-form AntiEcho variant from coecho.md §1(c) (AntiEcho_Π = ¬ Echo), specialised to the strict-below stratum. The Σ-form AntiEcho carrier from AntiEcho.agda is the witness-recording primitive; the Π-form above is the exhaustive global statement that names what IsArgmin was carrying implicitly.

Scope notes

  • Specialised to the concrete Candidate → ℕ setting of EchoTropical.agda. A generic-codomain version would need a -bearing ordered codomain and the decidability hypothesis from coecho.md §3 closing remark — deferred.
  • Smoke.agda pins all 14 headlines via using so silent renames or a slide back to ad-hoc tropical decoration trips CI fast.
  • --safe --without-K clean. No postulates. No funext. No path algebra beyond constructor-driven trichotomy on _≤_/_<_.

PR base / stacking

Branched from origin/theory/antiecho-thin-slice (so AntiEcho is in scope) but PR base is main per the stacked-PR-orphan-trap policy. The cumulative diff currently includes #69's content; when #69 merges the diff simplifies automatically.

Test plan

  • CI runs agda -i proofs/agda proofs/agda/All.agda — exits 0.
  • CI runs agda -i proofs/agda proofs/agda/Smoke.agda — exits 0.
  • All 14 pinned headlines in Smoke.agda resolve.
  • No new postulates / escape pragmas introduced.

Note on local verification. Settings restrictions in this sandbox blocked local agda invocation on this worktree (the project's Bash(agda *) allow rule did not apply to this session). Proofs are pure Σ-currying / pattern-matching + two small ℕ order-conversion lemmas — expected to typecheck on the existing CI gate.

Refs

Does NOT Close anything. The CoEcho roadmap entry stays open until decided by the owner; this PR cashes the structural half.

🤖 Generated with Claude Code

hyperpolymath and others added 2 commits May 20, 2026 14:48
…sjointness)

Lands the first four obligations from the `coecho.md` design note as
`proofs/agda/AntiEcho.agda` (renamed `antiecho-*` per user namespace
decision 2026-05-20):

  * `AntiEcho f y := Σ A (λ x → f x ≢ y)` — the carrier, the
    minimal-edit-distance Σ-dual of `Echo`. Same Σ-shape, same
    universe `a ⊔ b`, same proof-relevance posture as Echo; ≡ flips
    to ≢ = · ≡ y → ⊥. (antiecho-def)
  * `antiecho-intro : ∀ x → f x ≢ y → AntiEcho f y` — trivial pairing.
  * `antiecho-disjoint : ∀ x → f x ≡ y → f x ≢ y → ⊥` — per-element
    disjointness against Echo. The joint form
    `Echo f y → AntiEcho f y → ⊥` with possibly distinct witnesses is
    deliberately deferred (requires codomain decidability; lives in
    the partition lemma).
  * `antiecho-map-over : (g : A' → A) → AntiEcho (f ∘ g) y →
    AntiEcho f y` — source-side covariance; misses propagate back to
    the outer leg by re-applying g.

Naming decision (user, 2026-05-20). The new module is `AntiEcho`, NOT
`CoEcho`. The name `CoEcho` is already taken in
`EchoFiberTriangulation.agda` (lines 82–95) for the trivial
opposite-orientation fibre `∃ x . y ≡ f x` (Echo composed with `sym`).
That construction is a reorientation, not a dual. The negative dual
lands here under the distinct name `AntiEcho` so the two namespaces
stay fully separate. Both `EchoFiberTriangulation.CoEcho` and the new
`AntiEcho` are now pinned in `Smoke.agda`.

Deferred to follow-up slices (do NOT close anything):
  * obligation 5 `antiecho-partition-dec` — needs `DecEq B` on the
    codomain; lives in its own slice.
  * obligation 6 `antiecho-tropical-decompose` — crosses module
    boundaries (`EchoTropical.IsArgmin ≃ Echo × Π AntiEcho`) and
    deserves its own slice; the design note flags this as the
    structural-vs-quantitative payoff but the proof reaches beyond a
    thin-slice introduction.

Build invariants held: `--safe --without-K`, zero postulates, zero
escape pragmas. New module wired into `All.agda` as `open import
AntiEcho`; headline names (`AntiEcho`, `antiecho-intro`,
`antiecho-disjoint`, `antiecho-map-over`) pinned in `Smoke.agda` via
`using` clause so a rename/deletion fails CI fast.

Verification: `agda -i proofs/agda proofs/agda/All.agda` exits 0;
the build trace lists `Checking AntiEcho` and `Checking Smoke`
without errors, confirming both the module itself and the pinned
headlines typecheck.

Refs: docs/echo-types/roadmap.md "Negative / co-echoes" entry (CoEcho
formulation). Does NOT close that entry — only the carrier + the
first three small lemmas land; the partition and tropical
decomposition obligations remain.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cashes the headline claim from `/tmp/echo-types-exploration/coecho.md`
§3 ("Resolution of the EchoTropical tension") at the structural level:
`TropEcho` / `IsArgmin` decompose as Echo evidence conjoined with a
Π-quantified complement bound, with the AntiEcho-flavoured corollary
exposing that bound as a Π of negative data over the candidate set
(Π-form AntiEcho, `coecho.md` §1(c)).

New module `proofs/agda/AntiEchoTropical.agda`.

Headline theorem (both directions definitional, both round-trips
`refl`, packaged as stdlib `Function.Bundles._↔_`):

    antiecho-tropical-decompose :
      ∀ (y : ℕ) → TropEcho y ↔ (Echo score y × (∀ z → y ≤ score z))

`IsArgmin`-level restatement (identity on the Σ-shape):

    isargmin-decompose :
      ∀ (x : Candidate) (y : ℕ) →
      IsArgmin x y ↔ ((score x ≡ y) × (∀ z → y ≤ score z))

AntiEcho-flavoured corollary on the optimality factor — both
directions on ℕ (no abstract DecEq hypothesis; the candidate codomain
is `ℕ` concretely, so the order-conversion lemmas are constructive):

    optimality-as-antiecho-flavour-to   : (∀ z → y ≤ score z) → (∀ z → score z < y → ⊥)
    optimality-as-antiecho-flavour-from : (∀ z → score z < y → ⊥) → (∀ z → y ≤ score z)

with order-conversion lemmas `≤⇒¬<` / `¬<⇒≤` ported in-module.
Composite map (Echo + Π-of-negation form) shipped both ways:

    tropdecomp-antiecho-to   : TropEcho y → Echo score y × (∀ z → score z < y → ⊥)
    tropdecomp-antiecho-from : Echo score y × (∀ z → score z < y → ⊥) → TropEcho y

Scope: depends on `AntiEcho.agda` (from the AntiEcho thin slice,
PR #69); neither `AntiEcho.agda` nor `EchoTropical.agda` is modified
— the bridge module stays isolated. Specialised to the concrete
`Candidate → ℕ` setting (`EchoTropical.agda`); a generic-codomain
version would need a `≤`-bearing ordered codomain and is deferred
per `coecho.md` §3 closing remark.

Wiring: `proofs/agda/All.agda` opens the new module; `proofs/agda/Smoke.agda`
pins all 14 headlines via `using` so a silent rename or a slide back
to ad-hoc tropical decoration trips CI fast.

`--safe --without-K` clean. No postulates. No funext. No path algebra
beyond the constructor-driven trichotomy on `_≤_`/`_<_`.

Build verification: settings restrictions in this sandbox blocked
local `agda` invocation on this branch (the project's `Bash(agda *)`
allow rule didn't apply); CI must run `agda -i proofs/agda
proofs/agda/All.agda` and `agda -i proofs/agda proofs/agda/Smoke.agda`
to confirm both exit 0. Proofs are pure Σ-currying / pattern-matching
+ two small ℕ order-conversion lemmas — expected to typecheck on the
existing CI gate.

Refs PR #69 (depends on its `AntiEcho` module).
Refs `docs/echo-types/roadmap.md` CoEcho entry ("Possibly resolves
the quantitative / structural tension hinted at by `EchoTropical`").
Refs `/tmp/echo-types-exploration/coecho.md` §3 + §5 obligation 6.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hyperpolymath
Copy link
Copy Markdown
Owner Author

Build verified from parent session (sandbox quirk blocked the agent's local agda run; same workaround as PR #71):

$ cd /tmp/echo-types-worktrees/tropical-decomp
$ LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda; echo "exit: $?"
... (full module check, including Checking AntiEchoTropical and Checking Smoke)
exit: 0

$ LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/Smoke.agda; echo "exit: $?"
exit: 0

--safe --without-K invariants intact (Agda would have errored otherwise). Both round-trips of antiecho-tropical-decompose and the AntiEcho-flavoured corollary are well-typed; the 14 Smoke.agda pins resolve at top-level.

@hyperpolymath hyperpolymath marked this pull request as ready for review May 20, 2026 14:13
@hyperpolymath hyperpolymath merged commit eacce15 into main May 20, 2026
7 of 9 checks passed
@hyperpolymath hyperpolymath deleted the theory/antiecho-tropical-decompose branch May 20, 2026 14:13
hyperpolymath added a commit that referenced this pull request May 20, 2026
…eferred) (#75)

## Summary

Extends `proofs/agda/EchoAccess.agda` (the PR #68 thin slice) with the
join structure and per-decoration composition trio, completing the same
recipe as `EchoGraded` and `EchoLinear` at the per-decoration
composition rung.

**Rung A — categorical join structure.** `_⊔a_` (componentwise max along
`free ≤ decidable ≤ enum ≤ feasible ≤ infeasible`) + `≤a-⊔a-left` +
`≤a-⊔a-right` + `≤a-⊔a-univ` (universal property).

**Rung B — per-decoration composition trio.**
* `degrade-access-comp` — two successive degrades along a factoring
agree with one degrade along the composed proof. Closes `refl` on every
reachable `(p12, p23)` constructor pair (the carriers reduce in
lock-step with `≤a-trans`).
* `degrade-access-compose` — factoring-free composition; corollary of
`degrade-access-comp` + `≤a-prop`.
* `degrade-access-via-join` — same law restated through the join.

**Rung C — honest carriers — deferred with design note.** An honest
`enum`-grade carrier needs an enumerator `Fin n → A` and a decider on
`B`. Neither can be supplied without breaking the parametricity over `A`
that `Echo f y` enjoys at the `free` grade. The two clean resolutions
are (a) parameterise the whole `CEcho` family on `Decidable B` + an
enumeration witness (forces every caller to supply them, even at `free`
where they do nothing), or (b) bury both in an existential inside the
`enum` / `feasible` / `infeasible` cases (loses the ability to extract
from outside). Both are real architectural choices — the PR brief's
Stop-condition explicitly flagged this as the design-decision case and
instructed landing A + B with a written deferral.

Importantly, the composition layer that lands here is **grade-indexed
not carrier-indexed**, so it is unaffected by the eventual carrier
choice. Module preamble carries the full deferral note.

All new headlines pinned in `Smoke.agda`. Module preamble section list
refreshed; `degrade-access` follow-up commentary updated. No new imports
beyond `sym` from `Relation.Binary.PropositionalEquality`. No
postulates. `--safe --without-K` preserved throughout.

## Build status

**BUILD UNVERIFIED LOCALLY** — the sandbox repeatedly blocked `agda`
invocations on positional file arguments (the known quirk that hit PRs
#71 + #72). Parent session will verify (`LC_ALL=C.UTF-8 agda -i
proofs/agda proofs/agda/All.agda` and same for `Smoke.agda`, both
expected to exit 0) and post a confirmation comment.

The mathematical content is mechanical mirror of
`EchoGraded.{degrade-comp, degrade-compose, degrade-via-join, ⊔g,
≤g-⊔g-*}` (with 5 grades instead of 3) and
`EchoLinear.{degradeMode-comp, degradeMode-compose,
degradeMode-via-join, ⊔m, ≤m-⊔m-*}` (with 5 grades instead of 2). Every
clause closes `refl` modulo the `≤a-trans` reduction table that already
ships in PR #68.

## Refs

Refs PR #68 (the thin slice), `docs/echo-types/roadmap.md` Axis 8 entry,
`/tmp/echo-types-exploration/axis8.md` §5 deferred list.

## Test plan

- [ ] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda` exits 0.
- [ ] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/Smoke.agda` exits
0.
- [ ] No postulates / no escape pragmas / `--safe --without-K`
preserved.
- [ ] All seven new headline names resolve in `Smoke.agda`.

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

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request May 20, 2026
…-rot (#79)

## Summary

Three independent bookkeeping items consolidated to avoid PR churn:

1. **CLAUDE.md "Current rung state (2026-05-20)"** — full session arc
for the echo-types swarm (PRs #67-#72, #74-#77). §"Theory work — no
proof assistant needed" is now essentially closed (Lane 2
BalancedTolerance is #78, awaiting review). Two patterns formalised
(per-lemma Smoke pin for parameterised modules;
`sandbox.excludedCommands` workaround for the agda positional-arg
sandbox quirk). Plan for next Claude included.

2. **EchoAccess `Lift ⊤` carrier — design closure.** The post-#75
carrier-honesty work hit a structural wall on the owner-authorised
existential design: `degrade-access` becomes uninhabitable because the
access lattice tracks **decreasing** information as you climb, so
degrading must drop info, never fabricate it. Conclusion: `Lift ⊤` IS
the right honest carrier at the top of the lattice (same sense as
`EchoGraded.forget = ⊤`). New
`docs/echo-types/decisions/echo-access-trivial-carrier.adoc` captures
the closure; `EchoAccess.agda` module header updated from "Deferred to
follow-up" to "Resolved 2026-05-20" with the structural reasoning.

3. **Complete `≤a-⊔a-univ` baseline-rot** — 10 more wrong-RHS clauses in
the same family as commit `a8ac211` (which fixed only some of the
strict-inequality witnesses). Discovered by Agda 2.8.0 on a clean
`.agdai` cache; previous "verified green" reports were spuriously
passing because of stale incremental builds. Same diagnosis: when `c1 ⊔a
c2 = c2` (strict `c1 < c2`), the universal property witness needs `c2≤c`
shape (p2), not `c1≤c` shape (p1). Fixed clauses span the
decidable/enum/feasible/infeasible rows.

## Test plan

- [x] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda` exits 0
on Agda 2.8.0
- [x] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/Smoke.agda` exits
0 on Agda 2.8.0
- [x] `--safe --without-K` invariants intact
- [x] No postulates introduced
- [x] No escape pragmas
- [ ] CI Agda check passes
- [ ] AsciiDoctor render of new decisions adoc (no asciidoctor in
environment; hand-inspected against `decisions/no-2-cat.adoc` template)

Refs CLAUDE.md "Rung-consolidation policy" §4 ("Update machine docs").
Does **not** close any issue.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request May 20, 2026
…al decomposition (#91)

## Summary

Lifts the concrete ℕ-scored tropical decomposition from
`AntiEchoTropical.agda` to an arbitrary ordered codomain. Closes the
"generic-codomain version is deferred (would need a \`≤\`-bearing
ordered codomain)" remark that has lived in `AntiEchoTropical`'s
preamble since #72.

## What lands

### `AntiEchoTropicalGeneric.agda` — new module

```agda
record OrderedCodomain : Set₁ where
  field
    B    : Set
    _≤_  : B → B → Set
    _<_  : B → B → Set
    ≤⇒¬< : ∀ {y n : B} → y ≤ n → n < y → ⊥
    ¬<⇒≤ : ∀ {y n : B} → (n < y → ⊥) → y ≤ n
```

The first three fields are pure structure; the latter two are the
order conversions. `≤⇒¬<` is always available; `¬<⇒≤` is the entire
content of the "decidable order" hypothesis in the concrete ℕ case —
factored out as a field rather than baked into the codomain.

Three theorems in `module Generic (OC : OrderedCodomain)`:

* **`antiecho-tropical-decompose-gen`** — pure Σ-reshape iso between
  `TropEchoG s y` and `Echo s y × (∀ z → y ≤ s z)`. `refl` round-trips,
  does NOT use the order at all (structural only).
* **`optimality-as-antiecho-flavour-gen-to/from`** — `(∀ z → y ≤ s z)`
  ↔ `(∀ z → s z < y → ⊥)`. Uses `≤⇒¬<` / `¬<⇒≤` from the interface.
* **`tropdecomp-antiecho-gen-to/from`** — composite
  `TropEchoG ↔ Echo × (Π-of-AntiEcho-flavoured-misses)`.

Sanity instance `ℕ-ordered-codomain : OrderedCodomain` pinned in
`Smoke.agda` so the interface is demonstrably inhabitable.

### Preamble updates (zero Agda content change)

* `AntiEcho.agda` — obligation 6 line updated to point at both the
  concrete and generic landings
* `AntiEchoTropical.agda` — "generic-codomain version is deferred"
  replaced by pointer to the new module

## Test plan

* [x] `agda proofs/agda/AntiEchoTropicalGeneric.agda` exit 0
* [x] `agda proofs/agda/All.agda` exit 0 under `--safe --without-K`
* [x] `agda proofs/agda/Smoke.agda` exit 0 under `--safe --without-K`
* [x] `OrderedCodomain`, `ℕ-ordered-codomain`, `module Generic` pinned
* [x] No postulates, no funext, no escape pragmas

## Scope

The concrete `AntiEchoTropical.agda` module is **unchanged** (only its
preamble comment updated). The two coexist: concrete remains the
canonical landing for ℕ-scored tropical; generic is the abstract
sibling for downstream users at other ordered codomains.

## Dependencies

Depends on **#90** (antiecho-partition-dec). Branch based on
`antiecho-partition-dec`; will rebase onto `main` once #90 lands.
Disjoint from #88 (F3).

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request May 20, 2026
…luster landed (#92)

## Summary

Three small accuracy passes through `docs/echo-types/` after the
earn-back programme, the §"Theory work — no proof assistant needed"
section, and the canonical examples cluster (5/9/10) all closed in
this session. Pure prose; no Agda changes.

### 1. `roadmap.md` §"Theory work" — two stale items refreshed

* **Axis 8** line said the *decidability-respecting* candidate had
  shipped but listed the other three as still candidate refinements.
  All four have now shipped: `EchoDecidable`, `EchoCost` (#85),
  `EchoAccess` (#68 / #75), `EchoSearch` (#80). Updated to credit all
  four.
* **Negative / co-echoes** line was `[unblocked]`; now `[landed]` —
  `AntiEcho` (#69), tropical decomposition concrete + generic (#72 +
  #91), `antiecho-partition-dec` (#90). Names the `coecho.md` §5
  obligation-5 / obligation-6 closures explicitly.

After these edits, every item in §"Theory work — no proof assistant
needed" is either `[landed]` or `[ruled out]`/`[refreshed]` — the
section is genuinely closed.

### 2. `roadmap.md` §"Example work" — three items landed

* ex. 5 (`EchoExampleProvenance`, #81) → `[landed]`
* ex. 9 (`EchoExampleParser`, #83) → `[landed]`
* ex. 10 (`EchoExampleAbsInt`, #82) → `[landed]`

Only ex. 6 (approximate-echo numeric example) remains `[unblocked]`.

### 3. `earn-back-plan.adoc` — stale `roadmap-gates.adoc` claim
corrected

* Header note used to say "the gate discipline was historically
  attributed to a `roadmap-gates.adoc`; that file does not exist
  in-tree". The file **does** exist (created 2026-05-18; see its
  preamble). Header rewritten to list `roadmap-gates.adoc` alongside
  `retractions.adoc` / this plan / `next-questions.adoc` as the four
  canonical loci.
* Ledger row D (the "doesn't exist" entry) marked **CLOSED 2026-05-20**
  with the cite reflecting current reality.

## Test plan

* [x] Pure docs / `.adoc` / `.md` edits — no Agda touched
* [x] `agda proofs/agda/All.agda` exit 0 (confirms docs match code)
* [x] `agda proofs/agda/Smoke.agda` exit 0
* [x] No retracted-claim language moved; no earned-back claim
      overclaimed; `paper.adoc` / `types-abstract.adoc` /
      `conservativity.adoc` untouched

## Scope

Disjoint from all currently-open PRs:
* #88 (F3) — touches Agda + `retractions.adoc` (different sections)
  + `earn-back-plan.adoc` Status (different section from header /
  ledger-D)
* #90 (partition-dec) — touches Agda only
* #91 (generic-codomain) — touches Agda + preamble comments

No retracted claim is moved. No earned-back claim is overclaimed.
`paper.adoc` / `types-abstract.adoc` / `conservativity.adoc` are
intentionally untouched (owner-gated, per the posture set by #86 /
#88).

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

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

🔍 Hypatia Security Scan

Findings: 10 issues detected

Severity Count
🔴 Critical 0
🟠 High 5
🟡 Medium 5
View findings
[
  {
    "reason": "No test directory or test files found",
    "type": "no_tests",
    "file": "/home/runner/work/echo-types/echo-types",
    "action": "flag",
    "rule_module": "honest_completion",
    "severity": "high",
    "deduction": 20
  },
  {
    "reason": "Issue in quality.yml",
    "type": "missing_workflow",
    "file": "quality.yml",
    "action": "create",
    "rule_module": "workflow_audit",
    "severity": "high"
  },
  {
    "reason": "Issue in security-policy.yml",
    "type": "missing_workflow",
    "file": "security-policy.yml",
    "action": "create",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in secret-scanner.yml",
    "type": "missing_workflow",
    "file": "secret-scanner.yml",
    "action": "create",
    "rule_module": "workflow_audit",
    "severity": "high"
  },
  {
    "reason": "Action actions/cache@v4 needs attention",
    "type": "unpinned_action",
    "file": "agda.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action hyperpolymath/standards/.github/workflows/governance-reusable.yml@main needs attention",
    "type": "unpinned_action",
    "file": "governance.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "high"
  },
  {
    "reason": "No dependabot.yml or renovate.json found in echo-types",
    "type": "DependencyUpdate",
    "file": "/home/runner/work/echo-types/echo-types",
    "action": "auto_fix",
    "rule_module": "scorecard",
    "severity": "high",
    "remediation": "Add .github/dependabot.yml or renovate.json configuration.",
    "scorecard_check": "Dependency-Update-Tool"
  },
  {
    "reason": "Nominal-only SAST in echo-types: codeql.yml language matrix contains no language present in the repo and lacks `actions`, so CodeQL records zero results on every commit. Remediation: set the CodeQL matrix to `language: actions`.",
    "type": "StaticAnalysis",
    "file": "/home/runner/work/echo-types/echo-types",
    "action": "auto_fix",
    "rule_module": "scorecard",
    "severity": "medium",
    "remediation": "Add CodeQL or equivalent SAST workflow.",
    "scorecard_check": "SAST"
  },
  {
    "reason": "1 workflow(s) with tag-pinned (not SHA-pinned) actions in echo-types",
    "type": "DependencyPinning",
    "file": "/home/runner/work/echo-types/echo-types",
    "action": "auto_fix",
    "rule_module": "scorecard",
    "severity": "medium",
    "remediation": "Pin GitHub Actions and Docker base images by SHA hash.",
    "scorecard_check": "Pinned-Dependencies"
  },
  {
    "reason": "Repository has 1 non-main remote branch(es). Policy: single main branch only.",
    "type": "GS007",
    "file": ".",
    "action": "delete_remote_branches",
    "rule_module": "git_state",
    "severity": "medium"
  }
]

Powered by Hypatia Neurosymbolic CI/CD Intelligence

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