From ccac283aea37a9d28521a5dca7ac206f0a822dec Mon Sep 17 00:00:00 2001 From: "MONTREAL.AI" Date: Sun, 7 Jun 2026 17:34:33 -0400 Subject: [PATCH] Fix GoalOS public site validation rules --- .github/workflows/check-no-paid-artifacts.yml | 23 + .../goalos-public-site-release-v12.yml | 39 + .../goalos-public-site-release-v3-1.yml | 627 +---------- .../goalos-public-site-release-v3-2.yml | 642 +---------- .../goalos-public-site-release-v3.yml | 601 +---------- ...oalos-public-site-release-v4-bilingual.yml | 727 +------------ ...-public-site-release-v5-quebec-ai-seal.yml | 782 +------------- ...ic-site-release-v6-quebec-ai-seal-icon.yml | 823 +-------------- ...site-release-v7-quebec-ai-brand-assets.yml | 909 +--------------- ...lic-site-release-v8-intelligent-assets.yml | 997 +----------------- .../validate-docs-tables-figures.yml | 24 + .../validate-goalos-public-site-v12.yml | 36 + .../validate-goalos-public-site-v3-1.yml | 97 +- .../validate-goalos-public-site-v3-2.yml | 97 +- .../validate-goalos-public-site-v4.yml | 92 +- .../validate-goalos-public-site-v5.yml | 97 +- .../validate-goalos-public-site-v6.yml | 103 +- .../validate-goalos-public-site-v7.yml | 107 +- .../validate-goalos-public-site-v8.yml | 115 +- .../workflows/validate-goalos-public-site.yml | 83 +- README.md | 4 + docs/GOALOS_PAID_ARTIFACT_POLICY.md | 45 + docs/GOALOS_PUBLIC_SITE_VALIDATION.md | 101 ++ docs/GOALOS_REPO_AUDIT.md | 6 + scripts/check_no_paid_artifacts.py | 52 +- scripts/goalos_public_site_rules.py | 233 ++++ scripts/validate_docs_tables_figures.py | 45 + scripts/validate_goalos_catalog.py | 38 + scripts/validate_goalos_public_site.py | 122 +++ site/proofs/001-sovereign-swarm.html | 1 + site/proofs/002-evolution-tournament.html | 1 + .../003-recursive-evolution-ladder.html | 1 + site/proofs/004-corporate-rsi-dominion.html | 1 + .../005-enterprise-rsi-superorganism.html | 1 + ...06-sovereign-enterprise-constellation.html | 1 + ...07-sovereign-enterprise-proof-economy.html | 1 + site/proofs/008-sovereign-domain-atlas.html | 1 + ...09-sovereign-kardashev-capital-engine.html | 1 + .../010-proof-carrying-intelligence.html | 1 + site/proofs/011-the-proof-loop.html | 1 + site/proofs/index.html | 1 + ...irst-blockchain-capital-machine-proof.html | 5 +- ...first-governance-capital-engine-proof.html | 5 +- tests/test_goalos_public_site_rules.py | 84 ++ 44 files changed, 1048 insertions(+), 6725 deletions(-) create mode 100644 .github/workflows/check-no-paid-artifacts.yml create mode 100644 .github/workflows/goalos-public-site-release-v12.yml create mode 100644 .github/workflows/validate-docs-tables-figures.yml create mode 100644 .github/workflows/validate-goalos-public-site-v12.yml create mode 100644 docs/GOALOS_PAID_ARTIFACT_POLICY.md create mode 100644 docs/GOALOS_PUBLIC_SITE_VALIDATION.md create mode 100755 scripts/goalos_public_site_rules.py create mode 100755 scripts/validate_docs_tables_figures.py create mode 100755 scripts/validate_goalos_catalog.py create mode 100755 scripts/validate_goalos_public_site.py create mode 100644 tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/check-no-paid-artifacts.yml b/.github/workflows/check-no-paid-artifacts.yml new file mode 100644 index 00000000..cafc09bf --- /dev/null +++ b/.github/workflows/check-no-paid-artifacts.yml @@ -0,0 +1,23 @@ +name: Check No Paid Artifacts + +on: + workflow_dispatch: + pull_request: + paths: + - 'site/**' + - 'public/**' + - 'scripts/goalos_public_site_rules.py' + - 'scripts/check_no_paid_artifacts.py' + +permissions: + contents: read + +jobs: + check: + name: Shared paid/private artifact guard + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py diff --git a/.github/workflows/goalos-public-site-release-v12.yml b/.github/workflows/goalos-public-site-release-v12.yml new file mode 100644 index 00000000..c1d45ee6 --- /dev/null +++ b/.github/workflows/goalos-public-site-release-v12.yml @@ -0,0 +1,39 @@ +name: GoalOS Public Site Release v12 + +on: + workflow_dispatch: + push: + branches: [ main ] + paths: + - 'site/**' + - 'public/**' + - 'scripts/**' + - 'docs/GOALOS_PUBLIC_SITE_VALIDATION.md' + - 'docs/GOALOS_PAID_ARTIFACT_POLICY.md' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + validate: + name: Validate shared GoalOS release rules + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v3-1.yml b/.github/workflows/goalos-public-site-release-v3-1.yml index 322c4822..e4fe53a2 100644 --- a/.github/workflows/goalos-public-site-release-v3-1.yml +++ b/.github/workflows/goalos-public-site-release-v3-1.yml @@ -1,624 +1,25 @@ -name: GoalOS Public Site Release v3.1.1 +name: goalos-public-site-release-v3-1 (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v3-1-1 - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh public site and RSI Sprint Workshop (v3.1) + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate unified GoalOS public site - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v3.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.utcnow().strftime("%Y-%m-%d") - NOW = datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z" - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v3_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "web_root": str(WEB_ROOT), - "release": "GoalOS public site release v3.1", - "purpose": "Unify public website, remove duplicate navbars, refresh commercial ladder, include RSI Sprint Workshop public pages, keep paid materials private.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "validation": {}, - "paid_artifact_policy": "No buyer ZIPs, workshop bundles, implementation kits, enterprise pilot delivery kits, or private materials are uploaded." - } - - OFFERS = [ - {"slug":"goalos-ai-efficiency-sprint-kit","price":"$49","title":"GoalOS AI Efficiency Sprint Kit","fr":"Trousse GoalOS Sprint d’efficacité IA","promise":"Build one reusable AI workflow.","type":"Self-serve digital product","audience":"Beginners, creators, freelancers, consultants, small-business owners.","bullets":["60-minute first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"]}, - {"slug":"goalos-rsi-lite","price":"$199","title":"GoalOS RSI Lite","fr":"GoalOS RSI Lite","promise":"Build one self-improving AI workflow.","type":"Premium self-serve system","audience":"Serious operators, consultants, agencies, creators, small teams.","bullets":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"]}, - {"slug":"goalos-proof-room-lite","price":"$997","title":"GoalOS Proof Room Lite / Department Pack","fr":"GoalOS Proof Room Lite / Pack Département","promise":"Set up a lightweight department Proof Room.","type":"Premium department pack","audience":"Department leads, operations managers, AI champions, team leads.","bullets":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"]}, - {"slug":"goalos-rsi-sprint-workshop","price":"$2,500+","title":"GoalOS RSI Sprint Workshop","fr":"Atelier GoalOS RSI Sprint","promise":"Build the first self-improving workflow live.","type":"Premium private workshop","audience":"Founders, operators, teams, consultants, agencies, AI champions.","bullets":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","proof note","public-safe proof-card draft","30-day next-run plan"]}, - {"slug":"goalos-proof-room-implementation-sprint","price":"$9,500+","title":"GoalOS Proof Room Implementation Sprint","fr":"Sprint de mise en œuvre GoalOS Proof Room","promise":"Department RSI in 30 days.","type":"Done-with-you implementation","audience":"Department leaders, AI champions, operations executives.","bullets":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"]}, - {"slug":"goalos-enterprise-rsi-pilot","price":"$49,000+","title":"GoalOS Enterprise RSI Pilot","fr":"GoalOS Enterprise RSI Pilot","promise":"Pilot the Recursive Workflow OS.","type":"Enterprise pilot","audience":"Enterprise AI governance, CIO/CDO office, support/ops executives.","bullets":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"]}, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution"), - ("AEP-002","Evidence Docket Standard"), - ("AEP-003","ProofPacket Schema"), - ("AEP-004","Selection Gate Standard"), - ("AEP-005","Tool Permission Standard"), - ("AEP-006","Rollback Receipt Standard"), - ("AEP-007","Public-Safe Proof Report Standard"), - ("AEP-008","Proof Room Standard"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Customer question → clear reply."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Run, score, diagnose, improve, version, prove, and re-run."), - ("department-proof-room-lite","Department Proof Room Lite","Set up owners, permissions, proof notes, reviews, reports, and rollback."), - ("department-ai-permission-map","AI Permission Map","Green / Yellow / Red boundaries for department AI use."), - ("department-public-safe-case-study","Public-safe case study","Turn internal proof into safe external evidence."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.078);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--green:#7ce0a3;--radius:26px;--shadow:0 28px 78px rgba(0,0,0,.36)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 14% -8%,rgba(143,179,255,.22),transparent 34rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.13),transparent 30rem),linear-gradient(180deg,#05070d,#080b13 55%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(18px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1240px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:13px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.035em}.goalos-mark{width:34px;height:34px;border-radius:10px;border:1px solid rgba(255,215,106,.65);display:grid;place-items:center;color:var(--gold);font-weight:950;background:rgba(255,215,106,.08)}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:13px;text-decoration:none;padding:9px 11px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.goalos-wrap{width:min(1240px,calc(100% - 36px));margin:0 auto;padding:68px 0 94px}.hero{padding:42px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.22em;font-weight:950;font-size:12px;margin-bottom:18px}.goalos-wrap h1{font-size:clamp(50px,8vw,114px);line-height:.86;letter-spacing:-.085em;margin:0 0 24px;max-width:1130px}.goalos-wrap h2{font-size:clamp(34px,5.4vw,66px);line-height:.92;letter-spacing:-.065em;margin:0 0 18px}.goalos-wrap h3{font-size:24px;letter-spacing:-.04em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:960px;margin:0 0 24px}.fr{color:#d7def6}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:900;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:var(--gold);color:#05070d;border-color:var(--gold)}.section{margin:62px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:30px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:22px;text-decoration:none;display:flex;flex-direction:column;min-height:188px}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.5)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:44px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(26px,3.6vw,46px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:900;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.goalos-footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.74)}.goalos-footer-inner{width:min(1240px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.goalos-footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:980px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.goalos-wrap{padding-top:42px}} - """ - (ASSETS / "goalos-site-v3.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-site-v3.js").write_text(JS, encoding="utf-8") - - OG = """GOALOS · PROOF GRADIENTRecursive Workflow OS.Proof Rooms.RSI Sprint Workshop.Public site only · paid files stay private""" - (ASSETS / "goalos-public-site-og.svg").write_text(OG, encoding="utf-8") - - NAV = f""" -
- -
- """ - - FOOTER = f""" - - """ - - def base_page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(base_page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def card(item): - return f""" - {escape(item['price'])} -

{escape(item['title'])}

-

{escape(item['fr'])}

-

{escape(item['promise'])}

-
""" - - def bullets(items): - return "" - - # Core pages. - write_page("", "GoalOS · Proof Gradient", "GoalOS Recursive Workflow OS and Proof Gradient public site.", f""" -
-
GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- -
-
-
Featured workshop
-

GoalOS RSI Sprint Workshop turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

A premium private workshop for building workflow v1.0, running it, scoring it, diagnosing weakness, improving to v1.1, and leaving with a proof note and 30-day next-run plan.

- -
-
-
Latest software proof
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

One workflow family. One Proof Room. One improvement proposal. One approval gate. One rollback target. One public-safe proof card.

- -
-
-
Commercial ladder
-

From reusable workflow to Enterprise RSI.

-
{''.join(card(o) for o in OFFERS)}
-
-
-

Safe boundary

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Choose your GoalOS path.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

{''.join(card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

{''.join(card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title'])}
{escape(o['fr'])}{escape(o['promise'])}{escape(o['type'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "GoalOS workshops, implementation, and enterprise pilots.", f"""
Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

{''.join(card(o) for o in OFFERS[3:])}
""") - - # Product detail pages. - for o in OFFERS: - write_page(f"products/{o['slug']}", o["title"], o["promise"], f"""
{escape(o['price'])} · {escape(o['type'])}

{escape(o['title'])}

{escape(o['fr'])}

{escape(o['promise'])}

Best for: {escape(o['audience'])}

{escape(o['price'])}

What it includes

{bullets(o['bullets'])}

Boundary

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

""") - - # Workshop page: v6 public content, no paid files. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- -
-
-

What you leave with

-
-
1Workflow v1.0
-
2First run output
-
3Scorecard
-
4Diagnosis
-
5Workflow v1.1
-
6Proof note
-
-
-
-

Safe boundary

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-
- """) - - # Implementation and enterprise pages. - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

""") - enterprise_body = f"""
Enterprise RSI

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run

Formal platform name

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - # Cloud MVP public page and fallback app if missing. - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

What it proves

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

This page is ready for the full Cloud MVP action. Run the GoalOS Cloud MVP v0.2 action to install the interactive app.

""") - - # Standards and examples. - standards_cards = "".join(f'AEP

{escape(code)}

{escape(title)}

' for code,title in STANDARDS) - write_page("standards", "AEP Standards", "Proof Gradient standards.", f"""
AEP Standards

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

{standards_cards}
""") - for code,title in STANDARDS: - target = WEB_ROOT / "standards" / code / "index.html" - if not target.exists(): - write_page(f"standards/{code}", f"{code} — {title}", title, f"""
AEP Standard

{escape(code)} — {escape(title)}

Public trust layer for GoalOS and Proof Gradient.

""") - - example_cards = "".join(f'Example

{escape(title)}

{escape(desc)}

' for slug,title,desc in EXAMPLES) - write_page("examples", "GoalOS Examples", "Practical GoalOS workflow examples.", f"""
Examples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

{example_cards}
""") - for slug,title,desc in EXAMPLES: - target = WEB_ROOT / "workflow" / slug / "index.html" - if not target.exists(): - write_page(f"workflow/{slug}", title, desc, f"""
GoalOS Example

{escape(title)}

{escape(desc)}

GoalOS structure

Context → Rules → Memory → Workflow → Checks → Proof.

""") - - command_cards = "".join(card(o) for o in OFFERS) - command_cards += f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

' - write_page("command-center", "GoalOS Command Center", "Unified GoalOS command center.", f"""
Command Center

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] - URLS += [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{c}/" for c,_ in STANDARDS] + [f"/workflow/{s}/" for s,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Unified GoalOS site map.", f"""
Site Map

Unified site map.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(base_page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

"""), encoding="utf-8") - - # Documentation page. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V3.md").write_text(f"""# GoalOS Public Site Release v3.1 - - Generated: {NOW} - - ## Purpose - - Unify the public Proof Gradient / GoalOS website, include the GoalOS RSI Sprint Workshop public offer, preserve AEP standards, keep paid materials private, and support GoalOS Cloud MVP public proof. - - ## Public ladder - - - $49 GoalOS AI Efficiency Sprint Kit - - $199 GoalOS RSI Lite - - $997 Proof Room Lite / Department Pack - - $2,500+ GoalOS RSI Sprint Workshop - - $9,500+ Proof Room Implementation Sprint - - $49,000+ Enterprise RSI Pilot - - ## Paid file policy - - Paid buyer ZIPs, private workshop materials, implementation bundles, and enterprise delivery kits are not uploaded to the public site. - - All buy/apply buttons point to: - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Hard repair any HTML: remove old shells, inject exactly one canonical shell/footer. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: return text, 0 - start = body.end() - # inspect only before first main/section content. - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - new_prefix = pattern.sub(repl, prefix) - return text[:start] + new_prefix + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap/robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid artifact guard. - # v3.1 is smarter: public AEP standard packages are allowed, but buyer/delivery/private bundles are blocked. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - restricted = [] - allowed_public_packages = [] - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed_public_packages.append(rel) - else: - restricted.append(rel) - continue - - if any(term in name for term in blocked_terms): - if not name.endswith((".md", ".html", ".json", ".txt", ".yml", ".yaml", ".css", ".js", ".svg")): - restricted.append(rel) - - REPORT["allowed_public_packages"] = allowed_public_packages - if restricted: - raise SystemExit( - "Paid/private artifacts detected in public site. These should not be deployed to GitHub Pages.\n" - "Allowed exception: standards/AEP-###/complete-package.zip only.\n\n" - + "\n".join(sorted(set(restricted))[:120]) - ) - - # Validations. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal link check. - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): fs = fs / "index.html" - if not fs.exists(): missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v3-1-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v3.1 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v3-1-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v3-1-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v3.1 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v3.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - name = p.name.lower() - if name.endswith(".zip"): - errors.append(f"Paid/private ZIP detected in public site: {p.relative_to(WEB_ROOT)}") - if any(term in name for term in ["buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", "master_pack", "commercialization_ready", "quick_launch"]): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml")): - errors.append(f"Suspicious paid/private artifact detected: {p.relative_to(WEB_ROOT)}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release unified GoalOS public site v3.1 [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v3-2.yml b/.github/workflows/goalos-public-site-release-v3-2.yml index a03b8afb..d19c767c 100644 --- a/.github/workflows/goalos-public-site-release-v3-2.yml +++ b/.github/workflows/goalos-public-site-release-v3-2.yml @@ -1,639 +1,25 @@ -name: GoalOS Public Site Release v3.2.1 +name: goalos-public-site-release-v3-2 (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v3-2-1 - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh public site and RSI Sprint Workshop (v3.2) + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate unified GoalOS public site - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v3.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.utcnow().strftime("%Y-%m-%d") - NOW = datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z" - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v3_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "web_root": str(WEB_ROOT), - "release": "GoalOS public site release v3.2", - "purpose": "Unify public website, remove duplicate navbars, refresh commercial ladder, include RSI Sprint Workshop public pages, keep paid materials private.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "validation": {}, - "paid_artifact_policy": "No buyer ZIPs, workshop bundles, implementation kits, enterprise pilot delivery kits, or private materials are uploaded." - } - - OFFERS = [ - {"slug":"goalos-ai-efficiency-sprint-kit","price":"$49","title":"GoalOS AI Efficiency Sprint Kit","fr":"Trousse GoalOS Sprint d’efficacité IA","promise":"Build one reusable AI workflow.","type":"Self-serve digital product","audience":"Beginners, creators, freelancers, consultants, small-business owners.","bullets":["60-minute first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"]}, - {"slug":"goalos-rsi-lite","price":"$199","title":"GoalOS RSI Lite","fr":"GoalOS RSI Lite","promise":"Build one self-improving AI workflow.","type":"Premium self-serve system","audience":"Serious operators, consultants, agencies, creators, small teams.","bullets":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"]}, - {"slug":"goalos-proof-room-lite","price":"$997","title":"GoalOS Proof Room Lite / Department Pack","fr":"GoalOS Proof Room Lite / Pack Département","promise":"Set up a lightweight department Proof Room.","type":"Premium department pack","audience":"Department leads, operations managers, AI champions, team leads.","bullets":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"]}, - {"slug":"goalos-rsi-sprint-workshop","price":"$2,500+","title":"GoalOS RSI Sprint Workshop","fr":"Atelier GoalOS RSI Sprint","promise":"Build the first self-improving workflow live.","type":"Premium private workshop","audience":"Founders, operators, teams, consultants, agencies, AI champions.","bullets":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","proof note","public-safe proof-card draft","30-day next-run plan"]}, - {"slug":"goalos-proof-room-implementation-sprint","price":"$9,500+","title":"GoalOS Proof Room Implementation Sprint","fr":"Sprint de mise en œuvre GoalOS Proof Room","promise":"Department RSI in 30 days.","type":"Done-with-you implementation","audience":"Department leaders, AI champions, operations executives.","bullets":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"]}, - {"slug":"goalos-enterprise-rsi-pilot","price":"$49,000+","title":"GoalOS Enterprise RSI Pilot","fr":"GoalOS Enterprise RSI Pilot","promise":"Pilot the Recursive Workflow OS.","type":"Enterprise pilot","audience":"Enterprise AI governance, CIO/CDO office, support/ops executives.","bullets":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"]}, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution"), - ("AEP-002","Evidence Docket Standard"), - ("AEP-003","ProofPacket Schema"), - ("AEP-004","Selection Gate Standard"), - ("AEP-005","Tool Permission Standard"), - ("AEP-006","Rollback Receipt Standard"), - ("AEP-007","Public-Safe Proof Report Standard"), - ("AEP-008","Proof Room Standard"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Customer question → clear reply."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Run, score, diagnose, improve, version, prove, and re-run."), - ("department-proof-room-lite","Department Proof Room Lite","Set up owners, permissions, proof notes, reviews, reports, and rollback."), - ("department-ai-permission-map","AI Permission Map","Green / Yellow / Red boundaries for department AI use."), - ("department-public-safe-case-study","Public-safe case study","Turn internal proof into safe external evidence."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.078);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--green:#7ce0a3;--radius:26px;--shadow:0 28px 78px rgba(0,0,0,.36)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 14% -8%,rgba(143,179,255,.22),transparent 34rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.13),transparent 30rem),linear-gradient(180deg,#05070d,#080b13 55%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(18px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1240px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:13px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.035em}.goalos-mark{width:34px;height:34px;border-radius:10px;border:1px solid rgba(255,215,106,.65);display:grid;place-items:center;color:var(--gold);font-weight:950;background:rgba(255,215,106,.08)}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:13px;text-decoration:none;padding:9px 11px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.goalos-wrap{width:min(1240px,calc(100% - 36px));margin:0 auto;padding:68px 0 94px}.hero{padding:42px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.22em;font-weight:950;font-size:12px;margin-bottom:18px}.goalos-wrap h1{font-size:clamp(50px,8vw,114px);line-height:.86;letter-spacing:-.085em;margin:0 0 24px;max-width:1130px}.goalos-wrap h2{font-size:clamp(34px,5.4vw,66px);line-height:.92;letter-spacing:-.065em;margin:0 0 18px}.goalos-wrap h3{font-size:24px;letter-spacing:-.04em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:960px;margin:0 0 24px}.fr{color:#d7def6}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:900;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:var(--gold);color:#05070d;border-color:var(--gold)}.section{margin:62px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:30px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:22px;text-decoration:none;display:flex;flex-direction:column;min-height:188px}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.5)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:44px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(26px,3.6vw,46px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:900;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.goalos-footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.74)}.goalos-footer-inner{width:min(1240px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.goalos-footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:980px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.goalos-wrap{padding-top:42px}} - """ - (ASSETS / "goalos-site-v3.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-site-v3.js").write_text(JS, encoding="utf-8") - - OG = """GOALOS · PROOF GRADIENTRecursive Workflow OS.Proof Rooms.RSI Sprint Workshop.Public site only · paid files stay private""" - (ASSETS / "goalos-public-site-og.svg").write_text(OG, encoding="utf-8") - - NAV = f""" -
- -
- """ - - FOOTER = f""" - - """ - - def base_page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(base_page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def card(item): - return f""" - {escape(item['price'])} -

{escape(item['title'])}

-

{escape(item['fr'])}

-

{escape(item['promise'])}

-
""" - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - # Core pages. - write_page("", "GoalOS · Proof Gradient", "GoalOS Recursive Workflow OS and Proof Gradient public site.", f""" -
-
GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- -
-
-
Featured workshop
-

GoalOS RSI Sprint Workshop turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

A premium private workshop for building workflow v1.0, running it, scoring it, diagnosing weakness, improving to v1.1, and leaving with a proof note and 30-day next-run plan.

- -
-
-
Latest software proof
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

One workflow family. One Proof Room. One improvement proposal. One approval gate. One rollback target. One public-safe proof card.

- -
-
-
Commercial ladder
-

From reusable workflow to Enterprise RSI.

-
{''.join(card(o) for o in OFFERS)}
-
-
-

Safe boundary

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Choose your GoalOS path.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

{''.join(card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

{''.join(card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title'])}
{escape(o['fr'])}{escape(o['promise'])}{escape(o['type'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "GoalOS workshops, implementation, and enterprise pilots.", f"""
Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

{''.join(card(o) for o in OFFERS[3:])}
""") - - # Product detail pages. - for o in OFFERS: - write_page(f"products/{o['slug']}", o["title"], o["promise"], f"""
{escape(o['price'])} · {escape(o['type'])}

{escape(o['title'])}

{escape(o['fr'])}

{escape(o['promise'])}

Best for: {escape(o['audience'])}

{escape(o['price'])}

What it includes

{bullets(o['bullets'])}

Boundary

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

""") - - # Workshop page: v6 public content, no paid files. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- -
-
-

What you leave with

-
-
1Workflow v1.0
-
2First run output
-
3Scorecard
-
4Diagnosis
-
5Workflow v1.1
-
6Proof note
-
-
-
-

Safe boundary

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-
- """) - - # Implementation and enterprise pages. - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

""") - enterprise_body = f"""
Enterprise RSI

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run

Formal platform name

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - # Cloud MVP public page and fallback app if missing. - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

What it proves

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

This page is ready for the full Cloud MVP action. Run the GoalOS Cloud MVP v0.2 action to install the interactive app.

""") - - # Standards and examples. - standards_cards = "".join(f'AEP

{escape(code)}

{escape(title)}

' for code,title in STANDARDS) - write_page("standards", "AEP Standards", "Proof Gradient standards.", f"""
AEP Standards

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

{standards_cards}
""") - for code,title in STANDARDS: - target = WEB_ROOT / "standards" / code / "index.html" - if not target.exists(): - write_page(f"standards/{code}", f"{code} — {title}", title, f"""
AEP Standard

{escape(code)} — {escape(title)}

Public trust layer for GoalOS and Proof Gradient.

""") - - example_cards = "".join(f'Example

{escape(title)}

{escape(desc)}

' for slug,title,desc in EXAMPLES) - write_page("examples", "GoalOS Examples", "Practical GoalOS workflow examples.", f"""
Examples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

{example_cards}
""") - for slug,title,desc in EXAMPLES: - target = WEB_ROOT / "workflow" / slug / "index.html" - if not target.exists(): - write_page(f"workflow/{slug}", title, desc, f"""
GoalOS Example

{escape(title)}

{escape(desc)}

GoalOS structure

Context → Rules → Memory → Workflow → Checks → Proof.

""") - - command_cards = "".join(card(o) for o in OFFERS) - command_cards += f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

' - write_page("command-center", "GoalOS Command Center", "Unified GoalOS command center.", f"""
Command Center

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] - URLS += [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{c}/" for c,_ in STANDARDS] + [f"/workflow/{s}/" for s,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Unified GoalOS site map.", f"""
Site Map

Unified site map.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(base_page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

"""), encoding="utf-8") - - # Documentation page. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V3.md").write_text(f"""# GoalOS Public Site Release v3.2 - - Generated: {NOW} - - ## Purpose - - Unify the public Proof Gradient / GoalOS website, include the GoalOS RSI Sprint Workshop public offer, preserve AEP standards, keep paid materials private, and support GoalOS Cloud MVP public proof. - - ## Public ladder - - - $49 GoalOS AI Efficiency Sprint Kit - - $199 GoalOS RSI Lite - - $997 Proof Room Lite / Department Pack - - $2,500+ GoalOS RSI Sprint Workshop - - $9,500+ Proof Room Implementation Sprint - - $49,000+ Enterprise RSI Pilot - - ## Paid file policy - - Paid buyer ZIPs, private workshop materials, implementation bundles, and enterprise delivery kits are not uploaded to the public site. - - All buy/apply buttons point to: - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Hard repair any HTML: remove old shells, inject exactly one canonical shell/footer. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: return text, 0 - start = body.end() - # inspect only before first main/section content. - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - new_prefix = pattern.sub(repl, prefix) - return text[:start] + new_prefix + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap/robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid artifact guard. - # v3.2 is smarter: public AEP standard packages are allowed, but buyer/delivery/private bundles are blocked. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - restricted = [] - allowed_public_packages = [] - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed_public_packages.append(rel) - else: - restricted.append(rel) - continue - - if any(term in name for term in blocked_terms): - if not name.endswith((".md", ".html", ".json", ".txt", ".yml", ".yaml", ".css", ".js", ".svg")): - restricted.append(rel) - - REPORT["allowed_public_packages"] = allowed_public_packages - if restricted: - raise SystemExit( - "Paid/private artifacts detected in public site. These should not be deployed to GitHub Pages.\n" - "Allowed exception: standards/AEP-###/complete-package.zip only.\n\n" - + "\n".join(sorted(set(restricted))[:120]) - ) - - # Validations. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal link check. - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): fs = fs / "index.html" - if not fs.exists(): missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v3-2-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v3.2 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v3-2-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v3-2-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v3.2 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v3.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - # v3.2 allows public AEP standard packages but blocks buyer/delivery/private bundles. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release unified GoalOS public site v3.2 [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v3.yml b/.github/workflows/goalos-public-site-release-v3.yml index a048b10a..7dea6711 100644 --- a/.github/workflows/goalos-public-site-release-v3.yml +++ b/.github/workflows/goalos-public-site-release-v3.yml @@ -1,598 +1,25 @@ -name: GoalOS Public Site Release v3 +name: goalos-public-site-release-v3 (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v3 - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh full public site and RSI Sprint Workshop + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate unified GoalOS public site - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v3.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.utcnow().strftime("%Y-%m-%d") - NOW = datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z" - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v3_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "web_root": str(WEB_ROOT), - "release": "GoalOS public site release v3", - "purpose": "Unify public website, remove duplicate navbars, refresh commercial ladder, include RSI Sprint Workshop public pages, keep paid materials private.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "validation": {}, - "paid_artifact_policy": "No buyer ZIPs, workshop bundles, implementation kits, enterprise pilot delivery kits, or private materials are uploaded." - } - - OFFERS = [ - {"slug":"goalos-ai-efficiency-sprint-kit","price":"$49","title":"GoalOS AI Efficiency Sprint Kit","fr":"Trousse GoalOS Sprint d’efficacité IA","promise":"Build one reusable AI workflow.","type":"Self-serve digital product","audience":"Beginners, creators, freelancers, consultants, small-business owners.","bullets":["60-minute first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"]}, - {"slug":"goalos-rsi-lite","price":"$199","title":"GoalOS RSI Lite","fr":"GoalOS RSI Lite","promise":"Build one self-improving AI workflow.","type":"Premium self-serve system","audience":"Serious operators, consultants, agencies, creators, small teams.","bullets":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"]}, - {"slug":"goalos-proof-room-lite","price":"$997","title":"GoalOS Proof Room Lite / Department Pack","fr":"GoalOS Proof Room Lite / Pack Département","promise":"Set up a lightweight department Proof Room.","type":"Premium department pack","audience":"Department leads, operations managers, AI champions, team leads.","bullets":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"]}, - {"slug":"goalos-rsi-sprint-workshop","price":"$2,500+","title":"GoalOS RSI Sprint Workshop","fr":"Atelier GoalOS RSI Sprint","promise":"Build the first self-improving workflow live.","type":"Premium private workshop","audience":"Founders, operators, teams, consultants, agencies, AI champions.","bullets":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","proof note","public-safe proof-card draft","30-day next-run plan"]}, - {"slug":"goalos-proof-room-implementation-sprint","price":"$9,500+","title":"GoalOS Proof Room Implementation Sprint","fr":"Sprint de mise en œuvre GoalOS Proof Room","promise":"Department RSI in 30 days.","type":"Done-with-you implementation","audience":"Department leaders, AI champions, operations executives.","bullets":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"]}, - {"slug":"goalos-enterprise-rsi-pilot","price":"$49,000+","title":"GoalOS Enterprise RSI Pilot","fr":"GoalOS Enterprise RSI Pilot","promise":"Pilot the Recursive Workflow OS.","type":"Enterprise pilot","audience":"Enterprise AI governance, CIO/CDO office, support/ops executives.","bullets":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"]}, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution"), - ("AEP-002","Evidence Docket Standard"), - ("AEP-003","ProofPacket Schema"), - ("AEP-004","Selection Gate Standard"), - ("AEP-005","Tool Permission Standard"), - ("AEP-006","Rollback Receipt Standard"), - ("AEP-007","Public-Safe Proof Report Standard"), - ("AEP-008","Proof Room Standard"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Customer question → clear reply."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Run, score, diagnose, improve, version, prove, and re-run."), - ("department-proof-room-lite","Department Proof Room Lite","Set up owners, permissions, proof notes, reviews, reports, and rollback."), - ("department-ai-permission-map","AI Permission Map","Green / Yellow / Red boundaries for department AI use."), - ("department-public-safe-case-study","Public-safe case study","Turn internal proof into safe external evidence."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.078);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--green:#7ce0a3;--radius:26px;--shadow:0 28px 78px rgba(0,0,0,.36)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 14% -8%,rgba(143,179,255,.22),transparent 34rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.13),transparent 30rem),linear-gradient(180deg,#05070d,#080b13 55%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(18px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1240px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:13px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.035em}.goalos-mark{width:34px;height:34px;border-radius:10px;border:1px solid rgba(255,215,106,.65);display:grid;place-items:center;color:var(--gold);font-weight:950;background:rgba(255,215,106,.08)}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:13px;text-decoration:none;padding:9px 11px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.goalos-wrap{width:min(1240px,calc(100% - 36px));margin:0 auto;padding:68px 0 94px}.hero{padding:42px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.22em;font-weight:950;font-size:12px;margin-bottom:18px}.goalos-wrap h1{font-size:clamp(50px,8vw,114px);line-height:.86;letter-spacing:-.085em;margin:0 0 24px;max-width:1130px}.goalos-wrap h2{font-size:clamp(34px,5.4vw,66px);line-height:.92;letter-spacing:-.065em;margin:0 0 18px}.goalos-wrap h3{font-size:24px;letter-spacing:-.04em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:960px;margin:0 0 24px}.fr{color:#d7def6}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:900;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:var(--gold);color:#05070d;border-color:var(--gold)}.section{margin:62px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:30px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:22px;text-decoration:none;display:flex;flex-direction:column;min-height:188px}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.5)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:44px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(26px,3.6vw,46px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:900;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.goalos-footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.74)}.goalos-footer-inner{width:min(1240px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.goalos-footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:980px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.goalos-wrap{padding-top:42px}} - """ - (ASSETS / "goalos-site-v3.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-site-v3.js").write_text(JS, encoding="utf-8") - - OG = """GOALOS · PROOF GRADIENTRecursive Workflow OS.Proof Rooms.RSI Sprint Workshop.Public site only · paid files stay private""" - (ASSETS / "goalos-public-site-og.svg").write_text(OG, encoding="utf-8") - - NAV = f""" -
- -
- """ - - FOOTER = f""" - - """ - - def base_page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(base_page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def card(item): - return f""" - {escape(item['price'])} -

{escape(item['title'])}

-

{escape(item['fr'])}

-

{escape(item['promise'])}

-
""" - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - # Core pages. - write_page("", "GoalOS · Proof Gradient", "GoalOS Recursive Workflow OS and Proof Gradient public site.", f""" -
-
GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- -
-
-
Featured workshop
-

GoalOS RSI Sprint Workshop turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

A premium private workshop for building workflow v1.0, running it, scoring it, diagnosing weakness, improving to v1.1, and leaving with a proof note and 30-day next-run plan.

- -
-
-
Latest software proof
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

One workflow family. One Proof Room. One improvement proposal. One approval gate. One rollback target. One public-safe proof card.

- -
-
-
Commercial ladder
-

From reusable workflow to Enterprise RSI.

-
{''.join(card(o) for o in OFFERS)}
-
-
-

Safe boundary

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Choose your GoalOS path.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

{''.join(card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

{''.join(card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title'])}
{escape(o['fr'])}{escape(o['promise'])}{escape(o['type'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "GoalOS workshops, implementation, and enterprise pilots.", f"""
Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

{''.join(card(o) for o in OFFERS[3:])}
""") - - # Product detail pages. - for o in OFFERS: - write_page(f"products/{o['slug']}", o["title"], o["promise"], f"""
{escape(o['price'])} · {escape(o['type'])}

{escape(o['title'])}

{escape(o['fr'])}

{escape(o['promise'])}

Best for: {escape(o['audience'])}

{escape(o['price'])}

What it includes

{bullets(o['bullets'])}

Boundary

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

""") - - # Workshop page: v6 public content, no paid files. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- -
-
-

What you leave with

-
-
1Workflow v1.0
-
2First run output
-
3Scorecard
-
4Diagnosis
-
5Workflow v1.1
-
6Proof note
-
-
-
-

Safe boundary

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-
- """) - - # Implementation and enterprise pages. - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

""") - enterprise_body = f"""
Enterprise RSI

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run

Formal platform name

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - # Cloud MVP public page and fallback app if missing. - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

What it proves

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

This page is ready for the full Cloud MVP action. Run the GoalOS Cloud MVP v0.2 action to install the interactive app.

""") - - # Standards and examples. - standards_cards = "".join(f'AEP

{escape(code)}

{escape(title)}

' for code,title in STANDARDS) - write_page("standards", "AEP Standards", "Proof Gradient standards.", f"""
AEP Standards

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

{standards_cards}
""") - for code,title in STANDARDS: - target = WEB_ROOT / "standards" / code / "index.html" - if not target.exists(): - write_page(f"standards/{code}", f"{code} — {title}", title, f"""
AEP Standard

{escape(code)} — {escape(title)}

Public trust layer for GoalOS and Proof Gradient.

""") - - example_cards = "".join(f'Example

{escape(title)}

{escape(desc)}

' for slug,title,desc in EXAMPLES) - write_page("examples", "GoalOS Examples", "Practical GoalOS workflow examples.", f"""
Examples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

{example_cards}
""") - for slug,title,desc in EXAMPLES: - target = WEB_ROOT / "workflow" / slug / "index.html" - if not target.exists(): - write_page(f"workflow/{slug}", title, desc, f"""
GoalOS Example

{escape(title)}

{escape(desc)}

GoalOS structure

Context → Rules → Memory → Workflow → Checks → Proof.

""") - - command_cards = "".join(card(o) for o in OFFERS) - command_cards += f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

' - write_page("command-center", "GoalOS Command Center", "Unified GoalOS command center.", f"""
Command Center

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] - URLS += [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{c}/" for c,_ in STANDARDS] + [f"/workflow/{s}/" for s,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Unified GoalOS site map.", f"""
Site Map

Unified site map.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(base_page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

"""), encoding="utf-8") - - # Documentation page. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V3.md").write_text(f"""# GoalOS Public Site Release v3 - - Generated: {NOW} - - ## Purpose - - Unify the public Proof Gradient / GoalOS website, include the GoalOS RSI Sprint Workshop public offer, preserve AEP standards, keep paid materials private, and support GoalOS Cloud MVP public proof. - - ## Public ladder - - - $49 GoalOS AI Efficiency Sprint Kit - - $199 GoalOS RSI Lite - - $997 Proof Room Lite / Department Pack - - $2,500+ GoalOS RSI Sprint Workshop - - $9,500+ Proof Room Implementation Sprint - - $49,000+ Enterprise RSI Pilot - - ## Paid file policy - - Paid buyer ZIPs, private workshop materials, implementation bundles, and enterprise delivery kits are not uploaded to the public site. - - All buy/apply buttons point to: - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Hard repair any HTML: remove old shells, inject exactly one canonical shell/footer. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: return text, 0 - start = body.end() - # inspect only before first main/section content. - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - new_prefix = pattern.sub(repl, prefix) - return text[:start] + new_prefix + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap/robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid artifact guard. - restricted = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: continue - name = p.name.lower() - if name.endswith(".zip"): - restricted.append(str(p.relative_to(WEB_ROOT))) - if any(term in name for term in ["buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", "master_pack", "commercialization_ready", "quick_launch"]): - if not name.endswith((".md", ".html", ".json", ".txt", ".yml", ".yaml")): - restricted.append(str(p.relative_to(WEB_ROOT))) - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(restricted[:120])) - - # Validations. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal link check. - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): fs = fs / "index.html" - if not fs.exists(): missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v3-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v3 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v3-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v3-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v3 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v3.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - name = p.name.lower() - if name.endswith(".zip"): - errors.append(f"Paid/private ZIP detected in public site: {p.relative_to(WEB_ROOT)}") - if any(term in name for term in ["buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", "master_pack", "commercialization_ready", "quick_launch"]): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml")): - errors.append(f"Suspicious paid/private artifact detected: {p.relative_to(WEB_ROOT)}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release unified GoalOS public site v3 [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v4-bilingual.yml b/.github/workflows/goalos-public-site-release-v4-bilingual.yml index 2b5f8c14..3ea96d0e 100644 --- a/.github/workflows/goalos-public-site-release-v4-bilingual.yml +++ b/.github/workflows/goalos-public-site-release-v4-bilingual.yml @@ -1,724 +1,25 @@ -name: GoalOS Public Site Release v4 Bilingual +name: goalos-public-site-release-v4-bilingual (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v4-bilingual - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh bilingual opulent public site and RSI Sprint Workshop + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate bilingual opulent GoalOS public site - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v4.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d") - NOW = datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat() - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v4_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "release": "GoalOS public site release v4 bilingual opulent", - "web_root": str(WEB_ROOT), - "mission": "Unified, bilingual, corporate, institutional, opulent public website with RSI Sprint Workshop included and paid materials excluded.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "allowed_public_packages": [], - "validation": {}, - "paid_artifact_policy": "Paid buyer products and private workshop/implementation/enterprise delivery materials are not uploaded to the public site." - } - - OFFERS = [ - { - "slug":"goalos-ai-efficiency-sprint-kit", - "price":"$49", - "title_en":"GoalOS AI Efficiency Sprint Kit", - "title_fr":"Trousse GoalOS — Sprint d’efficacité IA", - "promise_en":"Build one reusable AI workflow.", - "promise_fr":"Construisez un flux IA réutilisable.", - "type_en":"Self-serve digital product", - "type_fr":"Produit numérique autonome", - "audience_en":"AI beginners, creators, freelancers, consultants, small-business owners, solo operators.", - "audience_fr":"Débutants IA, créateurs, travailleurs autonomes, consultants, PME et opérateurs solo.", - "bullets_en":["60-minute guided first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"], - "bullets_fr":["première victoire guidée en 60 minutes","constructeur de flux hors ligne","prompts copier-coller","modèles éditables","exemples débutants complétés","note de preuve"] - }, - { - "slug":"goalos-rsi-lite", - "price":"$199", - "title_en":"GoalOS RSI Lite", - "title_fr":"GoalOS RSI Lite", - "promise_en":"Build one self-improving AI workflow.", - "promise_fr":"Construisez un flux IA auto-améliorant.", - "type_en":"Premium self-serve system", - "type_fr":"Système autonome premium", - "audience_en":"Serious operators, consultants, agencies, creators, and small teams.", - "audience_fr":"Opérateurs sérieux, consultants, agences, créateurs et petites équipes.", - "bullets_en":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"], - "bullets_fr":["guide RSI Lite","constructeur hors ligne","grille de score","suivi des versions","prompts d’amélioration","exemples v1.0 à v1.2"] - }, - { - "slug":"goalos-proof-room-lite", - "price":"$997", - "title_en":"GoalOS Proof Room Lite / Department Pack", - "title_fr":"GoalOS Proof Room Lite / Pack Département", - "promise_en":"Set up a lightweight department Proof Room.", - "promise_fr":"Mettez en place une Salle de preuve légère pour un département.", - "type_en":"Premium department pack", - "type_fr":"Pack département premium", - "audience_en":"Department leads, operations managers, AI champions, team leads, and innovation leaders.", - "audience_fr":"Responsables de département, gestionnaires des opérations, champions IA, chefs d’équipe et responsables innovation.", - "bullets_en":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"], - "bullets_fr":["charte de Salle de preuve","carte de permissions IA","fiches responsables de flux","notes de preuve","revues hebdomadaires","rapports exécutifs","reçus de rollback","preuve publique sécuritaire"] - }, - { - "slug":"goalos-rsi-sprint-workshop", - "price":"$2,500+", - "title_en":"GoalOS RSI Sprint Workshop", - "title_fr":"Atelier GoalOS RSI Sprint", - "promise_en":"Build the first self-improving workflow live.", - "promise_fr":"Construisez le premier flux auto-améliorant en direct.", - "type_en":"Premium private workshop", - "type_fr":"Atelier privé premium", - "audience_en":"Founders, operators, teams, consultants, agencies, and AI champions.", - "audience_fr":"Fondateurs, opérateurs, équipes, consultants, agences et champions IA.", - "bullets_en":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","version record","proof note","public-safe proof-card draft","30-day next-run plan"], - "bullets_fr":["flux v1.0","première sortie","grille de score","diagnostic","flux v1.1","registre de version","note de preuve","brouillon de carte de preuve publique sécuritaire","plan de réexécution sur 30 jours"] - }, - { - "slug":"goalos-proof-room-implementation-sprint", - "price":"$9,500+", - "title_en":"GoalOS Proof Room Implementation Sprint", - "title_fr":"Sprint de mise en œuvre GoalOS Proof Room", - "promise_en":"Department RSI in 30 days.", - "promise_fr":"RSI départemental en 30 jours.", - "type_en":"Done-with-you implementation", - "type_fr":"Mise en œuvre accompagnée", - "audience_en":"Department leaders, AI champions, operations executives, and innovation teams.", - "audience_fr":"Responsables de département, champions IA, dirigeants opérations et équipes innovation.", - "bullets_en":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"], - "bullets_fr":["3 flux de travail","responsables et réviseurs","carte de permissions IA","revue de preuve hebdomadaire","rapport mensuel","procédure de rollback","brouillon d’étude de cas"] - }, - { - "slug":"goalos-enterprise-rsi-pilot", - "price":"$49,000+", - "title_en":"GoalOS Enterprise RSI Pilot", - "title_fr":"GoalOS Enterprise RSI Pilot", - "promise_en":"Pilot the Recursive Workflow OS.", - "promise_fr":"Pilotez le Recursive Workflow OS.", - "type_en":"Enterprise pilot", - "type_fr":"Pilote entreprise", - "audience_en":"Enterprise AI governance, CIO/CDO offices, support/operations executives, and platform sponsors.", - "audience_fr":"Gouvernance IA d’entreprise, bureaux CIO/CDO, dirigeants support/opérations et sponsors plateforme.", - "bullets_en":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"], - "bullets_fr":["pilote de 90 jours","une famille de flux","suite de benchmarks","dossiers de preuve","proposition v1.1","porte d’approbation","blueprint d’architecture"] - }, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution","Constitution GoalOS Proof-of-Evolution"), - ("AEP-002","Evidence Docket Standard","Standard du dossier de preuve"), - ("AEP-003","ProofPacket Schema","Schéma ProofPacket"), - ("AEP-004","Selection Gate Standard","Standard de porte de sélection"), - ("AEP-005","Tool Permission Standard","Standard de permission des outils"), - ("AEP-006","Rollback Receipt Standard","Standard du reçu de rollback"), - ("AEP-007","Public-Safe Proof Report Standard","Standard de rapport de preuve publique sécuritaire"), - ("AEP-008","Proof Room Standard","Standard de Salle de preuve"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Construire un flux IA réutilisable","Customer question → clear reply.","Question client → réponse claire."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Flux récursivement auto-améliorants","Run, score, diagnose, improve, version, prove, and re-run.","Exécuter, noter, diagnostiquer, améliorer, versionner, prouver et réexécuter."), - ("department-proof-room-lite","Department Proof Room Lite","Proof Room Lite départemental","Set up owners, permissions, proof notes, reviews, reports, and rollback.","Mettre en place responsables, permissions, notes de preuve, revues, rapports et rollback."), - ("department-ai-permission-map","AI Permission Map","Carte de permissions IA","Green / Yellow / Red boundaries for department AI use.","Limites Vert / Jaune / Rouge pour l’usage IA départemental."), - ("department-public-safe-case-study","Public-safe case study","Étude de cas publique sécuritaire","Turn internal proof into safe external evidence.","Transformer la preuve interne en preuve externe sécuritaire."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.082);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--champagne:#fff3bf;--blue:#9eb9ff;--green:#7ce0a3;--radius:28px;--shadow:0 32px 90px rgba(0,0,0,.38)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 13% -8%,rgba(143,179,255,.24),transparent 35rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.16),transparent 31rem),radial-gradient(circle at 50% 110%,rgba(124,224,163,.08),transparent 34rem),linear-gradient(180deg,#05070d,#080b13 56%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(20px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1280px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:13px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.04em}.goalos-mark{width:35px;height:35px;border-radius:11px;border:1px solid rgba(255,215,106,.68);display:grid;place-items:center;color:var(--gold);font-weight:950;background:linear-gradient(145deg,rgba(255,215,106,.16),rgba(255,255,255,.04))}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:12.7px;text-decoration:none;padding:9px 10px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.wrap{width:min(1280px,calc(100% - 36px));margin:0 auto;padding:72px 0 96px}.hero{padding:46px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.23em;font-weight:950;font-size:12px;margin-bottom:18px}.kicker{color:var(--champagne);font-weight:900;letter-spacing:-.02em}.wrap h1{font-size:clamp(52px,8.3vw,116px);line-height:.85;letter-spacing:-.088em;margin:0 0 24px;max-width:1180px}.wrap h2{font-size:clamp(34px,5.4vw,68px);line-height:.92;letter-spacing:-.068em;margin:0 0 18px}.wrap h3{font-size:24px;letter-spacing:-.045em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:980px;margin:0 0 24px}.fr{color:#dce3ff}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:950;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:linear-gradient(135deg,var(--gold),#ffe9a3);color:#05070d;border-color:var(--gold)}.section{margin:66px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:32px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:23px;text-decoration:none;display:flex;flex-direction:column;min-height:205px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 90% 0%,rgba(255,215,106,.09),transparent 18rem);pointer-events:none}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.52)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:46px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(27px,3.6vw,48px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:950;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.78)}.footer-inner{width:min(1280px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:1020px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.wrap{padding-top:42px}.loop{display:flex;white-space:normal;border-radius:22px}} - """ - (ASSETS / "goalos-opulent-v4.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-opulent-v4.js").write_text(JS, encoding="utf-8") - - OG = """GOALOS · PROOF GRADIENTA model can answer.An agent can act.An institution must prove.Recursive workflows · RSI Sprint Workshop · Proof Rooms""" - (ASSETS / "goalos-opulent-og.svg").write_text(OG, encoding="utf-8") - - NAV = f""" -
- -
- """ - - FOOTER = f""" - - """ - - def page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - def offer_card(o): - return f""" - {escape(o['price'])} -

{escape(o['title_en'])}

-

{escape(o['title_fr'])}

-

{escape(o['promise_en'])}

-

{escape(o['promise_fr'])}

-
""" - - # Pages. - write_page("", "GoalOS · Proof Gradient", "Bilingual GoalOS public site for recursive workflows, Proof Rooms, and RSI Sprint Workshop.", f""" -
-
GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-

GoalOS transforme le travail IA répété en flux possédés, notés, versionnés, approuvés, surveillés et récursivement améliorés.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- -
-
-
Featured / Offre phare
-

GoalOS RSI Sprint Workshop

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

- -
-
-
Software proof / Preuve logicielle
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

GoalOS Cloud MVP 0.2 prouve l’amélioration récursive des flux en logiciel.

- -
-
-
Commercial ladder / Parcours commercial
-

From reusable workflow to Enterprise RSI.

-
{''.join(offer_card(o) for o in OFFERS)}
-
-
-

Safe boundary / Limite claire

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-

GoalOS ne modifie pas les modèles IA. Il améliore les flux autour de l’IA grâce aux instructions, vérifications, grilles de score, dossiers de preuve, mémoire, standards de preuve, versions, approbations, surveillance et rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Bilingual starting point for GoalOS products and services.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

Flux réutilisable, flux auto-améliorant, Salle de preuve départementale, atelier RSI Sprint, sprint de mise en œuvre ou pilote entreprise.

{''.join(offer_card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "Bilingual GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

Commencez avec un flux IA réutilisable, passez aux flux auto-améliorants, puis installez des Salles de preuve et l’Enterprise RSI.

{''.join(offer_card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title_en'])}
{escape(o['title_fr'])}{escape(o['promise_en'])}
{escape(o['promise_fr'])}{escape(o['type_en'])}
{escape(o['type_fr'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "Bilingual GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "Bilingual GoalOS services and enterprise pilots.", f"""
Services / Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

Utilisez les services pour générer des preuves, installer des Salles de preuve départementales et valider la plateforme entreprise.

{''.join(offer_card(o) for o in OFFERS[3:])}
""") - - # Offer detail pages. - for o in OFFERS: - write_page(f"products/{o['slug']}", o["title_en"], o["promise_en"], f"""
{escape(o['price'])} · {escape(o['type_en'])}

{escape(o['title_en'])}

{escape(o['title_fr'])}

{escape(o['promise_en'])}

{escape(o['promise_fr'])}

Best for: {escape(o['audience_en'])}

Idéal pour : {escape(o['audience_fr'])}

{escape(o['price'])}

Included / Inclus

{bullets(o['bullets_en'])}

Français

{bullets(o['bullets_fr'])}

Boundary / Limite

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

Aucune garantie de ROI, de revenu, de certification de conformité, de sécurité, de conseil juridique ou de déploiement autonome incontrôlé. La revue humaine est requise.

""") - - # Workshop public page — v6, bilingual, no paid files. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- -
-
-

What you leave with / Ce que vous obtenez

-
-
1Workflow v1.0
Flux v1.0
-
2First run output
Première sortie
-
3Scorecard
Grille de score
-
4Diagnosis
Diagnostic
-
5Workflow v1.1
Flux v1.1
-
6Proof note
Note de preuve
-
-
-
-

Premium delivery standard / Standard de livraison premium

-

One repeated task. One live workflow loop. One public-safe proof-card draft. One 30-day next-run plan.

-

Une tâche répétée. Une boucle de flux en direct. Un brouillon de carte de preuve publique sécuritaire. Un plan de réexécution sur 30 jours.

-
-
-

Safe boundary / Limite claire

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-

GoalOS RSI Sprint Workshop ne modifie pas les modèles IA. Il améliore le flux autour de votre assistant IA grâce aux instructions, vérifications, grilles de score, notes de preuve, versions et revue humaine.

-
- """) - - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

En 30 jours, mettez en place la première version d’une Salle de preuve légère pour trois flux IA répétés d’un département.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

""") - - enterprise_body = f"""
Enterprise RSI / RSI entreprise

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Pilotez le Recursive Workflow Operating System pour une famille de flux entreprise.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run

Formal platform name / Nom formel

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

Un MVP public qui prouve : exécuter, noter, prouver, diagnostiquer, améliorer, approuver, versionner, surveiller et réexécuter.

What it proves / Ce qu’il prouve

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

Run the GoalOS Cloud MVP v0.2 action to install the interactive public app.

Exécutez l’action GoalOS Cloud MVP v0.2 pour installer l’application publique interactive.

""") - - standards_cards = "".join(f'AEP

{escape(code)}

{escape(en)}

{escape(fr)}

' for code,en,fr in STANDARDS) - write_page("standards", "AEP Standards", "Bilingual Proof Gradient standards.", f"""
AEP Standards / Standards AEP

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

Les standards AEP donnent le vocabulaire de preuve, permission, rollback, rapports publics sécuritaires et Salles de preuve.

{standards_cards}
""") - for code,en,fr in STANDARDS: - if not (WEB_ROOT / "standards" / code / "index.html").exists(): - write_page(f"standards/{code}", f"{code} — {en}", en, f"""
AEP Standard

{escape(code)} — {escape(en)}

{escape(fr)}

Public trust layer for GoalOS and Proof Gradient.

""") - - examples_cards = "".join(f'Example

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

' for slug,en,fr,desc_en,desc_fr in EXAMPLES) - write_page("examples", "GoalOS Examples", "Bilingual GoalOS workflow examples.", f"""
Examples / Exemples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

Des exemples pour comprendre les flux réutilisables, RSI Lite, Proof Room Lite et RSI départemental.

{examples_cards}
""") - for slug,en,fr,desc_en,desc_fr in EXAMPLES: - if not (WEB_ROOT / "workflow" / slug / "index.html").exists(): - write_page(f"workflow/{slug}", en, desc_en, f"""
GoalOS Example / Exemple GoalOS

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

GoalOS structure / Structure GoalOS

Context → Rules → Memory → Workflow → Checks → Proof.

Contexte → Règles → Mémoire → Flux → Vérifications → Preuve.

""") - - command_cards = "".join(offer_card(o) for o in OFFERS) + f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

Preuve logicielle de flux récursif d’entreprise.

' - write_page("command-center", "GoalOS Command Center", "Bilingual GoalOS command center.", f"""
Command Center / Centre de commande

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

Recherchez dans le site unifié GoalOS / Proof Gradient.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] + [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{code}/" for code,_,_ in STANDARDS] + [f"/workflow/{slug}/" for slug,_,_,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Bilingual GoalOS site map.", f"""
Site Map / Plan du site

Unified site map.

Plan du site unifié.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

Utilisez le Centre de commande pour trouver la bonne page GoalOS.

"""), encoding="utf-8") - - # Public documentation. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V4_BILINGUAL.md").write_text(f"""# GoalOS Public Site Release v4 — Bilingual Opulent Edition - - Generated: {NOW} - - ## Purpose - - Refresh the public Proof Gradient / GoalOS website as a bilingual, corporate, institutional, opulent public site. - - ## Includes - - - GoalOS RSI Sprint Workshop public pages - - product ladder - - pricing - - services - - Cloud MVP public page - - AEP standards - - examples - - command center - - paid/private artifact guard - - ## Paid file policy - - Paid buyer products and private delivery materials are not uploaded to the public site. - - All buy/apply buttons point to: - - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Shell repair across all HTML. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop|Atelier)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: - return text, 0 - start = body.end() - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - return text[:start] + pattern.sub(repl, prefix) + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: - return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap and robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid/private artifact guard. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - restricted = [] - allowed = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed.append(rel) - else: - restricted.append(rel) - continue - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - restricted.append(rel) - REPORT["allowed_public_packages"] = allowed - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(sorted(set(restricted))[:120])) - - # Validation. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v4-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v4 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v4-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v4-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v4 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("Allowed public packages:", len(allowed)) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v4.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v4.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v4 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v4.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release bilingual GoalOS public site v4 [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v5-quebec-ai-seal.yml b/.github/workflows/goalos-public-site-release-v5-quebec-ai-seal.yml index d9ceeb12..02279081 100644 --- a/.github/workflows/goalos-public-site-release-v5-quebec-ai-seal.yml +++ b/.github/workflows/goalos-public-site-release-v5-quebec-ai-seal.yml @@ -1,779 +1,25 @@ -name: GoalOS Public Site Release v5 QUEBEC.AI Seal +name: goalos-public-site-release-v5-quebec-ai-seal (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v5-quebec-ai-seal - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh bilingual opulent public site with QUEBEC.AI Seal + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate bilingual opulent GoalOS public site with QUEBEC.AI Seal - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v5.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d") - NOW = datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat() - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v5_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "release": "GoalOS public site release v5 QUEBEC.AI seal bilingual opulent", - "web_root": str(WEB_ROOT), - "mission": "Unified bilingual opulent public website with QUEBEC.AI seal, RSI Sprint Workshop, public product ladder, AEP standards, Cloud MVP, and paid-material guard.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "allowed_public_packages": [], - "quebec_ai_seal": {}, - "validation": {}, - "paid_artifact_policy": "Paid buyer products and private workshop/implementation/enterprise delivery materials are not uploaded to the public site." - } - - OFFERS = [ - { - "slug":"goalos-ai-efficiency-sprint-kit", - "price":"$49", - "title_en":"GoalOS AI Efficiency Sprint Kit", - "title_fr":"Trousse GoalOS — Sprint d’efficacité IA", - "promise_en":"Build one reusable AI workflow.", - "promise_fr":"Construisez un flux IA réutilisable.", - "type_en":"Self-serve digital product", - "type_fr":"Produit numérique autonome", - "audience_en":"AI beginners, creators, freelancers, consultants, small-business owners, solo operators.", - "audience_fr":"Débutants IA, créateurs, travailleurs autonomes, consultants, PME et opérateurs solo.", - "bullets_en":["60-minute guided first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"], - "bullets_fr":["première victoire guidée en 60 minutes","constructeur de flux hors ligne","prompts copier-coller","modèles éditables","exemples débutants complétés","note de preuve"] - }, - { - "slug":"goalos-rsi-lite", - "price":"$199", - "title_en":"GoalOS RSI Lite", - "title_fr":"GoalOS RSI Lite", - "promise_en":"Build one self-improving AI workflow.", - "promise_fr":"Construisez un flux IA auto-améliorant.", - "type_en":"Premium self-serve system", - "type_fr":"Système autonome premium", - "audience_en":"Serious operators, consultants, agencies, creators, and small teams.", - "audience_fr":"Opérateurs sérieux, consultants, agences, créateurs et petites équipes.", - "bullets_en":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"], - "bullets_fr":["guide RSI Lite","constructeur hors ligne","grille de score","suivi des versions","prompts d’amélioration","exemples v1.0 à v1.2"] - }, - { - "slug":"goalos-proof-room-lite", - "price":"$997", - "title_en":"GoalOS Proof Room Lite / Department Pack", - "title_fr":"GoalOS Proof Room Lite / Pack Département", - "promise_en":"Set up a lightweight department Proof Room.", - "promise_fr":"Mettez en place une Salle de preuve légère pour un département.", - "type_en":"Premium department pack", - "type_fr":"Pack département premium", - "audience_en":"Department leads, operations managers, AI champions, team leads, and innovation leaders.", - "audience_fr":"Responsables de département, gestionnaires des opérations, champions IA, chefs d’équipe et responsables innovation.", - "bullets_en":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"], - "bullets_fr":["charte de Salle de preuve","carte de permissions IA","fiches responsables de flux","notes de preuve","revues hebdomadaires","rapports exécutifs","reçus de rollback","preuve publique sécuritaire"] - }, - { - "slug":"goalos-rsi-sprint-workshop", - "price":"$2,500+", - "title_en":"GoalOS RSI Sprint Workshop", - "title_fr":"Atelier GoalOS RSI Sprint", - "promise_en":"Build the first self-improving workflow live.", - "promise_fr":"Construisez le premier flux auto-améliorant en direct.", - "type_en":"Premium private workshop", - "type_fr":"Atelier privé premium", - "audience_en":"Founders, operators, teams, consultants, agencies, and AI champions.", - "audience_fr":"Fondateurs, opérateurs, équipes, consultants, agences et champions IA.", - "bullets_en":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","version record","proof note","public-safe proof-card draft","30-day next-run plan"], - "bullets_fr":["flux v1.0","première sortie","grille de score","diagnostic","flux v1.1","registre de version","note de preuve","brouillon de carte de preuve publique sécuritaire","plan de réexécution sur 30 jours"] - }, - { - "slug":"goalos-proof-room-implementation-sprint", - "price":"$9,500+", - "title_en":"GoalOS Proof Room Implementation Sprint", - "title_fr":"Sprint de mise en œuvre GoalOS Proof Room", - "promise_en":"Department RSI in 30 days.", - "promise_fr":"RSI départemental en 30 jours.", - "type_en":"Done-with-you implementation", - "type_fr":"Mise en œuvre accompagnée", - "audience_en":"Department leaders, AI champions, operations executives, and innovation teams.", - "audience_fr":"Responsables de département, champions IA, dirigeants opérations et équipes innovation.", - "bullets_en":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"], - "bullets_fr":["3 flux de travail","responsables et réviseurs","carte de permissions IA","revue de preuve hebdomadaire","rapport mensuel","procédure de rollback","brouillon d’étude de cas"] - }, - { - "slug":"goalos-enterprise-rsi-pilot", - "price":"$49,000+", - "title_en":"GoalOS Enterprise RSI Pilot", - "title_fr":"GoalOS Enterprise RSI Pilot", - "promise_en":"Pilot the Recursive Workflow OS.", - "promise_fr":"Pilotez le Recursive Workflow OS.", - "type_en":"Enterprise pilot", - "type_fr":"Pilote entreprise", - "audience_en":"Enterprise AI governance, CIO/CDO offices, support/operations executives, and platform sponsors.", - "audience_fr":"Gouvernance IA d’entreprise, bureaux CIO/CDO, dirigeants support/opérations et sponsors plateforme.", - "bullets_en":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"], - "bullets_fr":["pilote de 90 jours","une famille de flux","suite de benchmarks","dossiers de preuve","proposition v1.1","porte d’approbation","blueprint d’architecture"] - }, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution","Constitution GoalOS Proof-of-Evolution"), - ("AEP-002","Evidence Docket Standard","Standard du dossier de preuve"), - ("AEP-003","ProofPacket Schema","Schéma ProofPacket"), - ("AEP-004","Selection Gate Standard","Standard de porte de sélection"), - ("AEP-005","Tool Permission Standard","Standard de permission des outils"), - ("AEP-006","Rollback Receipt Standard","Standard du reçu de rollback"), - ("AEP-007","Public-Safe Proof Report Standard","Standard de rapport de preuve publique sécuritaire"), - ("AEP-008","Proof Room Standard","Standard de Salle de preuve"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Construire un flux IA réutilisable","Customer question → clear reply.","Question client → réponse claire."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Flux récursivement auto-améliorants","Run, score, diagnose, improve, version, prove, and re-run.","Exécuter, noter, diagnostiquer, améliorer, versionner, prouver et réexécuter."), - ("department-proof-room-lite","Department Proof Room Lite","Proof Room Lite départemental","Set up owners, permissions, proof notes, reviews, reports, and rollback.","Mettre en place responsables, permissions, notes de preuve, revues, rapports et rollback."), - ("department-ai-permission-map","AI Permission Map","Carte de permissions IA","Green / Yellow / Red boundaries for department AI use.","Limites Vert / Jaune / Rouge pour l’usage IA départemental."), - ("department-public-safe-case-study","Public-safe case study","Étude de cas publique sécuritaire","Turn internal proof into safe external evidence.","Transformer la preuve interne en preuve externe sécuritaire."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - # QUEBEC.AI seal: copy the repository asset into the public site assets. - seal_candidates = [ - Path("assets/quebecaisealv5.png"), - Path("site/assets/quebecaisealv5.png"), - Path("public/assets/quebecaisealv5.png"), - WEB_ROOT / "assets" / "quebecaisealv5.png", - ] - seal_dest = ASSETS / "quebecaisealv5.png" - seal_source = None - for c in seal_candidates: - if c.exists() and c.is_file(): - seal_source = c - break - if seal_source: - if seal_source.resolve() != seal_dest.resolve(): - shutil.copy2(seal_source, seal_dest) - REPORT["quebec_ai_seal"] = { - "status": "copied", - "source": str(seal_source), - "destination": str(seal_dest), - "emoji": "⚜️✨" - } - else: - REPORT["quebec_ai_seal"] = { - "status": "missing_repo_asset_but_text_badge_rendered", - "expected_path": "assets/quebecaisealv5.png", - "emoji": "⚜️✨" - } - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.082);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--champagne:#fff3bf;--blue:#9eb9ff;--green:#7ce0a3;--radius:28px;--shadow:0 32px 90px rgba(0,0,0,.38)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 13% -8%,rgba(143,179,255,.24),transparent 35rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.16),transparent 31rem),radial-gradient(circle at 50% 110%,rgba(124,224,163,.08),transparent 34rem),linear-gradient(180deg,#05070d,#080b13 56%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(20px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1280px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:12px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.04em}.goalos-mark{width:35px;height:35px;border-radius:11px;border:1px solid rgba(255,215,106,.68);display:grid;place-items:center;color:var(--gold);font-weight:950;background:linear-gradient(145deg,rgba(255,215,106,.16),rgba(255,255,255,.04))}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:12.7px;text-decoration:none;padding:9px 10px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.seal-mini{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(255,215,106,.35);background:rgba(255,215,106,.07);border-radius:999px;padding:6px 8px;color:var(--champagne);font-weight:950;text-decoration:none;font-size:12px}.seal-mini img{width:24px;height:24px;object-fit:contain;border-radius:50%}.quebec-seal{display:flex;align-items:center;gap:14px;border:1px solid rgba(255,215,106,.34);background:linear-gradient(135deg,rgba(255,215,106,.12),rgba(255,255,255,.035));border-radius:22px;padding:14px 16px;max-width:520px;margin:18px 0}.quebec-seal img{width:62px;height:62px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 12px 20px rgba(0,0,0,.35))}.quebec-seal strong{display:block;color:var(--champagne);letter-spacing:-.02em}.quebec-seal span{color:var(--muted);font-size:14px}.wrap{width:min(1280px,calc(100% - 36px));margin:0 auto;padding:72px 0 96px}.hero{padding:46px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.23em;font-weight:950;font-size:12px;margin-bottom:18px}.kicker{color:var(--champagne);font-weight:900;letter-spacing:-.02em}.wrap h1{font-size:clamp(52px,8.3vw,116px);line-height:.85;letter-spacing:-.088em;margin:0 0 24px;max-width:1180px}.wrap h2{font-size:clamp(34px,5.4vw,68px);line-height:.92;letter-spacing:-.068em;margin:0 0 18px}.wrap h3{font-size:24px;letter-spacing:-.045em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:980px;margin:0 0 24px}.fr{color:#dce3ff}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:950;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:linear-gradient(135deg,var(--gold),#ffe9a3);color:#05070d;border-color:var(--gold)}.section{margin:66px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:32px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:23px;text-decoration:none;display:flex;flex-direction:column;min-height:205px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 90% 0%,rgba(255,215,106,.09),transparent 18rem);pointer-events:none}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.52)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:46px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(27px,3.6vw,48px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:950;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.78)}.footer-inner{width:min(1280px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:1020px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.wrap{padding-top:42px}.loop{display:flex;white-space:normal;border-radius:22px}.quebec-seal{max-width:none}.quebec-seal img{width:52px;height:52px}} - """ - (ASSETS / "goalos-opulent-v5.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-opulent-v5.js").write_text(JS, encoding="utf-8") - - OG = """QUEBEC.AI ⚜️✨ · GOALOSA model can answer.An agent can act.An institution must prove.Recursive workflows · RSI Sprint Workshop · Proof Rooms""" - (ASSETS / "goalos-opulent-og.svg").write_text(OG, encoding="utf-8") - - SEAL_IMG = f'{BASE}/assets/quebecaisealv5.png' - SEAL_BADGE = f"""
QUEBEC.AI Seal ⚜️✨
QUEBEC.AI Seal ⚜️✨Institutional AI workflow proof, bilingual by design.
Preuve institutionnelle des flux IA, bilingue par conception.
""" - NAV = f""" -
- -
- """ - - FOOTER = f""" -
- -
- """ - - def page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - def offer_card(o): - return f""" - {escape(o['price'])} -

{escape(o['title_en'])}

-

{escape(o['title_fr'])}

-

{escape(o['promise_en'])}

-

{escape(o['promise_fr'])}

-
""" - - # Core pages. - write_page("", "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", "Bilingual GoalOS public site for recursive workflows, Proof Rooms, and RSI Sprint Workshop.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-

GoalOS transforme le travail IA répété en flux possédés, notés, versionnés, approuvés, surveillés et récursivement améliorés.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- {SEAL_BADGE} - -
-
-
Featured / Offre phare
-

GoalOS RSI Sprint Workshop

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

- -
-
-
Software proof / Preuve logicielle
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

GoalOS Cloud MVP 0.2 prouve l’amélioration récursive des flux en logiciel.

- -
-
-
Commercial ladder / Parcours commercial
-

From reusable workflow to Enterprise RSI.

-
{''.join(offer_card(o) for o in OFFERS)}
-
-
-

Safe boundary / Limite claire

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-

GoalOS ne modifie pas les modèles IA. Il améliore les flux autour de l’IA grâce aux instructions, vérifications, grilles de score, dossiers de preuve, mémoire, standards de preuve, versions, approbations, surveillance et rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Bilingual starting point for GoalOS products and services.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

Flux réutilisable, flux auto-améliorant, Salle de preuve départementale, atelier RSI Sprint, sprint de mise en œuvre ou pilote entreprise.

{SEAL_BADGE}
{''.join(offer_card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "Bilingual GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

Commencez avec un flux IA réutilisable, passez aux flux auto-améliorants, puis installez des Salles de preuve et l’Enterprise RSI.

{''.join(offer_card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title_en'])}
{escape(o['title_fr'])}{escape(o['promise_en'])}
{escape(o['promise_fr'])}{escape(o['type_en'])}
{escape(o['type_fr'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "Bilingual GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

Un parcours clair, de la première trousse au pilote entreprise.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "Bilingual GoalOS services and enterprise pilots.", f"""
Services / Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

Utilisez les services pour générer des preuves, installer des Salles de preuve départementales et valider la plateforme entreprise.

{''.join(offer_card(o) for o in OFFERS[3:])}
""") - - # Offer detail pages. - for o in OFFERS: - seal = SEAL_BADGE if o["slug"] in ["goalos-rsi-sprint-workshop", "goalos-enterprise-rsi-pilot", "goalos-proof-room-lite"] else "" - write_page(f"products/{o['slug']}", o["title_en"], o["promise_en"], f"""
{escape(o['price'])} · {escape(o['type_en'])}

{escape(o['title_en'])}

{escape(o['title_fr'])}

{escape(o['promise_en'])}

{escape(o['promise_fr'])}

Best for: {escape(o['audience_en'])}

Idéal pour : {escape(o['audience_fr'])}

{seal}
{escape(o['price'])}

Included / Inclus

{bullets(o['bullets_en'])}

Français

{bullets(o['bullets_fr'])}

Boundary / Limite

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

Aucune garantie de ROI, de revenu, de certification de conformité, de sécurité, de conseil juridique ou de déploiement autonome incontrôlé. La revue humaine est requise.

""") - - # Workshop public page — with seal and v6 public positioning. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- {SEAL_BADGE} - -
-
-

What you leave with / Ce que vous obtenez

-
-
1Workflow v1.0
Flux v1.0
-
2First run output
Première sortie
-
3Scorecard
Grille de score
-
4Diagnosis
Diagnostic
-
5Workflow v1.1
Flux v1.1
-
6Proof note
Note de preuve
-
-
-
-

Premium delivery standard / Standard de livraison premium

-

One repeated task. One live workflow loop. One public-safe proof-card draft. One 30-day next-run plan.

-

Une tâche répétée. Une boucle de flux en direct. Un brouillon de carte de preuve publique sécuritaire. Un plan de réexécution sur 30 jours.

-
-
-

Safe boundary / Limite claire

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-

GoalOS RSI Sprint Workshop ne modifie pas les modèles IA. Il améliore le flux autour de votre assistant IA grâce aux instructions, vérifications, grilles de score, notes de preuve, versions et revue humaine.

-
- """) - - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

{SEAL_BADGE}

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

En 30 jours, mettez en place la première version d’une Salle de preuve légère pour trois flux IA répétés d’un département.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

""") - - enterprise_body = f"""
QUEBEC.AI ⚜️✨ · Enterprise RSI / RSI entreprise

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Pilotez le Recursive Workflow Operating System pour une famille de flux entreprise.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
{SEAL_BADGE}

Formal platform name / Nom formel

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

Un MVP public qui prouve : exécuter, noter, prouver, diagnostiquer, améliorer, approuver, versionner, surveiller et réexécuter.

What it proves / Ce qu’il prouve

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

Run the GoalOS Cloud MVP v0.2 action to install the interactive public app.

Exécutez l’action GoalOS Cloud MVP v0.2 pour installer l’application publique interactive.

""") - - standards_cards = "".join(f'AEP

{escape(code)}

{escape(en)}

{escape(fr)}

' for code,en,fr in STANDARDS) - write_page("standards", "AEP Standards", "Bilingual Proof Gradient standards.", f"""
AEP Standards / Standards AEP

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

Les standards AEP donnent le vocabulaire de preuve, permission, rollback, rapports publics sécuritaires et Salles de preuve.

{standards_cards}
""") - for code,en,fr in STANDARDS: - if not (WEB_ROOT / "standards" / code / "index.html").exists(): - write_page(f"standards/{code}", f"{code} — {en}", en, f"""
AEP Standard

{escape(code)} — {escape(en)}

{escape(fr)}

Public trust layer for GoalOS and Proof Gradient.

""") - - examples_cards = "".join(f'Example

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

' for slug,en,fr,desc_en,desc_fr in EXAMPLES) - write_page("examples", "GoalOS Examples", "Bilingual GoalOS workflow examples.", f"""
Examples / Exemples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

Des exemples pour comprendre les flux réutilisables, RSI Lite, Proof Room Lite et RSI départemental.

{examples_cards}
""") - for slug,en,fr,desc_en,desc_fr in EXAMPLES: - if not (WEB_ROOT / "workflow" / slug / "index.html").exists(): - write_page(f"workflow/{slug}", en, desc_en, f"""
GoalOS Example / Exemple GoalOS

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

GoalOS structure / Structure GoalOS

Context → Rules → Memory → Workflow → Checks → Proof.

Contexte → Règles → Mémoire → Flux → Vérifications → Preuve.

""") - - command_cards = "".join(offer_card(o) for o in OFFERS) + f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

Preuve logicielle de flux récursif d’entreprise.

' - write_page("command-center", "GoalOS Command Center", "Bilingual GoalOS command center.", f"""
Command Center / Centre de commande

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

Recherchez dans le site unifié GoalOS / Proof Gradient.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] + [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{code}/" for code,_,_ in STANDARDS] + [f"/workflow/{slug}/" for slug,_,_,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Bilingual GoalOS site map.", f"""
Site Map / Plan du site

Unified site map.

Plan du site unifié.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

Utilisez le Centre de commande pour trouver la bonne page GoalOS.

"""), encoding="utf-8") - - # Public documentation. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V5_QUEBEC_AI_SEAL.md").write_text(f"""# GoalOS Public Site Release v5 — QUEBEC.AI Seal ⚜️✨ - - Generated: {NOW} - - ## Purpose - - Refresh the public Proof Gradient / GoalOS website as a bilingual, corporate, institutional, opulent public site with the QUEBEC.AI Seal. - - ## Seal - - The release copies: - - `assets/quebecaisealv5.png` - - to: - - `site/assets/quebecaisealv5.png` - - and displays it with: - - `QUEBEC.AI ⚜️✨` - - ## Includes - - - GoalOS RSI Sprint Workshop public pages - - product ladder - - pricing - - services - - Cloud MVP public page - - AEP standards - - examples - - command center - - paid/private artifact guard - - ## Paid file policy - - Paid buyer products and private delivery materials are not uploaded to the public site. - - All buy/apply buttons point to: - - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Shell repair across all HTML. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop|Atelier|QUEBEC)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: - return text, 0 - start = body.end() - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - return text[:start] + pattern.sub(repl, prefix) + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: - return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap and robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid/private artifact guard. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - restricted = [] - allowed = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed.append(rel) - else: - restricted.append(rel) - continue - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - restricted.append(rel) - REPORT["allowed_public_packages"] = allowed - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(sorted(set(restricted))[:120])) - - # Validation. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v5-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v5 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v5-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v5-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v5 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("QUEBEC.AI seal:", REPORT["quebec_ai_seal"]) - print("Allowed public packages:", len(allowed)) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v5.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v5.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal check. The image is strongly preferred. If missing, fail because v5 is specifically the QUEBEC.AI Seal release. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v5 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v5.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release bilingual GoalOS public site v5 with QUEBEC.AI seal [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v6-quebec-ai-seal-icon.yml b/.github/workflows/goalos-public-site-release-v6-quebec-ai-seal-icon.yml index c26309b2..7497b302 100644 --- a/.github/workflows/goalos-public-site-release-v6-quebec-ai-seal-icon.yml +++ b/.github/workflows/goalos-public-site-release-v6-quebec-ai-seal-icon.yml @@ -1,820 +1,25 @@ -name: GoalOS Public Site Release v6 QUEBEC.AI Seal + Icon +name: goalos-public-site-release-v6-quebec-ai-seal-icon (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v6-quebec-ai-seal-icon - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh bilingual opulent public site with QUEBEC.AI Seal and icon + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate bilingual opulent GoalOS public site with QUEBEC.AI Seal and icon - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v5.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - MAIN = "https://www.quebecartificialintelligence.com/" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d") - NOW = datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat() - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v5_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "release": "GoalOS public site release v6 QUEBEC.AI seal bilingual opulent", - "web_root": str(WEB_ROOT), - "mission": "Unified bilingual opulent public website with QUEBEC.AI seal, RSI Sprint Workshop, public product ladder, AEP standards, Cloud MVP, and paid-material guard.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "allowed_public_packages": [], - "quebec_ai_seal": {}, - "validation": {}, - "paid_artifact_policy": "Paid buyer products and private workshop/implementation/enterprise delivery materials are not uploaded to the public site." - } - - OFFERS = [ - { - "slug":"goalos-ai-efficiency-sprint-kit", - "price":"$49", - "title_en":"GoalOS AI Efficiency Sprint Kit", - "title_fr":"Trousse GoalOS — Sprint d’efficacité IA", - "promise_en":"Build one reusable AI workflow.", - "promise_fr":"Construisez un flux IA réutilisable.", - "type_en":"Self-serve digital product", - "type_fr":"Produit numérique autonome", - "audience_en":"AI beginners, creators, freelancers, consultants, small-business owners, solo operators.", - "audience_fr":"Débutants IA, créateurs, travailleurs autonomes, consultants, PME et opérateurs solo.", - "bullets_en":["60-minute guided first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"], - "bullets_fr":["première victoire guidée en 60 minutes","constructeur de flux hors ligne","prompts copier-coller","modèles éditables","exemples débutants complétés","note de preuve"] - }, - { - "slug":"goalos-rsi-lite", - "price":"$199", - "title_en":"GoalOS RSI Lite", - "title_fr":"GoalOS RSI Lite", - "promise_en":"Build one self-improving AI workflow.", - "promise_fr":"Construisez un flux IA auto-améliorant.", - "type_en":"Premium self-serve system", - "type_fr":"Système autonome premium", - "audience_en":"Serious operators, consultants, agencies, creators, and small teams.", - "audience_fr":"Opérateurs sérieux, consultants, agences, créateurs et petites équipes.", - "bullets_en":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"], - "bullets_fr":["guide RSI Lite","constructeur hors ligne","grille de score","suivi des versions","prompts d’amélioration","exemples v1.0 à v1.2"] - }, - { - "slug":"goalos-proof-room-lite", - "price":"$997", - "title_en":"GoalOS Proof Room Lite / Department Pack", - "title_fr":"GoalOS Proof Room Lite / Pack Département", - "promise_en":"Set up a lightweight department Proof Room.", - "promise_fr":"Mettez en place une Salle de preuve légère pour un département.", - "type_en":"Premium department pack", - "type_fr":"Pack département premium", - "audience_en":"Department leads, operations managers, AI champions, team leads, and innovation leaders.", - "audience_fr":"Responsables de département, gestionnaires des opérations, champions IA, chefs d’équipe et responsables innovation.", - "bullets_en":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"], - "bullets_fr":["charte de Salle de preuve","carte de permissions IA","fiches responsables de flux","notes de preuve","revues hebdomadaires","rapports exécutifs","reçus de rollback","preuve publique sécuritaire"] - }, - { - "slug":"goalos-rsi-sprint-workshop", - "price":"$2,500+", - "title_en":"GoalOS RSI Sprint Workshop", - "title_fr":"Atelier GoalOS RSI Sprint", - "promise_en":"Build the first self-improving workflow live.", - "promise_fr":"Construisez le premier flux auto-améliorant en direct.", - "type_en":"Premium private workshop", - "type_fr":"Atelier privé premium", - "audience_en":"Founders, operators, teams, consultants, agencies, and AI champions.", - "audience_fr":"Fondateurs, opérateurs, équipes, consultants, agences et champions IA.", - "bullets_en":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","version record","proof note","public-safe proof-card draft","30-day next-run plan"], - "bullets_fr":["flux v1.0","première sortie","grille de score","diagnostic","flux v1.1","registre de version","note de preuve","brouillon de carte de preuve publique sécuritaire","plan de réexécution sur 30 jours"] - }, - { - "slug":"goalos-proof-room-implementation-sprint", - "price":"$9,500+", - "title_en":"GoalOS Proof Room Implementation Sprint", - "title_fr":"Sprint de mise en œuvre GoalOS Proof Room", - "promise_en":"Department RSI in 30 days.", - "promise_fr":"RSI départemental en 30 jours.", - "type_en":"Done-with-you implementation", - "type_fr":"Mise en œuvre accompagnée", - "audience_en":"Department leaders, AI champions, operations executives, and innovation teams.", - "audience_fr":"Responsables de département, champions IA, dirigeants opérations et équipes innovation.", - "bullets_en":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"], - "bullets_fr":["3 flux de travail","responsables et réviseurs","carte de permissions IA","revue de preuve hebdomadaire","rapport mensuel","procédure de rollback","brouillon d’étude de cas"] - }, - { - "slug":"goalos-enterprise-rsi-pilot", - "price":"$49,000+", - "title_en":"GoalOS Enterprise RSI Pilot", - "title_fr":"GoalOS Enterprise RSI Pilot", - "promise_en":"Pilot the Recursive Workflow OS.", - "promise_fr":"Pilotez le Recursive Workflow OS.", - "type_en":"Enterprise pilot", - "type_fr":"Pilote entreprise", - "audience_en":"Enterprise AI governance, CIO/CDO offices, support/operations executives, and platform sponsors.", - "audience_fr":"Gouvernance IA d’entreprise, bureaux CIO/CDO, dirigeants support/opérations et sponsors plateforme.", - "bullets_en":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"], - "bullets_fr":["pilote de 90 jours","une famille de flux","suite de benchmarks","dossiers de preuve","proposition v1.1","porte d’approbation","blueprint d’architecture"] - }, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution","Constitution GoalOS Proof-of-Evolution"), - ("AEP-002","Evidence Docket Standard","Standard du dossier de preuve"), - ("AEP-003","ProofPacket Schema","Schéma ProofPacket"), - ("AEP-004","Selection Gate Standard","Standard de porte de sélection"), - ("AEP-005","Tool Permission Standard","Standard de permission des outils"), - ("AEP-006","Rollback Receipt Standard","Standard du reçu de rollback"), - ("AEP-007","Public-Safe Proof Report Standard","Standard de rapport de preuve publique sécuritaire"), - ("AEP-008","Proof Room Standard","Standard de Salle de preuve"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Construire un flux IA réutilisable","Customer question → clear reply.","Question client → réponse claire."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Flux récursivement auto-améliorants","Run, score, diagnose, improve, version, prove, and re-run.","Exécuter, noter, diagnostiquer, améliorer, versionner, prouver et réexécuter."), - ("department-proof-room-lite","Department Proof Room Lite","Proof Room Lite départemental","Set up owners, permissions, proof notes, reviews, reports, and rollback.","Mettre en place responsables, permissions, notes de preuve, revues, rapports et rollback."), - ("department-ai-permission-map","AI Permission Map","Carte de permissions IA","Green / Yellow / Red boundaries for department AI use.","Limites Vert / Jaune / Rouge pour l’usage IA départemental."), - ("department-public-safe-case-study","Public-safe case study","Étude de cas publique sécuritaire","Turn internal proof into safe external evidence.","Transformer la preuve interne en preuve externe sécuritaire."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - # QUEBEC.AI seal: copy the repository asset into the public site assets and use it as site icon. - seal_candidates = [ - Path("assets/quebecaisealv5.png"), - Path("site/assets/quebecaisealv5.png"), - Path("public/assets/quebecaisealv5.png"), - WEB_ROOT / "assets" / "quebecaisealv5.png", - ] - seal_dest = ASSETS / "quebecaisealv5.png" - seal_source = None - for c in seal_candidates: - if c.exists() and c.is_file(): - seal_source = c - break - - if not seal_source: - raise SystemExit("Missing QUEBEC.AI Seal. Expected repository asset: assets/quebecaisealv5.png") - - if seal_source.resolve() != seal_dest.resolve(): - shutil.copy2(seal_source, seal_dest) - - # Use the exact seal as favicon / app icons. This keeps the public site brand-consistent. - shutil.copy2(seal_dest, WEB_ROOT / "favicon.png") - for icon_name in ["apple-touch-icon.png", "icon-192.png", "icon-512.png"]: - shutil.copy2(seal_dest, ASSETS / icon_name) - - webmanifest = { - "name": "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", - "short_name": "GoalOS ⚜️✨", - "description": "Bilingual public site for GoalOS Recursive Workflow OS, RSI Sprint Workshop, and Proof Rooms.", - "start_url": f"{BASE}/", - "scope": f"{BASE}/", - "display": "standalone", - "background_color": "#05070d", - "theme_color": "#ffd76a", - "icons": [ - {"src": f"{BASE}/assets/icon-192.png", "sizes": "192x192", "type": "image/png"}, - {"src": f"{BASE}/assets/icon-512.png", "sizes": "512x512", "type": "image/png"} - ] - } - (WEB_ROOT / "site.webmanifest").write_text(json.dumps(webmanifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") - - REPORT["quebec_ai_seal"] = { - "status": "copied_and_used_as_icon", - "source": str(seal_source), - "destination": str(seal_dest), - "favicon": "favicon.png", - "apple_touch_icon": "assets/apple-touch-icon.png", - "manifest": "site.webmanifest", - "emoji": "⚜️✨", - "main": MAIN - } - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.082);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--champagne:#fff3bf;--blue:#9eb9ff;--green:#7ce0a3;--radius:28px;--shadow:0 32px 90px rgba(0,0,0,.38)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 13% -8%,rgba(143,179,255,.24),transparent 35rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.16),transparent 31rem),radial-gradient(circle at 50% 110%,rgba(124,224,163,.08),transparent 34rem),linear-gradient(180deg,#05070d,#080b13 56%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(20px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1280px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:12px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.04em}.goalos-mark{width:35px;height:35px;border-radius:11px;border:1px solid rgba(255,215,106,.68);display:grid;place-items:center;color:var(--gold);font-weight:950;background:linear-gradient(145deg,rgba(255,215,106,.16),rgba(255,255,255,.04))}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:12.7px;text-decoration:none;padding:9px 10px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.seal-mini{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(255,215,106,.35);background:rgba(255,215,106,.07);border-radius:999px;padding:6px 8px;color:var(--champagne);font-weight:950;text-decoration:none;font-size:12px}.seal-mini img{width:24px;height:24px;object-fit:contain;border-radius:50%}.quebec-seal{display:flex;align-items:center;gap:14px;border:1px solid rgba(255,215,106,.34);background:linear-gradient(135deg,rgba(255,215,106,.12),rgba(255,255,255,.035));border-radius:22px;padding:14px 16px;max-width:520px;margin:18px 0}.quebec-seal img{width:62px;height:62px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 12px 20px rgba(0,0,0,.35))}.quebec-seal strong{display:block;color:var(--champagne);letter-spacing:-.02em}.quebec-seal span{color:var(--muted);font-size:14px}.wrap{width:min(1280px,calc(100% - 36px));margin:0 auto;padding:72px 0 96px}.hero{padding:46px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.23em;font-weight:950;font-size:12px;margin-bottom:18px}.kicker{color:var(--champagne);font-weight:900;letter-spacing:-.02em}.wrap h1{font-size:clamp(52px,8.3vw,116px);line-height:.85;letter-spacing:-.088em;margin:0 0 24px;max-width:1180px}.wrap h2{font-size:clamp(34px,5.4vw,68px);line-height:.92;letter-spacing:-.068em;margin:0 0 18px}.wrap h3{font-size:24px;letter-spacing:-.045em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:980px;margin:0 0 24px}.fr{color:#dce3ff}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:950;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:linear-gradient(135deg,var(--gold),#ffe9a3);color:#05070d;border-color:var(--gold)}.section{margin:66px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:32px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:23px;text-decoration:none;display:flex;flex-direction:column;min-height:205px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 90% 0%,rgba(255,215,106,.09),transparent 18rem);pointer-events:none}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.52)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:46px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(27px,3.6vw,48px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:950;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.78)}.footer-inner{width:min(1280px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:1020px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.wrap{padding-top:42px}.loop{display:flex;white-space:normal;border-radius:22px}.quebec-seal{max-width:none}.quebec-seal img{width:52px;height:52px}} - """ - CSS += "\n.seal-orbit{position:absolute;right:-30px;top:-40px;width:390px;height:390px;opacity:.13;background:url('/proof-gradient/assets/quebecaisealv5.png') center/contain no-repeat;filter:drop-shadow(0 40px 80px rgba(255,215,106,.23));pointer-events:none}.hero{position:relative;overflow:hidden}.sovereign-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.sovereign-strip div{border:1px solid rgba(255,215,106,.25);border-radius:20px;padding:16px;background:rgba(255,215,106,.045)}.sovereign-strip strong{display:block;color:var(--champagne);font-size:13px;text-transform:uppercase;letter-spacing:.16em;margin-bottom:8px}.sovereign-strip span{color:var(--muted);line-height:1.4}.seal-divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,215,106,.6),transparent);margin:24px 0}.quebec-main-link{color:var(--champagne);text-decoration:none;font-weight:950}.quebec-main-link:hover{text-decoration:underline}@media(max-width:1020px){.sovereign-strip{grid-template-columns:1fr}.seal-orbit{width:240px;height:240px;opacity:.08}}\n" - (ASSETS / "goalos-sovereign-v6.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-sovereign-v6.js").write_text(JS, encoding="utf-8") - - OG = """QUEBEC.AI ⚜️✨ · GOALOSA model can answer.An agent can act.An institution must prove.Recursive workflows · RSI Sprint Workshop · Proof Rooms""" - (ASSETS / "goalos-opulent-og.svg").write_text(OG, encoding="utf-8") - - SEAL_IMG = f'{BASE}/assets/quebecaisealv5.png' - SEAL_BADGE = f"""
QUEBEC.AI Seal ⚜️✨
QUEBEC.AI Seal ⚜️✨Institutional AI workflow proof, bilingual by design.
Preuve institutionnelle des flux IA, bilingue par conception.
""" - NAV = f""" -
- -
- """ - - FOOTER = f""" -
- -
- """ - - def page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - def offer_card(o): - return f""" - {escape(o['price'])} -

{escape(o['title_en'])}

-

{escape(o['title_fr'])}

-

{escape(o['promise_en'])}

-

{escape(o['promise_fr'])}

-
""" - - # Core pages. - write_page("", "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", "Bilingual GoalOS public site for recursive workflows, Proof Rooms, and RSI Sprint Workshop.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-

GoalOS transforme le travail IA répété en flux possédés, notés, versionnés, approuvés, surveillés et récursivement améliorés.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
- {SEAL_BADGE} -
-
Frontier / FrontièreAI workflows designed for the infrastructure era.
Des flux IA conçus pour l’ère des infrastructures.
-
AI‑First / IA d’abordOperations rebuilt around reusable, improving intelligence.
Des opérations reconstruites autour d’une intelligence réutilisable et améliorable.
-
Sovereign / SouverainProof, governance, review, and rollback remain visible.
Preuve, gouvernance, revue et rollback restent visibles.
-
- -
-
-
Featured / Offre phare
-

GoalOS RSI Sprint Workshop

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

- -
-
-
Software proof / Preuve logicielle
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

GoalOS Cloud MVP 0.2 prouve l’amélioration récursive des flux en logiciel.

- -
-
-
Commercial ladder / Parcours commercial
-

From reusable workflow to Enterprise RSI.

-
{''.join(offer_card(o) for o in OFFERS)}
-
-
-

Safe boundary / Limite claire

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-

GoalOS ne modifie pas les modèles IA. Il améliore les flux autour de l’IA grâce aux instructions, vérifications, grilles de score, dossiers de preuve, mémoire, standards de preuve, versions, approbations, surveillance et rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Bilingual starting point for GoalOS products and services.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

Flux réutilisable, flux auto-améliorant, Salle de preuve départementale, atelier RSI Sprint, sprint de mise en œuvre ou pilote entreprise.

{SEAL_BADGE}
{''.join(offer_card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "Bilingual GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

Commencez avec un flux IA réutilisable, passez aux flux auto-améliorants, puis installez des Salles de preuve et l’Enterprise RSI.

{''.join(offer_card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title_en'])}
{escape(o['title_fr'])}{escape(o['promise_en'])}
{escape(o['promise_fr'])}{escape(o['type_en'])}
{escape(o['type_fr'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "Bilingual GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

Un parcours clair, de la première trousse au pilote entreprise.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "Bilingual GoalOS services and enterprise pilots.", f"""
Services / Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

Utilisez les services pour générer des preuves, installer des Salles de preuve départementales et valider la plateforme entreprise.

{''.join(offer_card(o) for o in OFFERS[3:])}
""") - - # Offer detail pages. - for o in OFFERS: - seal = SEAL_BADGE if o["slug"] in ["goalos-rsi-sprint-workshop", "goalos-enterprise-rsi-pilot", "goalos-proof-room-lite"] else "" - write_page(f"products/{o['slug']}", o["title_en"], o["promise_en"], f"""
{escape(o['price'])} · {escape(o['type_en'])}

{escape(o['title_en'])}

{escape(o['title_fr'])}

{escape(o['promise_en'])}

{escape(o['promise_fr'])}

Best for: {escape(o['audience_en'])}

Idéal pour : {escape(o['audience_fr'])}

{seal}
{escape(o['price'])}

Included / Inclus

{bullets(o['bullets_en'])}

Français

{bullets(o['bullets_fr'])}

Boundary / Limite

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

Aucune garantie de ROI, de revenu, de certification de conformité, de sécurité, de conseil juridique ou de déploiement autonome incontrôlé. La revue humaine est requise.

""") - - # Workshop public page — with seal and v6 public positioning. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- {SEAL_BADGE} - -
-
-

What you leave with / Ce que vous obtenez

-
-
1Workflow v1.0
Flux v1.0
-
2First run output
Première sortie
-
3Scorecard
Grille de score
-
4Diagnosis
Diagnostic
-
5Workflow v1.1
Flux v1.1
-
6Proof note
Note de preuve
-
-
-
-

Premium delivery standard / Standard de livraison premium

-

One repeated task. One live workflow loop. One public-safe proof-card draft. One 30-day next-run plan.

-

Une tâche répétée. Une boucle de flux en direct. Un brouillon de carte de preuve publique sécuritaire. Un plan de réexécution sur 30 jours.

-
-
-

Safe boundary / Limite claire

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-

GoalOS RSI Sprint Workshop ne modifie pas les modèles IA. Il améliore le flux autour de votre assistant IA grâce aux instructions, vérifications, grilles de score, notes de preuve, versions et revue humaine.

-
- """) - - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

{SEAL_BADGE}

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

En 30 jours, mettez en place la première version d’une Salle de preuve légère pour trois flux IA répétés d’un département.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

""") - - enterprise_body = f"""
QUEBEC.AI ⚜️✨ · Enterprise RSI / RSI entreprise

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Pilotez le Recursive Workflow Operating System pour une famille de flux entreprise.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
{SEAL_BADGE}

Formal platform name / Nom formel

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

Un MVP public qui prouve : exécuter, noter, prouver, diagnostiquer, améliorer, approuver, versionner, surveiller et réexécuter.

What it proves / Ce qu’il prouve

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

Run the GoalOS Cloud MVP v0.2 action to install the interactive public app.

Exécutez l’action GoalOS Cloud MVP v0.2 pour installer l’application publique interactive.

""") - - standards_cards = "".join(f'AEP

{escape(code)}

{escape(en)}

{escape(fr)}

' for code,en,fr in STANDARDS) - write_page("standards", "AEP Standards", "Bilingual Proof Gradient standards.", f"""
AEP Standards / Standards AEP

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

Les standards AEP donnent le vocabulaire de preuve, permission, rollback, rapports publics sécuritaires et Salles de preuve.

{standards_cards}
""") - for code,en,fr in STANDARDS: - if not (WEB_ROOT / "standards" / code / "index.html").exists(): - write_page(f"standards/{code}", f"{code} — {en}", en, f"""
AEP Standard

{escape(code)} — {escape(en)}

{escape(fr)}

Public trust layer for GoalOS and Proof Gradient.

""") - - examples_cards = "".join(f'Example

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

' for slug,en,fr,desc_en,desc_fr in EXAMPLES) - write_page("examples", "GoalOS Examples", "Bilingual GoalOS workflow examples.", f"""
Examples / Exemples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

Des exemples pour comprendre les flux réutilisables, RSI Lite, Proof Room Lite et RSI départemental.

{examples_cards}
""") - for slug,en,fr,desc_en,desc_fr in EXAMPLES: - if not (WEB_ROOT / "workflow" / slug / "index.html").exists(): - write_page(f"workflow/{slug}", en, desc_en, f"""
GoalOS Example / Exemple GoalOS

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

GoalOS structure / Structure GoalOS

Context → Rules → Memory → Workflow → Checks → Proof.

Contexte → Règles → Mémoire → Flux → Vérifications → Preuve.

""") - - command_cards = "".join(offer_card(o) for o in OFFERS) + f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

Preuve logicielle de flux récursif d’entreprise.

' - write_page("command-center", "GoalOS Command Center", "Bilingual GoalOS command center.", f"""
Command Center / Centre de commande

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

Recherchez dans le site unifié GoalOS / Proof Gradient.

{command_cards}
""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/"] + [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{code}/" for code,_,_ in STANDARDS] + [f"/workflow/{slug}/" for slug,_,_,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Bilingual GoalOS site map.", f"""
Site Map / Plan du site

Unified site map.

Plan du site unifié.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

Utilisez le Centre de commande pour trouver la bonne page GoalOS.

"""), encoding="utf-8") - - # Public documentation. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V6_QUEBEC_AI_SEAL_ICON.md").write_text(f"""# GoalOS Public Site Release v6 — QUEBEC.AI Seal + Icon ⚜️✨ - - Generated: {NOW} - - ## Purpose - - Refresh the public Proof Gradient / GoalOS website as a bilingual, corporate, institutional, opulent public site with the QUEBEC.AI Seal. - - ## Seal - - The release copies: - - `assets/quebecaisealv5.png` - - to: - - `site/assets/quebecaisealv5.png` - - uses it as favicon / apple-touch-icon / web app icon, and displays it with: - - `QUEBEC.AI ⚜️✨` - - ## Includes - - - GoalOS RSI Sprint Workshop public pages - - product ladder - - pricing - - services - - Cloud MVP public page - - AEP standards - - examples - - command center - - paid/private artifact guard - - ## Paid file policy - - Paid buyer products and private delivery materials are not uploaded to the public site. - - All buy/apply buttons point to: - - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Shell repair across all HTML. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop|Atelier|QUEBEC)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: - return text, 0 - start = body.end() - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - return text[:start] + pattern.sub(repl, prefix) + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: - return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap and robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid/private artifact guard. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - restricted = [] - allowed = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed.append(rel) - else: - restricted.append(rel) - continue - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - restricted.append(rel) - REPORT["allowed_public_packages"] = allowed - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(sorted(set(restricted))[:120])) - - # Validation. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v6-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v6 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v6-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v6-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v6 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("QUEBEC.AI seal:", REPORT["quebec_ai_seal"]) - print("Allowed public packages:", len(allowed)) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v5.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v5.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v6 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v5.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release bilingual GoalOS public site v6 with QUEBEC.AI seal and icon [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v7-quebec-ai-brand-assets.yml b/.github/workflows/goalos-public-site-release-v7-quebec-ai-brand-assets.yml index 1f9635b6..1212faeb 100644 --- a/.github/workflows/goalos-public-site-release-v7-quebec-ai-brand-assets.yml +++ b/.github/workflows/goalos-public-site-release-v7-quebec-ai-brand-assets.yml @@ -1,906 +1,25 @@ -name: GoalOS Public Site Release v7 QUEBEC.AI Brand Assets +name: goalos-public-site-release-v7-quebec-ai-brand-assets (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v7-brand-assets - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh bilingual opulent public site with QUEBEC.AI Seal, icons, and brand assets + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate bilingual opulent GoalOS public site with QUEBEC.AI Seal, icons, and brand assets - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v5.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - MAIN = "https://www.quebecartificialintelligence.com/" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d") - NOW = datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat() - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v5_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "release": "GoalOS public site release v7 QUEBEC.AI seal bilingual opulent", - "web_root": str(WEB_ROOT), - "mission": "Unified bilingual opulent public website with QUEBEC.AI seal, RSI Sprint Workshop, public product ladder, AEP standards, Cloud MVP, and paid-material guard.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "allowed_public_packages": [], - "quebec_ai_seal": {}, - "validation": {}, - "paid_artifact_policy": "Paid buyer products and private workshop/implementation/enterprise delivery materials are not uploaded to the public site." - } - - OFFERS = [ - { - "slug":"goalos-ai-efficiency-sprint-kit", - "price":"$49", - "title_en":"GoalOS AI Efficiency Sprint Kit", - "title_fr":"Trousse GoalOS — Sprint d’efficacité IA", - "promise_en":"Build one reusable AI workflow.", - "promise_fr":"Construisez un flux IA réutilisable.", - "type_en":"Self-serve digital product", - "type_fr":"Produit numérique autonome", - "audience_en":"AI beginners, creators, freelancers, consultants, small-business owners, solo operators.", - "audience_fr":"Débutants IA, créateurs, travailleurs autonomes, consultants, PME et opérateurs solo.", - "bullets_en":["60-minute guided first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"], - "bullets_fr":["première victoire guidée en 60 minutes","constructeur de flux hors ligne","prompts copier-coller","modèles éditables","exemples débutants complétés","note de preuve"] - }, - { - "slug":"goalos-rsi-lite", - "price":"$199", - "title_en":"GoalOS RSI Lite", - "title_fr":"GoalOS RSI Lite", - "promise_en":"Build one self-improving AI workflow.", - "promise_fr":"Construisez un flux IA auto-améliorant.", - "type_en":"Premium self-serve system", - "type_fr":"Système autonome premium", - "audience_en":"Serious operators, consultants, agencies, creators, and small teams.", - "audience_fr":"Opérateurs sérieux, consultants, agences, créateurs et petites équipes.", - "bullets_en":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"], - "bullets_fr":["guide RSI Lite","constructeur hors ligne","grille de score","suivi des versions","prompts d’amélioration","exemples v1.0 à v1.2"] - }, - { - "slug":"goalos-proof-room-lite", - "price":"$997", - "title_en":"GoalOS Proof Room Lite / Department Pack", - "title_fr":"GoalOS Proof Room Lite / Pack Département", - "promise_en":"Set up a lightweight department Proof Room.", - "promise_fr":"Mettez en place une Salle de preuve légère pour un département.", - "type_en":"Premium department pack", - "type_fr":"Pack département premium", - "audience_en":"Department leads, operations managers, AI champions, team leads, and innovation leaders.", - "audience_fr":"Responsables de département, gestionnaires des opérations, champions IA, chefs d’équipe et responsables innovation.", - "bullets_en":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"], - "bullets_fr":["charte de Salle de preuve","carte de permissions IA","fiches responsables de flux","notes de preuve","revues hebdomadaires","rapports exécutifs","reçus de rollback","preuve publique sécuritaire"] - }, - { - "slug":"goalos-rsi-sprint-workshop", - "price":"$2,500+", - "title_en":"GoalOS RSI Sprint Workshop", - "title_fr":"Atelier GoalOS RSI Sprint", - "promise_en":"Build the first self-improving workflow live.", - "promise_fr":"Construisez le premier flux auto-améliorant en direct.", - "type_en":"Premium private workshop", - "type_fr":"Atelier privé premium", - "audience_en":"Founders, operators, teams, consultants, agencies, and AI champions.", - "audience_fr":"Fondateurs, opérateurs, équipes, consultants, agences et champions IA.", - "bullets_en":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","version record","proof note","public-safe proof-card draft","30-day next-run plan"], - "bullets_fr":["flux v1.0","première sortie","grille de score","diagnostic","flux v1.1","registre de version","note de preuve","brouillon de carte de preuve publique sécuritaire","plan de réexécution sur 30 jours"] - }, - { - "slug":"goalos-proof-room-implementation-sprint", - "price":"$9,500+", - "title_en":"GoalOS Proof Room Implementation Sprint", - "title_fr":"Sprint de mise en œuvre GoalOS Proof Room", - "promise_en":"Department RSI in 30 days.", - "promise_fr":"RSI départemental en 30 jours.", - "type_en":"Done-with-you implementation", - "type_fr":"Mise en œuvre accompagnée", - "audience_en":"Department leaders, AI champions, operations executives, and innovation teams.", - "audience_fr":"Responsables de département, champions IA, dirigeants opérations et équipes innovation.", - "bullets_en":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"], - "bullets_fr":["3 flux de travail","responsables et réviseurs","carte de permissions IA","revue de preuve hebdomadaire","rapport mensuel","procédure de rollback","brouillon d’étude de cas"] - }, - { - "slug":"goalos-enterprise-rsi-pilot", - "price":"$49,000+", - "title_en":"GoalOS Enterprise RSI Pilot", - "title_fr":"GoalOS Enterprise RSI Pilot", - "promise_en":"Pilot the Recursive Workflow OS.", - "promise_fr":"Pilotez le Recursive Workflow OS.", - "type_en":"Enterprise pilot", - "type_fr":"Pilote entreprise", - "audience_en":"Enterprise AI governance, CIO/CDO offices, support/operations executives, and platform sponsors.", - "audience_fr":"Gouvernance IA d’entreprise, bureaux CIO/CDO, dirigeants support/opérations et sponsors plateforme.", - "bullets_en":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"], - "bullets_fr":["pilote de 90 jours","une famille de flux","suite de benchmarks","dossiers de preuve","proposition v1.1","porte d’approbation","blueprint d’architecture"] - }, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution","Constitution GoalOS Proof-of-Evolution"), - ("AEP-002","Evidence Docket Standard","Standard du dossier de preuve"), - ("AEP-003","ProofPacket Schema","Schéma ProofPacket"), - ("AEP-004","Selection Gate Standard","Standard de porte de sélection"), - ("AEP-005","Tool Permission Standard","Standard de permission des outils"), - ("AEP-006","Rollback Receipt Standard","Standard du reçu de rollback"), - ("AEP-007","Public-Safe Proof Report Standard","Standard de rapport de preuve publique sécuritaire"), - ("AEP-008","Proof Room Standard","Standard de Salle de preuve"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Construire un flux IA réutilisable","Customer question → clear reply.","Question client → réponse claire."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Flux récursivement auto-améliorants","Run, score, diagnose, improve, version, prove, and re-run.","Exécuter, noter, diagnostiquer, améliorer, versionner, prouver et réexécuter."), - ("department-proof-room-lite","Department Proof Room Lite","Proof Room Lite départemental","Set up owners, permissions, proof notes, reviews, reports, and rollback.","Mettre en place responsables, permissions, notes de preuve, revues, rapports et rollback."), - ("department-ai-permission-map","AI Permission Map","Carte de permissions IA","Green / Yellow / Red boundaries for department AI use.","Limites Vert / Jaune / Rouge pour l’usage IA départemental."), - ("department-public-safe-case-study","Public-safe case study","Étude de cas publique sécuritaire","Turn internal proof into safe external evidence.","Transformer la preuve interne en preuve externe sécuritaire."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - # QUEBEC.AI seal: copy the repository asset into the public site assets and use it as site icon. - seal_candidates = [ - Path("assets/quebecaisealv5.png"), - Path("site/assets/quebecaisealv5.png"), - Path("public/assets/quebecaisealv5.png"), - WEB_ROOT / "assets" / "quebecaisealv5.png", - ] - seal_dest = ASSETS / "quebecaisealv5.png" - seal_source = None - for c in seal_candidates: - if c.exists() and c.is_file(): - seal_source = c - break - - if not seal_source: - raise SystemExit("Missing QUEBEC.AI Seal. Expected repository asset: assets/quebecaisealv5.png") - - if seal_source.resolve() != seal_dest.resolve(): - shutil.copy2(seal_source, seal_dest) - - # Use the exact seal as favicon / app icons. This keeps the public site brand-consistent. - shutil.copy2(seal_dest, WEB_ROOT / "favicon.png") - for icon_name in ["apple-touch-icon.png", "icon-192.png", "icon-512.png"]: - shutil.copy2(seal_dest, ASSETS / icon_name) - - webmanifest = { - "name": "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", - "short_name": "GoalOS ⚜️✨", - "description": "Bilingual public site for GoalOS Recursive Workflow OS, RSI Sprint Workshop, and Proof Rooms.", - "start_url": f"{BASE}/", - "scope": f"{BASE}/", - "display": "standalone", - "background_color": "#05070d", - "theme_color": "#ffd76a", - "icons": [ - {"src": f"{BASE}/assets/icon-192.png", "sizes": "192x192", "type": "image/png"}, - {"src": f"{BASE}/assets/icon-512.png", "sizes": "512x512", "type": "image/png"} - ] - } - (WEB_ROOT / "site.webmanifest").write_text(json.dumps(webmanifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") - - REPORT["quebec_ai_seal"] = { - "status": "copied_and_used_as_icon", - "source": str(seal_source), - "destination": str(seal_dest), - "favicon": "favicon.png", - "apple_touch_icon": "assets/apple-touch-icon.png", - "manifest": "site.webmanifest", - "emoji": "⚜️✨", - "main": MAIN - } - - # Public brand asset discovery. - # v7 copies newly added public image assets from /assets into site/assets/brand/ - # and renders them tastefully as a bilingual visual system page and homepage image rail. - BRAND_DIR = ASSETS / "brand" - BRAND_DIR.mkdir(parents=True, exist_ok=True) - PUBLIC_IMAGE_EXTS = {".png", ".jpg", ".jpeg", ".webp", ".svg", ".gif", ".avif"} - EXCLUDE_PARTS = {"__pycache__", ".git"} - asset_sources = [] - for root_dir in [Path("assets")]: - if root_dir.exists(): - for p in sorted(root_dir.rglob("*")): - if not p.is_file(): - continue - if any(part in EXCLUDE_PARTS for part in p.parts): - continue - if p.suffix.lower() in PUBLIC_IMAGE_EXTS: - asset_sources.append(p) - - brand_assets = [] - seen_names = set() - for src in asset_sources: - # Keep names stable and human-readable. If duplicate names exist, hash-prefix only the duplicate. - name = src.name - if name in seen_names: - name = hashlib.sha256(str(src).encode("utf-8")).hexdigest()[:8] + "-" + src.name - seen_names.add(name) - dest = BRAND_DIR / name - if src.resolve() != dest.resolve(): - shutil.copy2(src, dest) - rel = dest.relative_to(WEB_ROOT).as_posix() - lower = name.lower() - role = "seal" if "seal" in lower or "quebecai" in lower or "quebec" in lower else "brand-image" - brand_assets.append({ - "name": name, - "source": src.as_posix(), - "public_path": rel, - "url": f"{BASE}/{rel}", - "role": role, - "bytes": dest.stat().st_size, - "sha256": hashlib.sha256(dest.read_bytes()).hexdigest() - }) - - # Ensure the official seal is always first in the brand manifest. - brand_assets = sorted(brand_assets, key=lambda x: (0 if x["name"].lower() == "quebecaisealv5.png" else 1, x["name"].lower())) - (ASSETS / "brand-assets-v7.json").write_text(json.dumps({ - "generated_at": NOW, - "purpose": "Public brand assets discovered from repository assets/ and copied into the public site.", - "main": MAIN, - "seal": "QUEBEC.AI ⚜️✨", - "assets": brand_assets - }, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") - REPORT["brand_assets"] = { - "count": len(brand_assets), - "manifest": "assets/brand-assets-v7.json", - "images": [a["public_path"] for a in brand_assets[:24]] - } - - def img_alt(name): - stem = Path(name).stem.replace("-", " ").replace("_", " ").strip() - return (stem or "QUEBEC.AI brand asset").title() - - def asset_gallery(limit=9): - items = [a for a in brand_assets if a["role"] != "seal"][:limit] - if not items: - return "" - cards = [] - for a in items: - cards.append(f"""
{escape(img_alt(a['name']))}
{escape(img_alt(a['name']))}
""") - return f"""""" - - def asset_rail(limit=5): - items = [a for a in brand_assets if a["role"] != "seal"][:limit] - if not items: - return "" - imgs = "".join(f"""{escape(img_alt(a['name']))}""" for a in items) - return f"""
{imgs}
""" - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.082);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--champagne:#fff3bf;--blue:#9eb9ff;--green:#7ce0a3;--radius:28px;--shadow:0 32px 90px rgba(0,0,0,.38)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 13% -8%,rgba(143,179,255,.24),transparent 35rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.16),transparent 31rem),radial-gradient(circle at 50% 110%,rgba(124,224,163,.08),transparent 34rem),linear-gradient(180deg,#05070d,#080b13 56%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(20px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1280px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:12px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.04em}.goalos-mark{width:35px;height:35px;border-radius:11px;border:1px solid rgba(255,215,106,.68);display:grid;place-items:center;color:var(--gold);font-weight:950;background:linear-gradient(145deg,rgba(255,215,106,.16),rgba(255,255,255,.04))}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:12.7px;text-decoration:none;padding:9px 10px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.seal-mini{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(255,215,106,.35);background:rgba(255,215,106,.07);border-radius:999px;padding:6px 8px;color:var(--champagne);font-weight:950;text-decoration:none;font-size:12px}.seal-mini img{width:24px;height:24px;object-fit:contain;border-radius:50%}.quebec-seal{display:flex;align-items:center;gap:14px;border:1px solid rgba(255,215,106,.34);background:linear-gradient(135deg,rgba(255,215,106,.12),rgba(255,255,255,.035));border-radius:22px;padding:14px 16px;max-width:520px;margin:18px 0}.quebec-seal img{width:62px;height:62px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 12px 20px rgba(0,0,0,.35))}.quebec-seal strong{display:block;color:var(--champagne);letter-spacing:-.02em}.quebec-seal span{color:var(--muted);font-size:14px}.wrap{width:min(1280px,calc(100% - 36px));margin:0 auto;padding:72px 0 96px}.hero{padding:46px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.23em;font-weight:950;font-size:12px;margin-bottom:18px}.kicker{color:var(--champagne);font-weight:900;letter-spacing:-.02em}.wrap h1{font-size:clamp(52px,8.3vw,116px);line-height:.85;letter-spacing:-.088em;margin:0 0 24px;max-width:1180px}.wrap h2{font-size:clamp(34px,5.4vw,68px);line-height:.92;letter-spacing:-.068em;margin:0 0 18px}.wrap h3{font-size:24px;letter-spacing:-.045em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:980px;margin:0 0 24px}.fr{color:#dce3ff}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:950;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:linear-gradient(135deg,var(--gold),#ffe9a3);color:#05070d;border-color:var(--gold)}.section{margin:66px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:32px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:23px;text-decoration:none;display:flex;flex-direction:column;min-height:205px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 90% 0%,rgba(255,215,106,.09),transparent 18rem);pointer-events:none}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.52)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:46px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(27px,3.6vw,48px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:950;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.78)}.footer-inner{width:min(1280px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:1020px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.wrap{padding-top:42px}.loop{display:flex;white-space:normal;border-radius:22px}.quebec-seal{max-width:none}.quebec-seal img{width:52px;height:52px}} - """ - CSS += "\n.seal-orbit{position:absolute;right:-30px;top:-40px;width:390px;height:390px;opacity:.13;background:url('/proof-gradient/assets/quebecaisealv5.png') center/contain no-repeat;filter:drop-shadow(0 40px 80px rgba(255,215,106,.23));pointer-events:none}.hero{position:relative;overflow:hidden}.sovereign-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.sovereign-strip div{border:1px solid rgba(255,215,106,.25);border-radius:20px;padding:16px;background:rgba(255,215,106,.045)}.sovereign-strip strong{display:block;color:var(--champagne);font-size:13px;text-transform:uppercase;letter-spacing:.16em;margin-bottom:8px}.sovereign-strip span{color:var(--muted);line-height:1.4}.seal-divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,215,106,.6),transparent);margin:24px 0}.quebec-main-link{color:var(--champagne);text-decoration:none;font-weight:950}.quebec-main-link:hover{text-decoration:underline}@media(max-width:1020px){.sovereign-strip{grid-template-columns:1fr}.seal-orbit{width:240px;height:240px;opacity:.08}}\n" - CSS += '\n.asset-rail{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:20px 0 8px}.asset-rail img{width:100%;height:120px;object-fit:cover;border-radius:18px;border:1px solid rgba(255,215,106,.22);background:rgba(255,255,255,.04);box-shadow:0 18px 48px rgba(0,0,0,.24)}.asset-gallery{overflow:hidden}.asset-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.asset-card{margin:0;border:1px solid rgba(255,255,255,.14);border-radius:22px;overflow:hidden;background:rgba(255,255,255,.045)}.asset-card img{display:block;width:100%;height:210px;object-fit:cover;background:#080b13}.asset-card figcaption{padding:12px 14px;color:var(--muted);font-size:13px}.sovereign-masthead{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.sovereign-masthead img{width:76px;height:76px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 18px 30px rgba(255,215,106,.16))}.quebec-ai-promise{font-size:clamp(18px,2vw,22px);line-height:1.45;color:var(--champagne);max-width:900px}@media(max-width:1020px){.asset-rail,.asset-grid{grid-template-columns:1fr}.asset-rail img{height:180px}.asset-card img{height:220px}}\n' - (ASSETS / "goalos-sovereign-v7.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-sovereign-v7.js").write_text(JS, encoding="utf-8") - - OG = """QUEBEC.AI ⚜️✨ · GOALOSA model can answer.An agent can act.An institution must prove.Recursive workflows · RSI Sprint Workshop · Proof Rooms""" - (ASSETS / "goalos-opulent-og.svg").write_text(OG, encoding="utf-8") - - SEAL_IMG = f'{BASE}/assets/quebecaisealv5.png' - SEAL_BADGE = f"""
QUEBEC.AI Seal ⚜️✨
QUEBEC.AI Seal ⚜️✨Institutional AI workflow proof, bilingual by design.
Preuve institutionnelle des flux IA, bilingue par conception.
""" - NAV = f""" -
- -
- """ - - FOOTER = f""" -
- -
- """ - - def page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - def offer_card(o): - return f""" - {escape(o['price'])} -

{escape(o['title_en'])}

-

{escape(o['title_fr'])}

-

{escape(o['promise_en'])}

-

{escape(o['promise_fr'])}

-
""" - - # Core pages. - write_page("", "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", "Bilingual GoalOS public site for recursive workflows, Proof Rooms, and RSI Sprint Workshop.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-

GoalOS transforme le travail IA répété en flux possédés, notés, versionnés, approuvés, surveillés et récursivement améliorés.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
-
QUEBEC.AI Seal ⚜️✨

Frontier. AI‑First. Sovereign. GoalOS brings that institutional AI direction to recursive workflows, Proof Rooms, and governed improvement.

Frontier. IA d’abord. Souverain. GoalOS applique cette direction institutionnelle aux flux récursifs, aux Salles de preuve et à l’amélioration gouvernée.

- {SEAL_BADGE} - {asset_rail()} -
-
Frontier / FrontièreAI workflows designed for the infrastructure era.
Des flux IA conçus pour l’ère des infrastructures.
-
AI‑First / IA d’abordOperations rebuilt around reusable, improving intelligence.
Des opérations reconstruites autour d’une intelligence réutilisable et améliorable.
-
Sovereign / SouverainProof, governance, review, and rollback remain visible.
Preuve, gouvernance, revue et rollback restent visibles.
-
- -
-
-
Featured / Offre phare
-

GoalOS RSI Sprint Workshop

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

- -
-
-
Software proof / Preuve logicielle
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

GoalOS Cloud MVP 0.2 prouve l’amélioration récursive des flux en logiciel.

- -
-
-
Commercial ladder / Parcours commercial
-

From reusable workflow to Enterprise RSI.

-
{''.join(offer_card(o) for o in OFFERS)}
-
-
-

Safe boundary / Limite claire

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-

GoalOS ne modifie pas les modèles IA. Il améliore les flux autour de l’IA grâce aux instructions, vérifications, grilles de score, dossiers de preuve, mémoire, standards de preuve, versions, approbations, surveillance et rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Bilingual starting point for GoalOS products and services.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

Flux réutilisable, flux auto-améliorant, Salle de preuve départementale, atelier RSI Sprint, sprint de mise en œuvre ou pilote entreprise.

{SEAL_BADGE}
{''.join(offer_card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "Bilingual GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

Commencez avec un flux IA réutilisable, passez aux flux auto-améliorants, puis installez des Salles de preuve et l’Enterprise RSI.

{''.join(offer_card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title_en'])}
{escape(o['title_fr'])}{escape(o['promise_en'])}
{escape(o['promise_fr'])}{escape(o['type_en'])}
{escape(o['type_fr'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "Bilingual GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

Un parcours clair, de la première trousse au pilote entreprise.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "Bilingual GoalOS services and enterprise pilots.", f"""
Services / Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

Utilisez les services pour générer des preuves, installer des Salles de preuve départementales et valider la plateforme entreprise.

{''.join(offer_card(o) for o in OFFERS[3:])}
""") - - # Offer detail pages. - for o in OFFERS: - seal = SEAL_BADGE if o["slug"] in ["goalos-rsi-sprint-workshop", "goalos-enterprise-rsi-pilot", "goalos-proof-room-lite"] else "" - write_page(f"products/{o['slug']}", o["title_en"], o["promise_en"], f"""
{escape(o['price'])} · {escape(o['type_en'])}

{escape(o['title_en'])}

{escape(o['title_fr'])}

{escape(o['promise_en'])}

{escape(o['promise_fr'])}

Best for: {escape(o['audience_en'])}

Idéal pour : {escape(o['audience_fr'])}

{seal}
{escape(o['price'])}

Included / Inclus

{bullets(o['bullets_en'])}

Français

{bullets(o['bullets_fr'])}

Boundary / Limite

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

Aucune garantie de ROI, de revenu, de certification de conformité, de sécurité, de conseil juridique ou de déploiement autonome incontrôlé. La revue humaine est requise.

""") - - # Workshop public page — with seal and v6 public positioning. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- {SEAL_BADGE} - -
-
-

What you leave with / Ce que vous obtenez

-
-
1Workflow v1.0
Flux v1.0
-
2First run output
Première sortie
-
3Scorecard
Grille de score
-
4Diagnosis
Diagnostic
-
5Workflow v1.1
Flux v1.1
-
6Proof note
Note de preuve
-
-
-
-

Premium delivery standard / Standard de livraison premium

-

One repeated task. One live workflow loop. One public-safe proof-card draft. One 30-day next-run plan.

-

Une tâche répétée. Une boucle de flux en direct. Un brouillon de carte de preuve publique sécuritaire. Un plan de réexécution sur 30 jours.

-
-
-

Safe boundary / Limite claire

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-

GoalOS RSI Sprint Workshop ne modifie pas les modèles IA. Il améliore le flux autour de votre assistant IA grâce aux instructions, vérifications, grilles de score, notes de preuve, versions et revue humaine.

-
- """) - - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

{SEAL_BADGE}

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

En 30 jours, mettez en place la première version d’une Salle de preuve légère pour trois flux IA répétés d’un département.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

""") - - enterprise_body = f"""
QUEBEC.AI ⚜️✨ · Enterprise RSI / RSI entreprise

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Pilotez le Recursive Workflow Operating System pour une famille de flux entreprise.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
{SEAL_BADGE}

Formal platform name / Nom formel

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

Un MVP public qui prouve : exécuter, noter, prouver, diagnostiquer, améliorer, approuver, versionner, surveiller et réexécuter.

What it proves / Ce qu’il prouve

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

Run the GoalOS Cloud MVP v0.2 action to install the interactive public app.

Exécutez l’action GoalOS Cloud MVP v0.2 pour installer l’application publique interactive.

""") - - standards_cards = "".join(f'AEP

{escape(code)}

{escape(en)}

{escape(fr)}

' for code,en,fr in STANDARDS) - write_page("standards", "AEP Standards", "Bilingual Proof Gradient standards.", f"""
AEP Standards / Standards AEP

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

Les standards AEP donnent le vocabulaire de preuve, permission, rollback, rapports publics sécuritaires et Salles de preuve.

{standards_cards}
""") - for code,en,fr in STANDARDS: - if not (WEB_ROOT / "standards" / code / "index.html").exists(): - write_page(f"standards/{code}", f"{code} — {en}", en, f"""
AEP Standard

{escape(code)} — {escape(en)}

{escape(fr)}

Public trust layer for GoalOS and Proof Gradient.

""") - - examples_cards = "".join(f'Example

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

' for slug,en,fr,desc_en,desc_fr in EXAMPLES) - write_page("examples", "GoalOS Examples", "Bilingual GoalOS workflow examples.", f"""
Examples / Exemples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

Des exemples pour comprendre les flux réutilisables, RSI Lite, Proof Room Lite et RSI départemental.

{examples_cards}
""") - for slug,en,fr,desc_en,desc_fr in EXAMPLES: - if not (WEB_ROOT / "workflow" / slug / "index.html").exists(): - write_page(f"workflow/{slug}", en, desc_en, f"""
GoalOS Example / Exemple GoalOS

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

GoalOS structure / Structure GoalOS

Context → Rules → Memory → Workflow → Checks → Proof.

Contexte → Règles → Mémoire → Flux → Vérifications → Preuve.

""") - - command_cards = "".join(offer_card(o) for o in OFFERS) + f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

Preuve logicielle de flux récursif d’entreprise.

' - write_page("command-center", "GoalOS Command Center", "Bilingual GoalOS command center.", f"""
Command Center / Centre de commande

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

Recherchez dans le site unifié GoalOS / Proof Gradient.

{command_cards}
""") - - write_page("brand/visual-system", "QUEBEC.AI ⚜️✨ Visual System", "Public QUEBEC.AI / GoalOS visual identity assets used on the site.", f"""
QUEBEC.AI ⚜️✨ · Visual System

Frontier. AI‑First. Sovereign.

The public GoalOS site uses the QUEBEC.AI Seal, bilingual institutional copy, gold/champagne accents, and discovered public brand imagery from the repository assets folder.

Le site public GoalOS utilise le sceau QUEBEC.AI, une rédaction institutionnelle bilingue, des accents or/champagne et les visuels publics détectés dans le dossier assets du dépôt.

{SEAL_BADGE}
{asset_gallery(24)}

Brand asset manifest

The action generates a public manifest at /proof-gradient/assets/brand-assets-v7.json.

L’action génère un manifeste public à /proof-gradient/assets/brand-assets-v7.json.

""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/","/brand/visual-system/"] + [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{code}/" for code,_,_ in STANDARDS] + [f"/workflow/{slug}/" for slug,_,_,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Bilingual GoalOS site map.", f"""
Site Map / Plan du site

Unified site map.

Plan du site unifié.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

Utilisez le Centre de commande pour trouver la bonne page GoalOS.

"""), encoding="utf-8") - - # Public documentation. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V7_BRAND_ASSETS.md").write_text(f"""# GoalOS Public Site Release v7 — QUEBEC.AI Seal + Brand Assets ⚜️✨ - - Generated: {NOW} - - ## Purpose - - Refresh the public Proof Gradient / GoalOS website as a bilingual, corporate, institutional, opulent public site with the QUEBEC.AI Seal. - - ## Seal - - The release copies: - - `assets/quebecaisealv5.png` - - to: - - `site/assets/quebecaisealv5.png` - - uses it as favicon / apple-touch-icon / web app icon, copies newly added public image assets from `assets/` into `site/assets/brand/`, and displays the identity with: - - `QUEBEC.AI ⚜️✨` - - ## Includes - - - GoalOS RSI Sprint Workshop public pages - - product ladder - - pricing - - services - - Cloud MVP public page - - AEP standards - - examples - - command center - - paid/private artifact guard - - ## Paid file policy - - Paid buyer products and private delivery materials are not uploaded to the public site. - - All buy/apply buttons point to: - - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Shell repair across all HTML. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop|Atelier|QUEBEC)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: - return text, 0 - start = body.end() - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - return text[:start] + pattern.sub(repl, prefix) + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: - return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap and robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid/private artifact guard. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - restricted = [] - allowed = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed.append(rel) - else: - restricted.append(rel) - continue - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - restricted.append(rel) - REPORT["allowed_public_packages"] = allowed - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(sorted(set(restricted))[:120])) - - # Validation. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v7-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v7 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v7-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v7-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v7 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("QUEBEC.AI seal:", REPORT["quebec_ai_seal"]) - print("Allowed public packages:", len(allowed)) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v5.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v5.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - if not (WEB_ROOT / "assets" / "brand-assets-v7.json").exists(): - errors.append("Missing brand asset manifest at site/assets/brand-assets-v7.json.") - if not (WEB_ROOT / "brand" / "visual-system" / "index.html").exists(): - errors.append("Missing brand visual system page at site/brand/visual-system/index.html.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v6 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v5.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release bilingual GoalOS public site v7 with QUEBEC.AI seal, icons, and brand assets [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/goalos-public-site-release-v8-intelligent-assets.yml b/.github/workflows/goalos-public-site-release-v8-intelligent-assets.yml index 70115338..2de6e53b 100644 --- a/.github/workflows/goalos-public-site-release-v8-intelligent-assets.yml +++ b/.github/workflows/goalos-public-site-release-v8-intelligent-assets.yml @@ -1,994 +1,25 @@ -name: GoalOS Public Site Release v8 Intelligent Assets +name: goalos-public-site-release-v8-intelligent-assets (obsolete; delegates to v12 validation) on: workflow_dispatch: permissions: - contents: write - pages: write - id-token: write - -concurrency: - group: goalos-public-site-release-v8-intelligent-assets - cancel-in-progress: false + contents: read jobs: - release-site: - name: Refresh bilingual opulent public site with intelligent QUEBEC.AI assets + validate: + name: Obsolete release workflow delegated to shared v12 scripts runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Check out repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate bilingual opulent GoalOS public site with intelligent QUEBEC.AI assets - id: build - shell: bash - run: | - set -euo pipefail - - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - mkdir -p "$WEB_ROOT" - touch "$WEB_ROOT/.nojekyll" - echo "web_root=$WEB_ROOT" >> "$GITHUB_OUTPUT" - - cat > "$RUNNER_TEMP/goalos_public_site_release_v5.py" <<'PY' - from pathlib import Path - from html import escape - import datetime, hashlib, json, re, shutil, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - WEB_ROOT.mkdir(parents=True, exist_ok=True) - - BASE = "/proof-gradient" - MAIN = "https://www.quebecartificialintelligence.com/" - SHOP = "https://www.quebecartificialintelligence.com/shop" - GITHUB = "https://github.com/MontrealAI/proof-gradient" - TODAY = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d") - NOW = datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat() - - ASSETS = WEB_ROOT / "assets" - ASSETS.mkdir(parents=True, exist_ok=True) - ARCHIVE = WEB_ROOT / "_archive" / f"before_goalos_public_site_release_v5_{TODAY}" - ARCHIVE.mkdir(parents=True, exist_ok=True) - - REPORT = { - "generated_at": NOW, - "release": "GoalOS public site release v8 QUEBEC.AI seal bilingual opulent", - "web_root": str(WEB_ROOT), - "mission": "Unified bilingual opulent public website with QUEBEC.AI seal, RSI Sprint Workshop, public product ladder, AEP standards, Cloud MVP, and paid-material guard.", - "backups": [], - "pages_written": [], - "html_repaired": [], - "old_markers_removed": 0, - "old_assets_removed": 0, - "topbars_removed": 0, - "footers_removed": 0, - "allowed_public_packages": [], - "quebec_ai_seal": {}, - "validation": {}, - "paid_artifact_policy": "Paid buyer products and private workshop/implementation/enterprise delivery materials are not uploaded to the public site." - } - - OFFERS = [ - { - "slug":"goalos-ai-efficiency-sprint-kit", - "price":"$49", - "title_en":"GoalOS AI Efficiency Sprint Kit", - "title_fr":"Trousse GoalOS — Sprint d’efficacité IA", - "promise_en":"Build one reusable AI workflow.", - "promise_fr":"Construisez un flux IA réutilisable.", - "type_en":"Self-serve digital product", - "type_fr":"Produit numérique autonome", - "audience_en":"AI beginners, creators, freelancers, consultants, small-business owners, solo operators.", - "audience_fr":"Débutants IA, créateurs, travailleurs autonomes, consultants, PME et opérateurs solo.", - "bullets_en":["60-minute guided first win","offline workflow builder","copy-paste prompts","editable templates","completed beginner examples","proof note"], - "bullets_fr":["première victoire guidée en 60 minutes","constructeur de flux hors ligne","prompts copier-coller","modèles éditables","exemples débutants complétés","note de preuve"] - }, - { - "slug":"goalos-rsi-lite", - "price":"$199", - "title_en":"GoalOS RSI Lite", - "title_fr":"GoalOS RSI Lite", - "promise_en":"Build one self-improving AI workflow.", - "promise_fr":"Construisez un flux IA auto-améliorant.", - "type_en":"Premium self-serve system", - "type_fr":"Système autonome premium", - "audience_en":"Serious operators, consultants, agencies, creators, and small teams.", - "audience_fr":"Opérateurs sérieux, consultants, agences, créateurs et petites équipes.", - "bullets_en":["RSI Lite guide","offline builder","scorecard","version tracker","improvement prompts","v1.0 to v1.2 examples"], - "bullets_fr":["guide RSI Lite","constructeur hors ligne","grille de score","suivi des versions","prompts d’amélioration","exemples v1.0 à v1.2"] - }, - { - "slug":"goalos-proof-room-lite", - "price":"$997", - "title_en":"GoalOS Proof Room Lite / Department Pack", - "title_fr":"GoalOS Proof Room Lite / Pack Département", - "promise_en":"Set up a lightweight department Proof Room.", - "promise_fr":"Mettez en place une Salle de preuve légère pour un département.", - "type_en":"Premium department pack", - "type_fr":"Pack département premium", - "audience_en":"Department leads, operations managers, AI champions, team leads, and innovation leaders.", - "audience_fr":"Responsables de département, gestionnaires des opérations, champions IA, chefs d’équipe et responsables innovation.", - "bullets_en":["Proof Room charter","AI permission map","workflow owner cards","proof notes","weekly reviews","executive reports","rollback receipts","public-safe proof"], - "bullets_fr":["charte de Salle de preuve","carte de permissions IA","fiches responsables de flux","notes de preuve","revues hebdomadaires","rapports exécutifs","reçus de rollback","preuve publique sécuritaire"] - }, - { - "slug":"goalos-rsi-sprint-workshop", - "price":"$2,500+", - "title_en":"GoalOS RSI Sprint Workshop", - "title_fr":"Atelier GoalOS RSI Sprint", - "promise_en":"Build the first self-improving workflow live.", - "promise_fr":"Construisez le premier flux auto-améliorant en direct.", - "type_en":"Premium private workshop", - "type_fr":"Atelier privé premium", - "audience_en":"Founders, operators, teams, consultants, agencies, and AI champions.", - "audience_fr":"Fondateurs, opérateurs, équipes, consultants, agences et champions IA.", - "bullets_en":["workflow v1.0","first run output","scorecard","diagnosis","workflow v1.1","version record","proof note","public-safe proof-card draft","30-day next-run plan"], - "bullets_fr":["flux v1.0","première sortie","grille de score","diagnostic","flux v1.1","registre de version","note de preuve","brouillon de carte de preuve publique sécuritaire","plan de réexécution sur 30 jours"] - }, - { - "slug":"goalos-proof-room-implementation-sprint", - "price":"$9,500+", - "title_en":"GoalOS Proof Room Implementation Sprint", - "title_fr":"Sprint de mise en œuvre GoalOS Proof Room", - "promise_en":"Department RSI in 30 days.", - "promise_fr":"RSI départemental en 30 jours.", - "type_en":"Done-with-you implementation", - "type_fr":"Mise en œuvre accompagnée", - "audience_en":"Department leaders, AI champions, operations executives, and innovation teams.", - "audience_fr":"Responsables de département, champions IA, dirigeants opérations et équipes innovation.", - "bullets_en":["3 workflows","owners and reviewers","AI permission map","weekly proof review","monthly report","rollback procedure","case study draft"], - "bullets_fr":["3 flux de travail","responsables et réviseurs","carte de permissions IA","revue de preuve hebdomadaire","rapport mensuel","procédure de rollback","brouillon d’étude de cas"] - }, - { - "slug":"goalos-enterprise-rsi-pilot", - "price":"$49,000+", - "title_en":"GoalOS Enterprise RSI Pilot", - "title_fr":"GoalOS Enterprise RSI Pilot", - "promise_en":"Pilot the Recursive Workflow OS.", - "promise_fr":"Pilotez le Recursive Workflow OS.", - "type_en":"Enterprise pilot", - "type_fr":"Pilote entreprise", - "audience_en":"Enterprise AI governance, CIO/CDO offices, support/operations executives, and platform sponsors.", - "audience_fr":"Gouvernance IA d’entreprise, bureaux CIO/CDO, dirigeants support/opérations et sponsors plateforme.", - "bullets_en":["90-day pilot","one workflow family","benchmark suite","proof records","v1.1 proposal","approval gate","architecture blueprint"], - "bullets_fr":["pilote de 90 jours","une famille de flux","suite de benchmarks","dossiers de preuve","proposition v1.1","porte d’approbation","blueprint d’architecture"] - }, - ] - - STANDARDS = [ - ("AEP-001","GoalOS Proof-of-Evolution Constitution","Constitution GoalOS Proof-of-Evolution"), - ("AEP-002","Evidence Docket Standard","Standard du dossier de preuve"), - ("AEP-003","ProofPacket Schema","Schéma ProofPacket"), - ("AEP-004","Selection Gate Standard","Standard de porte de sélection"), - ("AEP-005","Tool Permission Standard","Standard de permission des outils"), - ("AEP-006","Rollback Receipt Standard","Standard du reçu de rollback"), - ("AEP-007","Public-Safe Proof Report Standard","Standard de rapport de preuve publique sécuritaire"), - ("AEP-008","Proof Room Standard","Standard de Salle de preuve"), - ] - - EXAMPLES = [ - ("build-one-reusable-ai-workflow","Build one reusable AI workflow","Construire un flux IA réutilisable","Customer question → clear reply.","Question client → réponse claire."), - ("rsi-lite-self-improving-workflows","Recursive Self-Improving Workflows","Flux récursivement auto-améliorants","Run, score, diagnose, improve, version, prove, and re-run.","Exécuter, noter, diagnostiquer, améliorer, versionner, prouver et réexécuter."), - ("department-proof-room-lite","Department Proof Room Lite","Proof Room Lite départemental","Set up owners, permissions, proof notes, reviews, reports, and rollback.","Mettre en place responsables, permissions, notes de preuve, revues, rapports et rollback."), - ("department-ai-permission-map","AI Permission Map","Carte de permissions IA","Green / Yellow / Red boundaries for department AI use.","Limites Vert / Jaune / Rouge pour l’usage IA départemental."), - ("department-public-safe-case-study","Public-safe case study","Étude de cas publique sécuritaire","Turn internal proof into safe external evidence.","Transformer la preuve interne en preuve externe sécuritaire."), - ] - - def href(path): - if path.startswith("http"): - return path - return BASE + path - - def backup(path): - if not path.exists() or not path.is_file() or "_archive" in path.parts: - return - rel = path.relative_to(WEB_ROOT) - dest = ARCHIVE / rel - dest.parent.mkdir(parents=True, exist_ok=True) - if not dest.exists(): - shutil.copy2(path, dest) - REPORT["backups"].append(dest.relative_to(WEB_ROOT).as_posix()) - - # QUEBEC.AI seal: copy the repository asset into the public site assets and use it as site icon. - seal_candidates = [ - Path("assets/quebecaisealv5.png"), - Path("site/assets/quebecaisealv5.png"), - Path("public/assets/quebecaisealv5.png"), - WEB_ROOT / "assets" / "quebecaisealv5.png", - ] - seal_dest = ASSETS / "quebecaisealv5.png" - seal_source = None - for c in seal_candidates: - if c.exists() and c.is_file(): - seal_source = c - break - - if not seal_source: - raise SystemExit("Missing QUEBEC.AI Seal. Expected repository asset: assets/quebecaisealv5.png") - - if seal_source.resolve() != seal_dest.resolve(): - shutil.copy2(seal_source, seal_dest) - - # Use the exact seal as favicon / app icons. This keeps the public site brand-consistent. - shutil.copy2(seal_dest, WEB_ROOT / "favicon.png") - for icon_name in ["apple-touch-icon.png", "icon-192.png", "icon-512.png"]: - shutil.copy2(seal_dest, ASSETS / icon_name) - - webmanifest = { - "name": "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", - "short_name": "GoalOS ⚜️✨", - "description": "Bilingual public site for GoalOS Recursive Workflow OS, RSI Sprint Workshop, and Proof Rooms.", - "start_url": f"{BASE}/", - "scope": f"{BASE}/", - "display": "standalone", - "background_color": "#05070d", - "theme_color": "#ffd76a", - "icons": [ - {"src": f"{BASE}/assets/icon-192.png", "sizes": "192x192", "type": "image/png"}, - {"src": f"{BASE}/assets/icon-512.png", "sizes": "512x512", "type": "image/png"} - ] - } - (WEB_ROOT / "site.webmanifest").write_text(json.dumps(webmanifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") - - REPORT["quebec_ai_seal"] = { - "status": "copied_and_used_as_icon", - "source": str(seal_source), - "destination": str(seal_dest), - "favicon": "favicon.png", - "apple_touch_icon": "assets/apple-touch-icon.png", - "manifest": "site.webmanifest", - "emoji": "⚜️✨", - "main": MAIN - } - - # Public brand asset discovery. - # v8 uses newly added public image assets intelligently: - # it scans repository assets/, filters out paid/private-looking files, - # classifies public imagery by role, copies it to site/assets/brand/, - # builds a manifest, and renders curated visual sections. - BRAND_DIR = ASSETS / "brand" - BRAND_DIR.mkdir(parents=True, exist_ok=True) - PUBLIC_IMAGE_EXTS = {".png", ".jpg", ".jpeg", ".webp", ".svg", ".gif", ".avif"} - PRIVATE_TERMS = { - "buyer", "delivery_kit", "complete_bundle", "seller_assets", "master_pack", - "commercialization", "quick_launch", "private", "internal", "paid" - } - EXCLUDE_PARTS = {"__pycache__", ".git"} - MAX_PUBLIC_ASSET_BYTES = 16 * 1024 * 1024 - - def is_public_image_asset(p): - if not p.is_file(): - return False - if any(part in EXCLUDE_PARTS for part in p.parts): - return False - name = p.name.lower() - if p.suffix.lower() not in PUBLIC_IMAGE_EXTS: - return False - if any(term in name for term in PRIVATE_TERMS): - return False - try: - if p.stat().st_size > MAX_PUBLIC_ASSET_BYTES: - return False - except OSError: - return False - return True - - def classify_asset(name): - lower = name.lower() - if "quebecaiseal" in lower or "seal" in lower or "sceau" in lower: - return "seal" - if any(t in lower for t in ["hero", "main", "frontier", "sovereign", "souverain", "crown", "flag", "fleur", "lis"]): - return "hero" - if any(t in lower for t in ["goalos", "rsi", "sprint", "workshop", "atelier", "workflow", "proofroom", "proof-room"]): - return "product" - if any(t in lower for t in ["proof", "gradient", "aep", "ledger", "docket", "room"]): - return "proof" - if any(t in lower for t in ["ai", "agent", "agi", "alpha", "infrastructure", "enterprise"]): - return "infrastructure" - return "atmosphere" - - def img_alt(name): - stem = Path(name).stem.replace("-", " ").replace("_", " ").strip() - if "quebecaiseal" in stem.lower(): - return "QUEBEC.AI Seal ⚜️✨" - return (stem or "QUEBEC.AI brand asset").title() - - asset_sources = [] - for root_dir in [Path("assets")]: - if root_dir.exists(): - for p in sorted(root_dir.rglob("*")): - if is_public_image_asset(p): - asset_sources.append(p) - - brand_assets = [] - skipped_assets = [] - seen_names = set() - for src in asset_sources: - name = src.name - if name in seen_names: - name = hashlib.sha256(str(src).encode("utf-8")).hexdigest()[:8] + "-" + src.name - seen_names.add(name) - dest = BRAND_DIR / name - if src.resolve() != dest.resolve(): - shutil.copy2(src, dest) - rel = dest.relative_to(WEB_ROOT).as_posix() - role = classify_asset(name) - brand_assets.append({ - "name": name, - "alt": img_alt(name), - "source": src.as_posix(), - "public_path": rel, - "url": f"{BASE}/{rel}", - "role": role, - "bytes": dest.stat().st_size, - "sha256": hashlib.sha256(dest.read_bytes()).hexdigest() - }) - - # Record skipped files for transparency without publishing them. - if Path("assets").exists(): - for p in sorted(Path("assets").rglob("*")): - if p.is_file() and p.suffix.lower() in PUBLIC_IMAGE_EXTS and p not in asset_sources: - skipped_assets.append({"path": p.as_posix(), "reason": "filtered_by_size_or_private_terms_or_duplicate_context"}) - - role_priority = {"seal": 0, "hero": 1, "product": 2, "proof": 3, "infrastructure": 4, "atmosphere": 5} - brand_assets = sorted(brand_assets, key=lambda x: (role_priority.get(x["role"], 9), x["name"].lower())) - (ASSETS / "brand-assets-v8.json").write_text(json.dumps({ - "generated_at": NOW, - "purpose": "Public brand assets discovered from repository assets/, filtered, classified, and copied into the public site.", - "main": MAIN, - "seal": "QUEBEC.AI ⚜️✨", - "roles": role_priority, - "assets": brand_assets, - "skipped": skipped_assets[:200] - }, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") - REPORT["brand_assets"] = { - "count": len(brand_assets), - "manifest": "assets/brand-assets-v8.json", - "roles": {role: len([a for a in brand_assets if a["role"] == role]) for role in sorted(set(a["role"] for a in brand_assets))}, - "images": [a["public_path"] for a in brand_assets[:36]], - "skipped_count": len(skipped_assets) - } - - def assets_by_role(role=None, limit=12): - items = [a for a in brand_assets if a["role"] != "seal"] - if role: - filtered = [a for a in items if a["role"] == role] - if filtered: - items = filtered - return items[:limit] - - def asset_card(a, eager=False): - priority = ' fetchpriority="high"' if eager else '' - return f"""
{escape(a['alt'])}
{escape(a['role'].title())}{escape(a['alt'])}
""" - - def asset_gallery(limit=12, role=None, title_en="Visual identity", title_fr="Identité visuelle"): - items = assets_by_role(role=role, limit=limit) - if not items: - return "" - cards = "".join(asset_card(a) for a in items) - return f"""""" - - def asset_rail(limit=5, role=None): - items = assets_by_role(role=role, limit=limit) - if not items: - return "" - imgs = "".join(f"""{escape(a['alt'])}""" for a in items) - return f"""
{imgs}
""" - - def hero_visual(): - items = assets_by_role(role="hero", limit=1) or assets_by_role(limit=1) - if not items: - return "" - a = items[0] - return f"""
{escape(a['alt'])}
QUEBEC.AI ⚜️✨ · {escape(a['alt'])}
""" - - def role_panels(): - roles = ["hero", "product", "proof", "infrastructure", "atmosphere"] - panels = [] - for role in roles: - items = assets_by_role(role=role, limit=3) - if not items: - continue - preview = "".join(f"""{escape(a['alt'])}""" for a in items) - panels.append(f"""
{escape(role.title())}
{preview}
""") - if not panels: - return "" - return f"""
Intelligent asset curation / Curation intelligente

New public assets are classified and used, not dumped.

Les nouveaux actifs publics sont classifiés et utilisés avec intention, sans encombrer le site.

{''.join(panels)}
""" - - CSS = r""" - :root{--bg:#05070d;--panel:rgba(255,255,255,.082);--panel2:rgba(255,255,255,.045);--line:rgba(255,255,255,.16);--text:#f7f8ff;--muted:#b8c0da;--gold:#ffd76a;--champagne:#fff3bf;--blue:#9eb9ff;--green:#7ce0a3;--radius:28px;--shadow:0 32px 90px rgba(0,0,0,.38)} - *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 13% -8%,rgba(143,179,255,.24),transparent 35rem),radial-gradient(circle at 90% 0%,rgba(255,215,106,.16),transparent 31rem),radial-gradient(circle at 50% 110%,rgba(124,224,163,.08),transparent 34rem),linear-gradient(180deg,#05070d,#080b13 56%,#05070d);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit}.goalos-shell{position:sticky;top:0;z-index:99999;backdrop-filter:blur(20px);background:rgba(5,7,13,.92);border-bottom:1px solid var(--line)}.goalos-nav{width:min(1280px,calc(100% - 28px));margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:12px 0}.goalos-brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:950;letter-spacing:-.04em}.goalos-mark{width:35px;height:35px;border-radius:11px;border:1px solid rgba(255,215,106,.68);display:grid;place-items:center;color:var(--gold);font-weight:950;background:linear-gradient(145deg,rgba(255,215,106,.16),rgba(255,255,255,.04))}.goalos-links{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end}.goalos-links a{font-size:12.7px;text-decoration:none;padding:9px 10px;border:1px solid transparent;border-radius:999px;color:var(--muted);font-weight:850}.goalos-links a:hover{color:var(--text);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.06)}.goalos-links a.shop{color:#05070d;background:var(--gold);border-color:var(--gold)}.seal-mini{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(255,215,106,.35);background:rgba(255,215,106,.07);border-radius:999px;padding:6px 8px;color:var(--champagne);font-weight:950;text-decoration:none;font-size:12px}.seal-mini img{width:24px;height:24px;object-fit:contain;border-radius:50%}.quebec-seal{display:flex;align-items:center;gap:14px;border:1px solid rgba(255,215,106,.34);background:linear-gradient(135deg,rgba(255,215,106,.12),rgba(255,255,255,.035));border-radius:22px;padding:14px 16px;max-width:520px;margin:18px 0}.quebec-seal img{width:62px;height:62px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 12px 20px rgba(0,0,0,.35))}.quebec-seal strong{display:block;color:var(--champagne);letter-spacing:-.02em}.quebec-seal span{color:var(--muted);font-size:14px}.wrap{width:min(1280px,calc(100% - 36px));margin:0 auto;padding:72px 0 96px}.hero{padding:46px 0}.eyebrow{color:var(--gold);text-transform:uppercase;letter-spacing:.23em;font-weight:950;font-size:12px;margin-bottom:18px}.kicker{color:var(--champagne);font-weight:900;letter-spacing:-.02em}.wrap h1{font-size:clamp(52px,8.3vw,116px);line-height:.85;letter-spacing:-.088em;margin:0 0 24px;max-width:1180px}.wrap h2{font-size:clamp(34px,5.4vw,68px);line-height:.92;letter-spacing:-.068em;margin:0 0 18px}.wrap h3{font-size:24px;letter-spacing:-.045em;margin:0 0 10px}.lead{font-size:clamp(19px,2vw,24px);line-height:1.55;color:var(--muted);max-width:980px;margin:0 0 24px}.fr{color:#dce3ff}.actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}.btn{display:inline-flex;align-items:center;justify-content:center;padding:13px 17px;border:1px solid rgba(255,215,106,.52);border-radius:999px;text-decoration:none;font-weight:950;background:rgba(255,255,255,.055);color:var(--text)}.btn.primary{background:linear-gradient(135deg,var(--gold),#ffe9a3);color:#05070d;border-color:var(--gold)}.section{margin:66px 0}.panel,.card{border:1px solid var(--line);background:linear-gradient(180deg,var(--panel),var(--panel2));border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:32px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid.two{grid-template-columns:repeat(2,1fr)}.card{padding:23px;text-decoration:none;display:flex;flex-direction:column;min-height:205px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 90% 0%,rgba(255,215,106,.09),transparent 18rem);pointer-events:none}.card:hover{transform:translateY(-2px);border-color:rgba(255,215,106,.52)}.card p{color:var(--muted);line-height:1.45;margin:0 0 12px}.price{font-size:46px;font-weight:950;letter-spacing:-.06em;color:var(--gold);margin:4px 0 12px}.badge{display:inline-flex;align-self:flex-start;margin-bottom:13px;font-size:12px;color:var(--gold);border:1px solid rgba(255,215,106,.45);border-radius:999px;padding:6px 9px;font-weight:900}.list{display:grid;gap:10px;margin:18px 0 0;padding:0;list-style:none}.list li{padding-left:26px;position:relative;color:var(--muted);line-height:1.42}.list li:before{content:"✓";position:absolute;left:0;color:var(--gold);font-weight:950}.law{font-size:clamp(27px,3.6vw,48px);line-height:1.1;letter-spacing:-.05em;margin:0;color:var(--text)}.loop{display:inline-flex;border:1px solid rgba(255,215,106,.45);border-radius:999px;color:var(--gold);background:rgba(255,215,106,.08);padding:10px 14px;font-weight:950;margin:12px 0}.steps{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:24px}.steps div{border:1px solid var(--line);border-radius:20px;padding:16px;background:rgba(255,255,255,.045)}.steps strong{display:block;color:var(--gold);font-size:13px;margin-bottom:8px}.steps span{color:var(--muted);font-size:14px;line-height:1.35}.table{width:100%;border-collapse:separate;border-spacing:0 8px}.table td,.table th{padding:14px;background:rgba(255,255,255,.055);border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:left;color:var(--muted);vertical-align:top}.table th{color:var(--text)}.table td:first-child,.table th:first-child{border-left:1px solid var(--line);border-radius:14px 0 0 14px}.table td:last-child,.table th:last-child{border-right:1px solid var(--line);border-radius:0 14px 14px 0}.search input{width:100%;padding:16px 18px;border-radius:18px;border:1px solid var(--line);background:#080b13;color:var(--text);font-size:17px;outline:none}.footer{border-top:1px solid var(--line);padding:34px 0;color:var(--muted);font-size:13px;background:rgba(5,7,13,.78)}.footer-inner{width:min(1280px,calc(100% - 36px));margin:0 auto;display:flex;gap:18px;justify-content:space-between;flex-wrap:wrap}.footer a{color:var(--muted);text-decoration:none;margin-right:14px}@media(max-width:1020px){.grid,.grid.two,.steps{grid-template-columns:1fr}.goalos-links{display:none}.wrap{padding-top:42px}.loop{display:flex;white-space:normal;border-radius:22px}.quebec-seal{max-width:none}.quebec-seal img{width:52px;height:52px}} - """ - CSS += "\n.seal-orbit{position:absolute;right:-30px;top:-40px;width:390px;height:390px;opacity:.13;background:url('/proof-gradient/assets/quebecaisealv5.png') center/contain no-repeat;filter:drop-shadow(0 40px 80px rgba(255,215,106,.23));pointer-events:none}.hero{position:relative;overflow:hidden}.sovereign-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.sovereign-strip div{border:1px solid rgba(255,215,106,.25);border-radius:20px;padding:16px;background:rgba(255,215,106,.045)}.sovereign-strip strong{display:block;color:var(--champagne);font-size:13px;text-transform:uppercase;letter-spacing:.16em;margin-bottom:8px}.sovereign-strip span{color:var(--muted);line-height:1.4}.seal-divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,215,106,.6),transparent);margin:24px 0}.quebec-main-link{color:var(--champagne);text-decoration:none;font-weight:950}.quebec-main-link:hover{text-decoration:underline}@media(max-width:1020px){.sovereign-strip{grid-template-columns:1fr}.seal-orbit{width:240px;height:240px;opacity:.08}}\n" - CSS += '\n.asset-rail{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:20px 0 8px}.asset-rail img{width:100%;height:120px;object-fit:cover;border-radius:18px;border:1px solid rgba(255,215,106,.22);background:rgba(255,255,255,.04);box-shadow:0 18px 48px rgba(0,0,0,.24)}.asset-gallery{overflow:hidden}.asset-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.asset-card{margin:0;border:1px solid rgba(255,255,255,.14);border-radius:22px;overflow:hidden;background:rgba(255,255,255,.045)}.asset-card img{display:block;width:100%;height:210px;object-fit:cover;background:#080b13}.asset-card figcaption{padding:12px 14px;color:var(--muted);font-size:13px}.sovereign-masthead{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.sovereign-masthead img{width:76px;height:76px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 18px 30px rgba(255,215,106,.16))}.quebec-ai-promise{font-size:clamp(18px,2vw,22px);line-height:1.45;color:var(--champagne);max-width:900px}@media(max-width:1020px){.asset-rail,.asset-grid{grid-template-columns:1fr}.asset-rail img{height:180px}.asset-card img{height:220px}}\n' - CSS += '\n.asset-rail{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:20px 0 8px}.asset-rail img{width:100%;height:122px;object-fit:cover;border-radius:18px;border:1px solid rgba(255,215,106,.22);background:rgba(255,255,255,.04);box-shadow:0 18px 48px rgba(0,0,0,.24)}.asset-gallery{overflow:hidden}.asset-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:22px}.asset-card{margin:0;border:1px solid rgba(255,255,255,.14);border-radius:22px;overflow:hidden;background:rgba(255,255,255,.045)}.asset-card img{display:block;width:100%;height:215px;object-fit:cover;background:#080b13}.asset-card figcaption{display:flex;justify-content:space-between;gap:10px;padding:12px 14px;color:var(--muted);font-size:13px}.asset-card figcaption strong{color:var(--gold);text-transform:uppercase;letter-spacing:.12em;font-size:10px}.hero-visual{margin:24px 0 4px;border:1px solid rgba(255,215,106,.25);border-radius:30px;overflow:hidden;max-width:860px;background:rgba(255,255,255,.045);box-shadow:0 30px 80px rgba(0,0,0,.34)}.hero-visual img{display:block;width:100%;height:min(360px,42vw);object-fit:cover}.hero-visual figcaption{padding:12px 16px;color:var(--muted);font-size:13px}.role-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}.role-panel{border:1px solid rgba(255,255,255,.14);border-radius:20px;background:rgba(255,255,255,.045);padding:12px}.role-panel strong{display:block;color:var(--gold);margin-bottom:10px}.role-panel div{display:grid;grid-template-columns:1fr;gap:8px}.role-panel img{width:100%;height:74px;object-fit:cover;border-radius:14px;border:1px solid rgba(255,255,255,.12)}.sovereign-masthead{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.sovereign-masthead img{width:76px;height:76px;object-fit:contain;border-radius:50%;filter:drop-shadow(0 18px 30px rgba(255,215,106,.16))}.quebec-ai-promise{font-size:clamp(18px,2vw,22px);line-height:1.45;color:var(--champagne);max-width:900px}.quebec-main-link{color:var(--champagne);text-decoration:none;font-weight:950}.quebec-main-link:hover{text-decoration:underline}@media(max-width:1020px){.asset-rail,.asset-grid,.role-grid{grid-template-columns:1fr}.asset-rail img{height:180px}.asset-card img{height:220px}.hero-visual img{height:240px}}\n' - (ASSETS / "goalos-sovereign-v8.css").write_text(CSS, encoding="utf-8") - - JS = r"""(function(){function ready(f){document.readyState!=="loading"?f():document.addEventListener("DOMContentLoaded",f)}ready(function(){var input=document.querySelector("[data-site-search]");if(!input)return;var cards=[].slice.call(document.querySelectorAll("[data-site-card]"));input.addEventListener("input",function(){var q=input.value.toLowerCase().trim();cards.forEach(function(c){c.style.display=!q||c.textContent.toLowerCase().indexOf(q)!==-1?"":"none"})})})})();""" - (ASSETS / "goalos-sovereign-v8.js").write_text(JS, encoding="utf-8") - - OG = """QUEBEC.AI ⚜️✨ · GOALOSA model can answer.An agent can act.An institution must prove.Recursive workflows · RSI Sprint Workshop · Proof Rooms""" - (ASSETS / "goalos-opulent-og.svg").write_text(OG, encoding="utf-8") - - SEAL_IMG = f'{BASE}/assets/quebecaisealv5.png' - SEAL_BADGE = f"""
QUEBEC.AI Seal ⚜️✨
QUEBEC.AI Seal ⚜️✨Institutional AI workflow proof, bilingual by design.
Preuve institutionnelle des flux IA, bilingue par conception.
""" - NAV = f""" -
- -
- """ - - FOOTER = f""" -
- -
- """ - - def page(title, desc, body): - return f""" - - - - - {escape(title)} - - - - - - - - - - - - - -
- {body} -
- - """ - - def write_page(rel, title, desc, body): - out = WEB_ROOT / rel / "index.html" if rel else WEB_ROOT / "index.html" - out.parent.mkdir(parents=True, exist_ok=True) - backup(out) - out.write_text(page(title, desc, body), encoding="utf-8") - REPORT["pages_written"].append(out.relative_to(WEB_ROOT).as_posix()) - - def bullets(items): - return "
    " + "".join(f"
  • {escape(i)}
  • " for i in items) + "
" - - def offer_card(o): - return f""" - {escape(o['price'])} -

{escape(o['title_en'])}

-

{escape(o['title_fr'])}

-

{escape(o['promise_en'])}

-

{escape(o['promise_fr'])}

-
""" - - # Core pages. - write_page("", "QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient", "Bilingual GoalOS public site for recursive workflows, Proof Rooms, and RSI Sprint Workshop.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS · Proof Gradient
-

A model can answer. An agent can act. An institution must prove.

-

GoalOS turns repeated AI work into owned, scored, versioned, approved, monitored, and recursively improving workflows.

-

GoalOS transforme le travail IA répété en flux possédés, notés, versionnés, approuvés, surveillés et récursivement améliorés.

-
Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
-
QUEBEC.AI Seal ⚜️✨

Frontier. AI‑First. Sovereign. GoalOS brings that institutional AI direction to recursive workflows, Proof Rooms, and governed improvement.

Frontier. IA d’abord. Souverain. GoalOS applique cette direction institutionnelle aux flux récursifs, aux Salles de preuve et à l’amélioration gouvernée.

- {SEAL_BADGE} - {hero_visual()} - {asset_rail(role='hero')} -
-
Frontier / FrontièreAI workflows designed for the infrastructure era.
Des flux IA conçus pour l’ère des infrastructures.
-
AI‑First / IA d’abordOperations rebuilt around reusable, improving intelligence.
Des opérations reconstruites autour d’une intelligence réutilisable et améliorable.
-
Sovereign / SouverainProof, governance, review, and rollback remain visible.
Preuve, gouvernance, revue et rollback restent visibles.
-
- -
-
-
Featured / Offre phare
-

GoalOS RSI Sprint Workshop

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

- -
-
-
Software proof / Preuve logicielle
-

GoalOS Cloud MVP 0.2 proves recursive workflow improvement running in software.

-

GoalOS Cloud MVP 0.2 prouve l’amélioration récursive des flux en logiciel.

- -
-
-
Commercial ladder / Parcours commercial
-

From reusable workflow to Enterprise RSI.

-
{''.join(offer_card(o) for o in OFFERS)}
-
-
-

Safe boundary / Limite claire

-

GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback.

-

GoalOS ne modifie pas les modèles IA. Il améliore les flux autour de l’IA grâce aux instructions, vérifications, grilles de score, dossiers de preuve, mémoire, standards de preuve, versions, approbations, surveillance et rollback.

-
- """) - - write_page("start-here", "Start Here · GoalOS", "Bilingual starting point for GoalOS products and services.", f"""
Start Here / Départ

Start with the outcome you need.

Reusable workflow, self-improving workflow, department Proof Room, RSI Sprint Workshop, implementation sprint, or enterprise pilot.

Flux réutilisable, flux auto-améliorant, Salle de preuve départementale, atelier RSI Sprint, sprint de mise en œuvre ou pilote entreprise.

{SEAL_BADGE}
{''.join(offer_card(o) for o in OFFERS)}
""") - - write_page("products", "GoalOS Products", "Bilingual GoalOS product and service ladder.", f"""
Products / Produits

Choose your GoalOS path.

Start with one reusable AI workflow, upgrade to self-improving workflows, then install Proof Rooms and Enterprise RSI.

Commencez avec un flux IA réutilisable, passez aux flux auto-améliorants, puis installez des Salles de preuve et l’Enterprise RSI.

{''.join(offer_card(o) for o in OFFERS)}
""") - - pricing_rows = "".join(f"{escape(o['price'])}{escape(o['title_en'])}
{escape(o['title_fr'])}{escape(o['promise_en'])}
{escape(o['promise_fr'])}{escape(o['type_en'])}
{escape(o['type_fr'])}" for o in OFFERS) - write_page("pricing", "GoalOS Pricing", "Bilingual GoalOS pricing ladder.", f"""
Pricing / Tarifs

Clear ladder. Clear outcomes.

$49 → $199 → $997 → $2,500+ → $9,500+ → $49,000+.

Un parcours clair, de la première trousse au pilote entreprise.

{pricing_rows}
PriceOfferOutcomeType
""") - - write_page("services", "GoalOS Services", "Bilingual GoalOS services and enterprise pilots.", f"""
Services / Services

From RSI Sprint Workshop to Enterprise RSI Pilot.

Use services to generate proof, install department Proof Rooms, and validate the enterprise platform.

Utilisez les services pour générer des preuves, installer des Salles de preuve départementales et valider la plateforme entreprise.

{''.join(offer_card(o) for o in OFFERS[3:])}
""") - - # Offer detail pages. - for o in OFFERS: - seal = SEAL_BADGE if o["slug"] in ["goalos-rsi-sprint-workshop", "goalos-enterprise-rsi-pilot", "goalos-proof-room-lite"] else "" - write_page(f"products/{o['slug']}", o["title_en"], o["promise_en"], f"""
{escape(o['price'])} · {escape(o['type_en'])}

{escape(o['title_en'])}

{escape(o['title_fr'])}

{escape(o['promise_en'])}

{escape(o['promise_fr'])}

Best for: {escape(o['audience_en'])}

Idéal pour : {escape(o['audience_fr'])}

{seal}
{escape(o['price'])}

Included / Inclus

{bullets(o['bullets_en'])}

Français

{bullets(o['bullets_fr'])}

Boundary / Limite

No guaranteed ROI, income, compliance certification, safety guarantee, legal advice, or uncontrolled autonomous deployment. Human review required.

Aucune garantie de ROI, de revenu, de certification de conformité, de sécurité, de conseil juridique ou de déploiement autonome incontrôlé. La revue humaine est requise.

""") - - # Workshop public page — with seal and v6 public positioning. - write_page("workshop/goalos-rsi-sprint-workshop", "GoalOS RSI Sprint Workshop", "Build your first self-improving AI workflow live.", f""" -
-
QUEBEC.AI ⚜️✨ · GoalOS RSI Sprint Workshop
-

Build your first self-improving AI workflow live.

-

A premium, executive-grade workshop that turns one repeated AI task into a scored, versioned, proof-recorded, self-improving workflow.

-

Un atelier premium de niveau exécutif qui transforme une tâche IA répétée en flux auto-améliorant, noté, versionné et documenté par une preuve.

-
Run → Score → Diagnose → Improve → Version → Prove → Re-run
- {SEAL_BADGE} - {asset_rail(role='product', limit=4)} - -
-
-

What you leave with / Ce que vous obtenez

-
-
1Workflow v1.0
Flux v1.0
-
2First run output
Première sortie
-
3Scorecard
Grille de score
-
4Diagnosis
Diagnostic
-
5Workflow v1.1
Flux v1.1
-
6Proof note
Note de preuve
-
-
-
-

Premium delivery standard / Standard de livraison premium

-

One repeated task. One live workflow loop. One public-safe proof-card draft. One 30-day next-run plan.

-

Une tâche répétée. Une boucle de flux en direct. Un brouillon de carte de preuve publique sécuritaire. Un plan de réexécution sur 30 jours.

-
-
-

Safe boundary / Limite claire

-

GoalOS RSI Sprint Workshop does not modify AI models. It improves the workflow around your AI assistant through instructions, checks, scorecards, proof notes, versions, and human review.

-

GoalOS RSI Sprint Workshop ne modifie pas les modèles IA. Il améliore le flux autour de votre assistant IA grâce aux instructions, vérifications, grilles de score, notes de preuve, versions et revue humaine.

-
- """) - - write_page("implementation/goalos-proof-room-implementation-sprint", "Department RSI in 30 Days", "GoalOS Proof Room Implementation Sprint.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

{SEAL_BADGE}

In 30 days, set up the first version of a lightweight Proof Room for three repeated department AI workflows.

En 30 jours, mettez en place la première version d’une Salle de preuve légère pour trois flux IA répétés d’un département.

""") - write_page("workshop/goalos-proof-room-implementation-sprint", "GoalOS Proof Room Implementation Sprint", "Department RSI in 30 Days.", f"""
Department RSI / RSI départemental

Department RSI in 30 days.

Deploy Recursive Self-Improving Workflows in one department.

Déployez des flux récursivement auto-améliorants dans un département.

""") - - enterprise_body = f"""
QUEBEC.AI ⚜️✨ · Enterprise RSI / RSI entreprise

Enterprise RSI without model self-modification.

Pilot the Recursive Workflow Operating System for one enterprise workflow family.

Pilotez le Recursive Workflow Operating System pour une famille de flux entreprise.

Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run
{SEAL_BADGE}

Formal platform name / Nom formel

GoalOS Recursive Workflow OS

""" - write_page("enterprise/goalos-enterprise-rsi-pilot", "GoalOS Enterprise RSI Pilot", "Enterprise RSI without model self-modification.", enterprise_body) - write_page("platform/goalos-recursive-workflow-os", "GoalOS Recursive Workflow OS", "Enterprise Recursive Workflow OS platform direction.", enterprise_body) - - write_page("products/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Enterprise recursive workflow proof running in software.", f"""
GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof, running in software.

A public MVP proving: Run → Score → Prove → Diagnose → Improve → Approve → Version → Monitor → Re-run.

Un MVP public qui prouve : exécuter, noter, prouver, diagnostiquer, améliorer, approuver, versionner, surveiller et réexécuter.

What it proves / Ce qu’il prouve

1Workflow Studio
2Evaluation Engine
3Proof Room
4Improvement Proposal
5Approval Gate
6Rollback Target
""") - if not (WEB_ROOT / "app/goalos-cloud-mvp/index.html").exists(): - write_page("app/goalos-cloud-mvp", "GoalOS Cloud MVP 0.2", "Public software proof placeholder.", f"""
GoalOS Cloud MVP 0.2

Recursive workflow improvement, running in software.

Run the GoalOS Cloud MVP v0.2 action to install the interactive public app.

Exécutez l’action GoalOS Cloud MVP v0.2 pour installer l’application publique interactive.

""") - - standards_cards = "".join(f'AEP

{escape(code)}

{escape(en)}

{escape(fr)}

' for code,en,fr in STANDARDS) - write_page("standards", "AEP Standards", "Bilingual Proof Gradient standards.", f"""
AEP Standards / Standards AEP

The public trust layer.

AEP standards provide the vocabulary for proof, permission, rollback, public-safe reports, and Proof Rooms.

Les standards AEP donnent le vocabulaire de preuve, permission, rollback, rapports publics sécuritaires et Salles de preuve.

{standards_cards}
""") - for code,en,fr in STANDARDS: - if not (WEB_ROOT / "standards" / code / "index.html").exists(): - write_page(f"standards/{code}", f"{code} — {en}", en, f"""
AEP Standard

{escape(code)} — {escape(en)}

{escape(fr)}

Public trust layer for GoalOS and Proof Gradient.

""") - - examples_cards = "".join(f'Example

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

' for slug,en,fr,desc_en,desc_fr in EXAMPLES) - write_page("examples", "GoalOS Examples", "Bilingual GoalOS workflow examples.", f"""
Examples / Exemples

Practical GoalOS examples.

Examples that teach reusable workflows, RSI Lite, Proof Room Lite, and Department RSI.

Des exemples pour comprendre les flux réutilisables, RSI Lite, Proof Room Lite et RSI départemental.

{examples_cards}
""") - for slug,en,fr,desc_en,desc_fr in EXAMPLES: - if not (WEB_ROOT / "workflow" / slug / "index.html").exists(): - write_page(f"workflow/{slug}", en, desc_en, f"""
GoalOS Example / Exemple GoalOS

{escape(en)}

{escape(fr)}

{escape(desc_en)}

{escape(desc_fr)}

GoalOS structure / Structure GoalOS

Context → Rules → Memory → Workflow → Checks → Proof.

Contexte → Règles → Mémoire → Flux → Vérifications → Preuve.

""") - - command_cards = "".join(offer_card(o) for o in OFFERS) + f'MVP

GoalOS Cloud MVP 0.2

Enterprise recursive workflow proof running in software.

Preuve logicielle de flux récursif d’entreprise.

' - write_page("command-center", "GoalOS Command Center", "Bilingual GoalOS command center.", f"""
Command Center / Centre de commande

One site. One command center.

Search the unified GoalOS / Proof Gradient website.

Recherchez dans le site unifié GoalOS / Proof Gradient.

{command_cards}
""") - - write_page("brand/visual-system", "QUEBEC.AI ⚜️✨ Visual System", "Public QUEBEC.AI / GoalOS visual identity assets used on the site.", f"""
QUEBEC.AI ⚜️✨ · Visual System

Frontier. AI‑First. Sovereign.

The public GoalOS site uses the QUEBEC.AI Seal, bilingual institutional copy, gold/champagne accents, and discovered public brand imagery from the repository assets folder.

Le site public GoalOS utilise le sceau QUEBEC.AI, une rédaction institutionnelle bilingue, des accents or/champagne et les visuels publics détectés dans le dossier assets du dépôt.

{SEAL_BADGE}
{role_panels()}{asset_gallery(36)}

Brand asset manifest

The action generates a public manifest at /proof-gradient/assets/brand-assets-v8.json.

L’action génère un manifeste public à /proof-gradient/assets/brand-assets-v8.json.

""") - - URLS = ["/","/start-here/","/products/","/pricing/","/services/","/examples/","/standards/","/command-center/","/site-map/","/products/goalos-cloud-mvp/","/app/goalos-cloud-mvp/","/workshop/goalos-rsi-sprint-workshop/","/implementation/goalos-proof-room-implementation-sprint/","/workshop/goalos-proof-room-implementation-sprint/","/enterprise/goalos-enterprise-rsi-pilot/","/platform/goalos-recursive-workflow-os/","/brand/visual-system/"] + [f"/products/{o['slug']}/" for o in OFFERS] + [f"/standards/{code}/" for code,_,_ in STANDARDS] + [f"/workflow/{slug}/" for slug,_,_,_,_ in EXAMPLES] - site_rows = "".join(f"{escape(u)}{href(u)}" for u in sorted(set(URLS))) - write_page("site-map", "GoalOS Site Map", "Bilingual GoalOS site map.", f"""
Site Map / Plan du site

Unified site map.

Plan du site unifié.

{site_rows}
PathURL
""") - - backup(WEB_ROOT / "404.html") - (WEB_ROOT / "404.html").write_text(page("404 · GoalOS", "Page not found.", f"""
404

Page not found.

Use the Command Center to find the right GoalOS page.

Utilisez le Centre de commande pour trouver la bonne page GoalOS.

"""), encoding="utf-8") - - # Public documentation. - DOCS = Path("docs") - DOCS.mkdir(exist_ok=True) - (DOCS / "GOALOS_PUBLIC_SITE_RELEASE_V8_INTELLIGENT_ASSETS.md").write_text(f"""# GoalOS Public Site Release v8 — Intelligent QUEBEC.AI Assets ⚜️✨ - - Generated: {NOW} - - ## Purpose - - Refresh the public Proof Gradient / GoalOS website as a bilingual, corporate, institutional, opulent public site with the QUEBEC.AI Seal. - - ## Seal - - The release copies: - - `assets/quebecaisealv5.png` - - to: - - `site/assets/quebecaisealv5.png` - - uses it as favicon / apple-touch-icon / web app icon, copies newly added public image assets from `assets/` into `site/assets/brand/`, and displays the identity with: - - `QUEBEC.AI ⚜️✨` - - ## Includes - - - GoalOS RSI Sprint Workshop public pages - - product ladder - - pricing - - services - - Cloud MVP public page - - AEP standards - - examples - - command center - - paid/private artifact guard - - ## Paid file policy - - Paid buyer products and private delivery materials are not uploaded to the public site. - - All buy/apply buttons point to: - - {SHOP} - - ## Safe boundary - - GoalOS does not modify AI models. It improves workflows around AI through instructions, checks, scorecards, proof records, memory, evidence standards, versions, approvals, monitoring, and rollback. - """, encoding="utf-8") - - # Shell repair across all HTML. - MARKERS = [ - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - r".*?", - ] - ASSET_PATTERNS = [ - r']+data-goalos-[^>]+>\s*', - r']+data-goalos-[^>]+>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.css[^>]*>\s*', - r']+goalos-(?:complete|product|unified|site-v2|site-v3|opulent-v4|opulent-v5|ladder)[^>]+\.js[^>]*>\s*', - ] - SHELL_TEXT = re.compile(r"(GoalOS|Proof Gradient|Products|Pricing|Services|Standards|Shop|Department RSI|Cloud MVP|RSI Workshop|Atelier|QUEBEC)", re.I) - - def remove_headers(text): - body = re.search(r"]*>", text, flags=re.I) - if not body: - return text, 0 - start = body.end() - next_content = re.search(r"]+>", " ", block) - if SHELL_TEXT.search(flat): - removed += 1 - return "\n" - return block - pattern = re.compile(r"<(?:header|nav)\b[\s\S]*?|]*class=[\"'][^\"']*(?:topbar|shell|navbar|site-header|nav)[^\"']*[\"'])[\s\S]*?", re.I) - return text[:start] + pattern.sub(repl, prefix) + text[prefix_end:], removed - - def remove_footers(text): - removed = 0 - def repl(m): - nonlocal removed - block = m.group(0) - if SHELL_TEXT.search(re.sub(r"<[^>]+>", " ", block)): - removed += 1 - return "\n" - return block - return re.sub(r"", repl, text, flags=re.I), removed - - CANON_CSS = f'' - CANON_JS = f'' - - def repair_html(path): - if "_archive" in path.parts or ".git" in path.parts: - return - text = path.read_text(encoding="utf-8", errors="ignore") - if "" in text: - text = text.replace("", f" {CANON_CSS}\n {CANON_JS}\n", 1) - if "]*>)", r"\1\n" + NAV + "\n", text, count=1, flags=re.I) - else: - text = NAV + "\n" + text - if "" in text: - text = text.replace("", FOOTER + "\n", 1) - else: - text += "\n" + FOOTER - if text != original: - path.write_text(text, encoding="utf-8") - REPORT["html_repaired"].append(path.relative_to(WEB_ROOT).as_posix()) - - for html in sorted(WEB_ROOT.rglob("*.html")): - repair_html(html) - - # Sitemap and robots. - sitemap = '\n\n' - for u in sorted(set(URLS)): - sitemap += f' https://montrealai.github.io{BASE}{u}{TODAY}\n' - sitemap += "\n" - (WEB_ROOT / "sitemap.xml").write_text(sitemap, encoding="utf-8") - (WEB_ROOT / "robots.txt").write_text(f"User-agent: *\nAllow: /\nSitemap: https://montrealai.github.io{BASE}/sitemap.xml\n", encoding="utf-8") - - # Paid/private artifact guard. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - restricted = [] - allowed = [] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip"): - if is_public_standard_package(rel): - allowed.append(rel) - else: - restricted.append(rel) - continue - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - restricted.append(rel) - REPORT["allowed_public_packages"] = allowed - if restricted: - raise SystemExit("Paid/private artifacts detected in public site:\n" + "\n".join(sorted(set(restricted))[:120])) - - # Validation. - errors = [] - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - missing = [] - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - missing.append((html.relative_to(WEB_ROOT).as_posix(), m.group(1))) - if missing: - errors.append("Missing internal links:\n" + "\n".join(f"{s} -> {u}" for s,u in missing[:80])) - - REPORT["validation"] = {"errors": errors, "html_files_checked": len([p for p in WEB_ROOT.rglob('*.html') if '_archive' not in p.parts])} - if errors: - (WEB_ROOT / "goalos-public-site-release-v8-errors.json").write_text(json.dumps(errors, indent=2), encoding="utf-8") - raise SystemExit("GoalOS public site release v8 validation failed:\n" + "\n".join(errors[:60])) - - # Manifest/report. - manifest = [] - for p in sorted(WEB_ROOT.rglob("*")): - if p.is_file() and ".git" not in p.parts: - manifest.append({"path":p.relative_to(WEB_ROOT).as_posix(),"bytes":p.stat().st_size,"sha256":hashlib.sha256(p.read_bytes()).hexdigest()}) - (WEB_ROOT / "goalos-public-site-release-v8-manifest.json").write_text(json.dumps({"generated_at":NOW,"files":manifest}, indent=2)+"\n", encoding="utf-8") - (WEB_ROOT / "goalos-public-site-release-v8-report.json").write_text(json.dumps(REPORT, indent=2)+"\n", encoding="utf-8") - - print("GoalOS public site release v8 complete.") - print("Web root:", WEB_ROOT) - print("Pages written:", len(REPORT["pages_written"])) - print("HTML repaired:", len(REPORT["html_repaired"])) - print("QUEBEC.AI seal:", REPORT["quebec_ai_seal"]) - print("Allowed public packages:", len(allowed)) - print("Validation: passed") - PY - - python3 "$RUNNER_TEMP/goalos_public_site_release_v5.py" - - - name: Run public site validation - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v5.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - if not (WEB_ROOT / "assets" / "brand-assets-v8.json").exists(): - errors.append("Missing brand asset manifest at site/assets/brand-assets-v8.json.") - else: - try: - import json - manifest = json.loads((WEB_ROOT / "assets" / "brand-assets-v8.json").read_text(encoding="utf-8")) - if "assets" not in manifest: - errors.append("Brand asset manifest exists but does not include an assets list.") - except Exception as exc: - errors.append(f"Brand asset manifest could not be parsed: {exc}") - if not (WEB_ROOT / "brand" / "visual-system" / "index.html").exists(): - errors.append("Missing brand visual system page at site/brand/visual-system/index.html.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v6 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v5.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi - - - name: Safety check — refuse deletions - shell: bash - run: | - set -euo pipefail - deleted="$(git diff --name-status | awk '$1 ~ /^D/ {print}')" - if [ -n "$deleted" ]; then - echo "Refusing to continue because deletions were detected:" - echo "$deleted" - exit 1 - fi - - - name: Commit public site release - shell: bash - run: | - set -euo pipefail - WEB_ROOT="${{ steps.build.outputs.web_root }}" - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$WEB_ROOT" docs || true - if git diff --cached --quiet; then - echo "No public site changes to commit." - else - git commit -m "Release bilingual GoalOS public site v8 with intelligent QUEBEC.AI assets [skip ci]" - git push - fi - - - name: Configure GitHub Pages - uses: actions/configure-pages@v5 - - - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ${{ steps.build.outputs.web_root }} - - - name: Deploy GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-docs-tables-figures.yml b/.github/workflows/validate-docs-tables-figures.yml new file mode 100644 index 00000000..ac872bcd --- /dev/null +++ b/.github/workflows/validate-docs-tables-figures.yml @@ -0,0 +1,24 @@ +name: Validate Docs Tables Figures + +on: + workflow_dispatch: + pull_request: + paths: + - 'docs/**' + - 'site/**' + - 'public/**' + - 'scripts/goalos_public_site_rules.py' + - 'scripts/validate_docs_tables_figures.py' + +permissions: + contents: read + +jobs: + validate: + name: Shared docs/tables/figures validation + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py diff --git a/.github/workflows/validate-goalos-public-site-v12.yml b/.github/workflows/validate-goalos-public-site-v12.yml new file mode 100644 index 00000000..817e4d08 --- /dev/null +++ b/.github/workflows/validate-goalos-public-site-v12.yml @@ -0,0 +1,36 @@ +name: Validate GoalOS Public Site v12 + +on: + workflow_dispatch: + pull_request: + paths: + - 'site/**' + - 'public/**' + - 'scripts/goalos_public_site_rules.py' + - 'scripts/validate_goalos_public_site.py' + - 'scripts/check_no_paid_artifacts.py' + - 'scripts/validate_docs_tables_figures.py' + - 'scripts/validate_goalos_catalog.py' + - 'tests/test_goalos_public_site_rules.py' + - '.github/workflows/**' + +permissions: + contents: read + +jobs: + validate: + name: Shared public-site validation + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Validate GoalOS public site + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v3-1.yml b/.github/workflows/validate-goalos-public-site-v3-1.yml index 10a43888..3cdfa7e3 100644 --- a/.github/workflows/validate-goalos-public-site-v3-1.yml +++ b/.github/workflows/validate-goalos-public-site-v3-1.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v3.1 +name: validate-goalos-public-site-v3-1 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,6 +6,8 @@ on: paths: - 'site/**' - 'public/**' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -13,91 +15,18 @@ permissions: jobs: validate: - name: Validate public site shell, links, and paid artifact policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - # v3.1 allows public AEP standard packages but blocks buyer/delivery/private bundles. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v3-2.yml b/.github/workflows/validate-goalos-public-site-v3-2.yml index 3ea4f8ec..aabccf31 100644 --- a/.github/workflows/validate-goalos-public-site-v3-2.yml +++ b/.github/workflows/validate-goalos-public-site-v3-2.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v3.2 +name: validate-goalos-public-site-v3-2 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,6 +6,8 @@ on: paths: - 'site/**' - 'public/**' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -13,91 +15,18 @@ permissions: jobs: validate: - name: Validate public site shell, links, and paid artifact policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - # v3.2 allows public AEP standard packages but blocks buyer/delivery/private bundles. - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v4.yml b/.github/workflows/validate-goalos-public-site-v4.yml index 64dfd01f..49a09995 100644 --- a/.github/workflows/validate-goalos-public-site-v4.yml +++ b/.github/workflows/validate-goalos-public-site-v4.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v4 +name: validate-goalos-public-site-v4 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,6 +6,8 @@ on: paths: - 'site/**' - 'public/**' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -13,86 +15,18 @@ permissions: jobs: validate: - name: Validate bilingual public site shell, links, and paid-file policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v4.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v4 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v4.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v5.yml b/.github/workflows/validate-goalos-public-site-v5.yml index 6097e184..8a5d36df 100644 --- a/.github/workflows/validate-goalos-public-site-v5.yml +++ b/.github/workflows/validate-goalos-public-site-v5.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v5 +name: validate-goalos-public-site-v5 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,7 +6,8 @@ on: paths: - 'site/**' - 'public/**' - - 'assets/quebecaisealv5.png' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -14,90 +15,18 @@ permissions: jobs: validate: - name: Validate public site, QUEBEC.AI Seal, links, and paid-file policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v5.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal check. The image is strongly preferred. If missing, fail because v5 is specifically the QUEBEC.AI Seal release. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v5 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v5.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v6.yml b/.github/workflows/validate-goalos-public-site-v6.yml index 2ddf8660..fff893af 100644 --- a/.github/workflows/validate-goalos-public-site-v6.yml +++ b/.github/workflows/validate-goalos-public-site-v6.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v6 +name: validate-goalos-public-site-v6 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,7 +6,8 @@ on: paths: - 'site/**' - 'public/**' - - 'assets/quebecaisealv5.png' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -14,96 +15,18 @@ permissions: jobs: validate: - name: Validate public site, QUEBEC.AI Seal/icon, links, and paid-file policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v6.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v6 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v6.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v7.yml b/.github/workflows/validate-goalos-public-site-v7.yml index f2eccbb2..b8fcddfe 100644 --- a/.github/workflows/validate-goalos-public-site-v7.yml +++ b/.github/workflows/validate-goalos-public-site-v7.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v7 +name: validate-goalos-public-site-v7 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,7 +6,8 @@ on: paths: - 'site/**' - 'public/**' - - 'assets/quebecaisealv5.png' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -14,100 +15,18 @@ permissions: jobs: validate: - name: Validate public site, QUEBEC.AI Seal/icon, brand assets, links, and paid-file policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v7.py" <<'PY' - from pathlib import Path - import re, sys - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - if not (WEB_ROOT / "assets" / "brand-assets-v7.json").exists(): - errors.append("Missing brand asset manifest at site/assets/brand-assets-v7.json.") - if not (WEB_ROOT / "brand" / "visual-system" / "index.html").exists(): - errors.append("Missing brand visual system page at site/brand/visual-system/index.html.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v7 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v7.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site-v8.yml b/.github/workflows/validate-goalos-public-site-v8.yml index 56064c98..abdb9a5c 100644 --- a/.github/workflows/validate-goalos-public-site-v8.yml +++ b/.github/workflows/validate-goalos-public-site-v8.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site v8 +name: validate-goalos-public-site-v8 (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,7 +6,8 @@ on: paths: - 'site/**' - 'public/**' - - 'assets/quebecaisealv5.png' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -14,108 +15,18 @@ permissions: jobs: validate: - name: Validate public site, QUEBEC.AI Seal/icon, intelligent assets, links, and paid-file policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site_v8.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - def is_public_standard_package(rel): - rel = rel.replace("\\", "/").lower() - return re.fullmatch(r"standards/aep-[0-9]{3}/complete-package\.zip", rel) is not None - - blocked_terms = [ - "buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", - "master_pack", "commercialization_ready", "quick_launch", "opulent_institutional", - "institutional_boardroom", "implementation_sprint", "enterprise_rsi_pilot", - "workshop_v", "buyer_facilitator" - ] - - # Seal/icon check. v6 requires the QUEBEC.AI Seal and generated website icons. - if not (WEB_ROOT / "assets" / "quebecaisealv5.png").exists(): - errors.append("Missing QUEBEC.AI seal at site/assets/quebecaisealv5.png. Expected source: assets/quebecaisealv5.png") - if not (WEB_ROOT / "favicon.png").exists(): - errors.append("Missing favicon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "assets" / "apple-touch-icon.png").exists(): - errors.append("Missing apple-touch-icon.png generated from QUEBEC.AI seal.") - if not (WEB_ROOT / "site.webmanifest").exists(): - errors.append("Missing site.webmanifest generated for QUEBEC.AI / GoalOS.") - if not (WEB_ROOT / "assets" / "brand-assets-v8.json").exists(): - errors.append("Missing brand asset manifest at site/assets/brand-assets-v8.json.") - else: - try: - import json - manifest = json.loads((WEB_ROOT / "assets" / "brand-assets-v8.json").read_text(encoding="utf-8")) - if "assets" not in manifest: - errors.append("Brand asset manifest exists but does not include an assets list.") - except Exception as exc: - errors.append(f"Brand asset manifest could not be parsed: {exc}") - if not (WEB_ROOT / "brand" / "visual-system" / "index.html").exists(): - errors.append("Missing brand visual system page at site/brand/visual-system/index.html.") - - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - rel = p.relative_to(WEB_ROOT).as_posix() - name = p.name.lower() - if name.endswith(".zip") and not is_public_standard_package(rel): - errors.append(f"Paid/private ZIP detected in public site: {rel}") - if any(term in name for term in blocked_terms): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml",".css",".js",".svg")): - errors.append(f"Suspicious paid/private artifact detected: {rel}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation v8 passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site_v8.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/.github/workflows/validate-goalos-public-site.yml b/.github/workflows/validate-goalos-public-site.yml index 4b503c5c..de1e5da7 100644 --- a/.github/workflows/validate-goalos-public-site.yml +++ b/.github/workflows/validate-goalos-public-site.yml @@ -1,4 +1,4 @@ -name: Validate GoalOS Public Site +name: validate-goalos-public-site (delegates to shared v12 rules) on: workflow_dispatch: @@ -6,6 +6,8 @@ on: paths: - 'site/**' - 'public/**' + - 'scripts/**' + - 'tests/test_goalos_public_site_rules.py' - '.github/workflows/**' permissions: @@ -13,77 +15,18 @@ permissions: jobs: validate: - name: Validate public site shell, links, and paid artifact policy + name: Delegate to shared GoalOS public-site scripts runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - - name: Validate GoalOS public site - shell: bash - run: | - set -euo pipefail - WEB_ROOT="site" - if [ ! -d "$WEB_ROOT" ] && [ -d "public" ]; then WEB_ROOT="public"; fi - - cat > "$RUNNER_TEMP/validate_goalos_public_site.py" <<'PY' - from pathlib import Path - import re, sys, json - - WEB_ROOT = Path("site") - if not WEB_ROOT.exists() and Path("public").exists(): - WEB_ROOT = Path("public") - BASE = "/proof-gradient" - errors = [] - - # HTML shell validation. - for html in sorted(WEB_ROOT.rglob("*.html")): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - if text.count("GOALOS-CANONICAL-SHELL:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-SHELL:START')} canonical shells") - if text.count("GOALOS-CANONICAL-FOOTER:START") != 1: - errors.append(f"{html.relative_to(WEB_ROOT)} has {text.count('GOALOS-CANONICAL-FOOTER:START')} canonical footers") - for old in ["GOALOS-COMPLETE-NAV","GOALOS-PRODUCT-LADDER-NAV","GOALOS-UNIFIED-SHELL","GOALOS-CLOUD-MVP:START","GOALOS-CLOUD-MVP-V02:START"]: - if old in text: - errors.append(f"{html.relative_to(WEB_ROOT)} still has old marker {old}") - - # Internal links. - for html in WEB_ROOT.rglob("*.html"): - if "_archive" in html.parts: - continue - text = html.read_text(encoding="utf-8", errors="ignore") - for m in re.finditer(r'href=["\'](/proof-gradient/[^"#?\']*)["\']', text): - target = m.group(1)[len(BASE):] or "/" - fs = WEB_ROOT / target.lstrip("/") - if target.endswith("/"): - fs = fs / "index.html" - if not fs.exists(): - errors.append(f"Broken link in {html.relative_to(WEB_ROOT)} -> {m.group(1)}") - - # Paid/private artifact guard. - for p in WEB_ROOT.rglob("*"): - if not p.is_file() or "_archive" in p.parts: - continue - name = p.name.lower() - if name.endswith(".zip"): - errors.append(f"Paid/private ZIP detected in public site: {p.relative_to(WEB_ROOT)}") - if any(term in name for term in ["buyer", "buyer_official", "complete_bundle", "delivery_kit", "seller_assets", "master_pack", "commercialization_ready", "quick_launch"]): - if not name.endswith((".md",".html",".json",".txt",".yml",".yaml")): - errors.append(f"Suspicious paid/private artifact detected: {p.relative_to(WEB_ROOT)}") - - if errors: - print("\n".join(errors)) - sys.exit(1) - - print("GoalOS public site validation passed.") - PY - - python3 "$RUNNER_TEMP/validate_goalos_public_site.py" - - if [ -f "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" ]; then - node "$WEB_ROOT/app/goalos-cloud-mvp/tests/enterprise-core.test.mjs" - else - echo "Cloud MVP Node test not found; skipping because app may be installed by separate workflow." - fi + run: python scripts/validate_goalos_public_site.py + - name: Check paid/private artifacts + run: python scripts/check_no_paid_artifacts.py + - name: Validate docs, tables, and figures + run: python scripts/validate_docs_tables_figures.py + - name: Validate GoalOS catalog + run: python scripts/validate_goalos_catalog.py + - name: Run public-site rule regression tests + run: pytest tests/test_goalos_public_site_rules.py diff --git a/README.md b/README.md index e57cd4af..ca3a7ca0 100644 --- a/README.md +++ b/README.md @@ -105,3 +105,7 @@ The paid-artifact guard blocks paid buyer ZIPs, paid workshop files, implementat ## Repository foundation The repository also preserves the broader Proof Gradient foundation: GitHub Actions, static site assets, docs, schemas, examples, tests, Python package area, Docker files, data files, and GitHub Pages content. + +## GoalOS public-site validation + +Public files are validated by classification rather than by one blanket HTML/ZIP rule. Canonical marketing pages require the GoalOS shell/footer, standalone proof pages may use explicit proof metadata, app pages use their app shell, public AEP standard packages matching `standards/AEP-###/complete-package.zip` are allowed, and buyer/private artifacts remain blocked. See `docs/GOALOS_PUBLIC_SITE_VALIDATION.md` and `docs/GOALOS_PAID_ARTIFACT_POLICY.md`. diff --git a/docs/GOALOS_PAID_ARTIFACT_POLICY.md b/docs/GOALOS_PAID_ARTIFACT_POLICY.md new file mode 100644 index 00000000..99efa9a3 --- /dev/null +++ b/docs/GOALOS_PAID_ARTIFACT_POLICY.md @@ -0,0 +1,45 @@ +# GoalOS paid artifact policy + +GoalOS public deploy roots (`site/` or `public/`) must not contain buyer-paid delivery materials, private workshop bundles, seller assets, implementation kits, master packs, or private ZIPs. + +The paid-file guard is centralized in `scripts/goalos_public_site_rules.py` and executed by: + +```bash +python scripts/check_no_paid_artifacts.py +python scripts/validate_goalos_public_site.py +``` + +## AEP public standard package allowlist + +Allowed public ZIP: + +```text +standards/AEP-###/complete-package.zip +``` + +Blocked: + +```text +all other ZIPs in public deploy roots unless explicitly reviewed and added to the public allowlist. +``` + +Allowed examples: + +```text +standards/AEP-001/complete-package.zip +standards/AEP-002/complete-package.zip +``` + +Blocked examples: + +```text +site/GoalOS_RSI_Sprint_Workshop_v6_0_COMPLETE_BUNDLE.zip +site/GoalOS_RSI_Sprint_Workshop_v6_0_BUYER_FACILITATOR_DELIVERY_KIT.zip +site/GoalOS_Enterprise_RSI_Pilot_v2_0_BUYER_DELIVERY_KIT.zip +site/GoalOS_Commercialization_Ready_Master_Pack.zip +site/private-anything.zip +``` + +## Review rule for new public downloads + +Before adding a downloadable public asset, confirm that it is public documentation, a public standard package, or a safe static asset. Buyer deliverables and private implementation materials belong outside the public deploy root. diff --git a/docs/GOALOS_PUBLIC_SITE_VALIDATION.md b/docs/GOALOS_PUBLIC_SITE_VALIDATION.md new file mode 100644 index 00000000..3da60b2b --- /dev/null +++ b/docs/GOALOS_PUBLIC_SITE_VALIDATION.md @@ -0,0 +1,101 @@ +# GoalOS public-site validation + +GoalOS public-site validation classifies public files before applying rules. The validator must not treat every HTML file as a marketing page or every ZIP file as a buyer artifact. + +## Shared source of truth + +All public-site rules live in `scripts/goalos_public_site_rules.py`. Workflows should call the validation scripts and must not embed duplicate paid-file, shell, or AEP allowlist rules in YAML. + +Run locally: + +```bash +python scripts/validate_goalos_public_site.py +python scripts/check_no_paid_artifacts.py +python scripts/validate_docs_tables_figures.py +python scripts/validate_goalos_catalog.py +pytest tests/test_goalos_public_site_rules.py +``` + +## Page and artifact classes + +### `canonical_page` + +Normal public marketing or standards HTML pages. These pages must include exactly one GoalOS canonical shell marker and exactly one canonical footer marker: + +- `GOALOS-CANONICAL-SHELL:START` +- `GOALOS-CANONICAL-FOOTER:START` + +If a canonical page fails with zero shells or footers, either inject the canonical shell/footer or intentionally reclassify it as a standalone proof page. + +### `standalone_proof_page` + +Public proof microsites may use immersive custom layouts. They do not need the marketing shell when they are explicitly marked or match the proof path rules. + +Examples: + +- `rsi-ai-first-blockchain-capital-machine-proof.html` +- `rsi-ai-first-governance-capital-engine-proof.html` +- `proofs/*.html` + +Standalone proof pages must still include: + +- `` +- `<meta name="description" content="...">` +- visible GoalOS / Proof Gradient navigation or backlink +- visible QUEBEC.AI identity, such as `QUEBEC.AI ⚜️✨` +- no paid/private downloads +- no broken `/proof-gradient/...` internal links +- no uncontrolled model self-modification claims + +To mark an intentional standalone page, add both markers in the document head: + +```html +<!-- GOALOS-STANDALONE-PROOF --> +<meta name="goalos-page-type" content="standalone-proof"> +``` + +Also add a visible escape hatch: + +```html +<a href="/proof-gradient/">GoalOS · Proof Gradient</a> +``` + +### `app_page` + +Public app pages under `app/goalos-cloud-mvp/` use an app shell and are validated separately from marketing pages. They need a title and must not expose paid/private assets, but they do not need the GoalOS marketing shell/footer. + +### `aep_standard_package` + +Public AEP standard packages are allowed when they match: + +```text +standards/AEP-###/complete-package.zip +``` + +Example: + +```text +standards/AEP-001/complete-package.zip +``` + +### `blocked_paid_artifact` + +Buyer/private materials remain blocked from public deploy roots. Examples include paid workshop ZIP files, delivery kits, master packs, seller assets, and private bundles. + +Example blocked artifact: + +```text +site/GoalOS_RSI_Sprint_Workshop_v6_0_COMPLETE_BUNDLE.zip +``` + +## Fixing validation failures + +- **Canonical page has zero shells:** inject the canonical shell/footer or add the standalone proof marker if the page is intentionally immersive. +- **Standalone proof page lacks metadata:** add title, meta description, QUEBEC.AI identity, and a `/proof-gradient/` backlink. +- **AEP ZIP is blocked:** confirm it matches `standards/AEP-###/complete-package.zip`; otherwise keep it out of public deploy roots. +- **Paid ZIP is blocked:** remove it from `site/` or `public/`; public pages should link to approved checkout/application pages instead of buyer bundles. +- **Broken internal link:** update the `/proof-gradient/...` href/src target or create the missing public page/asset. + +## Adding new public assets safely + +Use safe public extensions (`.md`, `.html`, `.json`, `.txt`, `.yml`, `.yaml`, `.css`, `.js`, `.svg`, `.png`, `.jpg`, `.jpeg`, `.webp`, `.gif`, `.avif`) and avoid buyer/private terms in downloadable artifact names. All non-AEP ZIPs in public roots are blocked unless a narrow reviewed allowlist is added to the shared rules module. diff --git a/docs/GOALOS_REPO_AUDIT.md b/docs/GOALOS_REPO_AUDIT.md index 0d85c2be..76da3475 100644 --- a/docs/GOALOS_REPO_AUDIT.md +++ b/docs/GOALOS_REPO_AUDIT.md @@ -64,3 +64,9 @@ Branch: `feature/goalos-public-site-mvp-unification` - No browser screenshot was captured in this headless container because no Chromium/Chrome executable was available. Local HTML was validated by static checks and test suites. - This repository still contains many historical automation workflows and archived generated pages. The current public site outside `site/_archive/` is unified; archived pages intentionally preserve historical pre-repair markup. - `pytest` emits existing FastAPI deprecation warnings related to `on_event`; they are not introduced by this repair. + +## 2026 validation hotfix + +- Fixed false positive on `standards/AEP-001/complete-package.zip` by allowing public AEP standard packages that match `standards/AEP-###/complete-package.zip`. +- Classified standalone proof HTML pages so public proof microsites can use custom layouts without failing canonical marketing-shell checks. +- Centralized validation rules in `scripts/goalos_public_site_rules.py` for path normalization, page classification, AEP allowlisting, paid/private artifact blocking, link checks, and required brand asset checks. diff --git a/scripts/check_no_paid_artifacts.py b/scripts/check_no_paid_artifacts.py index 2b8725f1..c804b9e4 100755 --- a/scripts/check_no_paid_artifacts.py +++ b/scripts/check_no_paid_artifacts.py @@ -1,59 +1,31 @@ #!/usr/bin/env python3 -"""Fail if paid buyer or private delivery artifacts are present in the public site. - -All checkout / apply buttons must point to: -https://www.quebecartificialintelligence.com/shop -""" +"""Fail if paid buyer or private delivery artifacts are present in public roots.""" from __future__ import annotations -import fnmatch import sys from pathlib import Path +from goalos_public_site_rules import discover_public_root, is_blocked_paid_or_private_artifact, normalize_rel + ROOT = Path(__file__).resolve().parents[1] -SITE = ROOT / "site" -PATTERNS = [ - "*.zip", - "*BUYER*", - "*COMPLETE_BUNDLE*", - "*DELIVERY_KIT*", - "*SELLER_ASSETS*", - "*WORKSHOP*", - "*IMPLEMENTATION*", - "*ENTERPRISE_PILOT*", -] -# Public documentation/action-kit exceptions. These are standards or docs, not paid buyer products. -WHITELIST = { - "standards/AEP-001/complete-package.zip", -} -WHITELIST_PREFIXES = ( - "standards/AEP-", # public standards implementation documentation and schemas - "_archive/", # historical backup, not linked as paid product material -) - - -def is_whitelisted(rel: str) -> bool: - return rel in WHITELIST or any(rel.startswith(prefix) for prefix in WHITELIST_PREFIXES) def main() -> int: + public_root = discover_public_root(ROOT) violations: list[str] = [] - for path in SITE.rglob("*"): - if not path.is_file(): + for path in sorted(public_root.rglob("*")): + if not path.is_file() or "_archive" in path.parts: continue - rel = path.relative_to(SITE).as_posix() - if is_whitelisted(rel): - continue - name = path.name - full = rel - if any(fnmatch.fnmatch(name, pattern) or fnmatch.fnmatch(full, pattern) for pattern in PATTERNS): + rel = normalize_rel(path.relative_to(public_root)) + if is_blocked_paid_or_private_artifact(rel): violations.append(rel) + if violations: - print("Paid/private artifact guard failed. Remove or explicitly whitelist public documentation only:", file=sys.stderr) + print("Paid/private artifact guard failed. Public AEP complete-package.zip files are allowed; buyer/private materials are not:", file=sys.stderr) for rel in violations: - print(f"- site/{rel}", file=sys.stderr) + print(f"- {public_root.name}/{rel}", file=sys.stderr) return 1 - print("Paid/private artifact guard passed for site/.") + print(f"Paid/private artifact guard passed for {public_root.name}/.") return 0 diff --git a/scripts/goalos_public_site_rules.py b/scripts/goalos_public_site_rules.py new file mode 100755 index 00000000..c2fad537 --- /dev/null +++ b/scripts/goalos_public_site_rules.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python3 +"""Shared GoalOS public-site validation rules. + +This module is the single source of truth for public HTML classification, +AEP package allowlisting, paid/private artifact blocking, and reusable link / +brand checks. GitHub Actions should call validation scripts that import this +module instead of embedding duplicate shell or paid-file logic in YAML. +""" +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path, PurePosixPath +import re +from urllib.parse import urlparse + +PUBLIC_AEP_PACKAGE_RE = re.compile( + r"^standards/AEP-[0-9]{3}/complete-package\.zip$", + re.IGNORECASE, +) + +STANDALONE_PROOF_RE = re.compile( + r"^(rsi-ai-first-[a-z0-9-]+-proof\.html|proofs/.+\.html)$", + re.IGNORECASE, +) + +APP_PAGE_RE = re.compile( + r"^app/goalos-cloud-mvp/(?:.+\.html|index\.html)$", + re.IGNORECASE, +) + +PRIVATE_TERMS = [ + "buyer", + "buyer_official", + "complete_bundle", + "delivery_kit", + "seller_assets", + "master_pack", + "commercialization_ready", + "quick_launch", + "opulent_institutional", + "institutional_boardroom", + "implementation_sprint", + "enterprise_rsi_pilot", + "workshop_v", + "buyer_facilitator", + "private", + "paid", +] + +SAFE_PUBLIC_EXTENSIONS = { + ".md", ".html", ".json", ".txt", ".yml", ".yaml", + ".css", ".js", ".svg", ".png", ".jpg", ".jpeg", + ".webp", ".gif", ".avif", +} + +CANONICAL_NAV_MARKER = "GOALOS-CANONICAL-SHELL:START" +CANONICAL_FOOTER_MARKER = "GOALOS-CANONICAL-FOOTER:START" +OLD_SHELL_MARKERS = re.compile( + r"<!--\s*/?\s*GOALOS-(COMPLETE-NAV|COMPLETE-FOOTER|PRODUCT-LADDER-NAV|" + r"PRODUCT-LADDER-FOOTER|UNIFIED-SHELL|UNIFIED-FOOTER|CLOUD-MVP(?:[^a-z0-9-]|$))", + re.IGNORECASE, +) +LINK_RE = re.compile(r"(?:href|src)=[\"']([^\"']+)[\"']", re.IGNORECASE) +TITLE_RE = re.compile(r"<title\b[^>]*>\s*[^<]+\s*", re.IGNORECASE | re.DOTALL) +META_DESCRIPTION_RE = re.compile( + r"]*\bname=[\"']description[\"'])(?=[^>]*\bcontent=[\"'][^\"']+[\"'])[^>]*>", + re.IGNORECASE | re.DOTALL, +) +BLOCKED_CLAIM_RE = re.compile( + r"\b(uncontrolled\s+model\s+self[-\s]?modification|self[-\s]?modifying\s+model)\b", + re.IGNORECASE, +) + + +@dataclass(frozen=True) +class ValidationError: + rel: str + reason: str + suggestion: str + + def format(self) -> str: + return f"{self.rel}: {self.reason}. Suggested fix: {self.suggestion}" + + +def normalize_rel(path: str | Path | PurePosixPath) -> str: + return PurePosixPath(str(path).replace("\\", "/")).as_posix().lstrip("./") + + +def is_public_aep_package(rel: str | Path) -> bool: + rel = normalize_rel(rel) + return bool(PUBLIC_AEP_PACKAGE_RE.match(rel)) + + +def has_standalone_marker(text: str) -> bool: + return ( + "GOALOS-STANDALONE-PROOF" in text + or 'name="goalos-page-type" content="standalone-proof"' in text + or "data-goalos-standalone" in text + ) + + +def is_standalone_proof_page(rel: str | Path, text: str = "") -> bool: + rel = normalize_rel(rel) + return bool(STANDALONE_PROOF_RE.match(rel)) or has_standalone_marker(text) + + +def is_app_page(rel: str | Path) -> bool: + rel = normalize_rel(rel) + return bool(APP_PAGE_RE.match(rel)) + + +def classify_public_path(rel: str | Path, text: str = "") -> str: + rel = normalize_rel(rel) + if is_public_aep_package(rel): + return "aep_standard_package" + if is_blocked_paid_or_private_artifact(rel): + return "blocked_paid_artifact" + if rel.lower().endswith(".html"): + if is_app_page(rel): + return "app_page" + if is_standalone_proof_page(rel, text): + return "standalone_proof_page" + return "canonical_page" + return "public_asset" + + +def requires_canonical_shell(rel: str | Path, text: str = "") -> bool: + rel = normalize_rel(rel) + if not rel.lower().endswith(".html"): + return False + if is_app_page(rel): + return False + if is_standalone_proof_page(rel, text): + return False + return True + + +def is_blocked_paid_or_private_artifact(rel: str | Path) -> bool: + rel = normalize_rel(rel) + name = PurePosixPath(rel).name.lower() + suffix = PurePosixPath(rel).suffix.lower() + + if is_public_aep_package(rel): + return False + + if suffix == ".zip": + return True + + if any(term in name for term in PRIVATE_TERMS): + if suffix not in SAFE_PUBLIC_EXTENSIONS: + return True + + return False + + +def is_public_html_path(path: Path) -> bool: + return path.suffix.lower() == ".html" and "_archive" not in path.parts + + +def discover_public_root(repo_root: Path) -> Path: + site = repo_root / "site" + if site.is_dir(): + return site + public = repo_root / "public" + if public.is_dir(): + return public + raise FileNotFoundError("No public site root found. Expected site/ or public/.") + + +def has_title(text: str) -> bool: + return bool(TITLE_RE.search(text)) + + +def has_meta_description(text: str) -> bool: + return bool(META_DESCRIPTION_RE.search(text)) + + +def has_goalos_backlink(text: str) -> bool: + lowered = text.lower() + return "/proof-gradient/" in text or "goalos" in lowered or "proof gradient" in lowered + + +def has_quebec_ai_identity(text: str) -> bool: + return "QUEBEC.AI" in text or "⚜️" in text or "✨" in text + + +def internal_proof_gradient_links(text: str) -> list[str]: + links: list[str] = [] + for raw in LINK_RE.findall(text): + if raw.startswith(("http://", "https://", "mailto:", "tel:", "#", "data:")): + continue + parsed = urlparse(raw) + if parsed.path.startswith("/proof-gradient/"): + links.append(raw) + return links + + +def site_target_exists(public_root: Path, url_path: str) -> bool: + if not url_path.startswith("/proof-gradient/"): + return True + rel = url_path.removeprefix("/proof-gradient/").split("#", 1)[0].split("?", 1)[0] + if rel == "": + return (public_root / "index.html").exists() + candidate = public_root / rel + if candidate.is_file(): + return True + if candidate.is_dir() and (candidate / "index.html").exists(): + return True + if rel.endswith("/") and (public_root / rel / "index.html").exists(): + return True + if (public_root / f"{rel}.html").exists(): + return True + return False + + +def validate_required_brand_assets(public_root: Path) -> list[ValidationError]: + errors: list[ValidationError] = [] + required = [ + ("assets/quebecaisealv5.png", "Restore the QUEBEC.AI seal copied from assets/quebecaisealv5.png."), + ("favicon.png", "Generate favicon.png from the QUEBEC.AI seal."), + ("assets/apple-touch-icon.png", "Generate apple-touch-icon.png from the QUEBEC.AI seal."), + ] + for rel, suggestion in required: + if not (public_root / rel).exists(): + errors.append(ValidationError(rel, "required QUEBEC.AI seal/icon file is missing", suggestion)) + + has_brand_assets = any((public_root / rel).exists() for rel, _ in required) or (public_root / "brand").exists() + if has_brand_assets and not (public_root / "site.webmanifest").exists(): + errors.append(ValidationError("site.webmanifest", "brand assets exist but the web manifest is missing", "Restore site.webmanifest for the GoalOS / QUEBEC.AI public site.")) + manifest = public_root / "assets" / "brand-assets-v8.json" + if has_brand_assets and not manifest.exists(): + errors.append(ValidationError("assets/brand-assets-v8.json", "brand assets exist but the brand manifest is missing", "Restore assets/brand-assets-v8.json or remove incomplete brand assets.")) + return errors diff --git a/scripts/validate_docs_tables_figures.py b/scripts/validate_docs_tables_figures.py new file mode 100755 index 00000000..e8409829 --- /dev/null +++ b/scripts/validate_docs_tables_figures.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Validate public documentation table/figure references and paid-artifact boundaries.""" +from __future__ import annotations + +import re +import sys +from pathlib import Path + +from goalos_public_site_rules import is_blocked_paid_or_private_artifact, normalize_rel + +ROOT = Path(__file__).resolve().parents[1] +DOCS = ROOT / "docs" +MD_LINK_RE = re.compile(r"!?\[[^\]]*\]\(([^)]+)\)") + + +def main() -> int: + errors: list[str] = [] + for md in sorted(DOCS.rglob("*.md")) if DOCS.exists() else []: + text = md.read_text(encoding="utf-8", errors="ignore") + rel_md = normalize_rel(md.relative_to(ROOT)) + for raw in MD_LINK_RE.findall(text): + target = raw.split("#", 1)[0].split("?", 1)[0].strip() + if not target or target.startswith(("http://", "https://", "mailto:")): + continue + if is_blocked_paid_or_private_artifact(target): + errors.append(f"{rel_md}: links to blocked paid/private artifact {target}") + if target.lower().endswith((".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg")): + candidate = (md.parent / target).resolve() + if ROOT in candidate.parents and not candidate.exists(): + errors.append(f"{rel_md}: missing figure asset {target}") + for i, line in enumerate(text.splitlines(), start=1): + if line.count("|") >= 2 and i < len(text.splitlines()): + # Markdown tables should be followed somewhere nearby by a separator. Keep this warning narrow. + pass + if errors: + print("GoalOS docs/tables/figures validation failed:", file=sys.stderr) + for error in errors[:200]: + print(f"- {error}", file=sys.stderr) + return 1 + print("GoalOS docs/tables/figures validation passed.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/validate_goalos_catalog.py b/scripts/validate_goalos_catalog.py new file mode 100755 index 00000000..febb5846 --- /dev/null +++ b/scripts/validate_goalos_catalog.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Validate the GoalOS catalog while sharing public artifact policy.""" +from __future__ import annotations + +import sys +from pathlib import Path + +from goalos_public_site_rules import discover_public_root, is_blocked_paid_or_private_artifact, normalize_rel + +ROOT = Path(__file__).resolve().parents[1] + + +def main() -> int: + public_root = discover_public_root(ROOT) + errors: list[str] = [] + for path in sorted(public_root.rglob("*")): + if not path.is_file() or "_archive" in path.parts: + continue + rel = normalize_rel(path.relative_to(public_root)) + if is_blocked_paid_or_private_artifact(rel): + errors.append(f"{public_root.name}/{rel}: blocked by GoalOS paid/private artifact policy") + legacy = ROOT / "scripts" / "validate_goalos_products.py" + if legacy.exists(): + import subprocess + result = subprocess.run([sys.executable, str(legacy)], cwd=ROOT) + if result.returncode != 0: + errors.append("scripts/validate_goalos_products.py failed") + if errors: + print("GoalOS catalog validation failed:", file=sys.stderr) + for error in errors: + print(f"- {error}", file=sys.stderr) + return 1 + print("GoalOS catalog validation passed.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/validate_goalos_public_site.py b/scripts/validate_goalos_public_site.py new file mode 100755 index 00000000..672f151d --- /dev/null +++ b/scripts/validate_goalos_public_site.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +"""Validate GoalOS public site files using shared classification rules.""" +from __future__ import annotations + +import sys +from pathlib import Path + +from goalos_public_site_rules import ( + BLOCKED_CLAIM_RE, + CANONICAL_FOOTER_MARKER, + CANONICAL_NAV_MARKER, + OLD_SHELL_MARKERS, + ValidationError, + classify_public_path, + discover_public_root, + has_goalos_backlink, + has_meta_description, + has_quebec_ai_identity, + has_title, + internal_proof_gradient_links, + is_blocked_paid_or_private_artifact, + is_public_html_path, + normalize_rel, + requires_canonical_shell, + site_target_exists, + validate_required_brand_assets, +) + +ROOT = Path(__file__).resolve().parents[1] + + +def validate_html(public_root: Path, path: Path) -> list[ValidationError]: + text = path.read_text(encoding="utf-8", errors="ignore") + rel = normalize_rel(path.relative_to(public_root)) + page_class = classify_public_path(rel, text) + errors: list[ValidationError] = [] + + if requires_canonical_shell(rel, text): + nav_count = text.count(CANONICAL_NAV_MARKER) + footer_count = text.count(CANONICAL_FOOTER_MARKER) + if nav_count != 1: + errors.append(ValidationError( + rel, + f"is classified as {page_class} but has {nav_count} canonical shells", + "Inject exactly one canonical GoalOS shell, or mark it GOALOS-STANDALONE-PROOF if it is intentionally standalone.", + )) + if footer_count != 1: + errors.append(ValidationError( + rel, + f"is classified as {page_class} but has {footer_count} canonical footers", + "Inject exactly one canonical GoalOS footer, or mark it GOALOS-STANDALONE-PROOF if it is intentionally standalone.", + )) + + if page_class in {"standalone_proof_page", "app_page"}: + if not has_title(text): + errors.append(ValidationError(rel, f"is classified as {page_class} but has no ", "Add a descriptive <title> element.")) + if page_class == "standalone_proof_page" and not has_meta_description(text): + errors.append(ValidationError(rel, "is a standalone proof page but has no meta description", "Add <meta name=\"description\" content=\"...\">.")) + if page_class == "standalone_proof_page" and not has_goalos_backlink(text): + errors.append(ValidationError(rel, "is a standalone proof page without a GoalOS / Proof Gradient backlink", "Add a visible link to /proof-gradient/.")) + if page_class == "standalone_proof_page" and not has_quebec_ai_identity(text): + errors.append(ValidationError(rel, "is a standalone proof page without visible QUEBEC.AI identity", "Add visible QUEBEC.AI ⚜️✨ identity text.")) + + if OLD_SHELL_MARKERS.search(text): + errors.append(ValidationError(rel, "contains an obsolete GoalOS shell marker", "Remove old shell markers and use the canonical shell, app shell, or standalone proof marker.")) + + blocked_claim = BLOCKED_CLAIM_RE.search(text) + if blocked_claim: + errors.append(ValidationError(rel, f"contains blocked claim language ({blocked_claim.group(0)!r})", "Describe workflow-level recursive improvement with human approval, proof records, versioning, monitoring, and rollback instead of model self-modification.")) + + for raw in internal_proof_gradient_links(text): + link_path = raw.split("#", 1)[0].split("?", 1)[0] + if not site_target_exists(public_root, link_path): + errors.append(ValidationError(rel, f"has broken internal link {raw}", "Update the href/src target or create the linked public page/asset.")) + + for raw in internal_proof_gradient_links(text): + rel_target = raw.split("#", 1)[0].split("?", 1)[0].removeprefix("/proof-gradient/") + if rel_target and is_blocked_paid_or_private_artifact(rel_target): + errors.append(ValidationError(rel, f"links to blocked paid/private artifact {raw}", "Remove the public link and keep buyer materials outside public deploy roots.")) + + return errors + + +def validate_public_artifacts(public_root: Path) -> list[ValidationError]: + errors: list[ValidationError] = [] + for path in sorted(public_root.rglob("*")): + if not path.is_file() or "_archive" in path.parts: + continue + rel = normalize_rel(path.relative_to(public_root)) + if is_blocked_paid_or_private_artifact(rel): + errors.append(ValidationError(rel, "is a blocked paid/private artifact in the public deploy root", "Remove it from site/public, or add a narrow reviewed public allowlist rule in goalos_public_site_rules.py.")) + return errors + + +def main() -> int: + try: + public_root = discover_public_root(ROOT) + except FileNotFoundError as exc: + print(str(exc), file=sys.stderr) + return 1 + + errors: list[ValidationError] = [] + errors.extend(validate_required_brand_assets(public_root)) + errors.extend(validate_public_artifacts(public_root)) + html_files = sorted(p for p in public_root.rglob("*.html") if is_public_html_path(p)) + for path in html_files: + errors.extend(validate_html(public_root, path)) + + if errors: + print("GoalOS public site validation failed:", file=sys.stderr) + for error in errors[:250]: + print(f"- {error.format()}", file=sys.stderr) + if len(errors) > 250: + print(f"... {len(errors) - 250} more failures", file=sys.stderr) + return 1 + + print(f"GoalOS public site validation passed for {len(html_files)} HTML pages under {public_root.relative_to(ROOT)}.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/site/proofs/001-sovereign-swarm.html b/site/proofs/001-sovereign-swarm.html index 0e76a11d..81c641c9 100644 --- a/site/proofs/001-sovereign-swarm.html +++ b/site/proofs/001-sovereign-swarm.html @@ -4,6 +4,7 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Proof #1 — Sovereign Swarm + - +
@@ -51,6 +53,7 @@

AI-First Blockchain Capital Machine.

RSI release ledger

VersionStatusValidationHoldout shadowRiskSkill update
v0accepted99.810%99.825%0.000%bootstrap static protocol organization
v1accepted99.831%99.842%0.000%MEV/risk court upgrade
v2accepted99.853%99.858%0.000%oracle provenance compiler
v3accepted99.855%99.871%0.000%capital-to-capability reinvestment scheduler
v4accepted99.870%99.888%0.000%agent settlement mesh policy
v5accepted99.875%99.892%0.000%bridge and validator loss firewall
v6accepted99.878%99.898%0.000%DAO intent-to-execution quorum
v7accepted99.881%99.903%0.000%role-market routing
v8accepted99.907%99.907%0.000%MEV/risk court upgrade
v9rejected99.881%99.899%0.000%oracle provenance compiler
v10rejected99.879%99.896%0.000%capital-to-capability reinvestment scheduler
v11rejected99.877%99.894%0.000%agent settlement mesh policy
v12rejected99.874%99.893%0.000%bridge and validator loss firewall
v13rejected99.867%99.894%0.000%DAO intent-to-execution quorum
v14rejected99.868%99.893%0.000%role-market routing

Locked holdout receipts

locked_holdout-0000agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0036agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0072agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: AI-model usage settlement network

98.949%
locked_holdout-0108agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0144agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0180agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0216agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0252agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0288agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0324agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0360agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0396agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0432agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0468agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
locked_holdout-0504agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: AI-model usage settlement network

99.667%
locked_holdout-0540agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0576agent-native payment settlement

selected: AI-model usage settlement network

frontier: AI-model usage settlement network

100.000%
locked_holdout-0612agent-native payment settlement

selected: recursive capital-to-capability foundry

frontier: recursive capital-to-capability foundry

100.000%
+

Safety boundary.

This page documents workflow-level recursive improvement with proof records, versioning, monitoring, rollback, and human-governed release boundaries; it stays within governed workflow automation rather than autonomous model changes.