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: 1 addition & 1 deletion .github/workflows/anchor-drift.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ jobs:
exit 1

# Runs the validator from THIS ref, not the pinned published action, so a
# change to validate-a2ml.sh is exercised by the same commit that makes it.
# change to validate-deed.sh is exercised by the same commit that makes it.
# Asserts on the discovery COUNT as well as the exit code: the defect this
# guards (the scan glob matching only '*.a2ml') produced a green exit 0 by
# opening no .deed files at all, so exit status alone cannot detect it.
Expand Down
6 changes: 3 additions & 3 deletions SETUP.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ upstream pins.
[source,sh]
----
# governance: whole repo, strict, ignoring fixtures and members
INPUT_PATH=. INPUT_STRICT=true INPUT_PATHS_IGNORE=$'conformance/\nmembers/' ../a2ml/a2ml-validate-action/validate-a2ml.sh
INPUT_PATH=. INPUT_STRICT=true INPUT_PATHS_IGNORE=$'conformance/\nmembers/' ../a2ml/a2ml-validate-action/validate-deed.sh
# conformance positive (zero errors) and negative (every case errors)
INPUT_PATH=conformance/valid INPUT_STRICT=true ../a2ml/a2ml-validate-action/validate-a2ml.sh
INPUT_PATH=conformance/invalid INPUT_STRICT=true ../a2ml/a2ml-validate-action/validate-a2ml.sh
INPUT_PATH=conformance/valid INPUT_STRICT=true ../a2ml/a2ml-validate-action/validate-deed.sh
INPUT_PATH=conformance/invalid INPUT_STRICT=true ../a2ml/a2ml-validate-action/validate-deed.sh
----

The invalid conformance command is expected to fail.
4 changes: 2 additions & 2 deletions conformance/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ missing-license case will self-pass.
[source,sh]
----
# positive: zero errors
INPUT_PATH=conformance/valid INPUT_STRICT=true <validate-a2ml.sh>
INPUT_PATH=conformance/valid INPUT_STRICT=true <validate-deed.sh>
# negative: every case errors
INPUT_PATH=conformance/invalid INPUT_STRICT=true <validate-a2ml.sh>
INPUT_PATH=conformance/invalid INPUT_STRICT=true <validate-deed.sh>
----
4 changes: 2 additions & 2 deletions conformance/run-deed-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-FileCopyrightText: © 2026 Jonathan D.A. Jewell (hyperpolymath)
# SPDX-License-Identifier: MPL-2.0
#
# Behavioural test for .deed support in validate-action/validate-a2ml.sh.
# Behavioural test for .deed support in validate-action/validate-deed.sh.
#
# This exists because the gap it guards was invisible to every source-level
# survey. The discovery glob matched only '*.a2ml', so .deed files were never
Expand All @@ -16,7 +16,7 @@
set -uo pipefail

HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VALIDATOR="${HERE}/../validate-action/validate-a2ml.sh"
VALIDATOR="${HERE}/../validate-action/validate-deed.sh"
FAILURES=0

# Report a passing assertion using the test script's standard output format.
Expand Down
2 changes: 1 addition & 1 deletion spec/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ the format.
frontmatter surface of `0-AI-MANIFEST.a2ml` (894 files, 100% conformant). Its
disposition under DEED is an *open question* for the owner — it is
deliberately not stamped.
* The existing `.a2ml` validator (`validate-action/validate-a2ml.sh`) and the
* The existing `.a2ml` validator (`validate-action/validate-deed.sh`) and the
positive fixtures in `conformance/valid/` are historical v1 inputs, explicitly
non-DEED. No migration is required to make that distinction accurate.

Expand Down
4 changes: 2 additions & 2 deletions validate-action/TOPOLOGY.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ enforce A2ML compliance.
a2ml-validate-action/
├── action.yml # GitHub Action metadata and entry point
├── src/
│ └── validate-a2ml.sh # Validation script (delegates to shell logic)
│ └── validate-deed.sh # Validation script (delegates to shell logic)
├── examples/ # Example workflows using this action
├── docs/ # Usage documentation
└── container/ # Containerfile for CI
Expand All @@ -22,7 +22,7 @@ a2ml-validate-action/
=== Data Flow

....
[GitHub workflow trigger] ──► [action.yml] ──► [validate-a2ml.sh]
[GitHub workflow trigger] ──► [action.yml] ──► [validate-deed.sh]
│
[scan repo for .a2ml files]
│
Expand Down
20 changes: 11 additions & 9 deletions validate-action/action.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
#
# action.yml — Validate A2ML Manifests GitHub Action
# Scans repository for .a2ml and .deed files and validates structure, required
# fields, SPDX headers, and attestation blocks.
# action.yml — Validate DEED Manifests GitHub Action
# Scans the repository for .deed (DEED grammar) and legacy .a2ml manifests and
# validates structure, required fields, SPDX headers, and attestation blocks.
# a2ml is retired (owner ruling R-H3, standards #836/#837): DEED is the grammar.

name: 'Validate A2ML Manifests'
name: 'Validate DEED Manifests'
description: >-
Scan and validate .a2ml and .deed manifest files in your repository.
Checks for required fields (agent-id / pedigree name / :canonical-name,
version / :schema-version), SPDX headers, and attestation block structure.
Scan and validate .deed (DEED grammar) and legacy .a2ml manifest files in
your repository. Checks for required fields (:schema-version, agent-id /
pedigree name / :canonical-name, version), SPDX headers, and attestation
block structure.
author: 'Jonathan D.A. Jewell'

branding:
Expand Down Expand Up @@ -51,7 +53,7 @@ inputs:

outputs:
files-scanned:
description: 'Number of .a2ml files scanned'
description: 'Number of .deed/.a2ml manifest files scanned'
value: ${{ steps.validate.outputs.files_scanned }}
errors:
description: 'Number of validation errors found'
Expand All @@ -71,4 +73,4 @@ runs:
INPUT_STRICT: ${{ inputs.strict }}
INPUT_PATHS_IGNORE: ${{ inputs.paths-ignore }}
run: |
"${GITHUB_ACTION_PATH}/validate-a2ml.sh"
"${GITHUB_ACTION_PATH}/validate-deed.sh"
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
#
# validate-a2ml.sh — A2ML manifest validation script
# validate-deed.sh — DEED manifest validation script
#
# Scans for .a2ml and .deed files and validates:
# 1. Required fields: agent-id or pedigree name, version
Expand Down Expand Up @@ -217,7 +217,7 @@
# from the enclosing directory + filename, not an in-file field. Sibling
# files in the same directory (ECOSYSTEM.a2ml, STATE.a2ml) DO carry their
# own $name/project and continue to be validated normally.
case "$basename" in

Check failure on line 220 in validate-action/validate-deed.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Add a default case (*) to handle unexpected values.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_a2ml-ecosystem&issues=AaDDpXtaHGx7a8kpp8da&open=AaDDpXtaHGx7a8kpp8da&pullRequest=65
AGENTIC.a2ml|META.a2ml|NEUROSYM.a2ml|PLAYBOOK.a2ml|AI.a2ml)
# AI.a2ml = free-text "AI Assistant Instructions" manifest, the same
# doc type as 0-AI-MANIFEST.a2ml but with the bare name; identity is
Expand Down Expand Up @@ -270,7 +270,7 @@
# ./-prefixed form that `find .` emits; spelling it out separately (as the
# original three-branch test did) is redundant. Verified equivalent across
# ./-prefixed, bare and absolute paths, and on the negative cases.
case "$file" in

Check failure on line 273 in validate-action/validate-deed.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Add a default case (*) to handle unexpected values.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_a2ml-ecosystem&issues=AaDDpXtaHGx7a8kpp8db&open=AaDDpXtaHGx7a8kpp8db&pullRequest=65
*/machine-readable/*|machine-readable/*|*/.machine_readable/*|.machine_readable/*)
is_structural_identity=true
;;
Expand Down Expand Up @@ -330,8 +330,8 @@
# Lines starting with [ should have a matching ]
if [[ "$line" =~ ^\[ && ! "$line" =~ ^\[.+\] ]]; then
# Exclude markdown-style links and multi-line values
if [[ ! "$line" =~ ^\[.*\]\( && ! "$line" =~ ^\[TODO && ! "$line" =~ ^\[YOUR ]]; then

Check warning on line 333 in validate-action/validate-deed.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Merge this if statement with the enclosing one.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_a2ml-ecosystem&issues=AaDDpXtaHGx7a8kpp8dc&open=AaDDpXtaHGx7a8kpp8dc&pullRequest=65
report_issue "warning" "$file" "$line_num" \

Check warning on line 334 in validate-action/validate-deed.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Define a constant instead of using the literal 'warning' 5 times.

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_a2ml-ecosystem&issues=AaDDpXtaHGx7a8kpp8de&open=AaDDpXtaHGx7a8kpp8de&pullRequest=65
"Possibly malformed section heading: unclosed bracket"
fi
fi
Expand Down Expand Up @@ -400,7 +400,7 @@

# Exit with failure if errors were found
if [[ $ERRORS -gt 0 ]]; then
echo "::error::A2ML validation failed with ${ERRORS} error(s)"

Check warning on line 403 in validate-action/validate-deed.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Redirect this error message to stderr (>&2).

See more on https://sonarcloud.io/project/issues?id=hyperpolymath_a2ml-ecosystem&issues=AaDDpXtaHGx7a8kpp8dd&open=AaDDpXtaHGx7a8kpp8dd&pullRequest=65
exit 1
fi

Expand Down
Loading