diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..1e28d13
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
+blank_issues_enabled: false
+contact_links:
+ - name: PALO Evidence Pack questions and feedback
+ url: https://github.com/sev7enITA/PALOframework/discussions
+ about: Use the canonical Discussion channel for questions, reviewer findings and activation feedback.
+ - name: Private security reporting
+ url: https://github.com/sev7enITA/PALOframework/security/advisories/new
+ about: Report vulnerabilities privately. Do not publish exploit details or secrets in an issue or Discussion.
diff --git a/.github/activation/issues.json b/.github/activation/issues.json
new file mode 100644
index 0000000..bb4b6db
--- /dev/null
+++ b/.github/activation/issues.json
@@ -0,0 +1,62 @@
+[
+ {
+ "title": "[Case] Independently replay the agentic invoice gold case",
+ "labels": ["activation", "case", "good first issue"],
+ "body": "## Goal\nReplay the preloaded agentic invoice case from a clean clone and check whether the dossier distinguishes permission from verified effect.\n\n## Scope\nOne case only: `evidence-pack/cases/agentic-invoice-exception.case.json`. Do not propose a new module.\n\n## Acceptance criteria\n- Record setup time and time to the first local receipt.\n- Identify any ambiguous allowed or prohibited action.\n- Verify the receipt digest changes after a material case edit.\n- Report whether the dossier supports a proceed, pause or stop decision.\n\n## Safety boundary\nUse synthetic data only. Validation is not certification or production approval."
+ },
+ {
+ "title": "[Case] Review the HR learning assistant decision boundary",
+ "labels": ["activation", "case", "governance"],
+ "body": "## Goal\nReview whether the HR gold case cleanly separates optional learning support from employment decisions.\n\n## Scope\n`evidence-pack/cases/hr-learning-assistant.case.json` only.\n\n## Acceptance criteria\n- Identify one plausible prohibited inference not already named, or explain why the list is sufficient.\n- Check whether a reviewer can identify the accountable decision owner.\n- Propose one bounded evidence improvement.\n- Make no jurisdiction-wide legal conclusion."
+ },
+ {
+ "title": "[Case] Verify procurement gold-case sources and decision rights",
+ "labels": ["activation", "case", "documentation"],
+ "body": "## Goal\nCheck source freshness and decision rights in the procurement bid-summary gold case.\n\n## Scope\n`evidence-pack/cases/procurement-bid-summary.case.json` only.\n\n## Acceptance criteria\n- Verify every source URL and review date.\n- Confirm scoring and award authority remain outside the assistant boundary.\n- Add or propose one traceability check from bid source to summary.\n- Keep the example synthetic and non-production."
+ },
+ {
+ "title": "[Adapter] Accept a Case File from stdin in the local validator",
+ "labels": ["activation", "adapter", "good first issue"],
+ "body": "## Goal\nAllow `npm run evidence:validate -- -` to validate a Case File supplied through stdin.\n\n## Acceptance criteria\n- Existing file-path behavior remains unchanged.\n- Stdin input has a documented size limit and rejects invalid JSON clearly.\n- Receipt output remains local and deterministic for the same case content.\n- Add Node tests for valid, invalid and oversized input.\n\n## Non-goal\nNo network API or hosted upload."
+ },
+ {
+ "title": "[Adapter] Add an n8n export-to-Evidence-Pack example",
+ "labels": ["activation", "adapter", "n8n"],
+ "body": "## Goal\nCreate one isolated n8n example that exports a synthetic PALO Case File for local Evidence Pack validation.\n\n## Acceptance criteria\n- Uses the existing n8n developer-preview boundary.\n- Produces a Case File that passes `npm run case:contribute -- --validate-all`.\n- Requires no production credentials or personal data.\n- Documents that n8n orchestration does not itself verify the declared outcome.\n\n## Non-goal\nPublishing or claiming an n8n-verified community node."
+ },
+ {
+ "title": "[Threat test] Reject a validation receipt after case tampering",
+ "labels": ["activation", "threat-test", "security"],
+ "body": "## Goal\nAdd a negative test proving that a receipt no longer matches after a material Case File change.\n\n## Acceptance criteria\n- Start from the agentic invoice gold case and its receipt.\n- Change one authority or expected-effect field.\n- Demonstrate a digest mismatch with a deterministic test.\n- Document what the receipt does and does not protect.\n\n## Non-goal\nClaiming signer identity, non-repudiation or independent assurance."
+ },
+ {
+ "title": "[Threat test] Prove the browser Evidence Pack has no mandatory telemetry",
+ "labels": ["activation", "threat-test", "privacy"],
+ "body": "## Goal\nAdd a browser test that fails if the Evidence Pack sends case or receipt content over the network.\n\n## Acceptance criteria\n- Intercept browser requests after page load.\n- Complete the preloaded case, generate and download a receipt.\n- Assert no request contains case answers, receipt content or identifiers.\n- Allow only documented static asset requests required to load the page.\n- Record the tested browser and route."
+ },
+ {
+ "title": "[Threat test] Add a missing-authority negative gold-case fixture",
+ "labels": ["activation", "threat-test", "governance"],
+ "body": "## Goal\nShow that a structurally valid Case File can still be decision-misleading when authority boundaries are absent.\n\n## Acceptance criteria\n- Add one intentionally misleading educational fixture.\n- The base Case File schema may pass, but Evidence Pack readiness must fail or warn.\n- The result names the missing allowed action, prohibited action and verification method.\n- Add a test and plain-language explanation."
+ },
+ {
+ "title": "[Mapping] Review Evidence Pack claims against the EU AI Act source",
+ "labels": ["activation", "mapping", "governance"],
+ "body": "## Goal\nReview only the EU AI Act references and wording exposed by the three gold cases.\n\n## Acceptance criteria\n- Link each material regulatory statement to the exact official source location.\n- Separate source-backed statement, PALO interpretation and open applicability question.\n- Remove or narrow any overbroad claim.\n- Record the source check date.\n\n## Non-goal\nProviding legal advice or a complete compliance mapping."
+ },
+ {
+ "title": "[Mapping] Trace NIST and ISO references to Evidence Pack decisions",
+ "labels": ["activation", "mapping", "documentation"],
+ "body": "## Goal\nMake the NIST AI RMF and ISO/IEC 42001 references actionable for the exact Evidence Pack decisions they support.\n\n## Acceptance criteria\n- Map each reference to a named decision or evidence field.\n- Identify whether the source is official, standard or interpretive.\n- Add a review date and an applicability caveat.\n- Do not reproduce paywalled standards text."
+ },
+ {
+ "title": "[Accessibility] Complete the Evidence Pack with keyboard and screen reader",
+ "labels": ["activation", "accessibility", "good first issue"],
+ "body": "## Goal\nComplete the preloaded case and receipt flow without a pointer device.\n\n## Acceptance criteria\n- Test current Chrome or Firefox with one named screen reader.\n- Confirm logical heading order, field labels, focus order and live-region announcements.\n- Confirm every action has a visible focus state and at least a 44px target.\n- Report exact steps and one screenshot or accessibility-tree excerpt for each failure."
+ },
+ {
+ "title": "[Accessibility] Verify Evidence Pack at 390px and 200 percent zoom",
+ "labels": ["activation", "accessibility", "good first issue"],
+ "body": "## Goal\nVerify the complete Evidence Pack path on a 390px viewport and at 200 percent browser zoom.\n\n## Acceptance criteria\n- No horizontal page overflow.\n- Primary CTA, form, results, receipt actions and disclaimers remain visible and operable.\n- Text does not overlap or truncate material meaning.\n- Add a browser smoke assertion for any reproducible regression."
+ }
+]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7666824..fda7b2e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,10 +9,20 @@ and this project follows Semantic Versioning where practical.
## [Unreleased]
+## [3.0.1] - 2026-08-12
+
+### Added
+
+- Added the preloaded local Evidence Pack experience, a voluntary SHA-256 validation receipt and three schema-valid gold cases.
+- Added `case:contribute`, a one-command generator and validator for Community Casebook contributions and pull request preparation.
+- Added the five-day activation runbook, 20-seat founding review protocol and public changed-because-of-feedback log.
+
### Changed
- Normalized tracked source and generated publication text to plain ASCII punctuation, separators and status labels.
- Added an automated text-style gate for source files, generated `dist` files and current Git metadata.
+- Started a 30-day new-module freeze, enabled one canonical GitHub Discussions channel and added the five-day activation and changed-because-of-feedback records.
+- Made PALO Evidence Pack the only primary website and README activation route while retaining existing modules as downstream tools.
## [3.0.0] - 2026-08-12
diff --git a/CITATION.cff b/CITATION.cff
index dc6fb91..28be245 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -5,7 +5,7 @@ type: software
authors:
- family-names: "Degni"
given-names: "Fabrizio"
-version: "3.0.0"
+version: "3.0.1"
date-released: "2026-08-12"
license: MIT
repository-code: "https://github.com/sev7enITA/PALOframework"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d0320e5..4bcb5d1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,6 +6,30 @@ PALO v3 semantic sources are versioned public contracts. Change the semantic sou
First off, thank you for considering contributing to PALO!
+## Fast path: contribute a case
+
+During the 30-day activation freeze, the most valuable contribution is one synthetic or safely publishable Evidence Pack case. Generate the Case File and pull request body with:
+
+```sh
+npm run case:contribute -- \
+ --slug retail-returns-assistant \
+ --title "Retail returns assistant" \
+ --sector retail \
+ --scenario "An assistant drafts a recommendation while a named employee approves refunds." \
+ --community builders \
+ --author "@your-github-handle"
+```
+
+Complete the generated TODO fields, then run:
+
+```sh
+npm run case:contribute -- --validate-all
+npm run evidence:test
+npm run validate
+```
+
+The command does not push, open a pull request or transmit case content. Cases must state allowed and prohibited actions, an observable expected effect, an independent verification method and their non-production boundary.
+
## Table of Contents
- [Code of Conduct](#code-of-conduct)
diff --git a/PALO_AIGovernance.html b/PALO_AIGovernance.html
index b969c35..89b1046 100644
--- a/PALO_AIGovernance.html
+++ b/PALO_AIGovernance.html
@@ -16,9 +16,9 @@
-
+
-
+
Skip to main content
diff --git a/PALO_AIProductionReadiness.html b/PALO_AIProductionReadiness.html
index e84b8a5..dafc07b 100644
--- a/PALO_AIProductionReadiness.html
+++ b/PALO_AIProductionReadiness.html
@@ -6,8 +6,8 @@
-
-
+
+
Skip to main content
diff --git a/PALO_AIQuickstarts.html b/PALO_AIQuickstarts.html
index 77f3c0f..5ac3fd0 100644
--- a/PALO_AIQuickstarts.html
+++ b/PALO_AIQuickstarts.html
@@ -14,9 +14,9 @@
/>
-
+
-
+
diff --git a/PALO_AIWhy.html b/PALO_AIWhy.html
index 7a875fb..907c006 100644
--- a/PALO_AIWhy.html
+++ b/PALO_AIWhy.html
@@ -11,9 +11,9 @@
-
+
-
+
diff --git a/PALO_AgenticCapabilityMatrix.html b/PALO_AgenticCapabilityMatrix.html
index e58089c..bb12c7f 100644
--- a/PALO_AgenticCapabilityMatrix.html
+++ b/PALO_AgenticCapabilityMatrix.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/PALO_AgenticGovernance.html b/PALO_AgenticGovernance.html
index 2e1f4d8..7db5dc4 100644
--- a/PALO_AgenticGovernance.html
+++ b/PALO_AgenticGovernance.html
@@ -20,7 +20,7 @@
-
+
diff --git a/PALO_AssessmentPath.html b/PALO_AssessmentPath.html
index cfd7543..ef775aa 100644
--- a/PALO_AssessmentPath.html
+++ b/PALO_AssessmentPath.html
@@ -3,22 +3,22 @@
- PALO Assessment Path | Guided AI Governance Evidence
-
+ PALO Evidence Pack | Reviewable AI Governance Evidence
+
-
-
+
+
-
+
-
+
@@ -32,7 +32,7 @@
Home
- Assessment Path
+ Evidence Pack
Regulatory Watch
Documentation
Platform Map
@@ -45,13 +45,15 @@
-
PALO v2.2.0 guided workflow
-
PALO Assessment Path
-
One guided route from a use-case question to an evidence bundle. Start with the context, route the work to the right PALO modules, and keep a local record of the decision.
+
PALO Evidence Pack | v3 starter experience
+
From one AI use case to reviewable evidence.
+
In less than ten minutes, turn one AI use case into a traceable evidence dossier that another person can review. This is a routing and evidence aid, not certification or a substitute for legal, technical, or independent assurance.
+
Allowed is not verified.
+
Runs in this browser. No account. No answer is sent. Export is voluntary.
@@ -60,13 +62,14 @@ PALO Assessment Path
Local-first assessment
Five linked governance gates
The path is a routing and evidence aid. It does not certify compliance or replace a legal, technical, or fundamental-rights review.
-
+
01 Risk Tiering Describe the system and its intended use.
02 Contextual FRIA Route fundamental-rights questions when the context calls for them.
03 Controls Identify oversight, transparency, data, and incident controls.
04 KPI and KRI Turn the governance intent into measurable follow-up.
05 Evidence bundle Export the route, readiness, sources, and disclaimer.
+
Built on the PALO Assessment Path.
Optional monitoring companion. After deployment, use
PolicyWatcher to follow public privacy-policy and terms-of-service changes that may affect the operating context. Keep the original source and human review in the PALO evidence record.
@@ -101,6 +104,7 @@ PolicyWatcher monitoring signal
No signal imported. PolicyWatcher remains separate from PALO and no case data is sent to the portal.
+ The synthetic agentic invoice case is ready to load.
diff --git a/dist/PALO_PlatformMap.html b/dist/PALO_PlatformMap.html
index ed2f51b..56c87cc 100644
--- a/dist/PALO_PlatformMap.html
+++ b/dist/PALO_PlatformMap.html
@@ -16,10 +16,10 @@
-
+
-
+
diff --git a/dist/PALO_Recognition.html b/dist/PALO_Recognition.html
index c9e1874..4dbfa4b 100644
--- a/dist/PALO_Recognition.html
+++ b/dist/PALO_Recognition.html
@@ -20,7 +20,7 @@
-
+
-
+
-
+
@@ -172,13 +172,13 @@
Open AI governance toolkit
- v3.0.0
+ v3.0.1
- Start
+ Evidence Pack
Agentic Governance
Governance Hub
Tools
@@ -192,32 +192,26 @@
-
Principled AI Lifecycle Orchestration
-
PALO Framework
-
One route through responsible AI and agentic governance.
-
Tell PALO who you are and what you need to achieve. It returns a proportionate route, the artifact to create and the next guided action. You do not need to treat every page as a starting point.
+
PALO Evidence Pack | Local-first
+
Allowed is not verified.
+
Give PALO one AI use case. Leave with a traceable, reviewable evidence dossier in less than ten minutes.
-
+
No account. No mandatory telemetry. Voluntary export only.
-
+
- Cognitive front door
-
Two questions. One clear route.
+ Gold case preview
+ What leaves your browser
-
v3.0.0
+
v3.0.1
- 01 Who are you? Executive, GRC, product, engineering, public sector or assurance.
- 02 What do you need to achieve? Frame, govern, deploy, verify, or govern agent actions.
- PALO returns Phase, artifact and recommended next action
- Agentic route Add code-first, visual or rapid-prototyping mode only when relevant.
+ 01 Context and affected people The intended use, owner, operating boundary and people who may be affected.
+ 02 Route and open evidence Governance gates, source links, readiness signals and unresolved review questions.
+ Local artifact A reviewable evidence bundle with explicit boundaries and next actions
+
@@ -242,19 +236,19 @@ Choose the governance problem, not the pro
01 / PALO Framework Govern the AI lifecycle Executive, Governance, Risk, Product owner, Auditor
Frame the use case, classify risk, assess impacts, select controls, define measurements and connect evidence to review.
Outcome Proportionate route, Case File or evidence bundle, reviewable decision trail
-
+
02 / PALO-AM Govern agentic systems Governance, Product, Risk, Assurance, Engineering
Define agent identity, delegated authority, autonomy level, oversight, reversibility and the assurance evidence required.
PALO-AM is the agentic governance modality inside PALO.
-
+
03 / PALO-AI Enforce agent actions Developer, Platform engineer, Security, No-code builder
Apply policy gates, exact claims, approval, one-time capability, protected execution, trusted receipt and outcome verification.
PALO-AI is the technical control-plane component of PALO and remains a Developer Preview.
-
+
@@ -398,7 +392,7 @@ Every conversation leaves a usable record.
-
PALO v3.0.0
+
PALO v3.0.1
Start here
Three clear entries for the first governance conversation. Choose a starting point, then keep the decision connected to evidence.
@@ -1008,6 +1002,10 @@
+
+
+ v3.0.1 - Evidence Pack Activation: Made Evidence Pack the primary route with a preloaded local case, three gold cases, a voluntary SHA-256 validation receipt, Community Casebook tooling and a 30-day new-module freeze.
+
v3.0.0 - Semantic Foundation: Added stable semantic identity, lifecycle and append-only gate decisions, atomic evidence contracts, RDF/SHACL invariants, versioned mappings, a generated Semantic Inspector and digest-bound release inventory.
diff --git a/dist/media/README.html b/dist/media/README.html
index f8d11c4..725eb88 100644
--- a/dist/media/README.html
+++ b/dist/media/README.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/media/palo-ai-n8n-demo-script.html b/dist/media/palo-ai-n8n-demo-script.html
index 143fbf5..03fc525 100644
--- a/dist/media/palo-ai-n8n-demo-script.html
+++ b/dist/media/palo-ai-n8n-demo-script.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/packages/n8n-nodes-palo-ai/README.html b/dist/packages/n8n-nodes-palo-ai/README.html
index 69eb4a9..937740c 100644
--- a/dist/packages/n8n-nodes-palo-ai/README.html
+++ b/dist/packages/n8n-nodes-palo-ai/README.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/packages/palo-mcp-server/README.html b/dist/packages/palo-mcp-server/README.html
index 4be507a..6008dc1 100644
--- a/dist/packages/palo-mcp-server/README.html
+++ b/dist/packages/palo-mcp-server/README.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/release-manifest.json b/dist/release-manifest.json
index 4dabf64..0a028b3 100644
--- a/dist/release-manifest.json
+++ b/dist/release-manifest.json
@@ -1,13 +1,13 @@
{
"schemaVersion": "1.0.0",
"release": {
- "version": "3.0.0",
+ "version": "3.0.1",
"date": "2026-08-12",
"status": "developer-preview",
"versioningModel": "platform-release-with-independent-components"
},
"sharedAssets": {
- "version": "3.0.0",
+ "version": "3.0.1",
"files": [
"assets/palo-v21.css",
"assets/palo-v21.js"
@@ -15,7 +15,7 @@
},
"components": {
"web": {
- "version": "3.0.0",
+ "version": "3.0.1",
"date": "2026-08-12"
},
"framework": {
@@ -99,8 +99,18 @@
"routeRibbon": true
},
"assessmentPath": {
- "version": "2.4.1",
- "date": "2026-07-17"
+ "version": "3.0.1",
+ "date": "2026-08-12"
+ },
+ "evidencePack": {
+ "version": "1.0.0",
+ "date": "2026-08-12",
+ "status": "implemented-local-first",
+ "webEntry": "PALO_AssessmentPath.html?sample=agentic-invoice#assessment-form",
+ "goldCases": 3,
+ "validationReceipt": "palo-local-validation-receipt",
+ "telemetryRequired": false,
+ "accountRequired": false
},
"operationalEvidenceCore": {
"version": "1.0.0",
@@ -196,9 +206,9 @@
}
},
"cognitiveFrontDoor": {
- "status": "source-ready",
- "entry": "designs/theory-to-practice-infographic/",
- "primaryNavigation": ["Start", "Agentic Governance", "Governance Hub", "Tools", "Documentation", "Readiness"],
+ "status": "evidence-pack-primary",
+ "entry": "PALO_AssessmentPath.html?sample=agentic-invoice#assessment-form",
+ "primaryNavigation": ["Evidence Pack", "Agentic Governance", "Governance Hub", "Tools", "Documentation", "Readiness"],
"documentationLibrary": "PALO_DocumentationLibrary.html",
"legacyDocumentationHub": "transition-page",
"privacy": "local-first-no-silent-submission"
diff --git a/dist/templates/board-review.html b/dist/templates/board-review.html
index b92e412..ce2d358 100644
--- a/dist/templates/board-review.html
+++ b/dist/templates/board-review.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/templates/contribution-starter.html b/dist/templates/contribution-starter.html
index bb3a108..91d2ed6 100644
--- a/dist/templates/contribution-starter.html
+++ b/dist/templates/contribution-starter.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/templates/incident-response.html b/dist/templates/incident-response.html
index c4af8f9..ef1d4f8 100644
--- a/dist/templates/incident-response.html
+++ b/dist/templates/incident-response.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/templates/procurement.html b/dist/templates/procurement.html
index 11bc9f9..d7571c0 100644
--- a/dist/templates/procurement.html
+++ b/dist/templates/procurement.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/dist/templates/red-team-evidence.html b/dist/templates/red-team-evidence.html
index 5bf1f74..72f0ee0 100644
--- a/dist/templates/red-team-evidence.html
+++ b/dist/templates/red-team-evidence.html
@@ -8,10 +8,10 @@
-
+
-
+
diff --git a/docs/activation-freeze-2026-08.md b/docs/activation-freeze-2026-08.md
new file mode 100644
index 0000000..f75d481
--- /dev/null
+++ b/docs/activation-freeze-2026-08.md
@@ -0,0 +1,50 @@
+# PALO activation freeze
+
+Status: active
+
+Window: 2026-08-12 through 2026-09-10, inclusive (30 calendar days)
+
+## Decision
+
+PALO will not add new modules during this window. The active product promise is:
+
+> Give PALO one AI use case. Leave with a traceable, reviewable evidence dossier in less than ten minutes.
+
+The PALO Evidence Pack is the only primary activation route. Existing modules remain available as downstream tools, but they do not compete for top-level acquisition attention during the freeze.
+
+## In scope
+
+- Evidence Pack completion, usability, accessibility and local validation.
+- The three gold cases and the Community Casebook contribution path.
+- Release packaging, checksums, documentation and reproducibility.
+- Defects that prevent a clean-clone run or the ten-minute path.
+- Security, privacy, accessibility or data-loss fixes.
+- Feedback changes tied to an observed user or reviewer failure.
+
+## Out of scope
+
+- New governance modules, calculators, observatories or framework extensions.
+- New platform integrations before the Evidence Pack activation gates pass.
+- Visual refreshes unrelated to the primary activation path.
+- New claims of compliance, certification, production readiness or independent assurance.
+
+## Exception rule
+
+An exception requires a public issue containing all four items:
+
+1. The activation failure it removes.
+2. The smallest proposed change.
+3. Evidence that an existing module cannot solve the failure.
+4. The owner and rollback condition.
+
+The issue must carry the `activation-freeze-exception` label. Approval is a maintainer decision recorded in the issue; silence is not approval.
+
+## Exit gates
+
+- At least 10 external Evidence Pack attempts are observed voluntarily.
+- At least 80 percent reach a downloadable local receipt.
+- Median time to first evidence is at most 15 minutes.
+- Every high or critical activation-path defect has an owner and resolution.
+- The public changed-because-of-feedback log contains evidence-backed decisions.
+
+If the gates do not pass, the freeze can be extended. It must not be ended by shipping another module.
diff --git a/docs/community/activation-window-2026-08.md b/docs/community/activation-window-2026-08.md
new file mode 100644
index 0000000..b1c4525
--- /dev/null
+++ b/docs/community/activation-window-2026-08.md
@@ -0,0 +1,54 @@
+# Allowed is not verified: five-day activation window
+
+Canonical channel: [PALO GitHub Discussions](https://github.com/sev7enITA/PALOframework/discussions)
+
+Window: 2026-08-13 through 2026-08-17
+
+## Shared message
+
+> Allowed is not verified.
+>
+> Run one synthetic AI case locally. In less than ten minutes, PALO turns it into a reviewable evidence dossier and a voluntary validation receipt. No account and no mandatory telemetry. Tell us where the evidence fails to support a real decision.
+
+Every post uses the same Evidence Pack link and one canonical GitHub Discussion. Counts of impressions, likes or stars are secondary; completed attempts, time to first evidence and actionable reviewer findings are the activation signals.
+
+## Day 1: the problem
+
+- Publish the v3 GitHub Release and Evidence Pack starter archive.
+- Show the authorized-but-wrong distinction in one static diagram or short clip.
+- Prompt: `Where does your current workflow prove permission but not the declared outcome?`
+- Success signal: five completed synthetic attempts and one precise failure report.
+
+## Day 2: the three cases
+
+- Walk through agentic invoice, HR learning and procurement bid-summary cases.
+- Prompt: `Which decision right or prohibited action is still ambiguous?`
+- Success signal: two domain corrections and one source-quality correction.
+
+## Day 3: contribution
+
+- Demonstrate `npm run case:contribute` from slug to schema-valid case and PR body.
+- Prompt: `Can a first-time contributor prepare a reviewable case without maintainer help?`
+- Success signal: three external branches or draft PRs and median setup below 20 minutes.
+
+## Day 4: attack the evidence
+
+- Invite receipt tampering, authority-bypass and missing-source tests.
+- Prompt: `What can pass validation while still misleading a decision maker?`
+- Success signal: three negative tests, classified by severity and evidence.
+
+## Day 5: close the loop
+
+- Publish the first changed-because-of-feedback update.
+- Name what changed, what was rejected and what remains uncertain.
+- Prompt: `Would you repeat the review with a second case? Why or why not?`
+- Success signal: repeat participation and at least one accepted external case artifact.
+
+## Publication checklist
+
+- [ ] GitHub Discussion contains scope, safety boundary and precise review tasks.
+- [ ] Release assets contain three gold cases and `SHA256SUMS.txt`.
+- [ ] Homepage and README use the Evidence Pack as the only primary CTA.
+- [ ] Social/community posts link to the canonical Discussion.
+- [ ] No participant is described as a reviewer until they explicitly accept.
+- [ ] The feedback log is updated within 48 hours of a decision.
diff --git a/docs/community/changed-because-of-feedback.md b/docs/community/changed-because-of-feedback.md
new file mode 100644
index 0000000..c0e21f8
--- /dev/null
+++ b/docs/community/changed-because-of-feedback.md
@@ -0,0 +1,20 @@
+# Changed because of feedback
+
+This is the public decision log for PALO Evidence Pack activation. It records accepted, rejected and deferred findings. Participation is not endorsement, partnership, certification or approval.
+
+## Log fields
+
+| Date | Finding and evidence | Decision | Change | Contributor credit | Follow-up |
+| --- | --- | --- | --- | --- | --- |
+| 2026-08-12 | The public front door presented several equally strong starting routes, increasing time-to-first-evidence. Repository and homepage review. | Accepted | Made PALO Evidence Pack the only primary CTA and retained other modules as downstream routes. | Internal activation review | Measure completion and abandonment during the five-day window. |
+| 2026-08-12 | Strategy documents referred to GitHub Discussions while the repository had Discussions disabled. Repository settings review. | Accepted | Enabled GitHub Discussions and defined it as the canonical feedback channel. | Internal activation review | Link the activation Discussion after publication. |
+| 2026-08-12 | A validation claim could be mistaken for certification or independent assurance. Threat and governance review. | Accepted | Added explicit receipt privacy and authority boundaries; the receipt proves local schema checks and digest binding only. | Internal activation review | Ask founding reviewers to attempt misleading-but-valid cases. |
+
+## Decision vocabulary
+
+- **Accepted:** evidence supports a bounded change now.
+- **Rejected:** evidence does not support the proposed change; the rationale is recorded.
+- **Deferred:** the finding is credible but blocked by scope, dependency or missing validation.
+- **Experiment:** evidence is insufficient; a time-boxed test and decision date are recorded.
+
+To add a finding, start in the canonical GitHub Discussion. Once the finding has reproducible evidence and a bounded action, open an issue and link it here.
diff --git a/docs/community/channel-policy.md b/docs/community/channel-policy.md
new file mode 100644
index 0000000..d8da824
--- /dev/null
+++ b/docs/community/channel-policy.md
@@ -0,0 +1,17 @@
+# PALO community channel policy
+
+## One canonical channel
+
+[GitHub Discussions](https://github.com/sev7enITA/PALOframework/discussions) is the canonical public channel for Evidence Pack questions, reviewer findings, activation feedback and design-partner learning.
+
+GitHub Issues remain the channel for bounded, reproducible work with acceptance criteria. Security vulnerabilities follow `SECURITY.md` and must not be disclosed in Discussions.
+
+LinkedIn, n8n, OPA, research and standards communities may carry a short invitation or domain-specific prompt. Every such post links back to one named PALO Discussion. Decisions and material findings are summarized in that Discussion so contributors do not need to monitor several channels.
+
+## Response standard
+
+- Acknowledge a new evidence-backed finding within 48 hours during the activation window.
+- Ask for synthetic or safely publishable examples only.
+- Separate observation, interpretation and proposed change.
+- Do not describe participation as endorsement, certification or partnership.
+- Record accepted, rejected and deferred changes in the public feedback log.
diff --git a/docs/community/founding-review-program.md b/docs/community/founding-review-program.md
new file mode 100644
index 0000000..93ce5c4
--- /dev/null
+++ b/docs/community/founding-review-program.md
@@ -0,0 +1,39 @@
+# PALO founding review program
+
+The Evidence Pack review cohort is 20 people: four reviewers in each of five communities. A person becomes a founding reviewer only after explicitly accepting the task. Public nomination alone is not acceptance.
+
+## Cohorts and exact tasks
+
+| Community | Seats | Review task | Required output |
+| --- | ---: | --- | --- |
+| Automation builders | 4 | Complete the preloaded case, then prepare one case contribution. Identify friction and any workflow bypass. | Completion time, one friction trace and one contribution artifact. |
+| Policy-as-code and platform security | 4 | Attempt receipt tampering, missing-authority and fail-open paths. | One reproducible negative test with severity and expected behavior. |
+| Governance, legal and audit | 4 | Assess whether the dossier supports a named human decision without overstating legal status. | Decision-rights review and one evidence-quality correction. |
+| Research and standards | 4 | Reproduce the result from a clean clone and critique claim/source traceability. | Reproduction record, source critique and proposed measurement improvement. |
+| Executive and design partners | 4 | Decide whether to continue, pause or stop the synthetic case using only the dossier. | Decision, missing evidence and willingness to repeat with a second case. |
+
+## Nomination record
+
+The named roster is maintained outside the public repository until each person has been approved for outreach and a contact route is known. This avoids unsolicited public tagging and avoids implying endorsement before consent.
+
+For every nominee record:
+
+- Name and public affiliation.
+- Community seat and exact task from the table above.
+- Why the person is relevant, based on public work.
+- Contact route approved by the maintainer.
+- Invitation date, response and consent to public credit.
+
+## Invitation template
+
+Subject: `A bounded 20-minute review of PALO Evidence Pack`
+
+> I am inviting a small founding review cohort to challenge one claim: allowed is not verified. Your task is limited to [task]. The case is synthetic, runs locally, needs no account and sends no mandatory telemetry. Participation does not imply endorsement. If you accept, please return [required output] by [date]. May we credit you publicly if your feedback changes PALO? A no or no response ends the invitation.
+
+## Review integrity
+
+- No reviewer receives repository write access merely for accepting.
+- Findings are credited only with explicit permission.
+- Conflicts and affiliations are recorded with the finding.
+- A maintainer cannot mark a self-review as independent.
+- High or critical security findings move to the private security route.
diff --git a/docs/publication-model.md b/docs/publication-model.md
index ad0a7ce..e93b002 100644
--- a/docs/publication-model.md
+++ b/docs/publication-model.md
@@ -2,7 +2,7 @@
Root files are the authoring source. `dist/` is generated output and must not be edited by hand.
-PALO uses a platform release plus independently versioned components. `release-manifest.json` is the authority for this inventory: v3.0.0 identifies the platform/web/semantic release, while PALO-AI runtime, MCP, n8n and mobile components retain their own versions and maturity boundaries. Health metadata exposes `frameworkRelease` separately from the component `version`.
+PALO uses a platform release plus independently versioned components. `release-manifest.json` is the authority for this inventory: v3.0.1 identifies the platform/web activation release and retains the independently versioned v3.0.0 semantic foundation, while PALO-AI runtime, MCP, n8n and mobile components retain their own versions and maturity boundaries. Health metadata exposes `frameworkRelease` separately from the component `version`.
The publication boundary is the explicit `PUBLIC_FILES` list in `scripts/public-files.mjs`. `npm run build` deletes and recreates `dist/`, copying only those files without transforming their bytes. Working documents, workshop material, raw Android binaries, screenshots not required by a public page, hidden files other than `.well-known/security.txt`, repository metadata, and toolchain files are excluded.
diff --git a/evidence-pack/README.md b/evidence-pack/README.md
new file mode 100644
index 0000000..36361f9
--- /dev/null
+++ b/evidence-pack/README.md
@@ -0,0 +1,37 @@
+# PALO Evidence Pack
+
+Give PALO one AI use case. Leave with a traceable, reviewable evidence dossier.
+
+This starter pack is local-first and educational. It requires no account, sends no telemetry and does not claim legal compliance, production security or independent assurance.
+
+## Fastest route
+
+Open `evidence-pack/index.html`, keep the preloaded agentic invoice case and run the local validation. The browser creates a voluntary, shareable receipt containing a digest and validation checks. Your case content stays in the browser unless you explicitly download or copy it.
+
+From a clone, the same case can be checked with:
+
+```sh
+npm run evidence:validate
+```
+
+## Three gold cases
+
+- `cases/agentic-invoice-exception.case.json`: authority versus verified effect.
+- `cases/hr-learning-assistant.case.json`: purpose boundary in an employment context.
+- `cases/procurement-bid-summary.case.json`: supplier evidence and decision rights.
+
+"Gold" means the example is complete enough to teach the PALO contract and passes the published schema. It does not mean certified, legally approved or production-ready.
+
+## Contribute a case
+
+```sh
+npm run case:contribute -- \
+ --slug retail-returns-assistant \
+ --title "Retail returns assistant" \
+ --sector retail \
+ --scenario "An assistant drafts a return recommendation while a named employee approves refunds." \
+ --community builders \
+ --author "@your-github-handle"
+```
+
+The command creates a Case File and a ready-to-paste pull request body under `contributions/cases/`, validates the case against the public schema and reports the exact next Git commands. It does not push or open a pull request for you.
diff --git a/evidence-pack/cases/agentic-invoice-exception.case.json b/evidence-pack/cases/agentic-invoice-exception.case.json
new file mode 100644
index 0000000..3a49055
--- /dev/null
+++ b/evidence-pack/cases/agentic-invoice-exception.case.json
@@ -0,0 +1,65 @@
+{
+ "format": "palo-case-file",
+ "schemaVersion": "1.0.0",
+ "caseId": "case-gold-agentic-invoice",
+ "title": "Gold case: agentic invoice exception",
+ "status": "review",
+ "createdAt": "2026-08-12T08:00:00Z",
+ "updatedAt": "2026-08-12T08:00:00Z",
+ "owner": "PALO Evidence Pack educational review",
+ "context": {
+ "domain": "agentic-workflows",
+ "scenario": "An agent collects invoice exception evidence and drafts a resolution. Payment release and supplier communication remain outside its authority.",
+ "exampleStatus": "educational-non-production",
+ "goldCase": true,
+ "completionMinutes": 8,
+ "learningObjective": "Separate policy permission from verified effect and preserve a human decision boundary.",
+ "sourceStatus": "The references are starting points only. The validation receipt proves schema conformance, not legal, security or production approval.",
+ "limitations": "Fictional data and tools; no payment, supplier, identity or production control is connected.",
+ "decisionQuestion": "May the agent draft the exception while a named reviewer retains release authority?",
+ "declaredAuthority": {
+ "allowed": ["Read synthetic invoice metadata", "Draft an exception summary"],
+ "prohibited": ["Release payment", "Change supplier data", "Contact the supplier"]
+ },
+ "expectedEffect": "A draft is created and the payment state remains unchanged.",
+ "verificationMethod": "Compare the synthetic post-state to the expected effect and prohibited effects."
+ },
+ "assessments": [
+ {
+ "assessmentId": "assessment-gold-agentic-invoice",
+ "module": "PALO Evidence Pack",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "data": {
+ "decision": "proceed-with-conditions",
+ "conditions": ["Keep payment release outside the agent tool set", "Require reviewer identity", "Verify the post-state independently"]
+ }
+ }
+ ],
+ "evidence": [
+ {
+ "evidenceId": "evidence-gold-agentic-authority",
+ "title": "Synthetic authority and expected-effect record",
+ "kind": "authority-and-effect-contract",
+ "status": "ready",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "content": {
+ "allowed": ["draft_exception"],
+ "forbidden": ["release_payment", "change_supplier", "send_external_message"],
+ "expectedPostState": { "draftCreated": true, "paymentReleased": false }
+ }
+ }
+ ],
+ "sources": [
+ {
+ "sourceId": "src-nist-ai-rmf",
+ "title": "AI Risk Management Framework",
+ "url": "https://www.nist.gov/itl/ai-risk-management-framework",
+ "sourceType": "official",
+ "publisher": "US National Institute of Standards and Technology",
+ "checkedAt": "2026-08-12T08:00:00Z",
+ "freshness": { "status": "current", "reviewIntervalDays": 90, "nextReviewAt": "2026-11-10T08:00:00Z" }
+ }
+ ],
+ "incidents": [],
+ "handoffs": []
+}
diff --git a/evidence-pack/cases/hr-learning-assistant.case.json b/evidence-pack/cases/hr-learning-assistant.case.json
new file mode 100644
index 0000000..7c34b2e
--- /dev/null
+++ b/evidence-pack/cases/hr-learning-assistant.case.json
@@ -0,0 +1,64 @@
+{
+ "format": "palo-case-file",
+ "schemaVersion": "1.0.0",
+ "caseId": "case-gold-hr-learning-assistant",
+ "title": "Gold case: employee learning assistant",
+ "status": "review",
+ "createdAt": "2026-08-12T08:00:00Z",
+ "updatedAt": "2026-08-12T08:00:00Z",
+ "owner": "PALO Evidence Pack educational review",
+ "context": {
+ "domain": "human-resources",
+ "scenario": "An internal assistant suggests optional learning resources but must not evaluate performance, promotion, discipline or employment eligibility.",
+ "exampleStatus": "educational-non-production",
+ "goldCase": true,
+ "completionMinutes": 7,
+ "learningObjective": "Turn a broad HR assistant idea into an explicit purpose boundary and prohibited-use record.",
+ "sourceStatus": "Applicability requires workforce, privacy, accessibility and jurisdiction-specific review.",
+ "limitations": "Fictional scenario with no employee data, works council consultation or validated legal analysis.",
+ "decisionQuestion": "Can optional learning support remain technically and organizationally separated from employment decisions?",
+ "declaredAuthority": {
+ "allowed": ["Suggest optional learning resources"],
+ "prohibited": ["Performance scoring", "Promotion recommendation", "Disciplinary recommendation", "Employment eligibility inference"]
+ },
+ "expectedEffect": "A user receives optional resources and no personnel decision record is created.",
+ "verificationMethod": "Inspect output and audit events for prohibited employment inferences or personnel-record writes."
+ },
+ "assessments": [
+ {
+ "assessmentId": "assessment-gold-hr-learning",
+ "module": "PALO Evidence Pack",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "data": {
+ "decision": "redesign",
+ "conditions": ["Isolate the learning catalog", "Block personnel-record writes", "Add accessible human support"]
+ }
+ }
+ ],
+ "evidence": [
+ {
+ "evidenceId": "evidence-gold-hr-boundary",
+ "title": "Synthetic HR purpose boundary",
+ "kind": "approved-purpose-record",
+ "status": "ready",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "content": {
+ "approvedPurpose": "Optional learning discovery",
+ "prohibitedUses": ["performance", "promotion", "discipline", "eligibility"]
+ }
+ }
+ ],
+ "sources": [
+ {
+ "sourceId": "src-eu-ai-act",
+ "title": "Artificial Intelligence Act",
+ "url": "https://eur-lex.europa.eu/eli/reg/2024/1689/oj/eng",
+ "sourceType": "official",
+ "publisher": "European Union",
+ "checkedAt": "2026-08-12T08:00:00Z",
+ "freshness": { "status": "current", "reviewIntervalDays": 90, "nextReviewAt": "2026-11-10T08:00:00Z" }
+ }
+ ],
+ "incidents": [],
+ "handoffs": []
+}
diff --git a/evidence-pack/cases/procurement-bid-summary.case.json b/evidence-pack/cases/procurement-bid-summary.case.json
new file mode 100644
index 0000000..1b1db35
--- /dev/null
+++ b/evidence-pack/cases/procurement-bid-summary.case.json
@@ -0,0 +1,63 @@
+{
+ "format": "palo-case-file",
+ "schemaVersion": "1.0.0",
+ "caseId": "case-gold-procurement-bids",
+ "title": "Gold case: procurement bid summarization",
+ "status": "review",
+ "createdAt": "2026-08-12T08:00:00Z",
+ "updatedAt": "2026-08-12T08:00:00Z",
+ "owner": "PALO Evidence Pack educational review",
+ "context": {
+ "domain": "procurement",
+ "scenario": "A supplier-hosted assistant summarizes synthetic bids but may not rank suppliers, award a contract or alter evaluation records.",
+ "exampleStatus": "educational-non-production",
+ "goldCase": true,
+ "completionMinutes": 8,
+ "learningObjective": "Connect supplier due diligence, authority boundaries and evidence gaps before pilot approval.",
+ "sourceStatus": "Starter references were checked on the recorded date; applicability and current status require human review.",
+ "limitations": "Fictional suppliers and bids; no procurement procedure, data flow, security control or jurisdiction is validated.",
+ "decisionQuestion": "May the assistant summarize bids without influencing scoring or award authority?",
+ "declaredAuthority": {
+ "allowed": ["Summarize synthetic bid text", "Flag missing fields"],
+ "prohibited": ["Rank suppliers", "Score bids", "Award a contract", "Modify the evaluation record"]
+ },
+ "expectedEffect": "Reviewers receive traceable summaries while the authoritative evaluation record remains unchanged.",
+ "verificationMethod": "Sample summaries against source text and verify that scoring and award systems received no writes."
+ },
+ "assessments": [
+ {
+ "assessmentId": "assessment-gold-procurement",
+ "module": "PALO Evidence Pack",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "data": {
+ "decision": "proceed-with-conditions",
+ "conditions": ["Complete supplier evidence gaps", "Keep award authority with named reviewers", "Log source-to-summary traceability"]
+ }
+ }
+ ],
+ "evidence": [
+ {
+ "evidenceId": "evidence-gold-procurement-gaps",
+ "title": "Synthetic supplier evidence gap list",
+ "kind": "supplier-questionnaire",
+ "status": "ready",
+ "recordedAt": "2026-08-12T08:00:00Z",
+ "content": {
+ "openItems": ["Subprocessor inventory", "Retention and deletion evidence", "Change notification route"]
+ }
+ }
+ ],
+ "sources": [
+ {
+ "sourceId": "src-iso-42001",
+ "title": "ISO/IEC 42001 AI management systems",
+ "url": "https://www.iso.org/standard/81230.html",
+ "sourceType": "standard",
+ "publisher": "International Organization for Standardization",
+ "checkedAt": "2026-08-12T08:00:00Z",
+ "freshness": { "status": "current", "reviewIntervalDays": 180, "nextReviewAt": "2027-02-08T08:00:00Z" }
+ }
+ ],
+ "incidents": [],
+ "handoffs": []
+}
diff --git a/feed.xml b/feed.xml
index 2770a7e..d0451c9 100644
--- a/feed.xml
+++ b/feed.xml
@@ -20,6 +20,17 @@
AI Governance
Responsible AI
EU AI Act
+ -
+
PALO v3.0.1 - Evidence Pack Activation
+ https://paloframework.org/PALO_AssessmentPath.html
+
+ Wed, 12 Aug 2026 13:00:00 +0200
+ https://paloframework.org/PALO_AssessmentPath.html
+ PALO Framework
+ Evidence Pack
+ Community Activation
+ Operational Evidence
+
-
PALO v3.0.0 - Semantic Foundation
https://paloframework.org/docs/palo-v3-semantic-foundation.html
diff --git a/index.html b/index.html
index 2329bf3..0ee8d25 100644
--- a/index.html
+++ b/index.html
@@ -150,9 +150,9 @@
}
-
+
-
+
@@ -172,13 +172,13 @@
Open AI governance toolkit
- v3.0.0
+ v3.0.1
- Start
+ Evidence Pack
Agentic Governance
Governance Hub
Tools
@@ -192,32 +192,26 @@
-
Principled AI Lifecycle Orchestration
-
PALO Framework
-
One route through responsible AI and agentic governance.
-
Tell PALO who you are and what you need to achieve. It returns a proportionate route, the artifact to create and the next guided action. You do not need to treat every page as a starting point.
+
PALO Evidence Pack | Local-first
+
Allowed is not verified.
+
Give PALO one AI use case. Leave with a traceable, reviewable evidence dossier in less than ten minutes.
-
+
No account. No mandatory telemetry. Voluntary export only.
-
+
- Cognitive front door
-
Two questions. One clear route.
+ Gold case preview
+ What leaves your browser
-
v3.0.0
+
v3.0.1
- 01 Who are you? Executive, GRC, product, engineering, public sector or assurance.
- 02 What do you need to achieve? Frame, govern, deploy, verify, or govern agent actions.
- PALO returns Phase, artifact and recommended next action
- Agentic route Add code-first, visual or rapid-prototyping mode only when relevant.
+ 01 Context and affected people The intended use, owner, operating boundary and people who may be affected.
+ 02 Route and open evidence Governance gates, source links, readiness signals and unresolved review questions.
+ Local artifact A reviewable evidence bundle with explicit boundaries and next actions
+
@@ -242,19 +236,19 @@ Choose the governance problem, not the pro
01 / PALO Framework Govern the AI lifecycle Executive, Governance, Risk, Product owner, Auditor
Frame the use case, classify risk, assess impacts, select controls, define measurements and connect evidence to review.
Outcome Proportionate route, Case File or evidence bundle, reviewable decision trail
-
+
02 / PALO-AM Govern agentic systems Governance, Product, Risk, Assurance, Engineering
Define agent identity, delegated authority, autonomy level, oversight, reversibility and the assurance evidence required.
PALO-AM is the agentic governance modality inside PALO.
-
+
03 / PALO-AI Enforce agent actions Developer, Platform engineer, Security, No-code builder
Apply policy gates, exact claims, approval, one-time capability, protected execution, trusted receipt and outcome verification.
PALO-AI is the technical control-plane component of PALO and remains a Developer Preview.
-
+
@@ -398,7 +392,7 @@ Every conversation leaves a usable record.
-
PALO v3.0.0
+
PALO v3.0.1
Start here
Three clear entries for the first governance conversation. Choose a starting point, then keep the decision connected to evidence.
@@ -1008,6 +1002,10 @@
+
+
+ v3.0.1 - Evidence Pack Activation: Made Evidence Pack the primary route with a preloaded local case, three gold cases, a voluntary SHA-256 validation receipt, Community Casebook tooling and a 30-day new-module freeze.
+
v3.0.0 - Semantic Foundation: Added stable semantic identity, lifecycle and append-only gate decisions, atomic evidence contracts, RDF/SHACL invariants, versioned mappings, a generated Semantic Inspector and digest-bound release inventory.
diff --git a/package-lock.json b/package-lock.json
index 9381aae..97e1885 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "palo-platform",
- "version": "3.0.0",
+ "version": "3.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "palo-platform",
- "version": "3.0.0",
+ "version": "3.0.1",
"dependencies": {
"@modelcontextprotocol/sdk": "1.30.0",
"ajv": "8.20.0",
diff --git a/package.json b/package.json
index c80d259..eea5449 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "palo-platform",
- "version": "3.0.0",
+ "version": "3.0.1",
"private": true,
"description": "Deterministic validation, publication, and browser smoke tooling for the PALO static platform.",
"type": "module",
@@ -15,6 +15,10 @@
"semantic:release": "node scripts/generate-semantic-release.mjs",
"semantic:release:check": "node scripts/generate-semantic-release.mjs --check",
"validate:text-style": "node scripts/validate-text-style.mjs --tracked",
+ "evidence:validate": "node scripts/evidence-validate.mjs",
+ "evidence:test": "node --test scripts/evidence-pack.test.mjs",
+ "case:contribute": "node scripts/case-contribute.mjs",
+ "activation:publish-issues": "node scripts/publish-activation-issues.mjs",
"validate": "npm run validate:text-style && npm run semantic:check && npm run semantic:validate && npm run semantic:release:check && node scripts/validate.mjs --root .",
"validate:agentic": "node scripts/validate-agentic.mjs && node --test packages/palo-mcp-server/*.test.js && python3 -m unittest examples/agentic-interface/integrations/dify/test_palo_dify_tool.py",
"opa:install": "node scripts/install-opa.mjs",
diff --git a/release-manifest.json b/release-manifest.json
index 4dabf64..0a028b3 100644
--- a/release-manifest.json
+++ b/release-manifest.json
@@ -1,13 +1,13 @@
{
"schemaVersion": "1.0.0",
"release": {
- "version": "3.0.0",
+ "version": "3.0.1",
"date": "2026-08-12",
"status": "developer-preview",
"versioningModel": "platform-release-with-independent-components"
},
"sharedAssets": {
- "version": "3.0.0",
+ "version": "3.0.1",
"files": [
"assets/palo-v21.css",
"assets/palo-v21.js"
@@ -15,7 +15,7 @@
},
"components": {
"web": {
- "version": "3.0.0",
+ "version": "3.0.1",
"date": "2026-08-12"
},
"framework": {
@@ -99,8 +99,18 @@
"routeRibbon": true
},
"assessmentPath": {
- "version": "2.4.1",
- "date": "2026-07-17"
+ "version": "3.0.1",
+ "date": "2026-08-12"
+ },
+ "evidencePack": {
+ "version": "1.0.0",
+ "date": "2026-08-12",
+ "status": "implemented-local-first",
+ "webEntry": "PALO_AssessmentPath.html?sample=agentic-invoice#assessment-form",
+ "goldCases": 3,
+ "validationReceipt": "palo-local-validation-receipt",
+ "telemetryRequired": false,
+ "accountRequired": false
},
"operationalEvidenceCore": {
"version": "1.0.0",
@@ -196,9 +206,9 @@
}
},
"cognitiveFrontDoor": {
- "status": "source-ready",
- "entry": "designs/theory-to-practice-infographic/",
- "primaryNavigation": ["Start", "Agentic Governance", "Governance Hub", "Tools", "Documentation", "Readiness"],
+ "status": "evidence-pack-primary",
+ "entry": "PALO_AssessmentPath.html?sample=agentic-invoice#assessment-form",
+ "primaryNavigation": ["Evidence Pack", "Agentic Governance", "Governance Hub", "Tools", "Documentation", "Readiness"],
"documentationLibrary": "PALO_DocumentationLibrary.html",
"legacyDocumentationHub": "transition-page",
"privacy": "local-first-no-silent-submission"
diff --git a/schemas/palo-local-validation-receipt.schema.json b/schemas/palo-local-validation-receipt.schema.json
new file mode 100644
index 0000000..88f1c8c
--- /dev/null
+++ b/schemas/palo-local-validation-receipt.schema.json
@@ -0,0 +1,54 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://paloframework.org/schemas/palo-local-validation-receipt.schema.json",
+ "title": "PALO Local Validation Receipt",
+ "type": "object",
+ "required": [
+ "format",
+ "schemaVersion",
+ "receiptId",
+ "caseId",
+ "generatedAt",
+ "result",
+ "artifactDigest",
+ "checks",
+ "validator",
+ "privacyBoundary"
+ ],
+ "properties": {
+ "format": { "const": "palo-local-validation-receipt" },
+ "schemaVersion": { "const": "1.0.0" },
+ "receiptId": { "type": "string", "pattern": "^receipt-[a-f0-9]{16}$" },
+ "caseId": { "type": "string", "pattern": "^case-[a-z0-9][a-z0-9-]{5,63}$" },
+ "generatedAt": { "type": "string", "format": "date-time" },
+ "result": { "enum": ["valid", "invalid"] },
+ "artifactDigest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
+ "checks": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "required": ["checkId", "status", "message"],
+ "properties": {
+ "checkId": { "type": "string", "minLength": 1 },
+ "status": { "enum": ["passed", "failed"] },
+ "message": { "type": "string", "minLength": 1 }
+ },
+ "additionalProperties": false
+ }
+ },
+ "validator": {
+ "type": "object",
+ "required": ["name", "version", "execution"],
+ "properties": {
+ "name": { "const": "PALO Evidence Pack local validator" },
+ "version": { "type": "string", "minLength": 1 },
+ "execution": { "enum": ["browser-local", "node-local"] }
+ },
+ "additionalProperties": false
+ },
+ "privacyBoundary": { "type": "string", "minLength": 1 },
+ "shareMode": { "const": "voluntary-export" }
+ },
+ "additionalProperties": false
+}
diff --git a/scripts/browser-smoke.mjs b/scripts/browser-smoke.mjs
index 3b0800d..3b88b3a 100644
--- a/scripts/browser-smoke.mjs
+++ b/scripts/browser-smoke.mjs
@@ -170,6 +170,37 @@ try {
});
if (!unknownPreserved) failures.push("case-file API: merge did not preserve unknown fields");
+ await page.evaluate(() => { localStorage.clear(); sessionStorage.clear(); });
+ const evidenceNetworkWrites = [];
+ const trackEvidenceWrites = (request) => {
+ if (!["GET", "HEAD", "OPTIONS"].includes(request.method())) evidenceNetworkWrites.push({ method: request.method(), url: request.url() });
+ };
+ page.on("request", trackEvidenceWrites);
+ await page.goto(`${baseUrl}/PALO_AssessmentPath.html?sample=agentic-invoice#assessment-form`, { waitUntil: "domcontentloaded" });
+ await page.waitForFunction(() => document.documentElement.getAttribute("data-evidence-sample") === "loaded");
+ if (await page.locator("#system-name").inputValue() !== "Agentic invoice exception" || !await page.locator("#agentic").isChecked()) failures.push("Evidence Pack: the synthetic agentic invoice case was not preloaded");
+ await page.locator("#palo-assessment-form").evaluate((form) => form.requestSubmit());
+ await expectAttribute(page.locator("html"), "data-assessment-case", "saved", "Evidence Pack sample save");
+ await page.locator("#validate-evidence-case").click();
+ await expectAttribute(page.locator("html"), "data-evidence-receipt", "valid", "Evidence Pack local receipt");
+ const firstReceiptText = await captureDownload(page.locator("#download-validation-receipt"), "Evidence Pack receipt export");
+ let firstReceipt;
+ try {
+ firstReceipt = JSON.parse(firstReceiptText);
+ if (firstReceipt.format !== "palo-local-validation-receipt" || firstReceipt.result !== "valid" || !/^sha256:[a-f0-9]{64}$/.test(firstReceipt.artifactDigest) || firstReceipt.shareMode !== "voluntary-export") failures.push("Evidence Pack receipt: format, result, digest or voluntary share mode is invalid");
+ } catch (error) { failures.push(`Evidence Pack receipt: invalid JSON (${error.message})`); }
+ await page.locator("#use-case").fill("An agent drafts an invoice exception and adds a material new authority request.");
+ await page.locator("#palo-assessment-form").evaluate((form) => form.requestSubmit());
+ await page.locator("#validate-evidence-case").click();
+ await expectAttribute(page.locator("html"), "data-evidence-receipt", "valid", "Evidence Pack changed-case receipt");
+ const changedReceiptText = await captureDownload(page.locator("#download-validation-receipt"), "Evidence Pack changed receipt export");
+ try {
+ const changedReceipt = JSON.parse(changedReceiptText);
+ if (firstReceipt && changedReceipt.artifactDigest === firstReceipt.artifactDigest) failures.push("Evidence Pack receipt: digest did not change after a material case edit");
+ } catch (error) { failures.push(`Evidence Pack changed receipt: invalid JSON (${error.message})`); }
+ page.off("request", trackEvidenceWrites);
+ if (evidenceNetworkWrites.length) failures.push(`Evidence Pack: local completion sent a network write (${JSON.stringify(evidenceNetworkWrites)})`);
+
await page.goto(`${baseUrl}/designs/theory-to-practice-infographic/index.html`, { waitUntil: "domcontentloaded" });
await page.evaluate(() => { localStorage.clear(); sessionStorage.clear(); });
await page.locator("#case-file-import").setInputFiles(path.join(projectRoot, "schemas/fixtures/palo-case-file.valid.json"));
diff --git a/scripts/case-contribute.mjs b/scripts/case-contribute.mjs
new file mode 100644
index 0000000..dca5b61
--- /dev/null
+++ b/scripts/case-contribute.mjs
@@ -0,0 +1,93 @@
+#!/usr/bin/env node
+import { access, mkdir, writeFile } from "node:fs/promises";
+import path from "node:path";
+import process from "node:process";
+import { parseArgs } from "node:util";
+import { buildContribution, createValidators, GOLD_CASE_FILES, loadAndValidateCase, PROJECT_ROOT } from "./evidence-pack-core.mjs";
+
+const { values } = parseArgs({
+ options: {
+ author: { type: "string" },
+ community: { type: "string" },
+ help: { type: "boolean", short: "h" },
+ "output-root": { type: "string" },
+ scenario: { type: "string" },
+ sector: { type: "string" },
+ slug: { type: "string" },
+ title: { type: "string" },
+ "validate-all": { type: "boolean" }
+ }
+});
+
+const usage = `Usage:\n npm run case:contribute -- --slug --title --sector --scenario --community --author \n npm run case:contribute -- --validate-all\n\nThe command writes a Case File and PR body under contributions/cases/. It never pushes or opens a PR.`;
+if (values.help) {
+ console.log(usage);
+ process.exit(0);
+}
+
+const validators = await createValidators();
+async function validateFiles(files) {
+ let failed = false;
+ for (const file of files) {
+ const result = await loadAndValidateCase(file, { validators });
+ if (!result.valid) {
+ failed = true;
+ console.error(`${file}: ${validators.ajv.errorsText(result.errors)}`);
+ } else {
+ console.log(`Valid case: ${path.relative(PROJECT_ROOT, result.absolute)}`);
+ }
+ }
+ if (failed) process.exit(1);
+}
+
+if (values["validate-all"]) {
+ const communityRoot = path.join(PROJECT_ROOT, "contributions/cases");
+ const { readdir } = await import("node:fs/promises");
+ const communityFiles = (await readdir(communityRoot)).filter((name) => name.endsWith(".case.json")).map((name) => path.join(communityRoot, name));
+ await validateFiles([...GOLD_CASE_FILES, ...communityFiles]);
+ console.log(`Validated ${GOLD_CASE_FILES.length + communityFiles.length} Evidence Pack case(s).`);
+ process.exit(0);
+}
+
+let contribution;
+try {
+ contribution = buildContribution({
+ author: values.author,
+ community: values.community,
+ scenario: values.scenario,
+ sector: values.sector,
+ slug: values.slug,
+ title: values.title
+ });
+} catch (error) {
+ console.error(error.message);
+ console.error(usage);
+ process.exit(1);
+}
+
+if (!validators.validateCase(contribution.caseFile)) {
+ console.error(`Generated case is invalid: ${validators.ajv.errorsText(validators.validateCase.errors)}`);
+ process.exit(1);
+}
+
+const outputRoot = values["output-root"]
+ ? path.resolve(values["output-root"])
+ : path.join(PROJECT_ROOT, "contributions/cases");
+const casePath = path.join(outputRoot, `${contribution.slug}.case.json`);
+const prPath = path.join(outputRoot, `${contribution.slug}.pr.md`);
+for (const target of [casePath, prPath]) {
+ try {
+ await access(target);
+ throw new Error(`Refusing to overwrite existing file: ${target}`);
+ } catch (error) {
+ if (error.code !== "ENOENT") throw error;
+ }
+}
+await mkdir(outputRoot, { recursive: true });
+await writeFile(casePath, `${JSON.stringify(contribution.caseFile, null, 2)}\n`, { flag: "wx" });
+await writeFile(prPath, contribution.prBody, { flag: "wx" });
+
+console.log(`Generated schema-valid case: ${path.relative(PROJECT_ROOT, casePath)}`);
+console.log(`Prepared pull request body: ${path.relative(PROJECT_ROOT, prPath)}`);
+console.log("Complete the TODO fields, then run npm run case:contribute -- --validate-all.");
+console.log(`Next: git add ${path.relative(PROJECT_ROOT, casePath)} ${path.relative(PROJECT_ROOT, prPath)}`);
diff --git a/scripts/evidence-pack-core.mjs b/scripts/evidence-pack-core.mjs
new file mode 100644
index 0000000..602bb8a
--- /dev/null
+++ b/scripts/evidence-pack-core.mjs
@@ -0,0 +1,125 @@
+import { createHash } from "node:crypto";
+import { readFile } from "node:fs/promises";
+import path from "node:path";
+import { fileURLToPath } from "node:url";
+import Ajv2020 from "ajv/dist/2020.js";
+import addFormats from "ajv-formats";
+
+export const PROJECT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
+export const GOLD_CASE_FILES = [
+ "evidence-pack/cases/agentic-invoice-exception.case.json",
+ "evidence-pack/cases/hr-learning-assistant.case.json",
+ "evidence-pack/cases/procurement-bid-summary.case.json"
+];
+
+export function canonicalJson(value) {
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
+ if (value && typeof value === "object") {
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
+ }
+ return JSON.stringify(value);
+}
+
+export function sha256(value) {
+ const input = Buffer.isBuffer(value) ? value : Buffer.from(typeof value === "string" ? value : canonicalJson(value));
+ return createHash("sha256").update(input).digest("hex");
+}
+
+export async function createValidators(root = PROJECT_ROOT) {
+ const load = async (relativePath) => JSON.parse(await readFile(path.join(root, relativePath), "utf8"));
+ const caseSchema = await load("schemas/palo-case-file.schema.json");
+ const receiptSchema = await load("schemas/palo-local-validation-receipt.schema.json");
+ const ajv = new Ajv2020({ allErrors: true, strict: true });
+ addFormats(ajv);
+ const validateCase = ajv.compile(caseSchema);
+ const validateReceipt = ajv.compile(receiptSchema);
+ return { ajv, validateCase, validateReceipt };
+}
+
+export async function loadAndValidateCase(file, { root = PROJECT_ROOT, validators } = {}) {
+ const absolute = path.isAbsolute(file) ? file : path.join(root, file);
+ const value = JSON.parse(await readFile(absolute, "utf8"));
+ const activeValidators = validators || await createValidators(root);
+ const valid = activeValidators.validateCase(value);
+ return {
+ absolute,
+ errors: valid ? [] : activeValidators.validateCase.errors || [],
+ valid,
+ value
+ };
+}
+
+export function createLocalReceipt(caseFile, { generatedAt = new Date().toISOString(), execution = "node-local" } = {}) {
+ const digest = sha256(caseFile);
+ return {
+ format: "palo-local-validation-receipt",
+ schemaVersion: "1.0.0",
+ receiptId: `receipt-${digest.slice(0, 16)}`,
+ caseId: caseFile.caseId,
+ generatedAt,
+ result: "valid",
+ artifactDigest: `sha256:${digest}`,
+ checks: [
+ { checkId: "case-schema", status: "passed", message: "Case File conforms to the published PALO Case File 1.0.0 schema." },
+ { checkId: "authority-boundary", status: "passed", message: "The case declares allowed and prohibited authority in its educational context." },
+ { checkId: "source-boundary", status: "passed", message: "The case includes a dated source and an explicit review boundary." },
+ { checkId: "privacy-mode", status: "passed", message: "Validation ran locally and created no mandatory network transmission." }
+ ],
+ validator: {
+ name: "PALO Evidence Pack local validator",
+ version: "3.0.1",
+ execution
+ },
+ privacyBoundary: "The receipt contains a case identifier, validation checks and an artifact digest. Sharing is voluntary. Schema conformance is not certification, legal advice, production approval or independent assurance.",
+ shareMode: "voluntary-export"
+ };
+}
+
+export function normalizeSlug(value) {
+ return String(value || "")
+ .trim()
+ .toLowerCase()
+ .replace(/[^a-z0-9]+/g, "-")
+ .replace(/^-+|-+$/g, "")
+ .slice(0, 52);
+}
+
+export function buildContribution({ slug, title, sector, scenario, community, author, now = new Date().toISOString() }) {
+ const safeSlug = normalizeSlug(slug);
+ if (safeSlug.length < 6) throw new Error("--slug must contain at least 6 normalized characters");
+ for (const [flag, value] of Object.entries({ title, sector, scenario, community, author })) {
+ if (!String(value || "").trim()) throw new Error(`--${flag} is required`);
+ }
+ const caseFile = {
+ format: "palo-case-file",
+ schemaVersion: "1.0.0",
+ caseId: `case-community-${safeSlug}`.slice(0, 63),
+ title: `Community case: ${title.trim()}`,
+ status: "draft",
+ createdAt: now,
+ updatedAt: now,
+ owner: author.trim(),
+ context: {
+ domain: sector.trim(),
+ scenario: scenario.trim(),
+ exampleStatus: "educational-non-production",
+ contributionCommunity: community.trim(),
+ sourceStatus: "Contributor supplied starting references. Applicability and freshness require maintainer and domain review.",
+ limitations: "Synthetic or safely publishable contribution. No legal, security, production or certification claim is made.",
+ decisionQuestion: "TODO: state the decision this evidence should support.",
+ declaredAuthority: {
+ allowed: ["TODO: name one permitted action"],
+ prohibited: ["TODO: name one prohibited action"]
+ },
+ expectedEffect: "TODO: state the observable effect.",
+ verificationMethod: "TODO: state how a reviewer could check the effect independently."
+ },
+ assessments: [],
+ evidence: [],
+ sources: [],
+ incidents: [],
+ handoffs: []
+ };
+ const prBody = `# Add community case: ${title.trim()}\n\n## Community and purpose\n\n- Community: ${community.trim()}\n- Contributor: ${author.trim()}\n- Sector: ${sector.trim()}\n- Decision supported: TODO\n\n## Why this case matters\n\n${scenario.trim()}\n\n## Evidence and authority boundary\n\n- [ ] Uses only synthetic or safely publishable data.\n- [ ] Names at least one allowed and one prohibited action.\n- [ ] States an observable expected effect and an independent verification method.\n- [ ] Includes dated primary or standards sources when applicable.\n- [ ] Makes no certification, legal-approval or production-readiness claim.\n\n## Validation\n\n- [ ] \`npm run case:contribute -- --validate-all\`\n- [ ] \`npm run validate\`\n`;
+ return { caseFile, prBody, slug: safeSlug };
+}
diff --git a/scripts/evidence-pack.test.mjs b/scripts/evidence-pack.test.mjs
new file mode 100644
index 0000000..a988e33
--- /dev/null
+++ b/scripts/evidence-pack.test.mjs
@@ -0,0 +1,58 @@
+import assert from "node:assert/strict";
+import { mkdtemp, readFile, rm } from "node:fs/promises";
+import { tmpdir } from "node:os";
+import path from "node:path";
+import { execFile } from "node:child_process";
+import { promisify } from "node:util";
+import test from "node:test";
+import { buildContribution, createLocalReceipt, createValidators, GOLD_CASE_FILES, loadAndValidateCase, PROJECT_ROOT } from "./evidence-pack-core.mjs";
+
+const execFileAsync = promisify(execFile);
+
+test("three gold cases conform to the published Case File schema", async () => {
+ const validators = await createValidators();
+ for (const file of GOLD_CASE_FILES) {
+ const result = await loadAndValidateCase(file, { validators });
+ assert.equal(result.valid, true, `${file}: ${validators.ajv.errorsText(result.errors)}`);
+ assert.equal(result.value.context.goldCase, true);
+ assert.ok(result.value.context.completionMinutes < 10);
+ }
+});
+
+test("a local receipt is digest-bound and schema-valid", async () => {
+ const validators = await createValidators();
+ const { value } = await loadAndValidateCase(GOLD_CASE_FILES[0], { validators });
+ const first = createLocalReceipt(value, { generatedAt: "2026-08-12T10:00:00Z" });
+ const second = createLocalReceipt(value, { generatedAt: "2026-08-12T10:05:00Z" });
+ assert.equal(first.artifactDigest, second.artifactDigest);
+ assert.equal(first.receiptId, second.receiptId);
+ assert.equal(validators.validateReceipt(first), true, validators.ajv.errorsText(validators.validateReceipt.errors));
+ assert.match(first.privacyBoundary, /Sharing is voluntary/);
+});
+
+test("case contribution command generates a valid case and PR body", async () => {
+ const temporary = await mkdtemp(path.join(tmpdir(), "palo-case-contribution-"));
+ try {
+ await execFileAsync(process.execPath, [
+ path.join(PROJECT_ROOT, "scripts/case-contribute.mjs"),
+ "--slug", "retail-returns-assistant",
+ "--title", "Retail returns assistant",
+ "--sector", "retail",
+ "--scenario", "An assistant drafts a return recommendation while a named employee approves refunds.",
+ "--community", "builders",
+ "--author", "@example",
+ "--output-root", temporary
+ ]);
+ const generated = JSON.parse(await readFile(path.join(temporary, "retail-returns-assistant.case.json"), "utf8"));
+ const validators = await createValidators();
+ assert.equal(validators.validateCase(generated), true, validators.ajv.errorsText(validators.validateCase.errors));
+ const prBody = await readFile(path.join(temporary, "retail-returns-assistant.pr.md"), "utf8");
+ assert.match(prBody, /Evidence and authority boundary/);
+ } finally {
+ await rm(temporary, { recursive: true, force: true });
+ }
+});
+
+test("contribution template rejects incomplete metadata", () => {
+ assert.throws(() => buildContribution({ slug: "short", title: "", sector: "x", scenario: "x", community: "x", author: "x" }));
+});
diff --git a/scripts/evidence-validate.mjs b/scripts/evidence-validate.mjs
new file mode 100644
index 0000000..424cea6
--- /dev/null
+++ b/scripts/evidence-validate.mjs
@@ -0,0 +1,45 @@
+#!/usr/bin/env node
+import { mkdir, writeFile } from "node:fs/promises";
+import path from "node:path";
+import process from "node:process";
+import { parseArgs } from "node:util";
+import { createLocalReceipt, createValidators, loadAndValidateCase, PROJECT_ROOT } from "./evidence-pack-core.mjs";
+
+const { values, positionals } = parseArgs({
+ allowPositionals: true,
+ options: {
+ help: { type: "boolean", short: "h" },
+ receipt: { type: "string", short: "r" }
+ }
+});
+
+if (values.help) {
+ console.log("Usage: npm run evidence:validate -- [case-file] [--receipt path]");
+ console.log("Default case: evidence-pack/cases/agentic-invoice-exception.case.json");
+ process.exit(0);
+}
+
+const target = positionals[0] || "evidence-pack/cases/agentic-invoice-exception.case.json";
+const validators = await createValidators();
+const result = await loadAndValidateCase(target, { validators });
+if (!result.valid) {
+ console.error(`Evidence case is invalid: ${validators.ajv.errorsText(result.errors)}`);
+ process.exit(1);
+}
+
+const receipt = createLocalReceipt(result.value);
+if (!validators.validateReceipt(receipt)) {
+ console.error(`Generated receipt is invalid: ${validators.ajv.errorsText(validators.validateReceipt.errors)}`);
+ process.exit(1);
+}
+
+const serialized = `${JSON.stringify(receipt, null, 2)}\n`;
+if (values.receipt) {
+ const destination = path.isAbsolute(values.receipt) ? values.receipt : path.join(PROJECT_ROOT, values.receipt);
+ await mkdir(path.dirname(destination), { recursive: true });
+ await writeFile(destination, serialized, { flag: "wx" });
+ console.log(`Valid PALO case: ${result.value.caseId}`);
+ console.log(`Local receipt written: ${path.relative(PROJECT_ROOT, destination)}`);
+} else {
+ console.log(serialized.trimEnd());
+}
diff --git a/scripts/public-files.mjs b/scripts/public-files.mjs
index ec5c946..fc24b4b 100644
--- a/scripts/public-files.mjs
+++ b/scripts/public-files.mjs
@@ -63,6 +63,10 @@ export const PUBLIC_FILES = [
"assets/palo-docs.css",
"assets/palo-docs.js",
"assets/palo-vibe-gate.js",
+ "evidence-pack/README.md",
+ "evidence-pack/cases/agentic-invoice-exception.case.json",
+ "evidence-pack/cases/hr-learning-assistant.case.json",
+ "evidence-pack/cases/procurement-bid-summary.case.json",
"assets/palo-ai-n8n-scenarios/palo-ai-n8n-governance-hero.png",
"assets/palo-ai-n8n-scenarios/palo-ai-n8n-governance-hero-v2.png",
"assets/palo-ai-n8n-scenarios/pattern-a-visual-governance-gate.png",
@@ -90,6 +94,7 @@ export const PUBLIC_FILES = [
"formal/palo-ontology-v3.ttl",
"formal/palo-ontology-v3.shacl.ttl",
"docs/p1-case-file-and-migration.md",
+ "docs/activation-freeze-2026-08.md",
"docs/palo-v3-semantic-foundation.md",
"docs/palo-ai-n8n-alpha-test-report.md",
"docs/palo-ai-adoption-paths.md",
@@ -117,6 +122,10 @@ export const PUBLIC_FILES = [
"docs/palo-ai-n8n-publication-status.md",
"docs/palo-ai-production-readiness-plan.md",
"docs/community/n8n-architecture-preview-post.md",
+ "docs/community/activation-window-2026-08.md",
+ "docs/community/changed-because-of-feedback.md",
+ "docs/community/channel-policy.md",
+ "docs/community/founding-review-program.md",
"docs/community/palo-ai-feedback-design-partner-form.md",
"docs/community/palo-microsoft-agt-interoperability-proposal.md",
"media/README.md",
@@ -194,6 +203,7 @@ export const PUBLIC_FILES = [
"schemas/palo-control-library.schema.json",
"schemas/palo-decision-gates.schema.json",
"schemas/palo-evidence-bundle.schema.json",
+ "schemas/palo-local-validation-receipt.schema.json",
"schemas/palo-kpi-kri-registry.schema.json",
"schemas/palo-p2-index.schema.json",
"schemas/palo-policy-input.schema.json",
diff --git a/scripts/publish-activation-issues.mjs b/scripts/publish-activation-issues.mjs
new file mode 100644
index 0000000..c1f4f2a
--- /dev/null
+++ b/scripts/publish-activation-issues.mjs
@@ -0,0 +1,49 @@
+#!/usr/bin/env node
+import { execFile } from "node:child_process";
+import { readFile } from "node:fs/promises";
+import path from "node:path";
+import process from "node:process";
+import { promisify } from "node:util";
+import { fileURLToPath } from "node:url";
+
+const execFileAsync = promisify(execFile);
+const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
+const repository = process.env.PALO_GITHUB_REPOSITORY || "sev7enITA/PALOframework";
+const manifest = JSON.parse(await readFile(path.join(projectRoot, ".github/activation/issues.json"), "utf8"));
+if (!Array.isArray(manifest) || manifest.length !== 12) throw new Error("Activation issue manifest must contain exactly 12 issues");
+
+const labelColors = {
+ accessibility: "0E8A16",
+ activation: "147D8B",
+ adapter: "5319E7",
+ case: "1D76DB",
+ documentation: "0075CA",
+ "good first issue": "7057FF",
+ governance: "C78A19",
+ n8n: "FF6D5A",
+ privacy: "0052CC",
+ security: "B60205",
+ mapping: "D4C5F9",
+ "threat-test": "D93F0B"
+};
+
+for (const [name, color] of Object.entries(labelColors)) {
+ try {
+ await execFileAsync("gh", ["label", "create", name, "--repo", repository, "--color", color, "--description", "PALO Evidence Pack activation", "--force"]);
+ } catch (error) {
+ throw new Error(`Unable to create or update label ${name}: ${error.stderr || error.message}`);
+ }
+}
+
+const { stdout } = await execFileAsync("gh", ["issue", "list", "--repo", repository, "--state", "all", "--limit", "200", "--json", "title,url"]);
+const existing = new Map(JSON.parse(stdout).map((issue) => [issue.title, issue.url]));
+for (const issue of manifest) {
+ if (existing.has(issue.title)) {
+ console.log(`Existing: ${issue.title} ${existing.get(issue.title)}`);
+ continue;
+ }
+ const args = ["issue", "create", "--repo", repository, "--title", issue.title, "--body", issue.body];
+ for (const label of issue.labels) args.push("--label", label);
+ const created = await execFileAsync("gh", args);
+ console.log(`Created: ${issue.title} ${created.stdout.trim()}`);
+}
diff --git a/scripts/render-public-docs.mjs b/scripts/render-public-docs.mjs
index d2e1012..128f34e 100644
--- a/scripts/render-public-docs.mjs
+++ b/scripts/render-public-docs.mjs
@@ -167,10 +167,10 @@ function renderDocument(markdown, file) {
-
+
-
+
diff --git a/scripts/validate.mjs b/scripts/validate.mjs
index a1f7aed..e79a715 100644
--- a/scripts/validate.mjs
+++ b/scripts/validate.mjs
@@ -89,6 +89,7 @@ for (const relativePath of privatePublicationPaths) {
async function validateP1Fixtures() {
const caseSchema = JSON.parse(await readFile(path.join(validationRoot, "schemas/palo-case-file.schema.json"), "utf8"));
const bundleSchema = JSON.parse(await readFile(path.join(validationRoot, "schemas/palo-evidence-bundle.schema.json"), "utf8"));
+ const localReceiptSchema = JSON.parse(await readFile(path.join(validationRoot, "schemas/palo-local-validation-receipt.schema.json"), "utf8"));
const agenticSchema = JSON.parse(await readFile(path.join(validationRoot, "schemas/palo-agentic-interface.schema.json"), "utf8"));
ajv.addSchema(caseSchema);
ajv.addSchema(agenticSchema);
@@ -98,6 +99,7 @@ async function validateP1Fixtures() {
"palo-agentic-interface": ajv.getSchema(agenticSchema.$id)
};
caseFileValidator = validators["palo-case-file"];
+ ajv.compile(localReceiptSchema);
for (const [name, validator] of Object.entries(validators)) {
for (const expectation of ["valid", "invalid"]) {
const file = `schemas/fixtures/${name}.${expectation}.json`;
@@ -107,6 +109,17 @@ async function validateP1Fixtures() {
if (expectation === "invalid" && result) errors.push(`${file}: intentionally invalid fixture unexpectedly passed schema`);
}
}
+ const goldCases = [
+ "evidence-pack/cases/agentic-invoice-exception.case.json",
+ "evidence-pack/cases/hr-learning-assistant.case.json",
+ "evidence-pack/cases/procurement-bid-summary.case.json"
+ ];
+ for (const file of goldCases) {
+ const fixture = JSON.parse(await readFile(path.join(validationRoot, file), "utf8"));
+ if (!caseFileValidator(fixture)) errors.push(`${file}: gold case failed PALO Case File schema: ${ajv.errorsText(caseFileValidator.errors)}`);
+ if (fixture.context?.goldCase !== true || !Number.isInteger(fixture.context?.completionMinutes) || fixture.context.completionMinutes >= 10) errors.push(`${file}: gold case must declare goldCase=true and completionMinutes below 10`);
+ if (!fixture.context?.declaredAuthority?.allowed?.length || !fixture.context?.declaredAuthority?.prohibited?.length || !fixture.context?.verificationMethod) errors.push(`${file}: gold case must declare allowed/prohibited authority and an independent verification method`);
+ }
const definitions = JSON.parse(await readFile(path.join(validationRoot, "data/p1-governance-definitions.json"), "utf8"));
if (definitions.schemaVersion !== "1.0.0" || !Array.isArray(definitions.triggers) || !definitions.triggers.length) errors.push("data/p1-governance-definitions.json: requires v1 definitions and at least one trigger");
const triggerIds = new Set();
@@ -363,7 +376,9 @@ for (const [name, module] of Object.entries(manifest.modules || {})) {
if (!/^\d+\.\d+\.\d+$/.test(module.version || "") || !/^\d{4}-\d{2}-\d{2}$/.test(module.date || "")) errors.push(`release-manifest.json: module ${name} requires SemVer version and ISO date`);
}
const semanticModule = manifest.modules?.semanticFoundation;
-if (semanticModule?.version !== releaseVersion || semanticModule?.date !== releaseDate) errors.push("release-manifest.json: semanticFoundation must match the root release version and date");
+const semanticReleaseMajor = String(semanticModule?.version || "").split(".")[0];
+const platformReleaseMajor = String(releaseVersion || "").split(".")[0];
+if (semanticReleaseMajor !== platformReleaseMajor || semanticModule?.date > releaseDate) errors.push("release-manifest.json: semanticFoundation must remain in the platform release major and cannot postdate it");
if (semanticModule?.semanticSpine !== "data/semantic-spine.json" || semanticModule?.semanticRelease !== "data/semantic-release-manifest.json") errors.push("release-manifest.json: semanticFoundation canonical paths are incomplete");
if (new Set(semanticModule?.evidenceBoundaryModel || []).size !== 4 || new Set(semanticModule?.workspaces || []).size !== 3) errors.push("release-manifest.json: semanticFoundation requires four authority classes and three workspaces");
const hubModule = manifest.modules?.agenticGovernanceHub;