Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/0.1-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Manifest - Level 1: .github
35 changes: 3 additions & 32 deletions .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,6 @@ Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
-->
# Security Policy

<!--
============================================================================
TEMPLATE INSTRUCTIONS (delete this block before publishing)
============================================================================
Replace all {{PLACEHOLDER}} values with your information:
Haec - Your project name
hyperpolymath - GitHub username or org (e.g., hyperpolymath)
haec - Repository name
j.d.a.jewell@open.ac.uk - Security contact email
{{PGP_FINGERPRINT}} - Your PGP key fingerprint (40 chars, no spaces)
{{PGP_KEY_URL}} - URL to your public PGP key
https://github.com/hyperpolymath/haec - Your website/domain
2026 - Current year for copyright

Optional: Remove sections that don't apply (e.g., PGP if you don't use it)
============================================================================
-->

We take security seriously. We appreciate your efforts to responsibly disclose vulnerabilities and will make every effort to acknowledge your contributions.

## Table of Contents
Expand Down Expand Up @@ -56,26 +38,16 @@ This method ensures:
- Coordinated disclosure tooling
- Automatic credit when the advisory is published

### Alternative: Encrypted Email
### Alternative: Email

If you cannot use GitHub Security Advisories, you may email us directly:

| | |
|---|---|
| **Email** | j.d.a.jewell@open.ac.uk |
| **PGP Key** | [Download Public Key]({{PGP_KEY_URL}}) |
| **Fingerprint** | `{{PGP_FINGERPRINT}}` |

```bash
# Import our PGP key
curl -sSL {{PGP_KEY_URL}} | gpg --import

# Verify fingerprint
gpg --fingerprint j.d.a.jewell@open.ac.uk

# Encrypt your report
gpg --armor --encrypt --recipient j.d.a.jewell@open.ac.uk report.txt
```
No PGP key is published for this project. If you need to send an encrypted
report, say so in a first plaintext message and a key will be exchanged.

> **⚠️ Important:** Do not report security vulnerabilities through public GitHub issues, pull requests, discussions, or social media.

Expand Down Expand Up @@ -374,7 +346,6 @@ When using Haec, we recommend:

## Additional Resources

- [Our PGP Public Key]({{PGP_KEY_URL}})
- [Security Advisories](https://github.com/hyperpolymath/haec/security/advisories)
- [Changelog](CHANGELOG.md)
- [Contributing Guidelines](CONTRIBUTING.md)
Expand Down
66 changes: 54 additions & 12 deletions .github/workflows/dogfood-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,65 @@ jobs:
echo "::warning::Found $config_count config files but no K9 contracts"
fi

- name: Validate A2ML manifests
# hyperpolymath/a2ml-validate-action and hyperpolymath/k9-validate-action
# do not exist β€” both 404. The steps therefore failed at "Set up job" on
# every push, and an unresolvable action also breaks Dependabot's
# github_actions updater. Validated inline until those are published.
#
# Scope is deliberately limited and stated honestly: these assert the
# file-level envelope contract (encoding, non-emptiness, SPDX header, and
# the K9 magic first line). They do NOT parse the A2ML grammar or
# typecheck Nickel β€” that still needs the real validators.
- name: Validate A2ML manifest envelopes
id: a2ml
if: steps.inventory.outputs.a2ml_count != '0'
continue-on-error: true
uses: hyperpolymath/a2ml-validate-action@05bcb78917c09702e90ed18004298a6728753914 # main
with:
path: '.'
strict: 'false'
shell: bash
run: |
set -euo pipefail
fail=0
while IFS= read -r -d '' f; do
if [ ! -s "$f" ]; then
echo "::error file=$f::empty A2ML manifest"; fail=1; continue
fi
if ! iconv -f UTF-8 -t UTF-8 "$f" >/dev/null 2>&1; then
echo "::error file=$f::not valid UTF-8"; fail=1; continue
fi
if ! grep -qE 'SPDX-License-Identifier:' "$f"; then
echo "::error file=$f::missing SPDX-License-Identifier header"; fail=1
fi
done < <(find . -name '*.a2ml' -not -path './.git/*' -print0)
[ "$fail" -eq 0 ] || { echo "::error::A2ML envelope check failed"; exit 1; }
echo "A2ML envelope check: OK"

- name: Validate K9 contracts
- name: Validate K9 contract envelopes
id: k9
if: steps.inventory.outputs.k9_count != '0'
continue-on-error: true
uses: hyperpolymath/k9-validate-action@bddcd9109ee96f9ea3fdb4bf51084fe9cd0909ce # main
with:
path: '.'
strict: 'false'
shell: bash
run: |
set -euo pipefail
fail=0
while IFS= read -r -d '' f; do
if [ ! -s "$f" ]; then
echo "::error file=$f::empty K9 contract"; fail=1; continue
fi
if ! iconv -f UTF-8 -t UTF-8 "$f" >/dev/null 2>&1; then
echo "::error file=$f::not valid UTF-8"; fail=1; continue
fi
first=$(head -1 "$f")
case "$f" in
# .k9.ncl must comment the magic so `nickel typecheck` still parses.
*.k9.ncl) want='# K9!' ;;
*) want='K9!' ;;
esac
if [ "$first" != "$want" ]; then
echo "::error file=$f::first line must be '$want' (found: '$first')"; fail=1
fi
if ! grep -qE 'SPDX-License-Identifier:' "$f"; then
echo "::error file=$f::missing SPDX-License-Identifier header"; fail=1
fi
done < <(find . \( -name '*.k9' -o -name '*.k9.ncl' \) -not -path './.git/*' -print0)
[ "$fail" -eq 0 ] || { echo "::error::K9 envelope check failed"; exit 1; }
echo "K9 envelope check: OK"

- name: Scan for invisible characters
id: empty_lint
Expand Down
2 changes: 2 additions & 0 deletions .machine_readable/6a2/0-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Manifest for 6a2 Directory

## Purpose
Expand Down
20 changes: 9 additions & 11 deletions .machine_readable/6a2/ECOSYSTEM.a2ml
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
# SPDX-License-Identifier: MPL-2.0
# ECOSYSTEM.a2ml β€” Ecosystem position (META-TEMPLATE)
# ECOSYSTEM.a2ml β€” Ecosystem position for Haec.
#
# This is the ECOSYSTEM file for rsr-template-repo itself. It records the
# TEMPLATE's own position in the estate. When consumed by a new project,
# replace these fields with the target project's ecosystem position and
# related projects (see the NOTE FOR CONSUMERS at the bottom).
# Instantiated from the rsr-template-repo meta-template; the fields below
# describe Haec's own position in the estate.

[metadata]
project = "rsr-template-repo"
project = "haec"
ecosystem = "hyperpolymath"

[position]
type = "repository-template"
purpose = "Canonical RSR-compliant repository template: scaffolding (CI/CD, AI manifests, ABI/FFI standards, container ecosystem, governance) that new hyperpolymath projects are instantiated from."
type = "language"
purpose = "Writes and type-checks Haec programs and emits Trope IR. Haec is deliberately not the tropechecker (trope-checker) and not the vocabulary (trope-particularity-workbench)."

[pipeline]
position = "foundation"
chain = "standards β†’ rsr-template-repo β†’ (every estate repo)"
notes = "rsr-template-repo turns the RSR standard into runnable scaffolding. New repos are created from it via `just init`, which substitutes the {{PLACEHOLDER}} tokens."
position = "producer"
chain = "trope-particularity-workbench (vocabulary) β†’ haec (emits Trope IR) β†’ trope-checker (verdict)"
notes = "Haec produces a record of graded effects; the checker consumes that IR and returns a verdict against each consumer's declared use-model. The checker never executes a Haec program, so Rice's theorem is no obstacle: an unbounded lossy loop simply gets an honest top grade."
coordination = "standards"

[related-projects]
Expand Down
28 changes: 14 additions & 14 deletions .machine_readable/6a2/STATE.a2ml
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
#
# STATE.a2ml β€” Project state checkpoint (META-TEMPLATE)
# STATE.a2ml β€” Project state checkpoint for Haec.
#
# This is the STATE file for rsr-template-repo itself.
# When consumed by a new project, replace {{PLACEHOLDER}} tokens
# and customize sections below for the target project.
# Instantiated from the rsr-template-repo meta-template. Identity and
# project-context below describe Haec; sections further down are still
# inherited from the template and need review (see NOTE, bottom).

[metadata]
project = "rsr-template-repo"
version = "0.2.0"
project = "haec"
version = "0.1.0"
last-updated = "2026-02-28"
status = "active" # active | paused | archived

[project-context]
name = "rsr-template-repo"
purpose = "Canonical RSR-compliant repository template providing scaffolding for all hyperpolymath projects β€” including CI/CD, AI manifests, ABI/FFI standards, container ecosystem, and governance infrastructure."
completion-percentage = 95
name = "Haec"
purpose = "A Turing-complete language whose type discipline is trope-particularity: every operation over a property-instance carries a loss-shape grade, emitted as Trope IR for a separate, language-independent tropechecker to verdict."
completion-percentage = 10 # rough: design stage, see README status '0.1 (design)'

[position]
phase = "maintenance" # design | implementation | testing | maintenance | archived
maturity = "production" # experimental | alpha | beta | production | lts
phase = "design" # design | implementation | testing | maintenance | archived
maturity = "experimental" # experimental | alpha | beta | production | lts

[route-to-mvp]
milestones = [
Expand Down Expand Up @@ -58,7 +58,7 @@ part-of = ["RSR Framework", "stapeln ecosystem"]
depends-on = ["stapeln", "selur-compose", "cerro-torre", "svalinn", "vordr", "k9-svc"]

# ---------------------------------------------------------------------------
# NOTE FOR CONSUMERS: When using this template to create a new repo, reset
# the fields above to your project's values and replace all {{PLACEHOLDER}}
# tokens. The milestones above describe the TEMPLATE's evolution, not yours.
# NOTE: the milestones and depends-on above are still the meta-template's,
# not Haec's, and are pending a rewrite. Identity, purpose, phase and
# maturity have been corrected to describe this project.
# ---------------------------------------------------------------------------
2 changes: 2 additions & 0 deletions .machine_readable/6a2/anchors/0-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Manifest for Anchor Directory

## Purpose
Expand Down
3 changes: 2 additions & 1 deletion .machine_readable/ai/AI.a2ml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Assistant Instructions

## Repository Focus
Expand Down
2 changes: 2 additions & 0 deletions examples/0.1-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Manifest - Level 1: examples
34 changes: 0 additions & 34 deletions flake.nix

This file was deleted.

2 changes: 2 additions & 0 deletions verification/tests/0.2-AI-MANIFEST.a2ml
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: Β© 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
# AI Manifest - Level 1: tests
Loading