diff --git a/.github/workflows/pawl.yml b/.github/workflows/pawl.yml new file mode 100644 index 0000000..34636d9 --- /dev/null +++ b/.github/workflows/pawl.yml @@ -0,0 +1,71 @@ +# Pawl ratchet gate. Make the "pawl" job a required status check on main. +# Actions are pinned by commit SHA. Dependabot keeps the pins current. +name: pawl + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + push: + branches: [main] + +permissions: + contents: read + +concurrency: + group: pawl-${{ github.ref }} + cancel-in-progress: true + +jobs: + pawl: + runs-on: ubuntu-latest + timeout-minutes: 60 + permissions: + contents: read + pull-requests: write + env: + BASE_REF: ${{ github.base_ref }} + EVENT: ${{ github.event_name }} + PR_NUMBER: ${{ github.event.pull_request.number }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.12" + - name: Install Pawl (hash-pinned, own venv) + run: | + python -m venv "$RUNNER_TEMP/pawl-venv" + cat > "$RUNNER_TEMP/pawl-requirements.txt" <<'REQ' + pawl-gate==0.2.0 \ + --hash=sha256:5daa5a256c79bfedc8b7d6ecd0c44d32ecaafb6473859e5b28939614ae2b7ddd \ + --hash=sha256:29ef49ad3737004bfb58c4455e1bb89a35ef6b95310a38fd243c38d020ce4d1c + REQ + "$RUNNER_TEMP/pawl-venv/bin/python" -m pip install --require-hashes --no-deps \ + --only-binary :all: -r "$RUNNER_TEMP/pawl-requirements.txt" + echo "PAWL=$RUNNER_TEMP/pawl-venv/bin/pawl" >> "$GITHUB_ENV" + - name: Install the project + run: | + python -m pip install --upgrade pip + if [ -f pyproject.toml ]; then pip install -e .; fi + - name: Pawl check (gate definition from the base branch) + run: | + if [ "$EVENT" = "pull_request" ]; then + "$PAWL" check --ci --trusted-ref "origin/$BASE_REF" + else + "$PAWL" check --ci + fi + - name: Pawl guard (tamper detection and test replay) + if: always() && github.event_name == 'pull_request' + run: | + "$PAWL" guard --ci --replay --base "origin/$BASE_REF" + - name: Post the report on the pull request + if: always() && github.event_name == 'pull_request' + continue-on-error: true + env: + GH_TOKEN: ${{ github.token }} + run: | + "$PAWL" report --format md > pawl-report.md + gh pr comment "$PR_NUMBER" --body-file pawl-report.md --edit-last \ + || gh pr comment "$PR_NUMBER" --body-file pawl-report.md diff --git a/.gitignore b/.gitignore index 378fa99..40aae3d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ node_modules/ coverage/ work/ npm-debug.log* +.pawl/ +pawl-test-results.xml diff --git a/PAWL_DEBT.md b/PAWL_DEBT.md new file mode 100644 index 0000000..bdfafaa --- /dev/null +++ b/PAWL_DEBT.md @@ -0,0 +1,9 @@ +# Pawl debt log + +Append-only record of every baseline change, newest last. Pawl writes this +file. A human reviews every entry marked LOOSENED. + + +## 2026-10-08 22:30 MDT: update (tightened) + +- tightened site-validation: recorded 0 failing, 1 collected (1 order(s)) diff --git a/README.md b/README.md index f88ac82..debfc8d 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Public product pages map to org repositories: | Hollersports | [Zero-State-LLC/Hollersports](https://github.com/Zero-State-LLC/Hollersports) | | Marigold Market | [Zero-State-LLC/Marigold-Market](https://github.com/Zero-State-LLC/Marigold-Market) | | Noema | [noema.guru](https://noema.guru) | +| Pawl | [pypi.org/project/pawl-gate](https://pypi.org/project/pawl-gate/) | ### Clients @@ -78,6 +79,10 @@ npm test `npm test` runs deterministic site validation (pages, assets, internal links, product posture, identity-motion constraints). Dev server: `http://localhost:8080`. +Pawl ratchets that validation in CI. Locally, run `/path/to/pawl check` after +installing `pawl-gate==0.2.0`; the gate records the canonical `npm test` result +without exposing the private product repositories. + ## Social preview `assets/og-image.png` (1200×630) is referenced by Open Graph and Twitter Card meta on the home page. diff --git a/assets/glyphs.svg b/assets/glyphs.svg index 2448c46..33e809f 100644 --- a/assets/glyphs.svg +++ b/assets/glyphs.svg @@ -19,4 +19,5 @@ The split zero crossed by the passage Intelligence held inside a frame A node on its orbit +Pawl ratchet gate diff --git a/assets/products/pawl-hero.png b/assets/products/pawl-hero.png new file mode 100644 index 0000000..c23b89f Binary files /dev/null and b/assets/products/pawl-hero.png differ diff --git a/assets/products/pawl-hero.webp b/assets/products/pawl-hero.webp new file mode 100644 index 0000000..85b23d7 Binary files /dev/null and b/assets/products/pawl-hero.webp differ diff --git a/index.html b/index.html index 62e5fd4..0b620ee 100644 --- a/index.html +++ b/index.html @@ -99,7 +99,7 @@

Systems in motion.

-

Products

Apps, games, and platforms we are building.

+

Products

Apps, games, and platforms we are building.

Clients.

Client work, shown separately from Zero State products.

Community.

Civic and hackathon work by zer0state, shown separately from products and clients.

Hermes / OpenClaw skills.

Installable agent skills — short tools that change how the work gets done.

@@ -168,4 +168,4 @@

Return to zero. Begin again.

- \ No newline at end of file + diff --git a/intent/2026-10-08-pawl-portfolio-entry.md b/intent/2026-10-08-pawl-portfolio-entry.md new file mode 100644 index 0000000..8d949aa --- /dev/null +++ b/intent/2026-10-08-pawl-portfolio-entry.md @@ -0,0 +1,45 @@ +# Intent — Pawl portfolio entry + +## Problem + +Pawl is publicly available on PyPI but is not represented in the Zero State +portfolio. The site needs a project entry and a supporting hero graphic that +match the existing product-page system without exposing the private GitHub +repository as a public destination. + +## Proposed outcome + +Add Pawl as a product entry with a dark product page, a generated hero asset, +an entry on the official home portfolio map, and the corresponding manifest, +README, and sitemap records. Link publicly to PyPI only. + +## Evidence + +- OBSERVED: Danny's email dated 2026-10-08 identifies Pawl as a ratchet gate + for agent coding work. +- OBSERVED: PyPI destination is `https://pypi.org/project/pawl-gate/` and the + email states the current release is `0.2.0`. +- OBSERVED: The email states Pawl is free and open under Apache-2.0, tested on + Linux and macOS, with Windows untested. +- OBSERVED: Danny supplied the website copy and reported 20 of 21 agent cheats + caught and 0 of 8 clean changes blocked. +- NOT_READY: The GitHub repository remains private and must not be linked from + the public site. + +## Constraints + +- Preserve the existing Zero State dark product-page format. +- Do not claim Windows support or link the private repository. +- Keep the supplied evaluation numbers attributed as reported evidence, not a + general guarantee. +- Do not deploy or publish without explicit human approval. + +## Source + +Danny Meyer, “Pawl: links, how to use it, and website copy,” received +2026-10-08 via `prabu.openclaw@gmail.com`. + +## Status + +Implementation authorized by the owner's direct request; deployment remains +human-controlled per `AGENTS.md`. diff --git a/marketing.html b/marketing.html index 6fc7814..ae1fc6a 100644 --- a/marketing.html +++ b/marketing.html @@ -137,6 +137,17 @@

Noema

Public world · humans watch

+ + +
+ Pawl ratchet mechanism locking a forward path +
+
+ Agent coding integrity gate +

Pawl

+

v0.2.0 · public PyPI release

+
+
+ + +
+ Pawl ratchet mechanism locking a forward path +
+
+ Agent coding integrity gate +

Pawl

+

OBSERVED · v0.2.0 · public PyPI release

+
+