Skip to content

Commit dd20cf8

Browse files
fix(stats,governance,security): complete PR #217 follow-ups, K9/DEED conformance, and input-boundary hardening (#245)
## Change and reason Supersedes #217 directly on current `main` (`d69d4f9`) and addresses remaining fork governance, K9/DEED conformance, and security/quality findings across the repository. ### 1. PR #217 reconciliation & CI/DOI workflow hardening - The streamed `BigInt` DuckDB count aggregation, strict RFC 7493 I-JSON / RFC 8785 JCS boundary, read-only DuckDB helpers, and CladeCumulus sidecar fixes from #217 already landed on `main` via #226; merging the stale #217 branch directly would revert subsequent `main` commits. - **Addresses CodeRabbit review feedback on #217 (`validated_statistics.jl`):** `_statistics_body` now measures UTF-8 byte length via `ncodeunits(req.body)` when given an `AbstractString` and avoids mutating `Vector{UInt8}` request buffers (`String(copy(req.body))`), with regression tests in `test/unit/test_validated_statistics.jl`. - **Restores PR #217 fast-fail test ordering & hardens workflows:** places `validated_statistics` first in `Run validated-statistics tests first`, captures both `julia` and `tee` exit statuses without redundant `|| true` suffixes (`RE005`), bounds `Julia tests` with `timeout-minutes: 60` (`WH006`), and replaces the silent-swallow YAML step in `.github/workflows/doi.yml` with real `CITATION.cff` and DOI receipt-schema checks. ### 2. K9 v1.0.0 & DEED conformance + fork hygiene - Authors Yard-tier K9 v1.0.0 fork contractiles (`must.k9.ncl`, `trust.k9.ncl`, `intend.k9.ncl`) under `.machine_readable/contractiles/` and routes `:contracts` in `MetaManifold-WebUI_chora.deed`. - Wires `hyperpolymath/standards/.github/workflows/k9-conformance.yml` (L0–L2 strict, `require-files: true`, `fail-on-indeterminate: true`) into `.github/workflows/governance.yml`, aligns all `hyperpolymath/standards` workflow pins to one SHA (`01c9b0c9f2646ebea0b30a9588462642ac94aee9`), switches `GH_TOKEN` to `github.token` (`RE001`), publishes the K9 verdict grid + `k9.json` badge endpoint, and extends `scripts/check-governance-contract.sh` from 20 to 26 checks. - Adds `SECURITY.md` (`CC-BY-SA-4.0`), `.editorconfig` (`MPL-2.0`), and `.github/dependabot.yml` (`MPL-2.0` for `github-actions`). ### 3. Security, input-boundary, proof-drift & frontend fixes - **HTTP JSON input boundaries (`panic-attack` `InputBoundary`):** adds `_read_json_object` in `src/server/server.jl` and updates `runs.jl`, `studies.jl`, `composition.jl`, `analysis.jl`, `results.jl`, `config.jl`, and `publication_tables.jl` so malformed or non-object JSON bodies return HTTP 400 (`invalid_json` / `invalid_library`) instead of throwing unhandled 500 exceptions, covered in `test/unit/test_server_security.jl`. - **Additional `InputBoundary` & `ProofDrift` fixes:** guards JSON parsing in `bench/advanced_zero_handling/benchmark.jl`, `frontend/src/figure/charts.ts`, and `frontend/src/components/alphaMetrics.tsx`, and replaces type-only `isa` assertions in `test/unit/test_occupancy_grade.jl` and `test/unit/test_evidence.jl` with concrete value and UTC ISO-8601 timestamp checks. - **Frontend `pons-asinorum` fixes:** batches SVG path fragments in `frontend/src/tree/TreeShapes.tsx` and cleans trailing post-return hook comments in `frontend/src/figure/PaneEditor.tsx` and `frontend/src/components/PublicationTablesPanel.tsx`. ## Validation - `npx --yes bun@1.3.10 install --frozen-lockfile --ignore-scripts` - `npx --yes bun@1.3.10 run typecheck` — clean - `npx --yes bun@1.3.10 test src` — **72 passed, 0 failed** (200 `expect()` assertions) - `npx --yes bun@1.3.10 run build` — production Vite bundle succeeded - `bash scripts/check-governance-contract.sh` — **26/26 passed** - `bash scripts/lint-sonar-reliability.sh` — clean - `bash scripts/lint-occupancy-readings.sh` — clean - `bash proofs/tests/axiom-audit.sh` — 7/7 Agda modules clean - `python3 test/references/check_high_precision_references.py --check test/unit/test_high_precision.jl` — verified - `node deed_lint.js MetaManifold-WebUI_chora.deed` — `OK` - `bash k9-validate.sh --layer L1 --strict` on `.machine_readable/contractiles/*/*.k9.ncl` — 3/3 `pass` (`errors: 0, warnings: 0`); full Nickel 1.18.0 L2 typecheck/export runs in `Governance (fork)` - Parsed all modified YAML workflows with `Bun.YAML.parse` and verified all 46 inline bash `run` blocks with `bash -n` - `git diff --check` — clean - Julia 1.12.5 / R / Agda test execution runs in the pinned GitHub Actions `CI` workflow (Julia is not installed in the authoring sandbox) ## Scope - Leaves upstream `AGPL-3.0-only` / `CC BY-SA 4.0` copyright headers, `LICENSE`, `CITATION.cff`, lockfiles (`Manifest.toml`, `renv.lock`, `frontend/bun.lock`), W3C XML/SVG namespace URIs (`http://www.w3.org/2000/svg`), and intentional Julia-to-R `RCall.reval` / `Meta.parse` bridges untouched. - Keeps `.gitbot-fleet/` report-backs honest (`not_run` until external fleet bots publish genuine evidence) and preserves the fork's non-blocking PR SARIF contract. ## Contribution checks - [x] I followed [CONTRIBUTING.md](../CONTRIBUTING.md). - [x] This branch starts at current `main` (`d69d4f9`) and contains no merge commits. - [x] CI and Governance workflows are running on this PR. - [x] Existing licensing, citation and acknowledgement text is unchanged. --------- Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
1 parent 90a1aa2 commit dd20cf8

30 files changed

Lines changed: 465 additions & 67 deletions

‎.github/workflows/ci.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ jobs:
417417
shell: bash
418418
run: |
419419
set +e
420-
julia --project=. -t2 --compiled-modules=no test/runtests.jl numeric_policy exact_summaries high_precision derived_analyses validated_statistics 2>&1 | tee /tmp/validated-statistics-tests.log
420+
julia --project=. -t2 --compiled-modules=no test/runtests.jl validated_statistics numeric_policy exact_summaries high_precision derived_analyses 2>&1 | tee /tmp/validated-statistics-tests.log
421421
# Preserve both exits immediately: a successful Julia run must not
422422
# hide a failed log write (e.g. a full runner filesystem).
423423
statuses=("${PIPESTATUS[@]}")

‎.github/workflows/doi.yml‎

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
BASE_SHA: ${{ github.event.pull_request.base.sha }}
4343
run: |
4444
relevant=false
45-
patterns=('src/core/doi.jl' 'docs/doi-publication.md' 'scripts/link-doi.sh' '.github/workflows/doi.yml')
45+
patterns=('src/core/doi.jl' 'src/server/routes/doi.jl' 'test/unit/test_doi.jl' 'CITATION.cff' 'docs/doi-publication.md' 'scripts/link-doi.sh' '.github/workflows/doi.yml')
4646
changed="$RUNNER_TEMP/doi-changed-files"
4747
if ! git diff --no-renames --name-only -z "$BASE_SHA...HEAD" > "$changed"; then
4848
echo "ERROR: git diff $BASE_SHA...HEAD failed" >&2
@@ -67,21 +67,38 @@ jobs:
6767
timeout-minutes: 10
6868
steps:
6969
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
70+
with:
71+
persist-credentials: false
7072

7173
- name: Shell syntax check
7274
run: bash -n scripts/link-doi.sh
7375

74-
- name: YAML parse
75-
run: python3 -c 'import yaml,sys; yaml.safe_load(open("docs/doi-publication.md"))' 2>/dev/null || true
76+
- name: Citation metadata check
77+
run: |
78+
python3 - <<'PY'
79+
from pathlib import Path
80+
import sys
81+
82+
cff = Path("CITATION.cff").read_text(encoding="utf-8")
83+
required_prefixes = ("cff-version:", "title:", "authors:", "license:")
84+
missing = [p for p in required_prefixes if not any(line.startswith(p) for line in cff.splitlines())]
85+
if missing:
86+
sys.exit(f"CITATION.cff missing required top-level keys: {', '.join(missing)}")
87+
PY
7688
7789
- name: Receipt schema shape
7890
run: |
7991
python3 - <<'PY'
80-
import json, sys
81-
# A valid receipt carries these keys; this is a shape check only.
82-
keys = {"schema","study","run","origin","deposition_id","doi","published",
83-
"files","created_at","published_at","checksum"}
84-
print("receipt schema shape documented in src/core/doi.jl")
92+
from pathlib import Path
93+
import sys
94+
95+
source = Path("src/core/doi.jl").read_text(encoding="utf-8")
96+
keys = ("schema", "study", "run", "origin", "deposition_id", "doi",
97+
"published", "files", "created_at", "published_at", "checksum")
98+
missing = [k for k in keys if f'"{k}"' not in source and f":{k}" not in source]
99+
if missing:
100+
sys.exit(f"src/core/doi.jl missing receipt schema keys: {', '.join(missing)}")
101+
print("verified DOI receipt schema keys in src/core/doi.jl")
85102
PY
86103
87104
# Julia lifecycle and real-HTTP checks require a provisioned machine with the

‎.github/workflows/governance.yml‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ jobs:
6060
contents: read
6161
pull-requests: read
6262
with:
63-
# No K9 contracts are committed yet: report grey, never pretend that
64-
# DEED syntax validation establishes K9 semantic conformance.
65-
require-files: false
63+
# Require the committed .machine_readable/contractiles/ K9 corpus across
64+
# L0–L2; an accidentally emptied corpus or orange state fails closed.
65+
require-files: true
6666
fail-on-indeterminate: true
6767

6868
hypatia:
@@ -164,14 +164,21 @@ jobs:
164164
165165
badges:
166166
name: Publish badges
167-
needs: [deed, hypatia]
167+
needs: [deed, k9, hypatia]
168168
if: ${{ always() && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
169169
runs-on: ubuntu-latest
170170
timeout-minutes: 5
171171
permissions:
172172
contents: write
173173
actions: read
174174
steps:
175+
- name: Download the K9 conformance grid
176+
continue-on-error: true
177+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
178+
with:
179+
name: k9-grid
180+
path: k9-grid
181+
175182
- name: Download the verdict grid
176183
continue-on-error: true
177184
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
@@ -183,6 +190,7 @@ jobs:
183190
env:
184191
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
185192
DEED_RESULT: ${{ needs.deed.result }}
193+
K9_RESULT: ${{ needs.k9.result }}
186194
run: |
187195
set -euo pipefail
188196
# shields.io endpoint JSON, one file per lane, on an orphan branch
@@ -195,6 +203,14 @@ jobs:
195203
*) msg=indeterminate; colour=orange ;;
196204
esac
197205
jq -n --arg m "$msg" --arg c "$colour" '{schemaVersion: 1, label: "DEED syntax", message: $m, color: $c}' > out/deed.json
206+
if [ "$K9_RESULT" = "success" ] && [ -s k9-grid/badge.json ]; then
207+
cp k9-grid/badge.json out/k9-grid.json
208+
elif [ "$K9_RESULT" = "failure" ]; then
209+
jq -n '{schemaVersion: 1, label: "K9 contracts", message: "failing", color: "red"}' > out/k9-grid.json
210+
else
211+
jq -n '{schemaVersion: 1, label: "K9 contracts", message: "indeterminate", color: "orange"}' > out/k9-grid.json
212+
fi
213+
[ -s k9-grid/report.json ] && cp k9-grid/report.json out/k9-grid.report.json
198214
if [ -s verdict-grid/badge.json ]; then
199215
cp verdict-grid/badge.json out/hypatia-grid.json
200216
else

‎.gitignore‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ proofs/agda/_build/
342342
# Occupancy proof dependencies and reproduction logs
343343
/_build/
344344

345-
# Fork governance: the gitbot-fleet enrolment manifest and report-backs are tracked.
345+
# Fork governance: the gitbot-fleet enrolment manifest, report-backs, and K9 contractiles are tracked.
346346
!.gitbot-fleet/
347347
!.gitbot-fleet/**
348+
!.machine_readable/
349+
!.machine_readable/**
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
K9!
2+
# SPDX-License-Identifier: MPL-2.0
3+
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
4+
#
5+
# intend.k9.ncl — Architectural commitments and north-star intent declarations
6+
# for the hyperpolymath/MetaManifold-WebUI fork. Evaluated at 'Yard (reporting
7+
# authority; non-gating drift reference).
8+
{
9+
pedigree = {
10+
schema_version = "1.0.0",
11+
component_type = "contractile:intend",
12+
contractile_verb = "intend",
13+
semantics = "commitment-and-aspiration",
14+
tier = 'Yard,
15+
authority = 'reporting,
16+
security = {
17+
leash = 'Yard,
18+
signature_required = false,
19+
trust_level = "contract-eval-only",
20+
allow_network = false,
21+
allow_filesystem_write = false,
22+
allow_subprocess = false,
23+
capabilities = [],
24+
},
25+
metadata = {
26+
name = "metamanifold-webui-intend",
27+
version = "1.0.0",
28+
description = "North-star commitments for exact ecological statistics, machine-checked Agda proofs, epistemic cladistic overlays, and clean upstream-candidate separation.",
29+
author = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
30+
},
31+
warnings = [
32+
"Evaluated at Yard with reporting authority; records architectural intent without executing host commands.",
33+
],
34+
side_effects = [],
35+
},
36+
37+
config = {
38+
commitments = [
39+
{
40+
id = "exact-count-aggregation",
41+
area = "src/analysis/exact_summaries.jl",
42+
status = "verified",
43+
summary = "Aggregate amplicon counts with arbitrary-precision integers and rationals before controlled high-precision projection.",
44+
},
45+
{
46+
id = "constructive-formal-proofs",
47+
area = "proofs/agda/",
48+
status = "verified",
49+
summary = "Maintain machine-checked Agda proofs for Benjamini-Hochberg adjustment and TSS/RLE scaling invariants.",
50+
},
51+
{
52+
id = "warranted-cladistic-overlays",
53+
area = "src/analysis/clade_cumulus.jl",
54+
status = "verified",
55+
summary = "Keep CladeCumulus topology proposals support-warranted, immutable as sidecars, and invariant in tip-level Faith PD across reaggregation.",
56+
},
57+
{
58+
id = "honest-fleet-evidence",
59+
area = ".gitbot-fleet/enrolment.json",
60+
status = "in_progress",
61+
summary = "Surface genuine Hypatia, panic-attack, pons-asinorum, K9, and DEED verdicts while keeping unenrolled or unexecuted bot slots explicitly marked rather than fabricated.",
62+
},
63+
],
64+
},
65+
66+
validation = {
67+
commitment_count_positive = std.array.length config.commitments >= 4,
68+
},
69+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
K9!
2+
# SPDX-License-Identifier: MPL-2.0
3+
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
4+
#
5+
# must.k9.ncl — Release-blocking invariant declarations for the
6+
# hyperpolymath/MetaManifold-WebUI fork. Evaluated at 'Yard (contract-eval-only);
7+
# verification commands run in dedicated CI jobs rather than inside this file.
8+
{
9+
pedigree = {
10+
schema_version = "1.0.0",
11+
component_type = "contractile:must",
12+
contractile_verb = "must",
13+
semantics = "invariant-assertion",
14+
tier = 'Yard,
15+
authority = 'blocking,
16+
security = {
17+
leash = 'Yard,
18+
signature_required = false,
19+
trust_level = "contract-eval-only",
20+
allow_network = false,
21+
allow_filesystem_write = false,
22+
allow_subprocess = false,
23+
capabilities = [],
24+
},
25+
metadata = {
26+
name = "metamanifold-webui-must",
27+
version = "1.0.0",
28+
description = "Release-blocking fork invariants for DEED/K9 governance, proof soundness, high-precision oracles, and upstream AGPL-3.0 preservation.",
29+
author = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
30+
},
31+
warnings = [
32+
"Evaluated at Yard as typed configuration only; invariant scripts execute in pinned GitHub Actions steps.",
33+
],
34+
side_effects = [],
35+
},
36+
37+
config = {
38+
repository = "hyperpolymath/MetaManifold-WebUI",
39+
upstream_repository = "JoshuaJewell/MetaManifold-WebUI",
40+
upstream_license = "AGPL-3.0-only",
41+
fork_addition_license = "MPL-2.0",
42+
invariants = [
43+
{
44+
id = "repo-deed-present",
45+
target = "MetaManifold-WebUI_chora.deed",
46+
check_command = "deed_lint.js MetaManifold-WebUI_chora.deed",
47+
rationale = "Repository deed must remain syntactically and structurally valid.",
48+
},
49+
{
50+
id = "governance-advisory-sarif-boundary",
51+
target = "scripts/check-governance-contract.sh",
52+
check_command = "bash scripts/check-governance-contract.sh",
53+
rationale = "Pull-request Hypatia scans must publish verdict grids without creating blocking SARIF upload gates, and standards workflow pins must match.",
54+
},
55+
{
56+
id = "agda-axiom-audit",
57+
target = "proofs/tests/axiom-audit.sh",
58+
check_command = "bash proofs/tests/axiom-audit.sh",
59+
rationale = "Agda proofs must retain --safe --without-K with zero postulates or escape pragmas.",
60+
},
61+
{
62+
id = "high-precision-reference-oracle",
63+
target = "test/references/check_high_precision_references.py",
64+
check_command = "python3 test/references/check_high_precision_references.py --check test/unit/test_high_precision.jl",
65+
rationale = "Independent arbitrary-precision reference constants must match the Julia test suite.",
66+
},
67+
{
68+
id = "upstream-license-untouched",
69+
target = "LICENSE",
70+
check_command = "test -s LICENSE && test -s CITATION.cff",
71+
rationale = "Upstream AGPL-3.0-only LICENSE, CITATION.cff, and existing copyright headers are never rewritten on this fork.",
72+
},
73+
],
74+
},
75+
76+
validation = {
77+
has_upstream_license = config.upstream_license == "AGPL-3.0-only",
78+
has_fork_license = config.fork_addition_license == "MPL-2.0",
79+
invariant_count_positive = std.array.length config.invariants >= 5,
80+
},
81+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
K9!
2+
# SPDX-License-Identifier: MPL-2.0
3+
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
4+
#
5+
# trust.k9.ncl — Security and data-integrity boundary declarations for the
6+
# hyperpolymath/MetaManifold-WebUI fork. Evaluated at 'Yard (contract-eval-only).
7+
{
8+
pedigree = {
9+
schema_version = "1.0.0",
10+
component_type = "contractile:trust",
11+
contractile_verb = "trust",
12+
semantics = "boundary-verification",
13+
tier = 'Yard,
14+
authority = 'blocking,
15+
security = {
16+
leash = 'Yard,
17+
signature_required = false,
18+
trust_level = "contract-eval-only",
19+
allow_network = false,
20+
allow_filesystem_write = false,
21+
allow_subprocess = false,
22+
capabilities = [],
23+
},
24+
metadata = {
25+
name = "metamanifold-webui-trust",
26+
version = "1.0.0",
27+
description = "Trust-boundary declarations covering strict I-JSON/JCS serialisation, HTTP JSON input validation, read-only DuckDB analysis access, and SHA-pinned workflows.",
28+
author = "Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>",
29+
},
30+
warnings = [
31+
"Evaluated at Yard as typed configuration only; boundary tests run inside the CI workflow.",
32+
],
33+
side_effects = [],
34+
},
35+
36+
config = {
37+
max_statistics_request_bytes = 16777216,
38+
max_ieee754_safe_integer = 9007199254740991,
39+
boundaries = [
40+
{
41+
id = "strict-ijson-jcs-wire-boundary",
42+
surface = "src/core/canonical.jl",
43+
rule = "Validated statistics and canonical responses enforce RFC 7493 I-JSON input parsing and RFC 8785 JCS deterministic output.",
44+
},
45+
{
46+
id = "http-json-body-validation",
47+
surface = "src/server/server.jl",
48+
rule = "HTTP JSON route handlers reject malformed or non-object JSON payloads with HTTP 400 rather than throwing unhandled 500 exceptions, without mutating request byte buffers.",
49+
},
50+
{
51+
id = "read-only-duckdb-analysis",
52+
surface = "src/server/routes/duckdb_helpers.jl",
53+
rule = "Analysis and validated-statistics routes open run DuckDB files in read-only mode and stream exact integer counts into BigInt accumulators.",
54+
},
55+
{
56+
id = "immutable-ci-and-tool-pins",
57+
surface = "test/unit/test_install_pins.jl",
58+
rule = "Workflow actions and bioinformatics tool versions remain pinned and verified by unit tests.",
59+
},
60+
],
61+
},
62+
63+
validation = {
64+
request_limit_positive = config.max_statistics_request_bytes > 0,
65+
safe_integer_bound = config.max_ieee754_safe_integer == 9007199254740991,
66+
boundary_count_positive = std.array.length config.boundaries >= 4,
67+
},
68+
}

‎0-AI-MANIFEST.a2ml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@
2929
(history-scan ".github/workflows/secret-scanner.yml")
3030
(security-practices ".github/workflows/scorecard.yml")
3131
(fleet-enrolment ".gitbot-fleet/enrolment.json")
32-
(scope "DEED syntax is not K9 semantic conformance. No K9 contracts are committed; the K9 corpus is grey, not a pass.")))
32+
(contractiles ".machine_readable/contractiles/")
33+
(scope "DEED syntax and K9 semantic conformance are validated separately: Yard-tier K9 contracts (must, trust, intend) are checked across L0-L2; L3 signatures remain outside CI.")))

‎MetaManifold-WebUI_chora.deed‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
:analysis "src/analysis/"
1818
:cladistics "docs/cladistics/"
1919
:proofs "proofs/"
20+
:contractiles ".machine_readable/contractiles/"
2021
:enforcement ".github/workflows/")
2122
(status
2223
:evidence-source ".github/workflows/governance.yml"
23-
:evidence-status "Fork governance lane only: DEED syntax, the K9 conformance grid (no contracts yet; grey corpus), and the Hypatia verdict grid with gitbot-fleet report-backs. Upstream owns the code and its CI; this deed describes the fork.")
24+
:evidence-status "Fork governance lane: DEED syntax, K9 L0-L2 contract conformance (must, trust, intend at Yard tier; L3 signatures not verified in CI), and the Hypatia verdict grid with gitbot-fleet report-backs. Upstream owns the application code and its CI; this deed describes the fork.")
2425
(policies
2526
(licensing
2627
:initial-assignment "New files the fork authors carry MPL-2.0 with an SPDX header, as upstream CONTRIBUTING.md permits."

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
Fork governance (hyperpolymath/MetaManifold-WebUI only; nothing here is part of upstream):
1010
[![Governance (fork)](https://github.com/hyperpolymath/MetaManifold-WebUI/actions/workflows/governance.yml/badge.svg)](https://github.com/hyperpolymath/MetaManifold-WebUI/actions/workflows/governance.yml)
1111
[![DEED syntax](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fhyperpolymath%2FMetaManifold-WebUI%2Fgovernance-badges%2Fdeed.json)](MetaManifold-WebUI_chora.deed)
12+
[![K9 contracts](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fhyperpolymath%2FMetaManifold-WebUI%2Fgovernance-badges%2Fk9-grid.json)](.machine_readable/contractiles/)
1213
[![Hypatia grid](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fhyperpolymath%2FMetaManifold-WebUI%2Fgovernance-badges%2Fhypatia-grid.json)](https://github.com/hyperpolymath/standards/blob/main/docs/VERDICT-GRID-SPEC.adoc)
1314
The grid grades the worst finding each reporter has (purple critical, red high, yellow medium, blue minor, green clean), with a scanner that did not run in orange and a fleet member not enrolled for this repository in grey; enrolment is in `.gitbot-fleet/enrolment.json`.
1415

0 commit comments

Comments
 (0)