diff --git a/CHANGELOG.md b/CHANGELOG.md index 94beebb..90be13d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.2.0 — release candidate on hold + +- Prepared a machine-validated release candidate without moving any staging record into production. +- Recorded an empty approved-batch set because no named human publication approval was supplied. +- Added an approval-gate audit, QA record, limitations, release notes, deployment status, and a versioned candidate manifest. +- Preserved schema `1.0.0`, data `0.0.0`, content `0.1.0`, and the `0.1.0` public framework manifest. +- Did not create a tag, publish a GitHub release, merge the release branch, deploy Pages, or claim live verification. + ## 0.1.0 — 2026-08-14 - Established 17 canonical entity contracts, review and workflow states, stable-ID and migration policies. diff --git a/README.md b/README.md index 0e8e678..c53d84f 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,90 @@ # Open Executive Intelligence Index -A cited map of the books, people, research, ideas, evidence, and media shaping executive decision-making. +**Trace executive ideas to their sources.** -This repository is Open Future Forum's transparent data, methodology, provenance, and public-intelligence layer for source-located executive ideas. Its primary unit is the **source statement**: an attributed, precisely located, neutrally paraphrased contribution. Statements connect to normalized propositions; dossiers and debates form a separate editorial-synthesis layer. +The Open Executive Intelligence Index (OEII) is an Open Future Forum research project that maps selected books, reports, talks, interviews, studies, and media about executive decision-making. It records who or which institution expressed an idea, the role and organization at source time, a neutral paraphrase, and an exact source locator. -## Current status +The index then connects compatible statements to carefully scoped propositions. Dossiers, debates, role comparisons, regional briefings, and trend reports form a separate editorial-synthesis layer with explicit evidence lineage and limitations. -Version 0.1.0 is a framework release. It contains no production research records and makes no claim of human editorial approval. Synthetic records exist only under `tests/fixtures/` and are excluded from the public build, exports, sitemap, and search index. +> **Current status:** The frozen `0.1.0` framework release contains no production research records and has no human editorial approval. Synthetic fixtures are excluded from the public build, exports, search index, and sitemap. See the [release manifest](exports/release-manifests/release-manifest.json) for the authoritative counts and limitations. -## Architecture +## Start here -- Node.js 22+, TypeScript, Astro, JSON Schema 2020-12, AJV, Vitest, Playwright, and Pagefind. -- Canonical records in `data/`; optional long-form interpretation in `content/`. -- Deterministic static output in `docs/`, matching the established OFF GitHub Pages convention. -- No production database, runtime API, secret, or live upstream fetch. -- Pinned external-project manifests preserve builds when upstream repositories are unavailable. +- [Methodology](METHODOLOGY.md) +- [Evidence standard](EVIDENCE-STANDARD.md) +- [Data dictionary](DATA-DICTIONARY.md) +- [Research workflow](RESEARCH-WORKFLOW.md) +- [Publication thresholds](config/publication-thresholds.yml) +- [Governance](GOVERNANCE.md) +- [Corrections](data/corrections/README.md) -## Start and verify +## What the index is designed to do + +Once records pass the publication rules, readers can use the index to: + +- Trace an attributed statement to a reproducible place in its source. +- Distinguish a speaker's claim from a study finding, verified external fact, researcher interpretation, or editorial conclusion. +- See how statements support, challenge, qualify, or refine a proposition. +- Compare role, regional, industry, and source-type coverage without treating a selected corpus as a population survey. +- Follow the evidence behind an editorial synthesis. +- Download structured records with stable identifiers and provenance. +- Review known limitations, corrections, withdrawals, and research gaps. + +## Three analytical layers + +| Layer | What it records | What it does not imply | +| --- | --- | --- | +| **Source statement** | A neutrally paraphrased contribution, attributed to a person or institution and tied to an exact locator. | That the statement is true or representative. | +| **Normalized proposition** | A scoped idea connecting compatible statements and their positions. | Consensus, popularity, or proof. | +| **Editorial synthesis** | A dossier, debate, comparison, briefing, agenda, or trend analysis with documented lineage. | A universal claim about executives or markets. | + +## Evidence and editorial safeguards + +- Publication begins with a registered research protocol and documented selection criteria. +- Production pages use approved records from `data/`; staging files, rejected sources, private notes, and synthetic fixtures are excluded. +- Primary sources establish attribution. Independent sources are required to verify performance and outcome claims. +- Role attribution uses the person's role at source time. +- Company claims remain attributed company claims; predictions remain predictions; missing information remains unknown. +- Evidence dimensions remain separate. No composite score substitutes for reading the source. +- Named human approval is required where the publication thresholds specify it. Automated systems cannot supply that approval. +- Rights, privacy, source concentration, lineage, duplication, and structured-data checks run before publication. + +## Scope and limitations + +OEII documents a selected and disclosed corpus of public material. It does not claim to represent every executive, company, industry, geography, or point of view. The number of indexed sources is not evidence of market prevalence, correctness, adoption, or consensus. Engagement data, when available, is reported separately from evidence quality. + +Inclusion does not imply endorsement by Open Future Forum. OFF-owned sources and relationships are disclosed, and private Forum Select conversations are not indexed. The project stores original structured records and limited original analysis rather than republishing copyrighted transcripts, books, reports, or media. + +## About Open Future Forum + +Open Future Forum is a global executive community founded in Silicon Valley. It publishes original research, datasets, market maps, and practical resources for executive communities and leaders. + +OEII is published by Open Future Forum. OFF-owned sources and relationships are identified so readers can distinguish them from external material. + +## Repository structure + +| Path | Purpose | +| --- | --- | +| `data/` | Canonical production records. | +| `content/` | Optional long-form editorial synthesis. | +| `staging/` | Candidate research, review material, and batch evidence that is not public production data. | +| `schema/` | Versioned JSON Schema contracts. | +| `exports/` | Generated CSV, JSON, NDJSON, citation, bibliography, and graph outputs. | +| `docs/` | Deterministic static-site output. | +| `config/` | Controlled vocabularies, publication thresholds, and project rules. | + +## Build and verify + +The project uses Node.js 22+, TypeScript, Astro, JSON Schema 2020-12, AJV, Vitest, Playwright, and Pagefind. ```sh npm ci npm run check +``` + +To inspect the generated site locally: + +```sh python3 -m http.server 8080 --directory docs ``` @@ -32,7 +96,7 @@ BASE_URL=https://openfutureforum.github.io/executive-intelligence-index/ npm run ## Research workflow -Work on one dedicated branch per research batch. Register the protocol before discovery, scaffold the batch, log accepted, rejected, and held sources, keep candidate records in `staging/`, and request named human review before publication. +Use one branch per research batch. Register the protocol before discovery, record accepted, rejected, and held sources, keep candidate records in `staging/`, and request named human review before publication. ```sh npm run scaffold:batch -- BATCH-2026-001 @@ -40,12 +104,19 @@ npm run scaffold:record -- STMT-2026-001 statements npm run generate:review-packets ``` -See [METHODOLOGY.md](METHODOLOGY.md), [RESEARCH-WORKFLOW.md](RESEARCH-WORKFLOW.md), [ATTRIBUTION-STANDARD.md](ATTRIBUTION-STANDARD.md), [COPYRIGHT.md](COPYRIGHT.md), and [CONTRIBUTING.md](CONTRIBUTING.md). +Read [CONTRIBUTING.md](CONTRIBUTING.md), [SOURCE-SELECTION.md](SOURCE-SELECTION.md), [ATTRIBUTION-STANDARD.md](ATTRIBUTION-STANDARD.md), [PROPOSITION-STANDARD.md](PROPOSITION-STANDARD.md), and [COPYRIGHT.md](COPYRIGHT.md) before proposing production records. + +## Related Open Future Forum projects + +- **CXO Ecosystem Index:** canonical organization, capability, audience, offering, and relationship records. +- **Executive AI Research:** OFF report-library records. +- **Executive Communities Index:** executive-community records and its disclosed editorial rankings. +- **Executive Community Playbook:** practical operating guidance and templates. -## Related OFF projects +OEII stores pinned references or crosswalks instead of duplicating those projects' canonical records. Inspected versions are recorded in [`config/external-projects.yml`](config/external-projects.yml) and material architectural decisions in [DECISIONS.md](DECISIONS.md). -The CXO Ecosystem Index owns full organization records; Executive AI Research owns OFF report-library records; the Executive Communities Index owns community records and its disclosed editorial rankings; the Executive Community Playbook owns practical guidance. This project stores pinned crosswalks or references instead of duplicating those records. Exact inspected commits are recorded in `config/external-projects.yml` and `DECISIONS.md`. +## Licensing and citation -## Licensing +Code is licensed under the [MIT License](LICENSE-CODE). Original structured data and original editorial content are licensed under [CC BY 4.0](LICENSE-DATA). Third-party works, source text, transcripts, metadata rights, media, and trademarks are not relicensed; see [COPYRIGHT.md](COPYRIGHT.md) and [LICENSE-CONTENT](LICENSE-CONTENT). -Code is MIT licensed. Original structured data and original editorial content are CC BY 4.0 licensed. Third-party works, transcripts, video, reports, source text, metadata rights, and trademarks are not relicensed. See the three license files and `COPYRIGHT.md`. +Citation metadata is available in [CITATION.cff](CITATION.cff). diff --git a/data/releases/0.2.0.json b/data/releases/0.2.0.json new file mode 100644 index 0000000..3c596f5 --- /dev/null +++ b/data/releases/0.2.0.json @@ -0,0 +1,100 @@ +{ + "release_id": "release-0.2.0-candidate", + "semantic_version": "0.2.0", + "schema_version": "1.0.0", + "data_version": "0.0.0", + "content_version": "0.1.0", + "release_date": null, + "included_batch_ids": [], + "included_record_counts": { + "people": 0, + "organization-references": 0, + "book-works": 0, + "book-editions": 0, + "sources": 0, + "statements": 0, + "propositions": 0, + "stances": 0, + "topics": 0, + "debates": 0, + "dossiers": 0, + "trends": 0, + "protocols": 0, + "batches": 0, + "reviews": 0, + "corrections": 0, + "releases": 0 + }, + "checksums": { + "exports/bibliographies/README.md": "9234346ea9b10467ff36dc51f97ea54591049fd84e1fd610aa754243b6462fb8", + "exports/citations/records.bib": "b129952ae22cf77632660b28b1a59008a5a4b0557f485a202dc7c83bef0a9514", + "exports/csv/batches.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/book-editions.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/book-works.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/corrections.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/debates.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/dossiers.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/organization-references.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/people.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/propositions.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/protocols.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/releases.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/reviews.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/sources.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/stances.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/statements.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/topics.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/trends.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/graphml/graph.graphml": "37776c7d8e5ad090874effed8b195d2f85b5f19d3e270f17e95dc889ab2cbb96", + "exports/json/catalog.json": "df12f7c90bcf89843b398888cee241b61103ccdd67d389bea0e1a1a9ce46abd2", + "exports/ndjson/catalog.ndjson": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "release_fingerprint": "3527bda659346bd2f07569f394d14bc43f2065ef4e5dc800d6c10ca7ea747d3b", + "upstream_crosswalk_versions": { + "cxo-ecosystem-index": "45ca4066fc00", + "executive-ai-research": "d205a6b2e6f4", + "executive-communities-index": "ba9bab57a774", + "executive-community-playbook": "2a0936b00c75", + "openfutureforum-github-profile": "c3fe1e9e27cc", + "openfutureforum-pages-root": "12505350a4d9" + }, + "known_limitations": [ + "No approved batch IDs were supplied or discovered.", + "No named human production-release approval is present.", + "The candidate contains no published production research records.", + "The target version was inferred from the prior 0.1.0 framework because the prompt placeholder was unresolved.", + "Deployment and live verification have not occurred." + ], + "changelog": [ + "Prepared a zero-record release candidate and approval-gate audit.", + "Kept every staging and proposal-only record out of production.", + "Preserved the 1.0.0 schema and existing public framework fingerprint." + ], + "approval_status": "blocked_pending_named_human_approval_and_explicit_batch_set", + "workflow_status": "publication_recommended", + "machine_review_status": "ready_for_human_review", + "human_review_status": "pending", + "reviewed_by": null, + "reviewed_at": null, + "provenance": [ + { + "source_url": "https://github.com/OpenFutureForum/executive-intelligence-index", + "accessed_at": "2026-08-16", + "retrieval_method": "local repository release audit", + "exact_locator": "release/0.2.0 candidate branch", + "content_hash": null, + "batch_id": "RELEASE-0.2.0", + "prompt_id": "OEII-RELEASE-MANAGER", + "prompt_version": "2.0", + "notes": "Machine-prepared candidate only; not a published release." + } + ], + "revision_history": [ + { + "changed_at": "2026-08-16T00:00:00Z", + "changed_by": "Codex release manager", + "summary": "Created a release hold record without changing human review status.", + "batch_id": "RELEASE-0.2.0" + } + ] +} diff --git a/exports/release-manifests/0.2.0.json b/exports/release-manifests/0.2.0.json new file mode 100644 index 0000000..950f7bf --- /dev/null +++ b/exports/release-manifests/0.2.0.json @@ -0,0 +1,95 @@ +{ + "release_id": "release-0.2.0-candidate", + "semantic_version": "0.2.0", + "release_status": "blocked_candidate_not_public", + "schema_version": "1.0.0", + "data_version": "0.0.0", + "content_version": "0.1.0", + "release_date": null, + "approved_batch_ids": [], + "included_record_counts": { + "people": 0, + "books": 0, + "editions": 0, + "media_sources": 0, + "evidence_sources": 0, + "statements": 0, + "propositions": 0, + "stance_relationships": 0, + "debates": 0, + "dossiers": 0, + "roles": 0, + "regions": 0, + "languages": 0 + }, + "source_metrics": { + "off_owned_share": null, + "external_share": null, + "source_concentration": null, + "reason": "No eligible production sources; denominator is zero." + }, + "records_by_review_status": { + "approved": 0, + "pending_canonical_records": 2, + "published": 0 + }, + "checksums": { + "exports/bibliographies/README.md": "9234346ea9b10467ff36dc51f97ea54591049fd84e1fd610aa754243b6462fb8", + "exports/citations/records.bib": "b129952ae22cf77632660b28b1a59008a5a4b0557f485a202dc7c83bef0a9514", + "exports/csv/batches.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/book-editions.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/book-works.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/corrections.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/debates.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/dossiers.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/organization-references.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/people.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/propositions.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/protocols.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/releases.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/reviews.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/sources.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/stances.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/statements.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/topics.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/csv/trends.csv": "8c7784e06705eeb046533c177c7c6af5a7eb89d6b0b912f82808e3a4ab1995e4", + "exports/graphml/graph.graphml": "37776c7d8e5ad090874effed8b195d2f85b5f19d3e270f17e95dc889ab2cbb96", + "exports/json/catalog.json": "df12f7c90bcf89843b398888cee241b61103ccdd67d389bea0e1a1a9ce46abd2", + "exports/ndjson/catalog.ndjson": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "release_fingerprint": "3527bda659346bd2f07569f394d14bc43f2065ef4e5dc800d6c10ca7ea747d3b", + "excluded_batches": [ + "BATCH-2026-001", + "BATCH-2026-002", + "BATCH-2026-003", + "BATCH-2026-004", + "BATCH-2026-005", + "BATCH-2026-006", + "BATCH-2026-007", + "BATCH-2026-008", + "BATCH-2026-009", + "BATCH-2026-010", + "BATCH-2026-011", + "BATCH-2026-012", + "BATCH-2026-013" + ], + "approval_gate": { + "named_human_release_approval": "missing", + "explicit_approved_batch_set": "missing", + "records_moved_to_production": 0, + "decision": "hold" + }, + "upstream_crosswalk_versions": [ + { "project_id": "cxo-ecosystem-index", "upstream_commit": "45ca4066fc00" }, + { "project_id": "executive-ai-research", "upstream_commit": "d205a6b2e6f4" }, + { "project_id": "executive-communities-index", "upstream_commit": "ba9bab57a774" }, + { "project_id": "executive-community-playbook", "upstream_commit": "2a0936b00c75" }, + { "project_id": "openfutureforum-github-profile", "upstream_commit": "c3fe1e9e27cc" }, + { "project_id": "openfutureforum-pages-root", "upstream_commit": "12505350a4d9" } + ], + "limitations": [ + "Candidate only; not an approved or frozen production release.", + "No release tag, GitHub release, deployment, or live verification is claimed.", + "The public 0.1.0 framework manifest remains authoritative." + ] +} diff --git a/operations/releases/0.2.0-deployment.md b/operations/releases/0.2.0-deployment.md new file mode 100644 index 0000000..6a36c63 --- /dev/null +++ b/operations/releases/0.2.0-deployment.md @@ -0,0 +1,30 @@ +# Release 0.2.0 deployment status + +## Current status + +**Not deployed. Live verification not run.** The release candidate is blocked by missing batch-level and release-level human approvals. + +## Prepared GitHub release metadata + +| Field | Proposed value | +| --- | --- | +| Tag | `v0.2.0` — not created | +| Release title | Open Executive Intelligence Index 0.2.0 | +| GitHub release state | Not created | +| Merge state | Release pull request only | +| Pages deployment | Not authorized or triggered by this task | +| Live verification | Pending deployment | + +Prepared artifact categories are the versioned release manifest, public JSON/CSV/NDJSON/GraphML data, node and edge representation, bibliography, citation file, schema bundle, checksum map, source-code archive supplied by GitHub after publication, and a data archive supplied only after approval. Because the included production count is zero, these remain framework artifacts and candidate metadata. + +## Deployment procedure after approval + +1. Record the target version, approved batch IDs, named record reviewers, and named release approver. +2. Re-run the full release gate and regenerate all exports from the approved canonical records. +3. Verify the final counts, checksums, fingerprint, data dictionary, citation guidance, migration notes, and limitations. +4. Obtain maintainer authorization, merge the release pull request, and allow the Pages workflow to complete. +5. Run `BASE_URL= npm run verify:live` against the deployed version. +6. Record the deployment workflow, production URL, live test output, and any corrective action. +7. Only then create the approved tag and GitHub release with the verified artifacts. + +If deployment or live verification fails, keep the release open, record the exact failing path and response, and do not describe the release as deployed. diff --git a/operations/releases/0.2.0-limitations.md b/operations/releases/0.2.0-limitations.md new file mode 100644 index 0000000..b3805e0 --- /dev/null +++ b/operations/releases/0.2.0-limitations.md @@ -0,0 +1,13 @@ +# Release 0.2.0 candidate limitations + +- `0.2.0` is an inferred candidate version because the supplied prompt retained its semantic-version placeholder. +- No approved batch IDs were supplied, and no batch manifest contains named human approval. +- No production research record is included. Zero is an eligibility result, not evidence that the topic has no relevant people, sources, statements, or propositions. +- Staging counts overlap across discovery, evidence, statement, person, proposition, regional, synthesis, and review stages; they are disclosed by stage and are not added into a false unique-record total. +- The `BATCH-2026-011` independent verification is a machine review. It does not authorize publication and every reviewed candidate remains `publication_approved: false`. +- The Executive Signal edition is ineligible for trend claims because an earlier comparable frozen production release does not exist. +- OFF-owned and external source shares, source concentration, role spread, geography spread, and language spread are undefined when the eligible-source denominator is zero. +- Schema `1.0.0` did not change, so no migration or backward-compatibility transition was required. +- Automated accessibility checks do not replace screen-reader testing, browser zoom review, or human evaluation of reading order and cognitive clarity. +- Local builds do not establish deployment success. The candidate has not been merged, tagged, released, deployed, or checked at a live Pages URL. +- The public `0.1.0` framework manifest remains the authoritative frozen artifact unless an authorized human completes the release gate. diff --git a/operations/releases/0.2.0-notes.md b/operations/releases/0.2.0-notes.md new file mode 100644 index 0000000..64dc3aa --- /dev/null +++ b/operations/releases/0.2.0-notes.md @@ -0,0 +1,9 @@ +# Open Executive Intelligence Index 0.2.0 candidate notes + +Release `0.2.0` is a blocked, zero-production-record candidate prepared to make the approval gap visible. It does not publish the research accumulated in batches `BATCH-2026-001` through `BATCH-2026-013`. + +The candidate preserves schema `1.0.0`, data `0.0.0`, content `0.1.0`, and the existing framework fingerprint. The public corpus therefore remains empty and the `0.1.0` framework manifest remains authoritative. + +For citation, continue to cite the `0.1.0` framework artifact and the original evidence source. Do not cite the `0.2.0` candidate as a released dataset or as support for a substantive executive claim. + +The next release should start only after explicit batch selection and named human review. Priority research gaps remain role-at-source-time evidence, regional and language coverage, production implementation outcomes, comparative frozen-release baselines, and independent evidence that does not depend on OFF-owned sources. diff --git a/operations/releases/0.2.0-qa.md b/operations/releases/0.2.0-qa.md new file mode 100644 index 0000000..67d0276 --- /dev/null +++ b/operations/releases/0.2.0-qa.md @@ -0,0 +1,156 @@ +# Release 0.2.0 candidate QA + +## Decision + +**Hold.** The candidate is machine-prepared but cannot become a production release. The prompt did not supply a semantic version or approved batch IDs; `0.2.0` is the inferred next candidate after the `0.1.0` framework, and the approved-batch set is empty. No named human release approval exists. + +This audit does not alter any human review status, move a staging record into production, create a tag, publish a GitHub release, deploy the site, or claim live verification. + +## Release identity + +| Field | Candidate value | +| --- | --- | +| Semantic version | `0.2.0` candidate | +| Schema version | `1.0.0` | +| Data version | `0.0.0` | +| Content version | `0.1.0` | +| Previous public artifact | `release-0.1.0-framework` | +| Approved batch IDs | None supplied or discovered | +| Included production records | 0 | +| Candidate fingerprint | `3527bda659346bd2f07569f394d14bc43f2065ef4e5dc800d6c10ca7ea747d3b` | +| Release status | Blocked pending explicit batch approvals and named human release approval | + +## Approval gate + +| Batch | Evidence available to this audit | Gate decision | Reason | +| --- | --- | --- | --- | +| `BATCH-2026-001` | 120 discovery candidates; 91 accepted for later research | Exclude | Manifest human review is pending; production records created: 0 | +| `BATCH-2026-002` | Separate book-metadata branch | Exclude | Not in the release-candidate lineage and no named human approval supplied | +| `BATCH-2026-003` | Separate book-analysis branch | Exclude | Not in the release-candidate lineage and deep analysis requires named approval | +| `BATCH-2026-004` | Separate media-research branch | Exclude | Not in the release-candidate lineage and no named human approval supplied | +| `BATCH-2026-005` | 9 selected evidence sources and 22 evidence statements | Exclude | Manifest human review is pending; production records created: 0 | +| `BATCH-2026-006` | 46 coded statements, 4 additionally held | Exclude | Attribution and locator review remain staging-only; human review is pending | +| `BATCH-2026-007` | 15 researched people | Exclude | Role and identity work remains staging-only; human review is pending | +| `BATCH-2026-008` | 9 proposed propositions and mapped stances | Exclude | Every proposition decision remains pending human review; debate eligibility was withheld | +| `BATCH-2026-009` | Topic dossier evidence-gap briefing | Exclude | Production source, person, statement, and proposition counts are all zero; human review is pending | +| `BATCH-2026-010` | Role-evidence-gap briefing | Exclude | Role-at-source-time evidence counts are zero and the comparison threshold is unmet | +| `BATCH-2026-011` | 60 global candidates; independent machine review; 40 held | Exclude | All record decisions say `publication_approved: false`; human review is pending | +| `BATCH-2026-012` | Executive Signal eligibility edition | Exclude | Manifest is staging-only; no eligible frozen comparison baseline exists | +| `BATCH-2026-013` | 41 original-research concepts | Exclude | Proposal-only agenda; named human review is pending and it contains no production evidence | + +The stage counts above overlap across the research pipeline and must not be summed as unique records. The approved-set gate admitted zero records. All staging files, review-only material, private notes, and synthetic fixtures remain outside the public exports. + +## Gate dimensions + +| Required condition | Result | +| --- | --- | +| Batch explicitly approved | Fail — no approved batch list supplied | +| Independent review where required | Partial — `BATCH-2026-011` has an independent machine review; this is not human approval | +| Named human approval | Fail | +| Rights issue resolved | No public rights-bearing record admitted; staging caveats remain outside production | +| Privacy issue resolved | No private record admitted; confidential roundtable concepts remain proposals only | +| Identity conflict resolved | No person record admitted | +| Locator issue resolved | No source or statement record admitted | +| Publication threshold met | Fail for every proposed production content type | +| Source concentration disclosed | Pass with zero-source denominator disclosure | +| OFF ownership disclosed | Pass with zero-source denominator disclosure | +| Schema compatible | Pass — schema remains `1.0.0`; no migration required | + +## Public release metrics + +| Metric | Count or share | +| --- | ---: | +| People | 0 | +| Books | 0 | +| Editions | 0 | +| Media sources | 0 | +| Evidence sources | 0 | +| Statements | 0 | +| Propositions | 0 | +| Stance relationships | 0 | +| Debates | 0 | +| Dossiers | 0 | +| Roles | 0 | +| Regions | 0 | +| Languages | 0 | +| OFF-owned source share | Not calculable; denominator 0 | +| External source share | Not calculable; denominator 0 | +| Source concentration | Not calculable; denominator 0 | + +Canonical review status after adding the blocked candidate record: two pending machine-created records, zero approved records, and zero published records. The two pending records are the discovery protocol and this release candidate; neither contributes to public exports. + +## Export and lineage review + +- JSON, CSV, NDJSON, GraphML, bibliography, citation, schema, and public manifest generation are retained. +- Counts in all public record exports remain zero. +- The versioned `0.2.0` manifest is candidate metadata and is excluded from its own payload checksum set. +- The public `release-manifest.json` continues to identify the approved `0.1.0` framework artifact. +- Batch, protocol, prompt, review, source, revision, approval identity, and publication-date lineage are not fabricated for excluded records. +- No migration was performed because neither schemas nor canonical field contracts changed. + +## Public-site QA + +| Area | Result | +| --- | --- | +| Home | Pass locally: purpose, zero-record metrics, limitations, and navigation remain explicit; the blocked `0.2.0` candidate is filtered out | +| People | Pass locally: truthful empty state; no ineligible profile | +| Books | Pass locally: truthful empty state; no copied publisher text | +| Media and reports | Pass locally: no unapproved source, transcript, report, or embed | +| Statements and propositions | Pass locally: no unapproved attribution or lineage page | +| Dossiers | Pass locally: no thin or below-threshold dossier exposed | +| Search | Pass locally: Pagefind generated; no staging or fixture identifier indexed | +| Data downloads | Pass locally: public counts, exports, schema bundle, and manifest agree | + +## Accessibility review + +The local browser inspection confirmed one `h1`, ordered heading levels, English document language, a single named main landmark, named primary navigation, a skip link targeting that main landmark, labelled collection search, header cells on data tables, and a readable non-graph relationship view. Measured contrast was 14.98:1 for primary body text and 8.08:1 for the primary button at a 1280×720 viewport, with no horizontal page overflow. Focus-reveal and reduced-motion rules are present in the stylesheet. A machine check is not a substitute for a named human accessibility review, screen-reader session, zoom review, or mobile-device inspection. + +## Performance, discovery, links, and analytics + +- The output remains static and has no runtime data API dependency. +- Pagefind is generated from local static pages; no unnecessary release-specific client code was added. +- Canonical URL, sitemap, Atom feed, robots, `llms.txt`, Open Graph, structured data, citation metadata, and downloads remain in the build. +- Link checks cover internal and canonical external links; staging URLs are not emitted as public data. +- Analytics hooks remain limited to documented event names. No provider credential, private identifier, or attendee data is committed. + +## Security and publication integrity + +Release-specific file inspection found no secret, private email, attendee list, confidential review note, unauthorized full text, transcript, hidden sponsor information, or private OFF-event material in the candidate outputs. Existing unrelated untracked duplicate files were not staged for this release. + +## Test commands + +```text +npm ci +npm run check +npm run report:rights +npm run report:release-readiness +npm run verify:determinism +candidate manifest and checksum verification +release gate and staging/fixture exclusion verification +git diff --check +``` + +## Test results + +- `npm ci`: passed; 449 packages installed, 0 reported vulnerabilities. +- `npm run check`: passed. Lint and typecheck reported 0 errors and warnings; 2 canonical pending records and 0 public records validated; 25/25 unit tests passed after the release-gate regression test was added; the static build produced 28 pages; Pagefind indexed 28 pages; artifact verification covered 22 checksums with staging and fixtures absent. +- Browser portion of the standard check: public-discovery request test passed; the two sandbox-aware interaction tests were skipped as designed. +- Direct local browser inspection: passed for title, language, main and navigation landmarks, heading hierarchy, labelled search control, empty-state behavior, release-candidate exclusion, table headers, contrast, and desktop overflow. +- Forced standalone Chromium run: not treated as a site failure. The executable installed successfully, but macOS denied its Mach port inside the managed sandbox. The equivalent page checks were completed through the in-app local browser. +- `npm run report:rights`: passed with 0 rights-bearing production records. +- `npm run report:release-readiness`: completed with 0 public-record validation errors and live deployment pending. The separate approval gate still blocks release because the approved-batch set and named human release approval are missing. +- `npm run verify:determinism`: passed; both clean static builds matched fingerprint `bdb1ab9fdd6bec56db9ae8dba83dcbbf2dc87b3b868529116df92196e0352d65`. +- Candidate manifest verification: passed for 22 payload checksums, zero approved batches, identical release fingerprints, blocked-candidate public exclusion, and preservation of the `0.1.0` public framework manifest. +- Secret and private-data scan: no match in the release-specific source set. +- `git diff --check`: passed. + +## Exact approvals required + +1. The release owner must confirm or replace target semantic version `0.2.0`. +2. An authorized human must provide the exact approved batch IDs. +3. Named human reviewers must approve every record proposed for production, including any high-impact book, debate, dossier, or trend record. +4. An authorized release approver must approve the final included-record list, manifest, limitations, checksum set, and release fingerprint. +5. A repository maintainer must authorize merge and Pages deployment. +6. After deployment, an authorized operator must run live verification and record the production URL and result. + +Until all applicable approvals are recorded, the release pull request must remain open and the proposed `v0.2.0` tag must not be created. diff --git a/scripts/cli.ts b/scripts/cli.ts index 2c0810d..5951eb8 100644 --- a/scripts/cli.ts +++ b/scripts/cli.ts @@ -202,7 +202,8 @@ function generateExports(): void { fs.writeFileSync(path.join(root, 'exports', 'graphml', 'graph.graphml'), graphml(publicItems)); fs.writeFileSync(path.join(root, 'exports', 'citations', 'records.bib'), '% No public research records in release 0.1.0.\n'); fs.writeFileSync(path.join(root, 'exports', 'bibliographies', 'README.md'), '# Bibliographies\n\nNo public research records are present in release 0.1.0.\n'); - const exportFiles = listFiles(path.join(root, 'exports')).filter((file) => !file.endsWith('release-manifest.json')); + const releaseManifestDirectory = path.join(root, 'exports', 'release-manifests'); + const exportFiles = listFiles(path.join(root, 'exports')).filter((file) => !file.startsWith(`${releaseManifestDirectory}${path.sep}`)); const checksums = Object.fromEntries(exportFiles.map((file) => [path.relative(root, file), sha256(fs.readFileSync(file))])); const manifest = { release_id: 'release-0.1.0-framework', semantic_version: '0.1.0', schema_version: '1.0.0', data_version: '0.0.0', content_version: '0.1.0', release_date: '2026-08-14', public_record_counts: Object.fromEntries(Object.entries(grouped).map(([key, value]) => [key, value.length])), checksums, release_fingerprint: sha256(stable(checksums)), upstream_crosswalk_versions: YAML.parse(fs.readFileSync(path.join(root, 'config', 'external-projects.yml'), 'utf8')).projects.map((project: any) => ({ project_id: project.project_id, upstream_commit: project.upstream_commit })), limitations: ['Framework release contains no production research records.', 'No human editorial approval has occurred.', 'Live deployment has not been verified.'] }; writeJson(path.join(root, 'exports', 'release-manifests', 'release-manifest.json'), manifest); diff --git a/src/pages/index.astro b/src/pages/index.astro index ff9f47c..59bc246 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -5,7 +5,7 @@ const catalog = loadCatalog(); const counts = countPublicResearch(catalog); const recentSources = publicRecords(catalog.sources ?? []).slice(-5).reverse(); const dossiers = publicRecords(catalog.dossiers ?? []).slice(-3).reverse(); -const release = (catalog.releases ?? []).at(-1); +const release = publicRecords(catalog.releases ?? []).at(-1); ---
diff --git a/tests/publication-gates/publication.test.ts b/tests/publication-gates/publication.test.ts index c679b0d..aaca84c 100644 --- a/tests/publication-gates/publication.test.ts +++ b/tests/publication-gates/publication.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest'; import { publicationIssues } from '../../scripts/lib/publication'; +import { publicRecords } from '../../src/lib/catalog'; describe('publication gates', () => { it('rejects agent-assigned human approval', () => { @@ -11,4 +12,7 @@ describe('publication gates', () => { it('allows non-public machine drafts to await review', () => { expect(publicationIssues({ workflow_status: 'candidate', human_review_status: 'pending', reviewed_by: null, reviewed_at: null })).toEqual([]); }); + it('keeps a pending release candidate out of public release selection', () => { + expect(publicRecords([{ workflow_status: 'publication_recommended', human_review_status: 'pending', reviewed_by: null, reviewed_at: null, semantic_version: '9.9.9' }])).toEqual([]); + }); });