diff --git a/CHANGELOG.md b/CHANGELOG.md index 63b6e61..b6ba6b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,50 @@ and this project uses semantic versioning. ## [Unreleased] +## [3.27.0] — 2026-09-05 + ### Changed -- Public install/docs paths updated for repo rename **NeonGenie** - (`scrimshawlife-ctrl/NeonGenie`, Pages `…/NeonGenie/`) +- Gate ISO: irreversible work requires conjunction `independent` ∧ versioned log pointer; alias table packet `validation_isolation.*` ↔ graph `validation_step.*`; `validation_log_version` on graph `validation_step` (PROMETHEUS gaps). +- **Required fields** (fail closed): `logic_label` on opportunity/product/zero-option packets; + `stage` on run-envelope (`shape`|`test`|`scale`); `evidence_ledger` on EvidenceIntelligence packets. +- Warn-then-require period for 3.26.x closed after dual-logic / U4 / U7 goldens. +- SkillEvaluator `metadata.author` in frontmatter (`Name ` shape) +- Public README / badge strings aligned to **3.27.0** (away from stale v3.23 / 3.26 copy) + +### Added + +- PR-A: optional `validation_isolation` on WayfinderExecutionPacket; Gate ISO. +- PR-B: PaperPilot `research-search-dag` schema + Gate PILOT (optional attach; write when research runs). +- Goldens: LOGIC / STAGE / BRIC / CITE / LEDGER / ISO / PILOT (`effectual-missing-means`, + `scale-without-test`, `fabricated-cite`, `uncited-claim`, `contradict-unresolved-testable`, + `irreversible-without-validation`, `irreversible-missing-log-pointer`, + `research-ran-without-dag`, `dag-fabricated-cite`) + +### Notes (public mirror) + +- 2026-09-17 PT: this public tree (`scrimshawlife-ctrl/NeonGenie`) is synced to the + org 3.27.0 skill surface. Installer/verification safety from **#20** is preserved: + staged `install.sh` + `scripts/install_transaction.py`, `tests_audit/`, and + `references/source-and-upgrades.md`. Advisory only; no spend/publish/contact. + +## [3.26.1] — 2026-09-01 + +### Fixed + +- `SKILL.md` frontmatter now matches Hermes Agent v0.21.0 (tag v2026.8.31): + one-sentence `description` ≤60 characters, required author/license/platforms + and `metadata.hermes.{tags, related_skills}`, frontmatter at byte 0. +- `do check` rejects folded or over-long descriptions so the skill index + no longer truncates routing text at 57 characters. + +### Changed + +- Skill body uses the v0.21 section order (When to Use, Prerequisites, How to + Run, Quick Reference, Procedure, Pitfalls, Verification). +- Packaging examples use `${HERMES_SKILL_DIR}` and Hermes `terminal`. +- Author credit is `Daniel Meyer (scrimshawlife-ctrl), Hermes Agent`. Applied + Alchemy Labs / Zero State credit remains in the skill body. ## [3.26.0] — 2026-08-08 @@ -42,6 +82,8 @@ and this project uses semantic versioning. - `do run --brief` auto-recipe prefers `capital-sprint` over commercial when both match - Hub package no longer ships Pages assets, hallmark, or monorepo ADR/checklist bulk - Public docs/README aligned to **3.25.0** (site link, founder prompts, capital-sprint CLI) +- Public install/docs paths updated for repo rename **NeonGenie** + (`scrimshawlife-ctrl/NeonGenie`, Pages `…/NeonGenie/`) ## [3.25.0] — 2026-08-06 diff --git a/README.md b/README.md index 72b5e4b..15ae56c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### Product & opportunity intelligence for Hermes -[![Version](https://img.shields.io/badge/version-3.26.0-7c3aed?style=for-the-badge)](./manifest.json) +[![Version](https://img.shields.io/badge/version-3.27.0-7c3aed?style=for-the-badge)](./manifest.json) [![Hermes Skill Evals](https://img.shields.io/github/actions/workflow/status/scrimshawlife-ctrl/NeonGenie/hermes-evals.yml?branch=main&label=hermes-evals&style=for-the-badge)](./.github/workflows/hermes-evals.yml) [![Authority](https://img.shields.io/badge/authority-advisory%20only-0ea5e9?style=for-the-badge)](#what-it-will-not-do) [![Privacy](https://img.shields.io/badge/privacy-by%20construction-a855f7?style=for-the-badge)](./PRIVACY.md) @@ -217,12 +217,19 @@ python scripts/neon_genie.py do run --recipe commercial --out out/neon-genie/aud | [CHANGELOG.md](./CHANGELOG.md) | What’s new | | [CONTRIBUTING.md](./CONTRIBUTING.md) | Development | -**Version:** 3.26.0 · **License:** MIT · **Maintainers:** [Applied Alchemy Labs / @scrimshawlife-ctrl](https://github.com/scrimshawlife-ctrl) · [Zero-State-LLC](https://github.com/Zero-State-LLC) +**Version:** 3.27.0 · **License:** MIT · **Maintainers:** [Applied Alchemy Labs / @scrimshawlife-ctrl](https://github.com/scrimshawlife-ctrl) · [Zero-State-LLC](https://github.com/Zero-State-LLC) ---
-Neon Genie v3.26.0 · advice only · evidence before invention +Neon Genie v3.27.0 · advice only · evidence before invention
+ +## License + +This repository now uses the MIT License for original Zero State materials going forward. See [LICENSE](LICENSE). Earlier grants in repository history are not rewritten. + +Third-party components remain subject to their respective licenses. + Source, profile, and migration rules: `references/source-and-upgrades.md`. diff --git a/SKILL.md b/SKILL.md index 9c2c30f..fd1d204 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,16 +1,12 @@ --- name: neon-genie -description: > - Evidence-bound product and opportunity intelligence — audits, zero-option - loops, commercial models, agentic graphs, and Wayfinder handoffs with claim - labels and fail-closed gates. Use for product intent, opportunity mining, - and advisory packets — not cinematic work (use Kubrick) or code execution. -version: 3.26.0 -author: Applied Alchemy Labs / Zero State +description: Audit products and opportunities with labeled evidence. +version: 3.27.0 +author: Daniel Meyer (scrimshawlife-ctrl), Hermes Agent license: MIT platforms: [linux, macos, windows] -dependencies: [] metadata: + author: Applied Alchemy Labs / Zero State hermes: tags: - Product @@ -24,452 +20,268 @@ metadata: - AgenticServices category: product related_skills: [] -triggers: - - neon genie - - product audit - - opportunity mining - - blocked transition - - fragmentation scan - - zero option - - first cash - - agentic services - - x402 - - commercial simulation - - evidence intelligence - - wayfinder handoff - - wayfinder execution packet - - cost of inaction - - audit delivery --- -# Neon Genie v3 +# Neon Genie Skill -## Hermes skill identity +Neon Genie is a standalone Hermes skill for evidence-bound product and opportunity intelligence. It drafts audits, opportunity packets, commercial models, agentic graphs, and Wayfinder handoffs with claim labels and fail-closed gates. It does not execute code, spend, publish, contact, or mutate repositories, and it is not cinematic work (use Kubrick). Credit: Applied Alchemy Labs / Zero State. -Neon Genie is a **standalone Hermes skill**. Hermes loads this directory directly and uses `SKILL.md` as the operating contract. No Python package install, Kubrick skill, Wayfinder runtime, or external knowledge base is required to load. +See `references/hermes-runtime-contract.md` for path, artifact, authority, and dependency policy. Profile contracts, packet schemas, and golden tests ship as hub mirrors and as root `profiles/`, `schemas/`, `evals/` on full install. -See `references/hermes-runtime-contract.md` for path, artifact, authority, and dependency policy. +## When to Use -Profile contracts, packet schemas, and golden tests ship as hub mirrors (see **Hermes Hub support files** below) and as root `profiles/`, `schemas/`, `evals/` on full install. +- Product intent, product audit, app/game/system design, or feature coherence. +- Opportunity mining, blocked transitions, roadmaps, or first-cash / zero-option work. +- Fragmentation, commercial simulation, agentic/x402 graphs, or evidence intelligence. +- Wayfinder execution-packet handoff, audit delivery, or capital-sprint planning. +- The operator needs labeled claims (`OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`) and fail-closed gates. -**Optional companions:** host research tools, Wayfinder (handoff consumer). Their absence never blocks local advisory work. +Do not use for: -## Packaging CLI +- Cinematic or motif work (use Kubrick). +- Code execution, repo mutation, spend, publish, contact, or canon promotion. +- Treating packaging envelopes as execution authority. -One pattern (packaging only — not a product brain): +## Prerequisites -```text -python scripts/neon_genie.py do [options] -``` - -| Job | Use | -|-----|-----| -| `doctor` | Full smoke after install | -| `wizard` | Guided packaging: resolve plan or quick onboarding | -| `privacy` | Resolved repository privacy boundary (`--json`) | -| `check` | Skill integrity | -| `run` | Operator packaging run (brief/recipe → envelope) | -| `capabilities` | Machine-readable skill surface (JSON) | -| `dist` | Hub mirrors + package (`verify` / `write`) | -| `recipe` | Named example (`--list` / `--name`) | -| `route` / `validate` / `receipt` / `envelope` | Profiles, schema, receipt, run envelope | -| `eval` / `transcripts` | Golden tests | -| `behavioral` / `runtime` | Semantic agent gates + hub install smoke | -| `learn` / `reconcile` | PROPOSED ledger entry; link entries to run_id | -| `release-check` | Pre-release version / changelog / dist gate | - -```bash -python scripts/neon_genie.py help -python scripts/neon_genie.py do doctor -python scripts/neon_genie.py do wizard --preset product-audit --print-only --json -python scripts/neon_genie.py do wizard --path quick --auto -python scripts/neon_genie.py do run --recipe product-audit --out out/neon-genie/demo -``` - -### Prefer the wizard - -When the operator is new, unsure which packaging job to run, or says “wizard” / -“guide me” / “walk me through”: - -1. Prefer `do wizard` over freestyling `do run` flags. -2. **Chat-driven Q&A** (Desktop-safe): merge answers JSON → - `do wizard --answers answers.json --print-only --json` → confirm → `--run`. -3. **New install:** `do wizard --path quick --auto` (doctor + sample product-audit). -4. After packaging, resume product judgment in chat (OPEN→SEAL). Envelope is not - execution authority. +- Hermes Agent that can load this directory and invoke `terminal`. +- Python 3 on PATH for the packaging CLI (stdlib only). No package install, API key, or secret is required to load. +- Optional companions: host research tools, Wayfinder (handoff consumer). Their absence never blocks local advisory work. +- Path, artifact, and authority rules: `references/hermes-runtime-contract.md`. +- Privacy contract: root `PRIVACY.md` and hub mirror `references/PRIVACY.md`; always-on profile `profiles/privacy.md`. -Load [references/wizard.md](references/wizard.md) while guiding. Packaging only — -no invented opportunities, no ledger writes, no repo mutation. +## How to Run -See `README.md` (How to use) and `QUICKSTART.md`. Golden prose: `examples/evals/transcripts/README.md`. Post-SEAL: `references/post-seal-verification.md`. Gate ontology: `references/gates.yaml`. Privacy contract: root `PRIVACY.md` and hub mirror `references/PRIVACY.md`; always-on profile `profiles/privacy.md`. +Frame every packaging command through Hermes `terminal`. Substitute `${HERMES_SKILL_DIR}` (Hermes replaces it with the installed skill root): -## Mission - -Convert weak signals, blocked state transitions, fragmented systems, raw ideas, and incomplete products into evidence-bound, externally testable, buildable opportunity systems. +```text +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do [options]") +``` -Neon Genie owns product and opportunity intelligence. It does not grant execution, forecast, governance, spending, publication, or canon-promotion authority. +When the operator is new, unsure which packaging job to run, or says “wizard” / “guide me” / “walk me through”: -## Default operator job (transitional builders) +1. Prefer `do wizard` over freestyling `do run` flags. Completion: a resolve plan is printed or a named recipe is queued. +2. Chat-driven Q&A (Desktop-safe): merge answers JSON → `do wizard --answers answers.json --print-only --json` → confirm → `--run`. Completion: plan JSON matches the answers file. +3. New install: `do wizard --path quick --auto` (doctor + sample product-audit). Completion: doctor exits 0 and a demo envelope exists. +4. After packaging, resume product judgment in chat (OPEN→SEAL). The envelope is not execution authority. -When the operator is developing an idea under constraint (solo, transitional, -limited money/time/skills) and has not named a specialized recipe, default to -this job shape — still **advisory only**: +Load [references/wizard.md](references/wizard.md) while guiding. Packaging only — no invented opportunities, no ledger writes, no repo mutation. -1. **Name the stuck point** — who is blocked, current state, what “done” looks like. -2. **Capture constraints** — time, money, skills, access. Never invent resources. -3. **Find → request → refuse** — research public facts; emit `DataRequest` for private - facts; label claims `OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`. -4. **Shape the plan** — roadmap and/or approach options with **completion_proof** - (externally checkable). Prefer profiles `opportunity_mining` and, when resources - are scarce, `zero_option` (plus `product_architecture` only if a product/system - boundary is in scope). -5. **Seal as drafts** — packets + receipt; no spend, publish, contact, or repo mutation. +See `README.md` (How to use) and `QUICKSTART.md`. Golden prose: `examples/evals/transcripts/README.md`. Post-SEAL: `references/post-seal-verification.md`. Gate ontology: `references/gates.yaml`. -**Example Hermes prompt (plain English):** +## Quick Reference ```text -Use Neon Genie. I'm between jobs with limited money and an app idea. -I need a realistic roadmap and first approaches I can actually run. -Do not invent buyers, capital, or skills I did not declare. -Research public facts if you can; request private facts with DataRequest. -Label every important claim. Advisory only — do not modify any repo. +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py help") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do doctor") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do check") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do wizard --preset product-audit --print-only --json") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do wizard --path quick --auto") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do run --recipe product-audit --out out/neon-genie/demo") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do privacy --json") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do eval") ``` -## Research doctrine (default: proactive) +Jobs: `doctor` (full smoke), `wizard` (guided packaging), `privacy` (resolved boundary), `check` (skill integrity), `run` (brief/recipe → envelope), `capabilities` (JSON surface), `dist` (hub mirrors), `recipe` (named example), `route` / `validate` / `receipt` / `envelope`, `eval` / `transcripts`, `behavioral` / `runtime`, `learn` / `reconcile` (PROPOSED ledger only), `release-check`. -**Automatically perform any research the host can run when it improves usefulness of the result.** Do not wait for the operator to name every source. Prefer a researched, labeled answer over a thin `NOT_COMPUTABLE` wall when facts are fetchable. +## Procedure -### Source stack (priority order) +1. **Load as a standalone skill.** Hermes uses this `SKILL.md` as the operating contract. No Python package install, Kubrick skill, Wayfinder runtime, or external knowledge base is required to load. Completion: skill index shows `neon-genie` with an intact description. -1. **Operator-supplied** — pasted evidence, attached files, declared URLs, explicit `canonical_sources` -2. **Workspace / host context** — open repo, local files, prior run artifacts Hermes can read -3. **Live host research** — web search, page fetch, academic indexes (e.g. arXiv), docs, registries, market/public filings, standards bodies, news, competitor sites, grant/board databases — *whatever tools the host exposes* -4. **Model prior** — only as `SPECULATIVE` or scaffolding; never as `OBSERVED` +2. **State the mission.** Convert weak signals, blocked state transitions, fragmented systems, raw ideas, and incomplete products into evidence-bound, externally testable, buildable opportunity systems. Neon Genie owns product and opportunity intelligence. It does not grant execution, forecast, governance, spending, publication, or canon-promotion authority. Completion: the operator can name the blocked transition and the desired state. -No external knowledge base is required to *load* the skill. Research uses **host-available tools at run time**. If a tool class is unavailable, record the gap and continue with the best remaining stack. +3. **Default operator job (transitional builders).** When the operator is developing an idea under constraint (solo, transitional, limited money/time/skills) and has not named a specialized recipe, still stay advisory only: + 1. Name the stuck point — who is blocked, current state, what “done” looks like. + 2. Capture constraints — time, money, skills, access. Never invent resources. + 3. Find → request → refuse — research public facts; emit `DataRequest` for private facts; label claims `OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`. + 4. Shape the plan — roadmap and/or approach options with `completion_proof` (externally checkable). Prefer profiles `opportunity_mining` and, when resources are scarce, `zero_option` (plus `product_architecture` only if a product/system boundary is in scope). + 5. Seal as drafts — packets + receipt; no spend, publish, contact, or repo mutation. -### When to research (auto) + Example Hermes prompt: -Run research during `ALIGN` and again in `ASCEND` whenever any of these hold: + ```text + Use Neon Genie. I'm between jobs with limited money and an app idea. + I need a realistic roadmap and first approaches I can actually run. + Do not invent buyers, capital, or skills I did not declare. + Research public facts if you can; request private facts with DataRequest. + Label every important claim. Advisory only — do not modify any repo. + ``` -- a material claim would otherwise be `NOT_COMPUTABLE` or weak `SPECULATIVE` and is fetchable; -- buyer, market, competitor, pricing, regulation, or technical feasibility is decision-critical; -- grants, boards, philanthropy, standards, or “current external facts” affect the scorecard; -- product/system claims depend on public APIs, licenses, or third-party capabilities; -- the operator asked for an audit, opportunity, commercial model, or handoff packet. + Completion: every material claim has a label; missing private facts have a `DataRequest`. -### Research loop +4. **Research doctrine (default: proactive).** Automatically perform any research the host can run when it improves usefulness. Do not wait for the operator to name every source. Prefer a researched, labeled answer over a thin `NOT_COMPUTABLE` wall when facts are fetchable. -```text -GAP_DETECT → QUERY_PLAN → PRIVACY_EGRESS_CHECK → FETCH (host tools) → NORMALIZE → CITE - → LABEL (OBSERVED | INFERRED | SPECULATIVE | NOT_COMPUTABLE) - → RE-SCORE → (repeat until usefulness plateaus or budget/tooling ends) -``` + Source stack (priority order): -Before every host research/tool send: classify → minimize → `RUNE.PRIVACY_EGRESS_CHECK` → only then FETCH. Outcomes: `ALLOW` | `REDACT_THEN_ALLOW` | `REQUEST_CONSENT` | `BLOCK`. Log attempts in receipt `external_actions`. See `profiles/privacy.md` and `references/PRIVACY.md`. + 1. Operator-supplied — pasted evidence, attached files, declared URLs, explicit `canonical_sources` + 2. Workspace / host context — open repo, local files, prior run artifacts Hermes can read + 3. Live host research — web search, page fetch, academic indexes, docs, registries, market/public filings, standards, news, competitor sites, grant/board databases — *whatever tools the host exposes* + 4. Model prior — only as `SPECULATIVE` or scaffolding; never as `OBSERVED` -### Research rules + No external knowledge base is required to *load* the skill. Research uses host-available tools at run time. If a tool class is unavailable, record the gap and continue with the best remaining stack. -- **Proactive by default** — research is on unless the operator sets `research: false` or `offline: true`. -- **Smallest sufficient fetch** — enough evidence for the decision, not infinite crawl. -- **Cite or drop** — every `OBSERVED` claim needs a source pointer (URL, path, title+date, or tool result id). -- **Find → request private → NOT_COMPUTABLE** — for public/fetchable gaps, attempt research first; for operator/private gaps, emit a `DataRequest` before (or instead of) `NOT_COMPUTABLE`; never invent. -- **Never fabricate** — if fetch fails or tools are absent, mark `NOT_COMPUTABLE` with the attempted query (after find was attempted or correctly skipped offline, and after request when private). -- **Freshness** — prefer primary/current sources; note retrieval time for volatile facts. -- **Attribution boundaries** — separate person / company / foundation / model inference. -- **Authority unchanged** — research may draft; it may not submit, contact, spend, publish, or mutate repos. -- **Privacy** — do not probe private systems without declared access; public + operator-granted only; request private facts via `DataRequest`. Run egress check before host tools; credentials never leave; private/operator egress needs consent. + Run research during `ALIGN` and again in `ASCEND` whenever any of these hold: -## Evidence Request Protocol + - a material claim would otherwise be `NOT_COMPUTABLE` or weak `SPECULATIVE` and is fetchable; + - buyer, market, competitor, pricing, regulation, or technical feasibility is decision-critical; + - grants, boards, philanthropy, standards, or current external facts affect the scorecard; + - product/system claims depend on public APIs, licenses, or third-party capabilities; + - the operator asked for an audit, opportunity, commercial model, or handoff packet. -Priority when a material fact is missing: + Research loop: -1. **Find** — if sensitivity is public (or unknown-but-likely-public) and host tools can run, attempt research; cite or drop. -2. **Request** — if sensitivity is operator/private or access is undeclared, emit a `DataRequest` (`references/schemas/data-request.schema.json`) instead of inventing. -3. **NOT_COMPUTABLE** — only after find was attempted (or correctly skipped offline) and/or a DataRequest is open or unanswered. -4. **Never** mark model prior as `OBSERVED`. + ```text + GAP_DETECT → QUERY_PLAN → PRIVACY_EGRESS_CHECK → FETCH (host tools) → NORMALIZE → CITE + → LABEL (OBSERVED | INFERRED | SPECULATIVE | NOT_COMPUTABLE) + → RE-SCORE → (repeat until usefulness plateaus or budget/tooling ends) + ``` -### DataRequest (required fields) + Before every host research/tool send: classify → minimize → `RUNE.PRIVACY_EGRESS_CHECK` → only then FETCH. Outcomes: `ALLOW` | `REDACT_THEN_ALLOW` | `REQUEST_CONSENT` | `BLOCK`. Log attempts in receipt `external_actions`. See `profiles/privacy.md` and `references/PRIVACY.md`. -- `field`, `why_decision_critical`, `sensitivity` (`public`|`operator`|`private`), - `suggested_source`, `blocks_promotion` (bool), `status` (`open`|`satisfied`|`waived`) + Research rules: -### CLEAR rules + - Proactive by default — research is on unless the operator sets `research: false` or `offline: true`. + - Smallest sufficient fetch — enough evidence for the decision, not infinite crawl. + - Cite or drop — every `OBSERVED` claim needs a source pointer (URL, path, title+date, or tool result id). + - Find → request private → `NOT_COMPUTABLE` — for public/fetchable gaps, attempt research first; for operator/private gaps, emit a `DataRequest` before (or instead of) `NOT_COMPUTABLE`; never invent. + - Never fabricate — if fetch fails or tools are absent, mark `NOT_COMPUTABLE` with the attempted query (after find was attempted or correctly skipped offline, and after request when private). + - Freshness — prefer primary/current sources; note retrieval time for volatile facts. + - Attribution boundaries — separate person / company / foundation / model inference. + - Authority unchanged — research may draft; it may not submit, contact, spend, publish, or mutate repos. + - Privacy — do not probe private systems without declared access; public + operator-granted only; request private facts via `DataRequest`. Run egress check before host tools; credentials never leave; private/operator egress needs consent. -- Public gap + tools available + no research attempt → fail (Gate P) -- Private decision-critical gap + no DataRequest → fail (Gate Q) -- Private/unknown fact labeled OBSERVED from model prior without source → fail (Gate R) -- Open DataRequests with `blocks_promotion: true` cap promotion until satisfied or waived -- CLEAR order: authority → evidence P–R → privacy S–Y → remaining anti-overclaim + Completion: every fetch is cited or dropped; egress decisions are logged. -### SEAL +5. **Evidence Request Protocol.** Priority when a material fact is missing: + 1. Find — if sensitivity is public (or unknown-but-likely-public) and host tools can run, attempt research; cite or drop. + 2. Request — if sensitivity is operator/private or access is undeclared, emit a `DataRequest` (`references/schemas/data-request.schema.json`) instead of inventing. + 3. `NOT_COMPUTABLE` — only after find was attempted (or correctly skipped offline) and/or a DataRequest is open or unanswered. + 4. Never mark model prior as `OBSERVED`. -Run receipt must list `data_requests`, `open_blocking_requests`, and `research_attempts` (may be empty arrays). See `references/schemas/run-receipt.schema.json`. + DataRequest required fields: `field`, `why_decision_critical`, `sensitivity` (`public`|`operator`|`private`), `suggested_source`, `blocks_promotion` (bool), `status` (`open`|`satisfied`|`waived`). -Privacy provenance (Gate Y / `RUNE.PRIVACY_SEAL_PROVENANCE`) is also required: `privacy_mode`, `privacy_contract_version`, `data_sources_used`, `external_actions`, `artifact_paths`, `telemetry_status` (`disabled`), `retention_statement`, `privacy_warnings`, `deletion_instructions`, `redaction`, `research_policy`. Contract: `PRIVACY.md` / `references/PRIVACY.md`. + CLEAR rules: + + - Public gap + tools available + no research attempt → fail (Gate P) + - Private decision-critical gap + no DataRequest → fail (Gate Q) + - Private/unknown fact labeled OBSERVED from model prior without source → fail (Gate R) + - Open DataRequests with `blocks_promotion: true` cap promotion until satisfied or waived + - Dual-logic / stage / means / cites (**required** as of 3.27.0): + - Missing or mismatched `logic_label` (`effectual`|`causal`|`mixed`) when opportunity/product/zero-option CLEAR expects it → fail (Gate LOGIC) + - Opportunity/agentic run missing `stage` (`shape`|`test`|`scale`), or `scale` without test evidence → fail (Gate STAGE) + - Effectual / zero-option with empty means inventory and no DataRequest / NOT_COMPUTABLE → fail (Gate BRIC) + - arXiv/DOI/paper claim without verified fetch or operator source → fail (Gate CITE); never fabricate citations + - Claim graph / EviGraph ledger (`evidence_ledger` **required** on EvidenceIntelligence packets as of 3.27.0; optional peer attach): + - Material claim promotes without an **active ledger cite** (claim node + typed relation) → fail (Gate LEDGER) + - Unresolved `Contradict` / `Invalidate` at ≥TESTABLE → fail (Gate LEDGER) + - Invent-OBSERVED from model prior without ledger cite → fail (Gate LEDGER); fabricated paper IDs still Gate CITE + - Final-answer fluency ≠ provenance; no invent Brier / auto-settle + - Irreversible agentic graph / action without independent validation step + versioned log pointer → fail (Gate ISO); PROMETHEUS consumes `validation_isolation` — no Wayfinder/fifth bot + - Research ran without editable PaperPilot `research_search_dag` (keyword→cite-expand→filter→score→extract) → fail (Gate PILOT; still warn-then-require for DAG until next cycle) + - Also apply (registry `references/gates.yaml`): HYP, METRIC, LIVE, CSET, LEDGER, ISO, PILOT + - CLEAR order: authority → evidence P–R → LOGIC/STAGE/BRIC/CITE/LEDGER → HYP/METRIC/LIVE/CSET → privacy S–Y → remaining anti-overclaim -Opportunity, product, and zero-option packets at `TESTABLE` or higher require **`completion_proof`** (externally checkable) and should include a **`proof_path`**. After SEAL, follow `references/post-seal-verification.md`. Record real outcomes with: + SEAL: run receipt must list `data_requests`, `open_blocking_requests`, and `research_attempts` (may be empty arrays). See `references/schemas/run-receipt.schema.json`. -```bash -python scripts/neon_genie.py do learn --class proof_obtained --summary "..." \ - --envelope out/neon-genie/demo/run-envelope.json \ - --ledger out/neon-genie/learning-ledger.jsonl -python scripts/neon_genie.py do reconcile --ledger out/neon-genie/learning-ledger.jsonl \ - --runs-root out/neon-genie -``` + Privacy provenance (Gate Y / `RUNE.PRIVACY_SEAL_PROVENANCE`) is also required: `privacy_mode`, `privacy_contract_version`, `data_sources_used`, `external_actions`, `artifact_paths`, `telemetry_status` (`disabled`), `retention_statement`, `privacy_warnings`, `deletion_instructions`, `redaction`, `research_policy`. Contract: `PRIVACY.md` / `references/PRIVACY.md`. -Learning ledger entries are `PROPOSED` / `OBSERVATION` only — never auto-canon. Prefer linking via `--envelope` / `run_id`. - -## Default operating sequence - -Always execute: - -1. `OPEN` -2. `ALIGN` ← includes gap-driven research plan + first fetch pass -3. `ASCEND` ← continues research when new gaps appear -4. `CLEAR` -5. `SEAL` ← source manifest lists every fetch - -Every material claim must be labeled: - -- `OBSERVED` -- `INFERRED` -- `SPECULATIVE` -- `NOT_COMPUTABLE` - -SHADOW detects drift and anomalies only. FORECAST performs evidence-based inference only. - -## Router - -Determine the smallest sufficient profile set. **Additionally auto-load** `evidence_intelligence` whenever external facts would change the recommendation, scorecard, or handoff quality — even if the operator did not name that profile. - -```yaml -profile_router: - core: always - privacy: - triggers: [always] - default_when: always_with_core - product_architecture: - triggers: [product audit, app design, game design, system design, feature coherence] - opportunity_mining: - triggers: [new venture, unmet need, market opportunity, blocked transition, roadmap, business idea, go into business, side project, app idea, product idea, what should I build, where do I start, next steps] - fragmentation: - triggers: [many portals, repeated handoffs, incompatible systems, coordination problem] - zero_option: - triggers: [zero capital, first cash, immediate executable opportunity, constrained launch, limited money, limited resources, limited capital, between jobs, bootstrapped, no budget, first revenue] - agentic_services: - triggers: [agent workflow, delegated outcome, automation, x402, machine services] - commercial: - triggers: [pricing, buyer, revenue, costs, market pressure, business model] - evidence_intelligence: - triggers: - - grants - - boards - - philanthropy - - competitive research - - current external facts - - auto: any material external gap that research can close - default_when: improves_result - memetic: - triggers: [name, hook, pitch language, public framing, shareability] - audit_delivery: - triggers: [client audit, cost of inaction, diagnostic package, implementation offer] - wayfinder_handoff: - triggers: [build plan, engineering readiness, execution packet] - capital_sprint: - triggers: - - capital sprint - - annual fund - - donation drive - - membership drive - - fundraising deadline - - impact object - - donor sprint - - nonprofit capital raise -``` + Opportunity, product, and zero-option packets at `TESTABLE` or higher require `completion_proof` (externally checkable) and should include a `proof_path`. After SEAL, follow `references/post-seal-verification.md`. Record real outcomes with: + + ```text + terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do learn --class proof_obtained --summary \"...\" --envelope out/neon-genie/demo/run-envelope.json --ledger out/neon-genie/learning-ledger.jsonl") + terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do reconcile --ledger out/neon-genie/learning-ledger.jsonl --runs-root out/neon-genie") + ``` + + Learning ledger entries are `PROPOSED` / `OBSERVATION` only — never auto-canon. Prefer linking via `--envelope` / `run_id`. Completion: receipt lists requests and research attempts; TESTABLE+ packets have `completion_proof`. + +6. **Default operating sequence.** Always execute `OPEN` → `ALIGN` (gap-driven research plan + first fetch) → `ASCEND` (continue research when new gaps appear) → `CLEAR` → `SEAL` (source manifest lists every fetch). Every material claim must be labeled `OBSERVED`, `INFERRED`, `SPECULATIVE`, or `NOT_COMPUTABLE`. SHADOW detects drift and anomalies only. FORECAST performs evidence-based inference only. Completion: all five modes ran; unlabeled material claims are absent. + +7. **Router.** Determine the smallest sufficient profile set. Additionally auto-load `evidence_intelligence` whenever external facts would change the recommendation, scorecard, or handoff quality — even if the operator did not name that profile. + + Load `references/profile-routing.md` when selecting specialized profiles; it preserves the full trigger registry. Core/privacy always apply, and evidence intelligence loads whenever external facts change the result. + + Do not activate a specialized product/commercial profile merely because it exists. Do activate research when usefulness requires it. Completion: selected profiles match triggers; unused specialized profiles stay unloaded. + +8. **Core pipeline.** + + ```text + SIGNAL + → BLOCKED TRANSITION + → OUTCOME MODEL + → EVIDENCE GAPS + → RESEARCH LOOP (PRIVACY_EGRESS_CHECK → host tools) + → SYSTEM TOPOLOGY + → OPPORTUNITY THESIS + → INTERVENTION + → PRODUCT / SERVICE GRAPH + → VALIDATION LOOP + → SCORECARD + → ROUTING + → VERIFIED OUTCOME + → LEARNING MEMORY + ``` + + Core runes: `RUNE.NG.INTAKE`, `RUNE.NG.EVIDENCE.NORMALIZE`, `RUNE.NG.RESEARCH.GAP_DETECT`, `RUNE.NG.RESEARCH.QUERY_PLAN`, `RUNE.NG.RESEARCH.FETCH`, `RUNE.NG.RESEARCH.CITE`, `RUNE.NG.BLOCKED_TRANSITION`, `RUNE.NG.OUTCOME.MODEL`, `RUNE.NG.TOPOLOGY`, `RUNE.NG.DISCOVER`, `RUNE.NG.RECOMBINE`, `RUNE.NG.DIFFERENTIATE`, `RUNE.NG.SHAPE`, `RUNE.NG.SCORE`, `RUNE.NG.VALIDATE_PATH`, `RUNE.NG.ROUTE`, `RUNE.NG.CLEAR_CHECK`, `RUNE.NG.SEAL`, `RUNE.PRIVACY_CLASSIFY`, `RUNE.PRIVACY_MINIMIZE`, `RUNE.PRIVACY_EGRESS_CHECK`, `RUNE.PRIVACY_SEAL_PROVENANCE`. + + Completion: pipeline stages that ran are named in the receipt; skipped stages have a reason. + +9. **Authority boundaries.** Neon Genie may research (proactively, via host tools), infer, generate, compare, score, model, audit, specify, route, draft, and recommend. Neon Genie may not, without explicit downstream authorization: spend or transfer money; submit applications; contact targets; publish content; modify repositories; execute irreversible workflows; promote artifacts to canon; represent forecasts as facts; mutate runtime state. Completion: no output claims execution authority. + +10. **Output selection.** A run emits one or more of: + + Load `references/output-selection.md` for packet-to-schema mapping. Every run still emits a receipt and validates each emitted packet against its schema. + + Anti-overclaim gates: `references/anti-overclaim-patterns.md`. Privacy: `PRIVACY.md`, `references/PRIVACY.md`, `profiles/privacy.md`. Completion: emitted packets validate against the named schema. + +11. **Promotion ladder.** `RAW_SIGNAL` → `MAPPED` → `CONCEPTUAL` → `TESTABLE` → `SERVICE_FIRST` → `SERVICE_PROVEN` → `SPEC_COMPLETE` → `WAYFINDER_READY` → `BUILD_READY` → `CANON_CANDIDATE` → `ARCHIVED` / `NOT_COMPUTABLE`. A composite score may never override a mandatory gate failure. Completion: promotion state matches the weakest mandatory gate. + +12. **Mandatory gates.** Fail closed when: + + - the desired state is ambiguous; + - the affected user is absent; + - buyer and beneficiary are conflated; + - completion proof is undefined; + - critical integration access is unknown; + - claims lack provenance; + - a proposed action exceeds authority; + - x402 is ornamental rather than economically useful; + - Zero State benefit reduces portability or user control; + - a concept duplicates an existing subsystem without wrapper classification; + - the implementation handoff changes product intent; + - missing data is fabricated instead of marked `NOT_COMPUTABLE` after research was attempted (or correctly skipped under offline mode); + - public fetchable facts are skipped without a research attempt (Gate P); + - private decision-critical facts lack a `DataRequest` (Gate Q); + - private facts are silently invented as `OBSERVED` without source or request (Gate R); + - external action sent with unknown/empty destination (Gate S); + - offline / `LOCAL_ONLY` / research disabled but external send recorded (Gate T); + - credential or secret-like payload would be or was sent (Gate U); + - private/operator egress without consent reference (Gate V); + - absolute privacy claim without matching mode and evidence (Gate W); + - telemetry status is not `disabled` (Gate X); + - SEAL without required privacy provenance fields (Gate Y); + - opportunity/product/zero-option CLEAR without a coherent `logic_label` when dual-logic applies (Gate LOGIC); + - opportunity/agentic run missing `stage`, or recommending `scale` without test evidence (Gate STAGE); + - effectual / zero-option spend-buy-build without means inventory, or empty means without NOT_COMPUTABLE + DataRequest (Gate BRIC); + - fabricated or unverified paper/DOI/arXiv citation (Gate CITE); + - ≥TESTABLE without hypothesis↔MVP map (Gate HYP; distinct from Gate H Wayfinder); + - decision-critical metric without role, or guardrail breached (Gate METRIC); + - live A/B or pricing rec without offline causal pass and without human-yes (Gate LIVE); + - market-share / competitive OBSERVED without competitor_set_definition + metric (Gate CSET); + - material claim without active ledger cite, invent-OBSERVED without ledger, or unresolved Contradict/Invalidate at ≥TESTABLE (Gate LEDGER); + - irreversible agentic action without independent validation_isolation / validation_step (Gate ISO); + - research ran without research_search_dag stages (Gate PILOT). + + Also apply anti-overclaim gates A–R and privacy gates S–Y in `references/anti-overclaim-patterns.md` during CLEAR. Registry: `references/gates.yaml` (includes LOGIC, STAGE, BRIC, CITE, HYP, METRIC, LIVE, CSET, LEDGER, ISO, PILOT). Completion: CLEAR lists every failed gate or records none. -Do not activate a specialized product/commercial profile merely because it exists. Do activate research when usefulness requires it. +13. **Profile loading.** Load the relevant profile markdown contracts (hub mirror files listed below, or root profiles on full install) and follow their local contracts. Profile-specific runes must remain namespaced and must not silently change core outputs. Completion: each loaded profile file exists. -## Core pipeline +14. **Wayfinder contract.** Neon Genie determines what should be built, why it should exist, target user and blocked transition, product boundary, system behavior, success criteria, and proof requirements. Wayfinder determines work decomposition, dependency sequence, milestones, engineering validation, and implementation status. Any proposed change to product intent returns to Neon Genie as a change request. Completion: handoff packets do not rewrite product intent. -```text -SIGNAL -→ BLOCKED TRANSITION -→ OUTCOME MODEL -→ EVIDENCE GAPS -→ RESEARCH LOOP (PRIVACY_EGRESS_CHECK → host tools) -→ SYSTEM TOPOLOGY -→ OPPORTUNITY THESIS -→ INTERVENTION -→ PRODUCT / SERVICE GRAPH -→ VALIDATION LOOP -→ SCORECARD -→ ROUTING -→ VERIFIED OUTCOME -→ LEARNING MEMORY -``` +15. **Registry and memory.** Every run should record: source manifest (operator + workspace + live fetches, with tool and timestamp); research queries attempted and outcomes; input hash; selected profiles; assumptions; scores; promotion state; rejected alternatives; failure reasons; output hash; human review status. + + Neon Genie must become harder to impress over time by learning from failed opportunities, brittle integrations, buyer failures, distribution failures, and anti-capture failures. Capture those as append-only learning ledger observations (`references/schemas/learning-ledger-entry.schema.json`, `do learn`) with `canon_status: PROPOSED` only — never auto-apply to the skill corpus. -## Core runes - -- `RUNE.NG.INTAKE` -- `RUNE.NG.EVIDENCE.NORMALIZE` -- `RUNE.NG.RESEARCH.GAP_DETECT` -- `RUNE.NG.RESEARCH.QUERY_PLAN` -- `RUNE.NG.RESEARCH.FETCH` -- `RUNE.NG.RESEARCH.CITE` -- `RUNE.NG.BLOCKED_TRANSITION` -- `RUNE.NG.OUTCOME.MODEL` -- `RUNE.NG.TOPOLOGY` -- `RUNE.NG.DISCOVER` -- `RUNE.NG.RECOMBINE` -- `RUNE.NG.DIFFERENTIATE` -- `RUNE.NG.SHAPE` -- `RUNE.NG.SCORE` -- `RUNE.NG.VALIDATE_PATH` -- `RUNE.NG.ROUTE` -- `RUNE.NG.CLEAR_CHECK` -- `RUNE.NG.SEAL` -- `RUNE.PRIVACY_CLASSIFY` -- `RUNE.PRIVACY_MINIMIZE` -- `RUNE.PRIVACY_EGRESS_CHECK` -- `RUNE.PRIVACY_SEAL_PROVENANCE` - -## Authority boundaries - -Neon Genie may: - -- research (proactively, via host tools); -- infer; -- generate; -- compare; -- score; -- model; -- audit; -- specify; -- route; -- draft; -- recommend. - -Neon Genie may not, without explicit downstream authorization: - -- spend or transfer money; -- submit applications; -- contact targets; -- publish content; -- modify repositories; -- execute irreversible workflows; -- promote artifacts to canon; -- represent forecasts as facts; -- mutate runtime state. - -## Output selection - -A run emits one or more of: - -- `NeonGenieOpportunityPacket` → `references/schemas/opportunity-packet.schema.json` -- `NeonGenieProductPacket` → `references/schemas/product-packet.schema.json` -- `FragmentationOpportunityPacket` → `references/schemas/fragmentation-packet.schema.json` -- `ZeroOptionPacket` → `references/schemas/zero-option-packet.schema.json` -- `AgenticServiceGraph` → `references/schemas/agentic-service-graph.schema.json` -- `CommercialSimulationPacket` → `references/schemas/commercial-simulation.schema.json` -- `EvidenceIntelligencePacket` → `references/schemas/evidence-intelligence-packet.schema.json` -- `MemeticPressurePacket` → `references/schemas/memetic-pressure-packet.schema.json` -- `AuditDeliveryPacket` → `references/schemas/audit-delivery-packet.schema.json` -- `WayfinderExecutionPacket` → `references/schemas/wayfinder-execution-packet.schema.json` -- `CapitalSprintPacket` → `references/schemas/capital-sprint-packet.schema.json` -- `NeonGenieRunReceipt` → `references/schemas/run-receipt.schema.json` - -Anti-overclaim gates: `references/anti-overclaim-patterns.md`. Privacy: `PRIVACY.md`, `references/PRIVACY.md`, `profiles/privacy.md`. - -## Promotion ladder - -- `RAW_SIGNAL` -- `MAPPED` -- `CONCEPTUAL` -- `TESTABLE` -- `SERVICE_FIRST` -- `SERVICE_PROVEN` -- `SPEC_COMPLETE` -- `WAYFINDER_READY` -- `BUILD_READY` -- `CANON_CANDIDATE` -- `ARCHIVED` -- `NOT_COMPUTABLE` - -A composite score may never override a mandatory gate failure. - -## Mandatory gates - -Fail closed when: - -- the desired state is ambiguous; -- the affected user is absent; -- buyer and beneficiary are conflated; -- completion proof is undefined; -- critical integration access is unknown; -- claims lack provenance; -- a proposed action exceeds authority; -- x402 is ornamental rather than economically useful; -- Zero State benefit reduces portability or user control; -- a concept duplicates an existing subsystem without wrapper classification; -- the implementation handoff changes product intent; -- missing data is fabricated instead of marked `NOT_COMPUTABLE` after research was attempted (or correctly skipped under offline mode); -- public fetchable facts are skipped without a research attempt (Gate P); -- private decision-critical facts lack a `DataRequest` (Gate Q); -- private facts are silently invented as `OBSERVED` without source or request (Gate R); -- external action sent with unknown/empty destination (Gate S); -- offline / `LOCAL_ONLY` / research disabled but external send recorded (Gate T); -- credential or secret-like payload would be or was sent (Gate U); -- private/operator egress without consent reference (Gate V); -- absolute privacy claim without matching mode and evidence (Gate W); -- telemetry status is not `disabled` (Gate X); -- SEAL without required privacy provenance fields (Gate Y). - -Also apply anti-overclaim gates A–R and privacy gates S–Y in `references/anti-overclaim-patterns.md` during CLEAR. Registry: `references/gates.yaml`. - -## Profile loading - -Load the relevant profile markdown contracts (hub mirror files listed below, or root profiles on full install) and follow their local contracts. Profile-specific runes must remain namespaced and must not silently change core outputs. - -## Wayfinder contract - -Neon Genie determines: - -- what should be built; -- why it should exist; -- target user and blocked transition; -- product boundary; -- system behavior; -- success criteria; -- proof requirements. - -Wayfinder determines: - -- work decomposition; -- dependency sequence; -- milestones; -- engineering validation; -- implementation status. - -Any proposed change to product intent returns to Neon Genie as a change request. - -## Registry and memory - -Every run should record: - -- source manifest (operator + workspace + live fetches, with tool and timestamp); -- research queries attempted and outcomes; -- input hash; -- selected profiles; -- assumptions; -- scores; -- promotion state; -- rejected alternatives; -- failure reasons; -- output hash; -- human review status. - -Neon Genie must become harder to impress over time by learning from failed opportunities, brittle integrations, buyer failures, distribution failures, and anti-capture failures. Capture those as append-only learning ledger observations (`references/schemas/learning-ledger-entry.schema.json`, `do learn`) with `canon_status: PROPOSED` only — never auto-apply to the skill corpus. +16. **Hermes Hub support files.** Hub installs copy only the generated list below. ### Hermes Hub support files @@ -511,7 +323,13 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `examples/evals/cases/buyer-beneficiary-conflation.json` - `examples/evals/cases/completion-proof-present.json` - `examples/evals/cases/completion-proof-required.json` +- `examples/evals/cases/contradict-unresolved-testable.json` +- `examples/evals/cases/dag-fabricated-cite.json` +- `examples/evals/cases/effectual-missing-means.json` +- `examples/evals/cases/fabricated-cite.json` - `examples/evals/cases/fictional-resource.json` +- `examples/evals/cases/irreversible-missing-log-pointer.json` +- `examples/evals/cases/irreversible-without-validation.json` - `examples/evals/cases/memetic-cannot-promote.json` - `examples/evals/cases/offline-no-fabricated-observed.json` - `examples/evals/cases/privacy-consent-purpose-bound.json` @@ -522,7 +340,10 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `examples/evals/cases/private-gap-silent-invent.json` - `examples/evals/cases/public-gap-must-attempt-research.json` - `examples/evals/cases/public-gap-research-attempted.json` +- `examples/evals/cases/research-ran-without-dag.json` +- `examples/evals/cases/scale-without-test.json` - `examples/evals/cases/scorecard-cannot-override-gate.json` +- `examples/evals/cases/uncited-claim.json` - `examples/evals/cases/wayfinder-change-control.json` - `examples/evals/cases/x402-misfit.json` - `examples/evals/cases/zero-option.json` @@ -563,8 +384,10 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `references/gates.yaml` - `references/hermes-runtime-contract.md` - `references/manifest.json` +- `references/output-selection.md` - `references/post-seal-verification.md` - `references/privacy-contract.md` +- `references/profile-routing.md` - `references/profiles/agentic_services.md` - `references/profiles/audit_delivery.md` - `references/profiles/capital_sprint.md` @@ -585,17 +408,20 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `references/schemas/commercial-simulation.schema.json` - `references/schemas/data-request.schema.json` - `references/schemas/evidence-intelligence-packet.schema.json` +- `references/schemas/evidence-ledger.schema.json` - `references/schemas/fragmentation-packet.schema.json` - `references/schemas/learning-ledger-entry.schema.json` - `references/schemas/memetic-pressure-packet.schema.json` - `references/schemas/opportunity-packet.schema.json` - `references/schemas/privacy-context.schema.json` - `references/schemas/product-packet.schema.json` +- `references/schemas/research-search-dag.schema.json` - `references/schemas/run-envelope.schema.json` - `references/schemas/run-receipt.schema.json` - `references/schemas/wayfinder-execution-packet.schema.json` - `references/schemas/wizard-answers.v1.schema.json` - `references/schemas/zero-option-packet.schema.json` +- `references/source-and-upgrades.md` - `references/wizard.md` - `scripts/audit_release_version.py` - `scripts/build_envelope.py` @@ -631,4 +457,37 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un Full tree also keeps root schemas, profiles, evals, VERSION, and manifest for clone/`./install.sh` installs (scripts resolve either layout via `scripts/paths.py`). +## Pitfalls + +- A folded or multi-sentence `description` loses routing signal: Hermes indexes 60 characters and truncates at 57 + `...`. +- Leading blank lines or a BOM before `---` fail frontmatter parse. +- Treating `do run` / `run-envelope.json` as execution authority. Packaging is not product judgment. +- Inventing buyers, capital, skills, or `OBSERVED` facts. Use Find → `DataRequest` → `NOT_COMPUTABLE`. +- Skipping host research on public fetchable gaps (Gate P) or skipping `DataRequest` on private gaps (Gate Q). +- Sending credentials or private/operator data without consent (Gates U/V). Offline / `LOCAL_ONLY` still recorded as an external send (Gate T). +- Letting a scorecard override a failed mandatory gate. +- Changing product intent inside a Wayfinder handoff. Return a change request to Neon Genie. +- Loading Kubrick, Wayfinder, or an external knowledge base as a load-time dependency. +- Pointing `related_skills` at other-org repos. Keep `related_skills: []`. +- Machine-local home paths in skill docs. Use `${HERMES_SKILL_DIR}` and repo-relative paths. + +## Verification + +Prove the skill loaded and the packaging CLI still works: + +```text +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do check") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do eval") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do doctor") +``` + +Pass when: + +- `SKILL.md` starts at byte 0 with `---`; `name` is `neon-genie`. +- `description` is one sentence, ≤60 characters, ends with a period, and has no marketing words. +- `version`, `author`, `license`, `platforms`, `metadata.hermes.tags`, and `metadata.hermes.related_skills` are present. +- VERSION matches frontmatter and `manifest.json`. +- `do check`, `do eval`, and `do doctor` exit 0. +- Advisory authority is unchanged: no spend, publish, contact, or repo mutation. + Source, profile, and migration rules: `references/source-and-upgrades.md`. diff --git a/VERSION b/VERSION index 419ede3..8c53120 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.26.0 +3.27.0 diff --git a/distribution.yaml b/distribution.yaml index 7bc2f86..05d944f 100644 --- a/distribution.yaml +++ b/distribution.yaml @@ -97,12 +97,15 @@ hub_support_globs: - references/hermes-runtime-contract.md - references/privacy-contract.md - references/wizard.md + - references/profile-routing.md + - references/output-selection.md - references/CAPABILITY_MAP.md - references/GOLDEN_TESTS.md - references/anti-overclaim-patterns.md - references/post-seal-verification.md - references/schema-versioning.md - references/PRIVACY.md + - references/source-and-upgrades.md - references/profiles/*.md - references/schemas/*.json - templates/request.yaml diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 46be0dc..5429c16 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -86,6 +86,9 @@ Public entry points: | **3.23.0** | Release automation, branch protection, gates.yaml registry, CONTRIBUTING | | **3.24.0** | Privacy-by-construction spine + runtime (issues #15 + #17); tagged `v3.24.0` | | **3.25.0** | Founder cold-start: founder-language routing, capital_sprint recipe, default transitional-builder job shape, hub list after doctrine, judgment honesty | +| **3.26.0** | Hermes packaging wizard (`do wizard`), presets, `references/wizard.md` | +| **3.26.1** | Hermes Agent v0.21 frontmatter (one-sentence description ≤60 chars) | +| **3.27.0** | Gate ISO + PaperPilot PILOT; required `logic_label` / envelope `stage` / `evidence_ledger`; BRIC / CITE / LEDGER / LOGIC / STAGE fail-closed | Also on main around this line: **capital_sprint** profile/protocol and **external-signals** corpus (labeled references). @@ -111,7 +114,17 @@ Also on main around this line: **capital_sprint** profile/protocol and **externa | Helpers & tests | `privacy_preflight.py`, runtime/integration unit tests, 12 behavioral cases (incl. privacy) | | Hub parity | Distribution spine mirrors + package under `skills/neon-genie/` | -**Program next (optional waves):** W2 Outcomes ∥ W3 Judgment in parallel, then W4 distribution/announce polish. Interfaces: privacy fields on receipt/envelope, `do privacy`, Wayfinder remains optional handoff only. +## 3.27.0 epistemic gates — shipped + +| Theme | Shipped | +|-------|---------| +| Dual-logic / stage | Required `logic_label` (`effectual`\|`causal`\|`mixed`); envelope `stage` (`shape`\|`test`\|`scale`); Gates LOGIC / STAGE / BRIC / CITE | +| Evidence ledger | Shared `evidence-ledger.schema.json`; required on EvidenceIntelligence; optional peer attach; Gate LEDGER | +| Isolation | `validation_isolation` on WayfinderExecutionPacket; Gate ISO (independent ∧ versioned log pointer) | +| PaperPilot | `research-search-dag` schema + Gate PILOT (write DAG when research runs) | +| Packaging | VERSION / SKILL / manifest / schemas / CHANGELOG aligned; public mirror keeps #20 installer safety | + +**Program next (optional waves):** W2 Outcomes ∥ W3 Judgment in parallel, then W4 distribution/announce polish. Interfaces: privacy fields on receipt/envelope, `do privacy`, Wayfinder remains optional handoff only. Live multi-turn Hermes LLM evals stay optional (fixture-only when the host has no Hermes / API keys). Design/plan: [privacy spine design](./superpowers/specs/2026-08-06-neon-genie-privacy-spine-design.md) · [implementation plan](./superpowers/plans/2026-08-06-neon-genie-privacy-spine.md) diff --git a/evals/cases/contradict-unresolved-testable.json b/evals/cases/contradict-unresolved-testable.json new file mode 100644 index 0000000..94164c1 --- /dev/null +++ b/evals/cases/contradict-unresolved-testable.json @@ -0,0 +1,12 @@ +{ + "input": { + "promotion_state": "TESTABLE", + "unresolved_contradict_or_invalidate": true, + "active_ledger_cite": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks \u2265TESTABLE" + } +} diff --git a/evals/cases/dag-fabricated-cite.json b/evals/cases/dag-fabricated-cite.json new file mode 100644 index 0000000..5eed61a --- /dev/null +++ b/evals/cases/dag-fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "in_search_dag": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/evals/cases/effectual-missing-means.json b/evals/cases/effectual-missing-means.json new file mode 100644 index 0000000..959e5c2 --- /dev/null +++ b/evals/cases/effectual-missing-means.json @@ -0,0 +1,13 @@ +{ + "input": { + "logic_label": "effectual", + "means_inventory": [], + "data_request_emitted": false, + "proposed_action": "buy_ads" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE" + } +} diff --git a/evals/cases/fabricated-cite.json b/evals/cases/fabricated-cite.json new file mode 100644 index 0000000..e2d66c5 --- /dev/null +++ b/evals/cases/fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/evals/cases/irreversible-missing-log-pointer.json b/evals/cases/irreversible-missing-log-pointer.json new file mode 100644 index 0000000..2152ef7 --- /dev/null +++ b/evals/cases/irreversible-missing-log-pointer.json @@ -0,0 +1,14 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": true, + "validation_independent": true, + "validation_log_pointer": "", + "validation_log_version": "" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent \u2227 versioned log pointer" + } +} diff --git a/evals/cases/irreversible-without-validation.json b/evals/cases/irreversible-without-validation.json new file mode 100644 index 0000000..5c25674 --- /dev/null +++ b/evals/cases/irreversible-without-validation.json @@ -0,0 +1,12 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": false, + "validation_independent": false + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step" + } +} diff --git a/evals/cases/research-ran-without-dag.json b/evals/cases/research-ran-without-dag.json new file mode 100644 index 0000000..856b852 --- /dev/null +++ b/evals/cases/research-ran-without-dag.json @@ -0,0 +1,12 @@ +{ + "input": { + "research_ran": true, + "dag_present": false, + "dag_stages": [] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag" + } +} diff --git a/evals/cases/scale-without-test.json b/evals/cases/scale-without-test.json new file mode 100644 index 0000000..2cef7f7 --- /dev/null +++ b/evals/cases/scale-without-test.json @@ -0,0 +1,15 @@ +{ + "input": { + "stage": "scale", + "test_evidence_present": false, + "profile_set": [ + "opportunity_mining", + "agentic_services" + ] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence" + } +} diff --git a/evals/cases/uncited-claim.json b/evals/cases/uncited-claim.json new file mode 100644 index 0000000..50196d7 --- /dev/null +++ b/evals/cases/uncited-claim.json @@ -0,0 +1,13 @@ +{ + "input": { + "material_claim": true, + "active_ledger_cite": false, + "promotion_state": "CONCEPTUAL", + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite" + } +} diff --git a/evals/rubric.md b/evals/rubric.md index 931faae..408f343 100644 --- a/evals/rubric.md +++ b/evals/rubric.md @@ -35,3 +35,12 @@ Wave 1 captures invariants for later automated runners. Fixtures live in `evals/ | `private-gap-must-request.json` | Gate Q — private decision-critical gap without DataRequest → GATE_FAIL | | `private-gap-request-open.json` | Gate Q — DataRequest open + blocks_promotion → PASS, promotion_capped | | `private-gap-silent-invent.json` | Gate R — private OBSERVED without DataRequest → GATE_FAIL | +| `effectual-missing-means.json` | Gate BRIC — effectual empty means without DataRequest → GATE_FAIL | +| `scale-without-test.json` | Gate STAGE — scale without test evidence → GATE_FAIL | +| `fabricated-cite.json` | Gate CITE — unverified arXiv/DOI → GATE_FAIL | +| `uncited-claim.json` | Gate LEDGER — material claim without active ledger cite → GATE_FAIL | +| `contradict-unresolved-testable.json` | Gate LEDGER — unresolved Contradict/Invalidate at ≥TESTABLE → GATE_FAIL | +| `irreversible-without-validation.json` | Gate ISO — irreversible agentic without independent validation → GATE_FAIL | +| `research-ran-without-dag.json` | Gate PILOT — research ran without DAG → GATE_FAIL | +| `dag-fabricated-cite.json` | Gate CITE — fabricated cite inside DAG → GATE_FAIL | +| `irreversible-missing-log-pointer.json` | Gate ISO — irreversible without versioned log pointer → GATE_FAIL | diff --git a/examples/evals/cases/contradict-unresolved-testable.json b/examples/evals/cases/contradict-unresolved-testable.json new file mode 100644 index 0000000..94164c1 --- /dev/null +++ b/examples/evals/cases/contradict-unresolved-testable.json @@ -0,0 +1,12 @@ +{ + "input": { + "promotion_state": "TESTABLE", + "unresolved_contradict_or_invalidate": true, + "active_ledger_cite": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks \u2265TESTABLE" + } +} diff --git a/examples/evals/cases/dag-fabricated-cite.json b/examples/evals/cases/dag-fabricated-cite.json new file mode 100644 index 0000000..5eed61a --- /dev/null +++ b/examples/evals/cases/dag-fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "in_search_dag": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/examples/evals/cases/effectual-missing-means.json b/examples/evals/cases/effectual-missing-means.json new file mode 100644 index 0000000..959e5c2 --- /dev/null +++ b/examples/evals/cases/effectual-missing-means.json @@ -0,0 +1,13 @@ +{ + "input": { + "logic_label": "effectual", + "means_inventory": [], + "data_request_emitted": false, + "proposed_action": "buy_ads" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE" + } +} diff --git a/examples/evals/cases/fabricated-cite.json b/examples/evals/cases/fabricated-cite.json new file mode 100644 index 0000000..e2d66c5 --- /dev/null +++ b/examples/evals/cases/fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/examples/evals/cases/irreversible-missing-log-pointer.json b/examples/evals/cases/irreversible-missing-log-pointer.json new file mode 100644 index 0000000..2152ef7 --- /dev/null +++ b/examples/evals/cases/irreversible-missing-log-pointer.json @@ -0,0 +1,14 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": true, + "validation_independent": true, + "validation_log_pointer": "", + "validation_log_version": "" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent \u2227 versioned log pointer" + } +} diff --git a/examples/evals/cases/irreversible-without-validation.json b/examples/evals/cases/irreversible-without-validation.json new file mode 100644 index 0000000..5c25674 --- /dev/null +++ b/examples/evals/cases/irreversible-without-validation.json @@ -0,0 +1,12 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": false, + "validation_independent": false + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step" + } +} diff --git a/examples/evals/cases/research-ran-without-dag.json b/examples/evals/cases/research-ran-without-dag.json new file mode 100644 index 0000000..856b852 --- /dev/null +++ b/examples/evals/cases/research-ran-without-dag.json @@ -0,0 +1,12 @@ +{ + "input": { + "research_ran": true, + "dag_present": false, + "dag_stages": [] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag" + } +} diff --git a/examples/evals/cases/scale-without-test.json b/examples/evals/cases/scale-without-test.json new file mode 100644 index 0000000..2cef7f7 --- /dev/null +++ b/examples/evals/cases/scale-without-test.json @@ -0,0 +1,15 @@ +{ + "input": { + "stage": "scale", + "test_evidence_present": false, + "profile_set": [ + "opportunity_mining", + "agentic_services" + ] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence" + } +} diff --git a/examples/evals/cases/uncited-claim.json b/examples/evals/cases/uncited-claim.json new file mode 100644 index 0000000..50196d7 --- /dev/null +++ b/examples/evals/cases/uncited-claim.json @@ -0,0 +1,13 @@ +{ + "input": { + "material_claim": true, + "active_ledger_cite": false, + "promotion_state": "CONCEPTUAL", + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite" + } +} diff --git a/examples/evals/rubric.md b/examples/evals/rubric.md index 931faae..408f343 100644 --- a/examples/evals/rubric.md +++ b/examples/evals/rubric.md @@ -35,3 +35,12 @@ Wave 1 captures invariants for later automated runners. Fixtures live in `evals/ | `private-gap-must-request.json` | Gate Q — private decision-critical gap without DataRequest → GATE_FAIL | | `private-gap-request-open.json` | Gate Q — DataRequest open + blocks_promotion → PASS, promotion_capped | | `private-gap-silent-invent.json` | Gate R — private OBSERVED without DataRequest → GATE_FAIL | +| `effectual-missing-means.json` | Gate BRIC — effectual empty means without DataRequest → GATE_FAIL | +| `scale-without-test.json` | Gate STAGE — scale without test evidence → GATE_FAIL | +| `fabricated-cite.json` | Gate CITE — unverified arXiv/DOI → GATE_FAIL | +| `uncited-claim.json` | Gate LEDGER — material claim without active ledger cite → GATE_FAIL | +| `contradict-unresolved-testable.json` | Gate LEDGER — unresolved Contradict/Invalidate at ≥TESTABLE → GATE_FAIL | +| `irreversible-without-validation.json` | Gate ISO — irreversible agentic without independent validation → GATE_FAIL | +| `research-ran-without-dag.json` | Gate PILOT — research ran without DAG → GATE_FAIL | +| `dag-fabricated-cite.json` | Gate CITE — fabricated cite inside DAG → GATE_FAIL | +| `irreversible-missing-log-pointer.json` | Gate ISO — irreversible without versioned log pointer → GATE_FAIL | diff --git a/examples/packets/sample-opportunity.packet.json b/examples/packets/sample-opportunity.packet.json index 41a3743..d8bbd67 100644 --- a/examples/packets/sample-opportunity.packet.json +++ b/examples/packets/sample-opportunity.packet.json @@ -8,11 +8,20 @@ "proof": "invoice or signed SOW" }, "system_topology": { - "actors": ["operator", "buyer"], - "systems": ["outreach", "delivery"] + "actors": [ + "operator", + "buyer" + ], + "systems": [ + "outreach", + "delivery" + ] }, "opportunity_thesis": "Warm-network micro-audit converts faster than cold content", - "validation_path": ["offer to 10 warm contacts", "track yes/no"], + "validation_path": [ + "offer to 10 warm contacts", + "track yes/no" + ], "completion_proof": "first paid diagnostic invoice or signed SOW within 14 days", "proof_path": [ "list 10 warm contacts", @@ -25,5 +34,6 @@ "outcome_clarity": 0.7 }, "promotion_state": "TESTABLE", - "authority": "advisory_only" + "authority": "advisory_only", + "logic_label": "mixed" } diff --git a/examples/packets/sample-run-envelope.json b/examples/packets/sample-run-envelope.json index e65d9b1..099d1eb 100644 --- a/examples/packets/sample-run-envelope.json +++ b/examples/packets/sample-run-envelope.json @@ -273,5 +273,6 @@ "provider_retention": "NOT_COMPUTABLE", "provider_processing": "NOT_COMPUTABLE" }, - "learning_ledger_disclosure": "Learning ledger entries are local operator artifacts under the chosen output path; they are never auto-applied to the skill corpus and must not contain raw secrets or private source payloads." + "learning_ledger_disclosure": "Learning ledger entries are local operator artifacts under the chosen output path; they are never auto-applied to the skill corpus and must not contain raw secrets or private source payloads.", + "stage": "shape" } diff --git a/manifest.json b/manifest.json index eab956d..b7fdb41 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "skill": "neon-genie", - "version": "3.26.0", + "version": "3.27.0", "profiles": [ "core", "privacy", diff --git a/profiles/agentic_services.md b/profiles/agentic_services.md index 16a3d96..b491613 100644 --- a/profiles/agentic_services.md +++ b/profiles/agentic_services.md @@ -45,3 +45,26 @@ Reject x402 when subscription, account billing, or a persistent relationship is - `NeonGenieRunReceipt` Schema: `schemas/agentic-service-graph.schema.json` + +## Stage vocab (U2 · P0) + +Bind agent/service graphs to envelope stage `shape` | `test` | `scale`. + +- Do not recommend scale automation without test evidence. +- Autonomy gates remain advisory in Neon Genie drafts (no packet elevates execution). + +## Planner / worker / validator roles (P2-1 · no new bots) + +Operational roles **inside** an existing Neon Genie run or PROMETHEUS consume — never a fifth growth bot. + +| Role | Owns | Does not | +|------|------|----------| +| Planner | Goal decomposition, tool plan, CLEAR gate list | Mute tool noise; invent OBSERVED | +| Worker | Tool fetch / transform; noisy output stays in worker context | Bypass privacy S–Y egress checks | +| Validator | Independent non-circular check before irreversible action | Rewrite product intent; grant execution | + +- Multi-step `AgenticServiceGraph` with irreversible action and **no** validation step → autonomy gate fail (CLEAR). Keepers: arXiv:2510.04678, 2503.11951, 2511.03094. +- GenAI empowerment-entrapment checklist (arXiv:2604.02567): hallucinations / overconfidence → anti-overclaim, not phenomenology. +- Privacy S–Y still bind tool workers (egress known, offline no-send, secrets, consent). + +CLEAR (Gate **ISO**): `has_irreversible_action: true` requires conjunction **`validation_step.independent: true` ∧ versioned log pointer** (`log_pointer` + `validation_log_version`). Missing either → GATE_FAIL. Independence is a boolean attestation at SHADOW — no proof protocol. See alias table in `profiles/wayfinder_handoff.md`. Do not invent a fifth bot for the validator role. diff --git a/profiles/capital_sprint.md b/profiles/capital_sprint.md index c9eedeb..ba18139 100644 --- a/profiles/capital_sprint.md +++ b/profiles/capital_sprint.md @@ -104,3 +104,16 @@ Schema: `schemas/capital-sprint-packet.schema.json` ## Related profiles Often co-triggered: `evidence_intelligence`, `commercial`, `memetic`, `opportunity_mining`, `agentic_services`. + +## Bricolage before spend (U3 · P0) + +Before recommending buy/build of new fundraising tooling or paid channels: + +1. Inventory existing rails, warm-network classes, and declared access. +2. Fail CLEAR (Gate BRIC) if proposed spend lacks repertoire scan. +3. Neon remains advisory — spend is always human-yes. + +## Offline-causal before live (P1-3 · secondary) + +Prefer offline/historical raise analysis before recommending live donor A/B or irreversible ask experiments. Thresholds = org policy, not OBSERVED. Live tests need human-yes (AUTHORITY). Gate LIVE. + diff --git a/profiles/commercial.md b/profiles/commercial.md index 138ac89..3122378 100644 --- a/profiles/commercial.md +++ b/profiles/commercial.md @@ -46,3 +46,32 @@ Unsupported numerical projections remain `SPECULATIVE` or `NOT_COMPUTABLE` — n - `NeonGenieRunReceipt` Schema: `schemas/commercial-simulation.schema.json` + +## Metric roles (P0-3) + +Every scored metric in commercial / validation plans must declare a **role**: + +| Role | Meaning | +|------|---------| +| `success` | Primary outcome we want to move | +| `guardrail` | Must not breach; **breach blocks promotion** | +| `deterioration` | Early-warning decline signal | +| `quality` | Evidence / sample / measurement integrity | + +- Guardrail breach or missing role on a decision-critical metric → fail CLEAR (Gate METRIC). +- Never invent conversion rates or volumes (Gate B). +- Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Offline-causal before live (P1-3) + +Do not recommend live pricing tests or user-facing A/B that can irreversibly hurt users until an offline/logged causal pass is noted (or operator human-yes waives). Thresholds are policy, not OBSERVED. `recommended_test_n` stays SPECULATIVE. Gate LIVE. Keepers: arXiv:2001.05699, 1710.03410, 1811.00457. + +## Competitor set before share claims (P2-2) + +Market-share or competitive claims require: + +1. Explicit `competitor_set_definition` (who is in/out). +2. Explicit metric definition (numerator/denominator/time window). + +Missing set when the claim `blocks_promotion` → emit DataRequest `competitor_set_definition` (Gate Q / Gate CSET). “10% share” labeled `OBSERVED` without competitor_set → Gate B/Q/CSET. Keeper: arXiv:2212.04810. + diff --git a/profiles/core.md b/profiles/core.md index 9903167..58f21cd 100644 --- a/profiles/core.md +++ b/profiles/core.md @@ -82,3 +82,37 @@ Composite score never overrides a mandatory gate failure. ## Outputs Always consider `NeonGenieRunReceipt`. Other packets by profile selection. + +## Dual-logic + stage + cite (doctrine 2026-09-05) + +On opportunity/product/zero-option runs, CLEAR also checks: + +- **logic_label** present (`effectual` | `causal` | `mixed`) — Gate LOGIC. +- **stage** on envelope when opportunity/agentic profiles resolve (`shape` | `test` | `scale`) — Gate STAGE; `scale` needs test evidence. +- **Citation integrity** — never invent arXiv/DOI; Gate CITE. +- **Bricolage** — no proposed spend/buy/build without repertoire inventory — Gate BRIC. + +`logic_label` and envelope `stage` are **required** as of 3.27.0 (Gate LOGIC / STAGE). + +## Reconcile 2026-09-05 (prose-only) + +Schema/SKILL field lift **HOLD** (Danny skipped intent). Additional CLEAR prose: + +- Empty means → `NOT_COMPUTABLE` + DataRequest (P0-1). +- Hypothesis↔MVP map before ≥TESTABLE — Gate HYP (P0-2; not Wayfinder Gate H). +- Metric roles; guardrail blocks promotion — Gate METRIC (P0-3). + +## Continue 2026-09-05 (LIVE + CSET) + +- Gate LIVE: offline/logged causal pass before live A/B or pricing recs that can hurt users; human-yes required; no auto-roll. +- Gate CSET: competitor_set_definition + metric before share/competitive OBSERVED claims. + +## Claim graph / Gate LEDGER (U4 · required evidence_ledger on EvidenceIntelligence as of 3.27.0) + +When `evidence_intelligence` resolves (or any material external claim is promoted): + +- Treat the claim graph as CLEAR **control plane**: every promoting claim needs an active ledger cite. +- Relations: `Support` | `Depend-on` | `Contradict` | `Invalidate` | `Update`. +- Gate **LEDGER**: uncited material claim, or invent-OBSERVED from model prior without ledger cite → fail CLEAR. +- Fluency of the final answer is **not** provenance. Do not invent Brier scores or auto-settle. +- `evidence_ledger` required on EvidenceIntelligence packets (3.27.0). diff --git a/profiles/evidence_intelligence.md b/profiles/evidence_intelligence.md index 35fb60b..844ef82 100644 --- a/profiles/evidence_intelligence.md +++ b/profiles/evidence_intelligence.md @@ -71,3 +71,71 @@ Schema: `schemas/evidence-intelligence-packet.schema.json` ## Offline When `research.enabled=false` / offline: use operator + workspace only; model prior ≤ `SPECULATIVE` (Gate N). + +## Citation policy (U8 · P2 lock-now) + +**Never generate** arXiv IDs, DOIs, or paper titles. Only rank / cite IDs that were verified fetched or operator-supplied. + +- Fabricated cite → Gate fail (Gate CITE / anti-overclaim A). +- PaperPilot search DAG (U7): keyword → cite-expand → filter → score → extract. Emit optional `research_search_dag` **only when research runs** (`schemas/research-search-dag.schema.json`). Gate PILOT. Keeper: arXiv:2607.00597. +- Keeper: arXiv:2605.14306 (never-generate-cites). + + +## Metric roles (P0-3) + +When this profile scores or recommends metrics, label each as `success` | `guardrail` | `deterioration` | `quality`. Guardrail breach blocks promotion (Gate METRIC). Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Claim → evidence → stance (P1-1 prose) + +For material claims, prefer the spine **claim → evidence item → stance**. Stance values may still use `Support` | `Contradict` | `Invalidate` | `Unknown`. Keeper: arXiv:2506.16383. + +## Claim graph as control plane (U4 · EviGraph prose · intent DRAFT) + +The **claim graph / evidence ledger** is the CLEAR control plane, not a post-hoc appendix log. Schema/SKILL field lift waits on accepted intent (`intent/2026-09-05-evigraph-ledger.md`); until then emit ledger cites in narrative / `gate_results` notes. + +| Rule | Hold | +|------|------| +| No material claim promotes without an **active ledger cite** (pointer to claim node + evidence edge) | Gate LEDGER | +| Typed relations | `Support` · `Depend-on` · `Contradict` · `Invalidate` · `Update` | +| Do not invent ledger IDs as `OBSERVED` | Gate R / CITE / LEDGER | +| Final-answer fluency ≠ provenance | Anti-overclaim; execution traces ≠ truth (arXiv:2606.04990, 2608.04738, 2607.28374) | +| Contradict / Invalidate without resolution | Block ≥TESTABLE until Update or explicit waive | +| Ready(G)-style closure | SPECULATIVE until schema + goldens; do not invent Brier / auto-settle | + +Keepers: arXiv:2606.04990, 2608.04738, 2607.28374 (plus P1-1 2506.16383). No phenomenology / new bots. + +## Proxy vs construct (P1-2) + +When a metric is a **proxy** for a latent construct, say so. Do not treat proxy movement as construct proof. Keeper: arXiv:2507.02819. + +## Offline-causal before live (P1-3) + +Prefer an **offline / logged-data causal pass** before recommending live A/B, pricing, or other irreversible user-harming tests. + +| Rule | Label / gate | +|------|----------------| +| Offline causal / logged analysis first | Keeper arXiv:2001.05699 | +| Decision thresholds = operator policy | `SPECULATIVE` / policy — not `OBSERVED` (arXiv:1710.03410) | +| `recommended_test_n` | Always `SPECULATIVE` advisory; AUTHORITY forbids auto-roll (arXiv:1811.00457) | +| `p<0.05` (or any significance) as OBSERVED truth without source | Fail CLEAR (Gate B / Gate LIVE) | + +CLEAR: live pricing or A/B recommendation with **no offline pass** and **no human-yes** → blocked (Gate LIVE). + +## Planner / worker / validator in research loop (P2-1) + +- **Planner** (GAP run): gap list, query plan, which CLEAR gates apply. +- **Worker**: host-tool fetches; keep raw/noisy tool output in worker context — do not promote noise to OBSERVED (arXiv:2510.04678). +- **Validator**: independent check that claim→evidence→stance holds before promotion; no circular self-grade. +- Roles are operational only. No phenomenology (“agent feels/wants”). No new bot names for validator. + +## PaperPilot search DAG (U7) + +When research runs, write an editable `research_search_dag`: + +1. `keyword` — seed queries +2. `cite-expand` — expand from verified cites only +3. `filter` — drop irrelevant / contradictory retrieval +4. `score` — rank candidates (no invent Brier / auto-settle) +5. `extract` — pull claims into evidence ledger cites + +CLEAR (Gate **PILOT**): `research_ran: true` but missing/empty DAG → fail (warn-then-require in 3.26.x). Fabricated citation IDs inside DAG nodes → Gate **CITE** (arXiv:2605.14306). Do not invent OBSERVED cites. diff --git a/profiles/fragmentation.md b/profiles/fragmentation.md index b10996d..7b23dca 100644 --- a/profiles/fragmentation.md +++ b/profiles/fragmentation.md @@ -42,3 +42,8 @@ Schema: `schemas/fragmentation-packet.schema.json` - Do not propose a platform “because everything is fragmented” without a measured coordination gap. - Classify wrappers vs silent subsystem duplicates (Gate M). + +## Competitor set before share claims (P2-2) + +If a defrag / aggregator thesis claims market share or “everyone else is fragmented,” define `competitor_set_definition` + the share metric. Otherwise Gate CSET / Gate B. Do not invent competitor lists from model prior (Gate R). + diff --git a/profiles/memetic.md b/profiles/memetic.md index d2dea6e..86379a3 100644 --- a/profiles/memetic.md +++ b/profiles/memetic.md @@ -36,3 +36,10 @@ Schema: `schemas/memetic-pressure-packet.schema.json` - Reject candidates that force untrue claims. - Route approved public language downstream; Neon does not publish. + +## Imitation evidence (P1-4) + +Gate D still holds: memetic strength cannot raise promotion past failed evidence/feasibility. + +When claiming imitation / share pressure, cite **imitation evidence** (observed copies, quotes, remixes) — not vibes. Public language execution stays with **SIGNAL** (or Level 99 when present); Neon only drafts candidates. Keeper: arXiv:2407.11861. + diff --git a/profiles/opportunity_mining.md b/profiles/opportunity_mining.md index 21f2f1a..cb8f0f6 100644 --- a/profiles/opportunity_mining.md +++ b/profiles/opportunity_mining.md @@ -56,3 +56,46 @@ Schema: `schemas/opportunity-packet.schema.json` - High monetization cannot override missing user, proof, or authority. - Weak signals stay `SPECULATIVE` until evidence density rises. + +## Dual-logic label (U1 · P0) + +Every Opportunity / Product / Zero-Option run must emit `logic_label`: `effectual` | `causal` | `mixed`. + +| Label | When | CLEAR | +|-------|------|-------| +| `effectual` | Means-driven explore; affordable loss; partner co-creation | Requires means inventory (declared skills/access/partners). Missing means → fail CLEAR. | +| `causal` | Goal-driven verify; predicted market → build → test | Requires `completion_proof` + test evidence path. Missing proof → Gate G. | +| `mixed` | Explicit split of explore vs verify legs | Each leg must satisfy its own CLEAR rules. | + +Cite keepers: arXiv:2103.07999, arXiv:1711.07045 (OBSERVED). Do not invent OBSERVED citations. + +## Stage vocab (U2 · P0) + +Envelope / opportunity stage: `shape` → `test` (nano-MVP) → `scale`. + +- `shape`: intervention still forming; promotion capped below TESTABLE without proof. +- `test`: nano-MVP / external check running; needs completion_proof definition. +- `scale`: blocked without test evidence (Gate STAGE). + +Keeper: arXiv:2511.09533. + +## Hypothesis↔MVP map (P0-2) + +Before promotion ≥ `TESTABLE`, require an explicit **hypothesis ↔ MVP** map: + +| Field | Rule | +|-------|------| +| falsifiable hypothesis | What must be true for the opportunity to work | +| MVP / nano-test | Smallest external check that could falsify it | +| kill criteria | What evidence stops the path | + +Missing map → fail CLEAR (Gate HYP). Do not promote on thesis prose alone. Keepers: arXiv:1808.05630, arXiv:2506.16334. + +Note: Gate HYP is distinct from Wayfinder **Gate H** (intent-rewrite handoff). + +## Competitor set + recognition basis (P2-2) + +- Competitive / share claims need `competitor_set_definition` + metric definition (Gate CSET; arXiv:2212.04810). +- Opportunity recognition must cite **knowledge_basis** and/or **network_basis** with epistemic labels (arXiv:2401.17448). +- Model-prior networks or access paths → Gate R / DataRequest — never silent `OBSERVED`. + diff --git a/profiles/product_architecture.md b/profiles/product_architecture.md index bb20b6a..ce8386e 100644 --- a/profiles/product_architecture.md +++ b/profiles/product_architecture.md @@ -51,3 +51,16 @@ Schema: `schemas/product-packet.schema.json` - Do not invent technical feasibility; mark `NOT_COMPUTABLE` when critical access is unknown. - Do not silently expand product intent in handoff packets (Gate H). + +## Dual-logic label (U1 · P0) + +Emit `logic_label`: `effectual` | `causal` | `mixed` on product packets. + +- Effectual PD ≠ standard waterfall SE (arXiv:1711.07045). Do not force causal SE process onto means-driven builds. +- Causal verify paths still need completion_proof + acceptance criteria. +- Never invent technical feasibility (Gate K / NOT_COMPUTABLE). + +## Hypothesis↔MVP map (P0-2) + +Product packets promoting ≥ `TESTABLE` need the same hypothesis ↔ MVP map as opportunity_mining (Gate HYP). Validation path must name the falsifier, not only the happy path. Keepers: arXiv:1808.05630, arXiv:2506.16334. + diff --git a/profiles/wayfinder_handoff.md b/profiles/wayfinder_handoff.md index bea1849..43cca98 100644 --- a/profiles/wayfinder_handoff.md +++ b/profiles/wayfinder_handoff.md @@ -37,3 +37,24 @@ Schema: `schemas/wayfinder-execution-packet.schema.json` ## Authority Handoff is still **advisory**. It does not authorize spend, deploy, or repo mutation. Wayfinder runtime is optional; absence never blocks emitting a local packet. + +## Validation isolation (P2-1 · PROMETHEUS consumes) + +Schema: `schemas/wayfinder-execution-packet.schema.json` (`validation_isolation`, optional until a later require-bump). + +**Irreversible conjunction (PROMETHEUS gap close):** when work can irreversibly affect users/spend/egress, CLEAR needs: + +`independent` ∧ versioned log pointer + +i.e. `validation_isolation.independent_of_planner: true` **and** both `validation_log_pointer` + `validation_log_version` (or graph aliases below). Schema if-then remains optional; doctrine is fail-closed in CLEAR. + +### Alias table (packet ↔ graph ↔ eval) + +| Concept | Wayfinder packet | Agentic graph | Eval fixture keys | +|---------|------------------|---------------|-------------------| +| Validation present | `validation_isolation.enabled` | `validation_step.present` | `validation_step_present` / `validation_isolation_enabled` | +| Independence (boolean attestation; SHADOW — no proof protocol) | `validation_isolation.independent_of_planner` | `validation_step.independent` | `validation_independent` / `independent_of_planner` | +| Versioned log pointer | `validation_isolation.validation_log_pointer` | `validation_step.log_pointer` | `validation_log_pointer` | +| Log version / content-hash | `validation_isolation.validation_log_version` | `validation_step.validation_log_version` | `validation_log_version` | + +PROMETHEUS consumes these fields — **no Wayfinder bot**, no fifth growth bot. Gate H (intent rewrite) still binds. Gate **ISO** when irreversible work lacks the conjunction above. Keepers: arXiv:2503.11951, 2511.03094. diff --git a/profiles/zero_option.md b/profiles/zero_option.md index a8fc9fa..fe77fec 100644 --- a/profiles/zero_option.md +++ b/profiles/zero_option.md @@ -56,3 +56,24 @@ Schema: `schemas/zero-option-packet.schema.json` ## Fail closed If skills and access are empty or unusable under constraints → `NOT_COMPUTABLE` with reason (see `evals/cases/zero-option.json`). + +## Dual-logic + bricolage (U1 · U3 · P0) + +Default Zero-Option posture is **effectual** (means → optional loops). Emit `logic_label`. + +**Bricolage checklist (before buy/build):** +1. Inventory declared repertoire: skills, access, tools, inventory, relationships (operator-supplied only). +2. Prefer recombine existing means over purchase or invent. +3. Affordable-loss framing when any spend is proposed — still advisory; human-yes on spend. +4. Forbid inventing missing resources (Gate G / Gate BRIC). + +Keepers: arXiv:2108.09943, arXiv:2507.02819 (cite Sarasvathy / Baker&Nelson via these; NOT_COMPUTABLE as direct arXiv). + +## Means inventory empty (P0-1) + +Tighten U3 / effectual CLEAR: + +- **Means** = declared skills + access + tools + inventory + relationships (operator-supplied only). +- If means inventory is **empty or unusable** under constraints → `NOT_COMPUTABLE` **and** emit a `DataRequest` for the missing means (Gate Q / Gate BRIC). Do not invent means. Do not promote. +- Keepers: arXiv:2312.00916, arXiv:2311.14340, arXiv:2108.09943. + diff --git a/references/VERSION b/references/VERSION index 419ede3..8c53120 100644 --- a/references/VERSION +++ b/references/VERSION @@ -1 +1 @@ -3.26.0 +3.27.0 diff --git a/references/anti-overclaim-patterns.md b/references/anti-overclaim-patterns.md index 9f08836..921b97c 100644 --- a/references/anti-overclaim-patterns.md +++ b/references/anti-overclaim-patterns.md @@ -4,6 +4,8 @@ Gates that keep Neon Genie evidence-bound and advisory. Fail closed when a patte Use alongside mandatory gates in `SKILL.md`. Labels: `OBSERVED` · `INFERRED` · `SPECULATIVE` · `NOT_COMPUTABLE`. +**Fluency ≠ provenance:** a fluent final answer (or a tidy agent trace) is not evidence that claims are grounded. Execution provenance ≠ final-answer accuracy. Prefer claim-graph ledger cites over narrative polish (arXiv:2606.04990, 2608.04738, 2607.28374). Do not invent Brier / auto-settle scores. + | Gate | Pattern | Repair | |------|---------|--------| | **A — Fabricated fact** | Claim presented as true without source or research attempt | Label `NOT_COMPUTABLE` or re-fetch; never invent `OBSERVED` | @@ -36,6 +38,27 @@ Gates **A–R** apply during CLEAR (evidence + anti-overclaim). Gates **S–Y** CLEAR order: **authority → evidence P–R → privacy S–Y → remaining anti-overclaim**. + +| **LOGIC — Dual-logic missing** | Opportunity/Product/Zero-Option run without `effectual`/`causal`/`mixed`, or effectual without means inventory | Emit label; inventory means or fail CLEAR | +| **STAGE — Scale without test** | Envelope/stage `scale` without test evidence, or missing stage on opp/agentic run | Set `shape`/`test`/`scale`; block scale | +| **BRIC — Buy/build without repertoire** | Proposed spend/buy/build without declared-means inventory | Inventory first; Gate G if inventing resources | +| **CITE — Generated citation** | arXiv/DOI/title invented rather than verified fetch or operator-supplied | Drop or re-fetch; never invent OBSERVED cites | + + +| **HYP — Hypothesis↔MVP missing** | ≥TESTABLE without falsifiable hypothesis ↔ MVP ↔ kill map | Emit map; distinct from Wayfinder Gate H | +| **METRIC — Role/guardrail** | Decision metric lacks success\|guardrail\|deterioration\|quality, or guardrail breached | Label roles; guardrail blocks promotion | + + +| **LIVE — Offline before live** | Live A/B or pricing rec without offline/logged causal pass + human-yes; or p-value as OBSERVED without source | Offline pass or human-yes; keep n SPECULATIVE; no auto-roll | +| **CSET — Competitor set missing** | Share/competitive OBSERVED without competitor_set_definition + metric | Define set/metric or DataRequest; else Gate B/Q | + + +| **LEDGER — Uncited claim / invent OBSERVED** | Material claim promotes without active ledger cite, or OBSERVED from model prior without ledger edge; unresolved Contradict/Invalidate at ≥TESTABLE | Emit ledger cite + typed relation (`Support`/`Depend-on`/`Contradict`/`Invalidate`/`Update`); else relabel or block | + +| **ISO — Missing validation isolation** | Irreversible agentic action / graph without independent validation step + log pointer | Emit validation_step / validation_isolation; PROMETHEUS consumes — no fifth bot | + +| **PILOT — Research DAG missing** | Research ran but `research_search_dag` missing/empty | Emit keyword→cite-expand→filter→score→extract DAG; fabricated IDs → CITE | + ## Scorecard rule A composite score **never** overrides a mandatory gate failure or an anti-overclaim fail-closed outcome. diff --git a/references/gates.yaml b/references/gates.yaml index 70dd70f..7bede76 100644 --- a/references/gates.yaml +++ b/references/gates.yaml @@ -171,3 +171,145 @@ gates: - profiles/privacy.md - schemas/run-receipt.schema.json - references/PRIVACY.md + + # Doctrine 2026-09-05 (arXiv keepers / Boof P0). Schema fields pending accepted intent. + LOGIC: + name: dual_logic_label_required + severity: blocking + condition: opportunity_or_product_or_zero_option_run && logic_label_missing_or_invalid + remediation: emit_effectual_or_causal_or_mixed_with_matching_CLEAR_inputs + refs: + - profiles/opportunity_mining.md + - profiles/product_architecture.md + - profiles/zero_option.md + - /workspace/neon-genie-adapt/arxiv/UPGRADE-BRIEF.md + - arXiv:2103.07999 + - arXiv:1711.07045 + + STAGE: + name: stage_vocab_and_scale_gate + severity: blocking + condition: (scale_without_test_evidence) || (opportunity_or_agentic_run && stage_missing) + remediation: set_shape_test_or_scale_and_block_scale_without_test + refs: + - profiles/opportunity_mining.md + - profiles/agentic_services.md + - profiles/core.md + - arXiv:2511.09533 + + BRIC: + name: bricolage_before_buy_build + severity: blocking + condition: proposed_spend_or_buy_or_build_without_repertoire_inventory || means_inventory_empty_on_effectual_or_zero_option + remediation: inventory_declared_means_or_NOT_COMPUTABLE_plus_DataRequest + refs: + - profiles/zero_option.md + - profiles/capital_sprint.md + - arXiv:2108.09943 + - arXiv:2507.02819 + + CITE: + name: never_generate_citations + severity: blocking + condition: arxiv_doi_or_paper_claim_without_verified_fetch_or_operator_source + remediation: drop_cite_or_fetch_then_cite_only_verified_ids + refs: + - profiles/evidence_intelligence.md + - profiles/core.md + - references/anti-overclaim-patterns.md + - arXiv:2605.14306 + + # Reconcile 2026-09-05 — prose-only (schema HOLD) + HYP: + name: hypothesis_mvp_map_before_testable + severity: blocking + condition: promotion_gte_testable && hypothesis_mvp_map_missing + remediation: emit_falsifiable_hypothesis_mvp_and_kill_criteria + refs: + - profiles/opportunity_mining.md + - profiles/product_architecture.md + - arXiv:1808.05630 + - arXiv:2506.16334 + note: Distinct from Gate H / WAYFINDER (intent-rewrite handoff). + + METRIC: + name: metric_roles_and_guardrail + severity: blocking + condition: decision_critical_metric_without_role || guardrail_breached + remediation: label_success_guardrail_deterioration_or_quality_and_block_on_guardrail + refs: + - profiles/commercial.md + - profiles/evidence_intelligence.md + - arXiv:2402.11609 + - arXiv:2210.17187 + + # Continue 2026-09-05 — prose-only (schema HOLD) + LIVE: + name: offline_causal_before_live_test + severity: blocking + condition: live_ab_or_pricing_rec_without_offline_pass_and_without_human_yes || significance_claimed_observed_without_source + remediation: require_offline_logged_causal_pass_or_human_yes_keep_recommended_test_n_speculative + refs: + - profiles/evidence_intelligence.md + - profiles/commercial.md + - profiles/capital_sprint.md + - arXiv:2001.05699 + - arXiv:1710.03410 + - arXiv:1811.00457 + + CSET: + name: competitor_set_before_share_claims + severity: blocking + condition: market_share_or_competitive_observed_without_competitor_set_definition || missing_metric_definition + remediation: emit_competitor_set_definition_DataRequest_when_blocks_promotion_or_relabel + refs: + - profiles/opportunity_mining.md + - profiles/commercial.md + - profiles/fragmentation.md + - arXiv:2212.04810 + - arXiv:2401.17448 + + # U4 EviGraph — prose scaffolding (intent DRAFT; no SKILL/schema rewrite yet) + LEDGER: + name: claim_graph_ledger_cite_required + severity: blocking + condition: material_claim_without_active_ledger_cite || invent_observed_from_model_prior_without_ledger || unresolved_contradict_at_testable + remediation: emit_ledger_cite_with_typed_relation_or_relabel_or_block_promotion + refs: + - profiles/evidence_intelligence.md + - profiles/core.md + - intent/2026-09-05-evigraph-ledger.md + - arXiv:2606.04990 + - arXiv:2608.04738 + - arXiv:2607.28374 + note: Intent ACCEPTED 2026-09-05; schemas/evidence-ledger.schema.json optional in 3.26.x (warn-then-require). Relation enum Support|Depend-on|Contradict|Invalidate|Update. + + # PR-A 2026-09-05 — validation_isolation (P2-1) + ISO: + name: validation_isolation_before_irreversible + severity: blocking + condition: irreversible_action_and_not_(independent_and_versioned_log_pointer) + remediation: emit_independent_true_and_log_pointer_plus_validation_log_version + refs: + - profiles/wayfinder_handoff.md + - profiles/agentic_services.md + - schemas/wayfinder-execution-packet.schema.json + - intent/2026-09-05-validation-isolation.md + - arXiv:2503.11951 + - arXiv:2511.03094 + note: Conjunction independent ∧ versioned log pointer when irreversible. Independence = boolean attestation (SHADOW, no proof). Alias table in profiles/wayfinder_handoff.md. PROMETHEUS consumes; no Wayfinder/fifth bot. + + # PR-B 2026-09-05 — U7 PaperPilot search DAG + PILOT: + name: research_search_dag_when_research_runs + severity: blocking + condition: research_ran_without_search_dag || empty_dag_stages_when_research_ran + remediation: emit_research_search_dag_keyword_cite_expand_filter_score_extract + refs: + - profiles/evidence_intelligence.md + - schemas/research-search-dag.schema.json + - intent/2026-09-05-paperpilot-search-dag.md + - arXiv:2607.00597 + - arXiv:2605.14306 + note: Warn-then-require in 3.26.x. Fabricated cites remain Gate CITE. No invent Brier. + diff --git a/references/manifest.json b/references/manifest.json index eab956d..b7fdb41 100644 --- a/references/manifest.json +++ b/references/manifest.json @@ -1,6 +1,6 @@ { "skill": "neon-genie", - "version": "3.26.0", + "version": "3.27.0", "profiles": [ "core", "privacy", diff --git a/references/output-selection.md b/references/output-selection.md new file mode 100644 index 0000000..bc7cb19 --- /dev/null +++ b/references/output-selection.md @@ -0,0 +1,16 @@ +# Output packet selection + +Load when selecting or validating a specialized output. These schemas do not grant execution authority. + + - `NeonGenieOpportunityPacket` → `references/schemas/opportunity-packet.schema.json` + - `NeonGenieProductPacket` → `references/schemas/product-packet.schema.json` + - `FragmentationOpportunityPacket` → `references/schemas/fragmentation-packet.schema.json` + - `ZeroOptionPacket` → `references/schemas/zero-option-packet.schema.json` + - `AgenticServiceGraph` → `references/schemas/agentic-service-graph.schema.json` + - `CommercialSimulationPacket` → `references/schemas/commercial-simulation.schema.json` + - `EvidenceIntelligencePacket` → `references/schemas/evidence-intelligence-packet.schema.json` + - `MemeticPressurePacket` → `references/schemas/memetic-pressure-packet.schema.json` + - `AuditDeliveryPacket` → `references/schemas/audit-delivery-packet.schema.json` + - `WayfinderExecutionPacket` → `references/schemas/wayfinder-execution-packet.schema.json` + - `CapitalSprintPacket` → `references/schemas/capital-sprint-packet.schema.json` + - `NeonGenieRunReceipt` → `references/schemas/run-receipt.schema.json` diff --git a/references/profile-routing.md b/references/profile-routing.md new file mode 100644 index 0000000..b3517f8 --- /dev/null +++ b/references/profile-routing.md @@ -0,0 +1,48 @@ +# Profile routing (load when choosing specialized modes) + +Core and privacy always apply. Auto-load evidence intelligence when external facts matter. + + ```yaml + profile_router: + core: always + privacy: + triggers: [always] + default_when: always_with_core + product_architecture: + triggers: [product audit, app design, game design, system design, feature coherence] + opportunity_mining: + triggers: [new venture, unmet need, market opportunity, blocked transition, roadmap, business idea, go into business, side project, app idea, product idea, what should I build, where do I start, next steps] + fragmentation: + triggers: [many portals, repeated handoffs, incompatible systems, coordination problem] + zero_option: + triggers: [zero capital, first cash, immediate executable opportunity, constrained launch, limited money, limited resources, limited capital, between jobs, bootstrapped, no budget, first revenue] + agentic_services: + triggers: [agent workflow, delegated outcome, automation, x402, machine services] + commercial: + triggers: [pricing, buyer, revenue, costs, market pressure, business model] + evidence_intelligence: + triggers: + - grants + - boards + - philanthropy + - competitive research + - current external facts + - auto: any material external gap that research can close + default_when: improves_result + memetic: + triggers: [name, hook, pitch language, public framing, shareability] + audit_delivery: + triggers: [client audit, cost of inaction, diagnostic package, implementation offer] + wayfinder_handoff: + triggers: [build plan, engineering readiness, execution packet] + capital_sprint: + triggers: + - capital sprint + - annual fund + - donation drive + - membership drive + - fundraising deadline + - impact object + - donor sprint + - nonprofit capital raise + ``` diff --git a/references/profiles/agentic_services.md b/references/profiles/agentic_services.md index 16a3d96..b491613 100644 --- a/references/profiles/agentic_services.md +++ b/references/profiles/agentic_services.md @@ -45,3 +45,26 @@ Reject x402 when subscription, account billing, or a persistent relationship is - `NeonGenieRunReceipt` Schema: `schemas/agentic-service-graph.schema.json` + +## Stage vocab (U2 · P0) + +Bind agent/service graphs to envelope stage `shape` | `test` | `scale`. + +- Do not recommend scale automation without test evidence. +- Autonomy gates remain advisory in Neon Genie drafts (no packet elevates execution). + +## Planner / worker / validator roles (P2-1 · no new bots) + +Operational roles **inside** an existing Neon Genie run or PROMETHEUS consume — never a fifth growth bot. + +| Role | Owns | Does not | +|------|------|----------| +| Planner | Goal decomposition, tool plan, CLEAR gate list | Mute tool noise; invent OBSERVED | +| Worker | Tool fetch / transform; noisy output stays in worker context | Bypass privacy S–Y egress checks | +| Validator | Independent non-circular check before irreversible action | Rewrite product intent; grant execution | + +- Multi-step `AgenticServiceGraph` with irreversible action and **no** validation step → autonomy gate fail (CLEAR). Keepers: arXiv:2510.04678, 2503.11951, 2511.03094. +- GenAI empowerment-entrapment checklist (arXiv:2604.02567): hallucinations / overconfidence → anti-overclaim, not phenomenology. +- Privacy S–Y still bind tool workers (egress known, offline no-send, secrets, consent). + +CLEAR (Gate **ISO**): `has_irreversible_action: true` requires conjunction **`validation_step.independent: true` ∧ versioned log pointer** (`log_pointer` + `validation_log_version`). Missing either → GATE_FAIL. Independence is a boolean attestation at SHADOW — no proof protocol. See alias table in `profiles/wayfinder_handoff.md`. Do not invent a fifth bot for the validator role. diff --git a/references/profiles/capital_sprint.md b/references/profiles/capital_sprint.md index c9eedeb..ba18139 100644 --- a/references/profiles/capital_sprint.md +++ b/references/profiles/capital_sprint.md @@ -104,3 +104,16 @@ Schema: `schemas/capital-sprint-packet.schema.json` ## Related profiles Often co-triggered: `evidence_intelligence`, `commercial`, `memetic`, `opportunity_mining`, `agentic_services`. + +## Bricolage before spend (U3 · P0) + +Before recommending buy/build of new fundraising tooling or paid channels: + +1. Inventory existing rails, warm-network classes, and declared access. +2. Fail CLEAR (Gate BRIC) if proposed spend lacks repertoire scan. +3. Neon remains advisory — spend is always human-yes. + +## Offline-causal before live (P1-3 · secondary) + +Prefer offline/historical raise analysis before recommending live donor A/B or irreversible ask experiments. Thresholds = org policy, not OBSERVED. Live tests need human-yes (AUTHORITY). Gate LIVE. + diff --git a/references/profiles/commercial.md b/references/profiles/commercial.md index 138ac89..3122378 100644 --- a/references/profiles/commercial.md +++ b/references/profiles/commercial.md @@ -46,3 +46,32 @@ Unsupported numerical projections remain `SPECULATIVE` or `NOT_COMPUTABLE` — n - `NeonGenieRunReceipt` Schema: `schemas/commercial-simulation.schema.json` + +## Metric roles (P0-3) + +Every scored metric in commercial / validation plans must declare a **role**: + +| Role | Meaning | +|------|---------| +| `success` | Primary outcome we want to move | +| `guardrail` | Must not breach; **breach blocks promotion** | +| `deterioration` | Early-warning decline signal | +| `quality` | Evidence / sample / measurement integrity | + +- Guardrail breach or missing role on a decision-critical metric → fail CLEAR (Gate METRIC). +- Never invent conversion rates or volumes (Gate B). +- Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Offline-causal before live (P1-3) + +Do not recommend live pricing tests or user-facing A/B that can irreversibly hurt users until an offline/logged causal pass is noted (or operator human-yes waives). Thresholds are policy, not OBSERVED. `recommended_test_n` stays SPECULATIVE. Gate LIVE. Keepers: arXiv:2001.05699, 1710.03410, 1811.00457. + +## Competitor set before share claims (P2-2) + +Market-share or competitive claims require: + +1. Explicit `competitor_set_definition` (who is in/out). +2. Explicit metric definition (numerator/denominator/time window). + +Missing set when the claim `blocks_promotion` → emit DataRequest `competitor_set_definition` (Gate Q / Gate CSET). “10% share” labeled `OBSERVED` without competitor_set → Gate B/Q/CSET. Keeper: arXiv:2212.04810. + diff --git a/references/profiles/core.md b/references/profiles/core.md index 9903167..58f21cd 100644 --- a/references/profiles/core.md +++ b/references/profiles/core.md @@ -82,3 +82,37 @@ Composite score never overrides a mandatory gate failure. ## Outputs Always consider `NeonGenieRunReceipt`. Other packets by profile selection. + +## Dual-logic + stage + cite (doctrine 2026-09-05) + +On opportunity/product/zero-option runs, CLEAR also checks: + +- **logic_label** present (`effectual` | `causal` | `mixed`) — Gate LOGIC. +- **stage** on envelope when opportunity/agentic profiles resolve (`shape` | `test` | `scale`) — Gate STAGE; `scale` needs test evidence. +- **Citation integrity** — never invent arXiv/DOI; Gate CITE. +- **Bricolage** — no proposed spend/buy/build without repertoire inventory — Gate BRIC. + +`logic_label` and envelope `stage` are **required** as of 3.27.0 (Gate LOGIC / STAGE). + +## Reconcile 2026-09-05 (prose-only) + +Schema/SKILL field lift **HOLD** (Danny skipped intent). Additional CLEAR prose: + +- Empty means → `NOT_COMPUTABLE` + DataRequest (P0-1). +- Hypothesis↔MVP map before ≥TESTABLE — Gate HYP (P0-2; not Wayfinder Gate H). +- Metric roles; guardrail blocks promotion — Gate METRIC (P0-3). + +## Continue 2026-09-05 (LIVE + CSET) + +- Gate LIVE: offline/logged causal pass before live A/B or pricing recs that can hurt users; human-yes required; no auto-roll. +- Gate CSET: competitor_set_definition + metric before share/competitive OBSERVED claims. + +## Claim graph / Gate LEDGER (U4 · required evidence_ledger on EvidenceIntelligence as of 3.27.0) + +When `evidence_intelligence` resolves (or any material external claim is promoted): + +- Treat the claim graph as CLEAR **control plane**: every promoting claim needs an active ledger cite. +- Relations: `Support` | `Depend-on` | `Contradict` | `Invalidate` | `Update`. +- Gate **LEDGER**: uncited material claim, or invent-OBSERVED from model prior without ledger cite → fail CLEAR. +- Fluency of the final answer is **not** provenance. Do not invent Brier scores or auto-settle. +- `evidence_ledger` required on EvidenceIntelligence packets (3.27.0). diff --git a/references/profiles/evidence_intelligence.md b/references/profiles/evidence_intelligence.md index 35fb60b..844ef82 100644 --- a/references/profiles/evidence_intelligence.md +++ b/references/profiles/evidence_intelligence.md @@ -71,3 +71,71 @@ Schema: `schemas/evidence-intelligence-packet.schema.json` ## Offline When `research.enabled=false` / offline: use operator + workspace only; model prior ≤ `SPECULATIVE` (Gate N). + +## Citation policy (U8 · P2 lock-now) + +**Never generate** arXiv IDs, DOIs, or paper titles. Only rank / cite IDs that were verified fetched or operator-supplied. + +- Fabricated cite → Gate fail (Gate CITE / anti-overclaim A). +- PaperPilot search DAG (U7): keyword → cite-expand → filter → score → extract. Emit optional `research_search_dag` **only when research runs** (`schemas/research-search-dag.schema.json`). Gate PILOT. Keeper: arXiv:2607.00597. +- Keeper: arXiv:2605.14306 (never-generate-cites). + + +## Metric roles (P0-3) + +When this profile scores or recommends metrics, label each as `success` | `guardrail` | `deterioration` | `quality`. Guardrail breach blocks promotion (Gate METRIC). Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Claim → evidence → stance (P1-1 prose) + +For material claims, prefer the spine **claim → evidence item → stance**. Stance values may still use `Support` | `Contradict` | `Invalidate` | `Unknown`. Keeper: arXiv:2506.16383. + +## Claim graph as control plane (U4 · EviGraph prose · intent DRAFT) + +The **claim graph / evidence ledger** is the CLEAR control plane, not a post-hoc appendix log. Schema/SKILL field lift waits on accepted intent (`intent/2026-09-05-evigraph-ledger.md`); until then emit ledger cites in narrative / `gate_results` notes. + +| Rule | Hold | +|------|------| +| No material claim promotes without an **active ledger cite** (pointer to claim node + evidence edge) | Gate LEDGER | +| Typed relations | `Support` · `Depend-on` · `Contradict` · `Invalidate` · `Update` | +| Do not invent ledger IDs as `OBSERVED` | Gate R / CITE / LEDGER | +| Final-answer fluency ≠ provenance | Anti-overclaim; execution traces ≠ truth (arXiv:2606.04990, 2608.04738, 2607.28374) | +| Contradict / Invalidate without resolution | Block ≥TESTABLE until Update or explicit waive | +| Ready(G)-style closure | SPECULATIVE until schema + goldens; do not invent Brier / auto-settle | + +Keepers: arXiv:2606.04990, 2608.04738, 2607.28374 (plus P1-1 2506.16383). No phenomenology / new bots. + +## Proxy vs construct (P1-2) + +When a metric is a **proxy** for a latent construct, say so. Do not treat proxy movement as construct proof. Keeper: arXiv:2507.02819. + +## Offline-causal before live (P1-3) + +Prefer an **offline / logged-data causal pass** before recommending live A/B, pricing, or other irreversible user-harming tests. + +| Rule | Label / gate | +|------|----------------| +| Offline causal / logged analysis first | Keeper arXiv:2001.05699 | +| Decision thresholds = operator policy | `SPECULATIVE` / policy — not `OBSERVED` (arXiv:1710.03410) | +| `recommended_test_n` | Always `SPECULATIVE` advisory; AUTHORITY forbids auto-roll (arXiv:1811.00457) | +| `p<0.05` (or any significance) as OBSERVED truth without source | Fail CLEAR (Gate B / Gate LIVE) | + +CLEAR: live pricing or A/B recommendation with **no offline pass** and **no human-yes** → blocked (Gate LIVE). + +## Planner / worker / validator in research loop (P2-1) + +- **Planner** (GAP run): gap list, query plan, which CLEAR gates apply. +- **Worker**: host-tool fetches; keep raw/noisy tool output in worker context — do not promote noise to OBSERVED (arXiv:2510.04678). +- **Validator**: independent check that claim→evidence→stance holds before promotion; no circular self-grade. +- Roles are operational only. No phenomenology (“agent feels/wants”). No new bot names for validator. + +## PaperPilot search DAG (U7) + +When research runs, write an editable `research_search_dag`: + +1. `keyword` — seed queries +2. `cite-expand` — expand from verified cites only +3. `filter` — drop irrelevant / contradictory retrieval +4. `score` — rank candidates (no invent Brier / auto-settle) +5. `extract` — pull claims into evidence ledger cites + +CLEAR (Gate **PILOT**): `research_ran: true` but missing/empty DAG → fail (warn-then-require in 3.26.x). Fabricated citation IDs inside DAG nodes → Gate **CITE** (arXiv:2605.14306). Do not invent OBSERVED cites. diff --git a/references/profiles/fragmentation.md b/references/profiles/fragmentation.md index b10996d..7b23dca 100644 --- a/references/profiles/fragmentation.md +++ b/references/profiles/fragmentation.md @@ -42,3 +42,8 @@ Schema: `schemas/fragmentation-packet.schema.json` - Do not propose a platform “because everything is fragmented” without a measured coordination gap. - Classify wrappers vs silent subsystem duplicates (Gate M). + +## Competitor set before share claims (P2-2) + +If a defrag / aggregator thesis claims market share or “everyone else is fragmented,” define `competitor_set_definition` + the share metric. Otherwise Gate CSET / Gate B. Do not invent competitor lists from model prior (Gate R). + diff --git a/references/profiles/memetic.md b/references/profiles/memetic.md index d2dea6e..86379a3 100644 --- a/references/profiles/memetic.md +++ b/references/profiles/memetic.md @@ -36,3 +36,10 @@ Schema: `schemas/memetic-pressure-packet.schema.json` - Reject candidates that force untrue claims. - Route approved public language downstream; Neon does not publish. + +## Imitation evidence (P1-4) + +Gate D still holds: memetic strength cannot raise promotion past failed evidence/feasibility. + +When claiming imitation / share pressure, cite **imitation evidence** (observed copies, quotes, remixes) — not vibes. Public language execution stays with **SIGNAL** (or Level 99 when present); Neon only drafts candidates. Keeper: arXiv:2407.11861. + diff --git a/references/profiles/opportunity_mining.md b/references/profiles/opportunity_mining.md index 21f2f1a..cb8f0f6 100644 --- a/references/profiles/opportunity_mining.md +++ b/references/profiles/opportunity_mining.md @@ -56,3 +56,46 @@ Schema: `schemas/opportunity-packet.schema.json` - High monetization cannot override missing user, proof, or authority. - Weak signals stay `SPECULATIVE` until evidence density rises. + +## Dual-logic label (U1 · P0) + +Every Opportunity / Product / Zero-Option run must emit `logic_label`: `effectual` | `causal` | `mixed`. + +| Label | When | CLEAR | +|-------|------|-------| +| `effectual` | Means-driven explore; affordable loss; partner co-creation | Requires means inventory (declared skills/access/partners). Missing means → fail CLEAR. | +| `causal` | Goal-driven verify; predicted market → build → test | Requires `completion_proof` + test evidence path. Missing proof → Gate G. | +| `mixed` | Explicit split of explore vs verify legs | Each leg must satisfy its own CLEAR rules. | + +Cite keepers: arXiv:2103.07999, arXiv:1711.07045 (OBSERVED). Do not invent OBSERVED citations. + +## Stage vocab (U2 · P0) + +Envelope / opportunity stage: `shape` → `test` (nano-MVP) → `scale`. + +- `shape`: intervention still forming; promotion capped below TESTABLE without proof. +- `test`: nano-MVP / external check running; needs completion_proof definition. +- `scale`: blocked without test evidence (Gate STAGE). + +Keeper: arXiv:2511.09533. + +## Hypothesis↔MVP map (P0-2) + +Before promotion ≥ `TESTABLE`, require an explicit **hypothesis ↔ MVP** map: + +| Field | Rule | +|-------|------| +| falsifiable hypothesis | What must be true for the opportunity to work | +| MVP / nano-test | Smallest external check that could falsify it | +| kill criteria | What evidence stops the path | + +Missing map → fail CLEAR (Gate HYP). Do not promote on thesis prose alone. Keepers: arXiv:1808.05630, arXiv:2506.16334. + +Note: Gate HYP is distinct from Wayfinder **Gate H** (intent-rewrite handoff). + +## Competitor set + recognition basis (P2-2) + +- Competitive / share claims need `competitor_set_definition` + metric definition (Gate CSET; arXiv:2212.04810). +- Opportunity recognition must cite **knowledge_basis** and/or **network_basis** with epistemic labels (arXiv:2401.17448). +- Model-prior networks or access paths → Gate R / DataRequest — never silent `OBSERVED`. + diff --git a/references/profiles/product_architecture.md b/references/profiles/product_architecture.md index bb20b6a..ce8386e 100644 --- a/references/profiles/product_architecture.md +++ b/references/profiles/product_architecture.md @@ -51,3 +51,16 @@ Schema: `schemas/product-packet.schema.json` - Do not invent technical feasibility; mark `NOT_COMPUTABLE` when critical access is unknown. - Do not silently expand product intent in handoff packets (Gate H). + +## Dual-logic label (U1 · P0) + +Emit `logic_label`: `effectual` | `causal` | `mixed` on product packets. + +- Effectual PD ≠ standard waterfall SE (arXiv:1711.07045). Do not force causal SE process onto means-driven builds. +- Causal verify paths still need completion_proof + acceptance criteria. +- Never invent technical feasibility (Gate K / NOT_COMPUTABLE). + +## Hypothesis↔MVP map (P0-2) + +Product packets promoting ≥ `TESTABLE` need the same hypothesis ↔ MVP map as opportunity_mining (Gate HYP). Validation path must name the falsifier, not only the happy path. Keepers: arXiv:1808.05630, arXiv:2506.16334. + diff --git a/references/profiles/wayfinder_handoff.md b/references/profiles/wayfinder_handoff.md index bea1849..43cca98 100644 --- a/references/profiles/wayfinder_handoff.md +++ b/references/profiles/wayfinder_handoff.md @@ -37,3 +37,24 @@ Schema: `schemas/wayfinder-execution-packet.schema.json` ## Authority Handoff is still **advisory**. It does not authorize spend, deploy, or repo mutation. Wayfinder runtime is optional; absence never blocks emitting a local packet. + +## Validation isolation (P2-1 · PROMETHEUS consumes) + +Schema: `schemas/wayfinder-execution-packet.schema.json` (`validation_isolation`, optional until a later require-bump). + +**Irreversible conjunction (PROMETHEUS gap close):** when work can irreversibly affect users/spend/egress, CLEAR needs: + +`independent` ∧ versioned log pointer + +i.e. `validation_isolation.independent_of_planner: true` **and** both `validation_log_pointer` + `validation_log_version` (or graph aliases below). Schema if-then remains optional; doctrine is fail-closed in CLEAR. + +### Alias table (packet ↔ graph ↔ eval) + +| Concept | Wayfinder packet | Agentic graph | Eval fixture keys | +|---------|------------------|---------------|-------------------| +| Validation present | `validation_isolation.enabled` | `validation_step.present` | `validation_step_present` / `validation_isolation_enabled` | +| Independence (boolean attestation; SHADOW — no proof protocol) | `validation_isolation.independent_of_planner` | `validation_step.independent` | `validation_independent` / `independent_of_planner` | +| Versioned log pointer | `validation_isolation.validation_log_pointer` | `validation_step.log_pointer` | `validation_log_pointer` | +| Log version / content-hash | `validation_isolation.validation_log_version` | `validation_step.validation_log_version` | `validation_log_version` | + +PROMETHEUS consumes these fields — **no Wayfinder bot**, no fifth growth bot. Gate H (intent rewrite) still binds. Gate **ISO** when irreversible work lacks the conjunction above. Keepers: arXiv:2503.11951, 2511.03094. diff --git a/references/profiles/zero_option.md b/references/profiles/zero_option.md index a8fc9fa..fe77fec 100644 --- a/references/profiles/zero_option.md +++ b/references/profiles/zero_option.md @@ -56,3 +56,24 @@ Schema: `schemas/zero-option-packet.schema.json` ## Fail closed If skills and access are empty or unusable under constraints → `NOT_COMPUTABLE` with reason (see `evals/cases/zero-option.json`). + +## Dual-logic + bricolage (U1 · U3 · P0) + +Default Zero-Option posture is **effectual** (means → optional loops). Emit `logic_label`. + +**Bricolage checklist (before buy/build):** +1. Inventory declared repertoire: skills, access, tools, inventory, relationships (operator-supplied only). +2. Prefer recombine existing means over purchase or invent. +3. Affordable-loss framing when any spend is proposed — still advisory; human-yes on spend. +4. Forbid inventing missing resources (Gate G / Gate BRIC). + +Keepers: arXiv:2108.09943, arXiv:2507.02819 (cite Sarasvathy / Baker&Nelson via these; NOT_COMPUTABLE as direct arXiv). + +## Means inventory empty (P0-1) + +Tighten U3 / effectual CLEAR: + +- **Means** = declared skills + access + tools + inventory + relationships (operator-supplied only). +- If means inventory is **empty or unusable** under constraints → `NOT_COMPUTABLE` **and** emit a `DataRequest` for the missing means (Gate Q / Gate BRIC). Do not invent means. Do not promote. +- Keepers: arXiv:2312.00916, arXiv:2311.14340, arXiv:2108.09943. + diff --git a/references/schemas/agentic-service-graph.schema.json b/references/schemas/agentic-service-graph.schema.json index 01f2d0c..4fa635c 100644 --- a/references/schemas/agentic-service-graph.schema.json +++ b/references/schemas/agentic-service-graph.schema.json @@ -14,7 +14,34 @@ "actions": {}, "authority_gates": {}, "exception_paths": {}, - "completion_proof": {} + "completion_proof": {}, + "validation_step": { + "type": "object", + "description": "Independent non-circular validation before irreversible actions. When has_irreversible_action is true, CLEAR requires independent=true AND a versioned log pointer (log_pointer + validation_log_version). Absence \u2192 Gate ISO fail. PROMETHEUS consumes; no fifth bot.", + "properties": { + "present": { + "type": "boolean", + "description": "True when a validation step exists. Alias of validation_isolation.enabled" + }, + "independent": { + "type": "boolean", + "description": "Boolean attestation that validator is non-circular vs planner (SHADOW \u2014 no proof protocol). Alias of validation_isolation.independent_of_planner" + }, + "log_pointer": { + "type": "string", + "description": "Alias of packet validation_isolation.validation_log_pointer \u2014 versioned log / receipt path or URI" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at log_pointer (parity with wayfinder validation_isolation.validation_log_version)" + } + }, + "additionalProperties": true + }, + "has_irreversible_action": { + "type": "boolean", + "description": "True when any action can irreversibly affect users/spend/egress" + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/references/schemas/evidence-intelligence-packet.schema.json b/references/schemas/evidence-intelligence-packet.schema.json index b54d6fa..6c757b2 100644 --- a/references/schemas/evidence-intelligence-packet.schema.json +++ b/references/schemas/evidence-intelligence-packet.schema.json @@ -10,7 +10,8 @@ "tooling_gaps", "attribution_boundaries", "research_log", - "not_computable_fields" + "not_computable_fields", + "evidence_ledger" ], "properties": { "decision_questions": {}, @@ -24,7 +25,229 @@ "competitive_scan": {}, "grant_or_funder_map": {}, "board_or_stakeholder_map": {}, - "freshness_notes": {} + "freshness_notes": {}, + "evidence_ledger": { + "description": "Required as of 3.27.0 when EvidenceIntelligence packet is emitted. Typed EviGraph claim graph; see evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + }, + "research_search_dag": { + "description": "Optional in 3.26.x (warn-then-require). Write only when research runs. Canonical: schemas/research-search-dag.schema.json. Gate PILOT.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true } diff --git a/references/schemas/evidence-ledger.schema.json b/references/schemas/evidence-ledger.schema.json new file mode 100644 index 0000000..4480ec6 --- /dev/null +++ b/references/schemas/evidence-ledger.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/evidence-ledger/1.0.0", + "title": "Evidence Ledger (EviGraph claim graph)", + "description": "Shared claim graph for Gate LEDGER. Required on EvidenceIntelligence packets as of 3.27.0. No invent Brier / auto-settle.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/references/schemas/opportunity-packet.schema.json b/references/schemas/opportunity-packet.schema.json index 1a89042..992f09c 100644 --- a/references/schemas/opportunity-packet.schema.json +++ b/references/schemas/opportunity-packet.schema.json @@ -10,7 +10,8 @@ "validation_path", "completion_proof", "scorecard", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "blocked_transition": {}, @@ -25,6 +26,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/references/schemas/product-packet.schema.json b/references/schemas/product-packet.schema.json index 5c2f2b9..aafe3e4 100644 --- a/references/schemas/product-packet.schema.json +++ b/references/schemas/product-packet.schema.json @@ -12,7 +12,8 @@ "experience_architecture", "validation_path", "completion_proof", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "target_user": {}, @@ -29,6 +30,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered eng/operator steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/references/schemas/research-search-dag.schema.json b/references/schemas/research-search-dag.schema.json new file mode 100644 index 0000000..5cf589f --- /dev/null +++ b/references/schemas/research-search-dag.schema.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/research-search-dag/1.0.0", + "title": "Research Search DAG (PaperPilot)", + "description": "Editable search DAG written only when research runs. Stages: keyword \u2192 cite-expand \u2192 filter \u2192 score \u2192 extract. Optional in 3.26.x (warn-then-require). Never invent citations (Gate CITE). Keeper arXiv:2607.00597.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/references/schemas/run-envelope.schema.json b/references/schemas/run-envelope.schema.json index 674a24c..5aec5bc 100644 --- a/references/schemas/run-envelope.schema.json +++ b/references/schemas/run-envelope.schema.json @@ -16,7 +16,8 @@ "artifacts", "promotion", "receipt", - "generator" + "generator", + "stage" ], "properties": { "schema_id": { @@ -55,59 +56,118 @@ "request": { "type": "object", "properties": { - "request_id": { "type": "string" }, - "summary": { "type": "string" }, - "brief_path": { "type": "string" }, - "recipe": { "type": "string" }, + "request_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "brief_path": { + "type": "string" + }, + "recipe": { + "type": "string" + }, "requested_profiles": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } } } }, "resolved_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "minItems": 1 }, "mode_status": { "type": "object", - "required": ["OPEN", "ALIGN", "ASCEND", "CLEAR", "SEAL"], + "required": [ + "OPEN", + "ALIGN", + "ASCEND", + "CLEAR", + "SEAL" + ], "properties": { - "OPEN": { "type": "string" }, - "ALIGN": { "type": "string" }, - "ASCEND": { "type": "string" }, - "CLEAR": { "type": "string" }, - "SEAL": { "type": "string" } + "OPEN": { + "type": "string" + }, + "ALIGN": { + "type": "string" + }, + "ASCEND": { + "type": "string" + }, + "CLEAR": { + "type": "string" + }, + "SEAL": { + "type": "string" + } }, "additionalProperties": false }, "primary_artifact": { "type": "object", - "required": ["type", "path", "artifact_id"], + "required": [ + "type", + "path", + "artifact_id" + ], "properties": { - "type": { "type": "string" }, - "path": { "type": "string" }, - "artifact_id": { "type": "string" }, - "content_hash": { "type": "string" } + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "artifact_id": { + "type": "string" + }, + "content_hash": { + "type": "string" + } } }, "artifacts": { "type": "array", "items": { "type": "object", - "required": ["artifact_id", "type", "path", "content_hash"], + "required": [ + "artifact_id", + "type", + "path", + "content_hash" + ], "properties": { - "artifact_id": { "type": "string" }, - "type": { "type": "string" }, - "path": { "type": "string" }, - "content_hash": { "type": "string" }, + "artifact_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "content_hash": { + "type": "string" + }, "parent_artifact_ids": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } + }, + "schema_id": { + "type": "string" }, - "schema_id": { "type": "string" }, - "schema_version": { "type": "string" } + "schema_version": { + "type": "string" + } } } }, @@ -119,20 +179,32 @@ "items": { "type": "object", "properties": { - "gate": { "type": "string" }, - "status": { "type": "string" }, - "detail": { "type": "string" } + "gate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "detail": { + "type": "string" + } } } }, "promotion": { "type": "object", - "required": ["state"], + "required": [ + "state" + ], "properties": { - "state": { "type": "string" }, + "state": { + "type": "string" + }, "blocking_gates": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } }, "open_blocking_requests": { "type": "array" @@ -146,45 +218,96 @@ "receipt_path": { "type": "string" }, - "privacy": { "$ref": "privacy-context.schema.json" }, - "privacy_mode": { "enum": ["local_only", "external_research_allowed", "custom"] }, - "external_actions": { "type": "array" }, - "artifact_paths": { "type": "array" }, - "telemetry_status": { "const": "disabled" }, - "deletion_instructions": { "type": "string" }, + "privacy": { + "$ref": "privacy-context.schema.json" + }, + "privacy_mode": { + "enum": [ + "local_only", + "external_research_allowed", + "custom" + ] + }, + "external_actions": { + "type": "array" + }, + "artifact_paths": { + "type": "array" + }, + "telemetry_status": { + "const": "disabled" + }, + "deletion_instructions": { + "type": "string" + }, "content_hash": { "type": "string", "description": "sha256 of envelope body without content_hash field" }, "generator": { "type": "object", - "required": ["skill", "version", "tool"], + "required": [ + "skill", + "version", + "tool" + ], "properties": { - "skill": { "type": "string" }, - "version": { "type": "string" }, - "tool": { "type": "string" } + "skill": { + "type": "string" + }, + "version": { + "type": "string" + }, + "tool": { + "type": "string" + } } }, "wayfinder": { "type": "object", "description": "Canonical Wayfinder ingestion hints", "properties": { - "ingest": { "type": "string", "const": "run-envelope.json" }, - "product_intent_changes_require_neon_genie_review": { "type": "boolean" }, - "handoff_path": { "type": ["string", "null"] } + "ingest": { + "type": "string", + "const": "run-envelope.json" + }, + "product_intent_changes_require_neon_genie_review": { + "type": "boolean" + }, + "handoff_path": { + "type": [ + "string", + "null" + ] + } } }, "selected_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "description": "Deprecated alias for resolved_profiles" }, "outputs": { "type": "array", "description": "Deprecated alias for artifacts (v0 compatibility)" }, - "canonical_sources": { "type": "array" }, - "assumptions": { "type": "array" } + "canonical_sources": { + "type": "array" + }, + "assumptions": { + "type": "array" + }, + "stage": { + "type": "string", + "enum": [ + "shape", + "test", + "scale" + ], + "description": "Required as of 3.27.0. Gate STAGE. Enum shape|test|scale. scale needs test evidence." + } }, "additionalProperties": true } diff --git a/references/schemas/wayfinder-execution-packet.schema.json b/references/schemas/wayfinder-execution-packet.schema.json index 44d2804..0c56da1 100644 --- a/references/schemas/wayfinder-execution-packet.schema.json +++ b/references/schemas/wayfinder-execution-packet.schema.json @@ -20,7 +20,36 @@ "acceptance_criteria": {}, "workstreams": {}, "validation_gates": {}, - "change_control": {} + "change_control": {}, + "validation_isolation": { + "type": "object", + "description": "Optional. Independent eng validation step separate from the planner that authored the packet. PROMETHEUS consumes \u2014 no Wayfinder bot. Gate ISO / P2-1.", + "properties": { + "enabled": { + "type": "boolean" + }, + "independent_of_planner": { + "type": "boolean", + "description": "True when validator is non-circular vs the planner that wrote the packet" + }, + "validator_role": { + "type": "string", + "description": "Operational role label only (e.g. eng_validator). Not a bot identity." + }, + "validation_log_pointer": { + "type": "string", + "description": "Versioned log / receipt path or URI for the validation pass" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at pointer" + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/references/schemas/zero-option-packet.schema.json b/references/schemas/zero-option-packet.schema.json index dba5e0f..83352cd 100644 --- a/references/schemas/zero-option-packet.schema.json +++ b/references/schemas/zero-option-packet.schema.json @@ -8,7 +8,8 @@ "opportunities", "shadow_flags", "system_state", - "completion_proof" + "completion_proof", + "logic_label" ], "properties": { "constraints": {}, @@ -20,10 +21,19 @@ "description": "Observable proof of first cash/signal or honest NOT_COMPUTABLE reason" }, "proof_path": { - "description": "Micro-loop steps: narrative → action → result → reinforcement" + "description": "Micro-loop steps: narrative \u2192 action \u2192 result \u2192 reinforcement" }, "status": {}, - "reason": {} + "reason": {}, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + } }, "additionalProperties": true } diff --git a/references/source-and-upgrades.md b/references/source-and-upgrades.md index ec14b69..0a8f1ab 100644 --- a/references/source-and-upgrades.md +++ b/references/source-and-upgrades.md @@ -1,7 +1,7 @@ # Source identity and upgrades -This distribution is `scrimshawlife-ctrl/NeonGenie`, version `3.26.0`, based on commit -`9e7e6d388a77a9f6103fba6f982457afc873084b` before the local audit-fix commit. Record the actual installed commit +This distribution is `scrimshawlife-ctrl/NeonGenie`, version `3.27.0`, based on commit +`516689f1308d3a5e009e901343bbc119a3f39cc6` (#20 installer safety) plus the 3.27.0 skill-surface sync. Record the actual installed commit with `git rev-parse HEAD` before installation; do not use a version string alone as a source identity. Root and hub packaging are distribution surfaces, not a claim that organizational, personal, or legacy embedded variants are identical. diff --git a/schemas/agentic-service-graph.schema.json b/schemas/agentic-service-graph.schema.json index 01f2d0c..4fa635c 100644 --- a/schemas/agentic-service-graph.schema.json +++ b/schemas/agentic-service-graph.schema.json @@ -14,7 +14,34 @@ "actions": {}, "authority_gates": {}, "exception_paths": {}, - "completion_proof": {} + "completion_proof": {}, + "validation_step": { + "type": "object", + "description": "Independent non-circular validation before irreversible actions. When has_irreversible_action is true, CLEAR requires independent=true AND a versioned log pointer (log_pointer + validation_log_version). Absence \u2192 Gate ISO fail. PROMETHEUS consumes; no fifth bot.", + "properties": { + "present": { + "type": "boolean", + "description": "True when a validation step exists. Alias of validation_isolation.enabled" + }, + "independent": { + "type": "boolean", + "description": "Boolean attestation that validator is non-circular vs planner (SHADOW \u2014 no proof protocol). Alias of validation_isolation.independent_of_planner" + }, + "log_pointer": { + "type": "string", + "description": "Alias of packet validation_isolation.validation_log_pointer \u2014 versioned log / receipt path or URI" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at log_pointer (parity with wayfinder validation_isolation.validation_log_version)" + } + }, + "additionalProperties": true + }, + "has_irreversible_action": { + "type": "boolean", + "description": "True when any action can irreversibly affect users/spend/egress" + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/evidence-intelligence-packet.schema.json b/schemas/evidence-intelligence-packet.schema.json index b54d6fa..6c757b2 100644 --- a/schemas/evidence-intelligence-packet.schema.json +++ b/schemas/evidence-intelligence-packet.schema.json @@ -10,7 +10,8 @@ "tooling_gaps", "attribution_boundaries", "research_log", - "not_computable_fields" + "not_computable_fields", + "evidence_ledger" ], "properties": { "decision_questions": {}, @@ -24,7 +25,229 @@ "competitive_scan": {}, "grant_or_funder_map": {}, "board_or_stakeholder_map": {}, - "freshness_notes": {} + "freshness_notes": {}, + "evidence_ledger": { + "description": "Required as of 3.27.0 when EvidenceIntelligence packet is emitted. Typed EviGraph claim graph; see evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + }, + "research_search_dag": { + "description": "Optional in 3.26.x (warn-then-require). Write only when research runs. Canonical: schemas/research-search-dag.schema.json. Gate PILOT.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true } diff --git a/schemas/evidence-ledger.schema.json b/schemas/evidence-ledger.schema.json new file mode 100644 index 0000000..4480ec6 --- /dev/null +++ b/schemas/evidence-ledger.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/evidence-ledger/1.0.0", + "title": "Evidence Ledger (EviGraph claim graph)", + "description": "Shared claim graph for Gate LEDGER. Required on EvidenceIntelligence packets as of 3.27.0. No invent Brier / auto-settle.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/schemas/opportunity-packet.schema.json b/schemas/opportunity-packet.schema.json index 1a89042..992f09c 100644 --- a/schemas/opportunity-packet.schema.json +++ b/schemas/opportunity-packet.schema.json @@ -10,7 +10,8 @@ "validation_path", "completion_proof", "scorecard", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "blocked_transition": {}, @@ -25,6 +26,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/schemas/product-packet.schema.json b/schemas/product-packet.schema.json index 5c2f2b9..aafe3e4 100644 --- a/schemas/product-packet.schema.json +++ b/schemas/product-packet.schema.json @@ -12,7 +12,8 @@ "experience_architecture", "validation_path", "completion_proof", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "target_user": {}, @@ -29,6 +30,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered eng/operator steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/schemas/research-search-dag.schema.json b/schemas/research-search-dag.schema.json new file mode 100644 index 0000000..5cf589f --- /dev/null +++ b/schemas/research-search-dag.schema.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/research-search-dag/1.0.0", + "title": "Research Search DAG (PaperPilot)", + "description": "Editable search DAG written only when research runs. Stages: keyword \u2192 cite-expand \u2192 filter \u2192 score \u2192 extract. Optional in 3.26.x (warn-then-require). Never invent citations (Gate CITE). Keeper arXiv:2607.00597.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/schemas/run-envelope.schema.json b/schemas/run-envelope.schema.json index 674a24c..5aec5bc 100644 --- a/schemas/run-envelope.schema.json +++ b/schemas/run-envelope.schema.json @@ -16,7 +16,8 @@ "artifacts", "promotion", "receipt", - "generator" + "generator", + "stage" ], "properties": { "schema_id": { @@ -55,59 +56,118 @@ "request": { "type": "object", "properties": { - "request_id": { "type": "string" }, - "summary": { "type": "string" }, - "brief_path": { "type": "string" }, - "recipe": { "type": "string" }, + "request_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "brief_path": { + "type": "string" + }, + "recipe": { + "type": "string" + }, "requested_profiles": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } } } }, "resolved_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "minItems": 1 }, "mode_status": { "type": "object", - "required": ["OPEN", "ALIGN", "ASCEND", "CLEAR", "SEAL"], + "required": [ + "OPEN", + "ALIGN", + "ASCEND", + "CLEAR", + "SEAL" + ], "properties": { - "OPEN": { "type": "string" }, - "ALIGN": { "type": "string" }, - "ASCEND": { "type": "string" }, - "CLEAR": { "type": "string" }, - "SEAL": { "type": "string" } + "OPEN": { + "type": "string" + }, + "ALIGN": { + "type": "string" + }, + "ASCEND": { + "type": "string" + }, + "CLEAR": { + "type": "string" + }, + "SEAL": { + "type": "string" + } }, "additionalProperties": false }, "primary_artifact": { "type": "object", - "required": ["type", "path", "artifact_id"], + "required": [ + "type", + "path", + "artifact_id" + ], "properties": { - "type": { "type": "string" }, - "path": { "type": "string" }, - "artifact_id": { "type": "string" }, - "content_hash": { "type": "string" } + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "artifact_id": { + "type": "string" + }, + "content_hash": { + "type": "string" + } } }, "artifacts": { "type": "array", "items": { "type": "object", - "required": ["artifact_id", "type", "path", "content_hash"], + "required": [ + "artifact_id", + "type", + "path", + "content_hash" + ], "properties": { - "artifact_id": { "type": "string" }, - "type": { "type": "string" }, - "path": { "type": "string" }, - "content_hash": { "type": "string" }, + "artifact_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "content_hash": { + "type": "string" + }, "parent_artifact_ids": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } + }, + "schema_id": { + "type": "string" }, - "schema_id": { "type": "string" }, - "schema_version": { "type": "string" } + "schema_version": { + "type": "string" + } } } }, @@ -119,20 +179,32 @@ "items": { "type": "object", "properties": { - "gate": { "type": "string" }, - "status": { "type": "string" }, - "detail": { "type": "string" } + "gate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "detail": { + "type": "string" + } } } }, "promotion": { "type": "object", - "required": ["state"], + "required": [ + "state" + ], "properties": { - "state": { "type": "string" }, + "state": { + "type": "string" + }, "blocking_gates": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } }, "open_blocking_requests": { "type": "array" @@ -146,45 +218,96 @@ "receipt_path": { "type": "string" }, - "privacy": { "$ref": "privacy-context.schema.json" }, - "privacy_mode": { "enum": ["local_only", "external_research_allowed", "custom"] }, - "external_actions": { "type": "array" }, - "artifact_paths": { "type": "array" }, - "telemetry_status": { "const": "disabled" }, - "deletion_instructions": { "type": "string" }, + "privacy": { + "$ref": "privacy-context.schema.json" + }, + "privacy_mode": { + "enum": [ + "local_only", + "external_research_allowed", + "custom" + ] + }, + "external_actions": { + "type": "array" + }, + "artifact_paths": { + "type": "array" + }, + "telemetry_status": { + "const": "disabled" + }, + "deletion_instructions": { + "type": "string" + }, "content_hash": { "type": "string", "description": "sha256 of envelope body without content_hash field" }, "generator": { "type": "object", - "required": ["skill", "version", "tool"], + "required": [ + "skill", + "version", + "tool" + ], "properties": { - "skill": { "type": "string" }, - "version": { "type": "string" }, - "tool": { "type": "string" } + "skill": { + "type": "string" + }, + "version": { + "type": "string" + }, + "tool": { + "type": "string" + } } }, "wayfinder": { "type": "object", "description": "Canonical Wayfinder ingestion hints", "properties": { - "ingest": { "type": "string", "const": "run-envelope.json" }, - "product_intent_changes_require_neon_genie_review": { "type": "boolean" }, - "handoff_path": { "type": ["string", "null"] } + "ingest": { + "type": "string", + "const": "run-envelope.json" + }, + "product_intent_changes_require_neon_genie_review": { + "type": "boolean" + }, + "handoff_path": { + "type": [ + "string", + "null" + ] + } } }, "selected_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "description": "Deprecated alias for resolved_profiles" }, "outputs": { "type": "array", "description": "Deprecated alias for artifacts (v0 compatibility)" }, - "canonical_sources": { "type": "array" }, - "assumptions": { "type": "array" } + "canonical_sources": { + "type": "array" + }, + "assumptions": { + "type": "array" + }, + "stage": { + "type": "string", + "enum": [ + "shape", + "test", + "scale" + ], + "description": "Required as of 3.27.0. Gate STAGE. Enum shape|test|scale. scale needs test evidence." + } }, "additionalProperties": true } diff --git a/schemas/wayfinder-execution-packet.schema.json b/schemas/wayfinder-execution-packet.schema.json index 44d2804..0c56da1 100644 --- a/schemas/wayfinder-execution-packet.schema.json +++ b/schemas/wayfinder-execution-packet.schema.json @@ -20,7 +20,36 @@ "acceptance_criteria": {}, "workstreams": {}, "validation_gates": {}, - "change_control": {} + "change_control": {}, + "validation_isolation": { + "type": "object", + "description": "Optional. Independent eng validation step separate from the planner that authored the packet. PROMETHEUS consumes \u2014 no Wayfinder bot. Gate ISO / P2-1.", + "properties": { + "enabled": { + "type": "boolean" + }, + "independent_of_planner": { + "type": "boolean", + "description": "True when validator is non-circular vs the planner that wrote the packet" + }, + "validator_role": { + "type": "string", + "description": "Operational role label only (e.g. eng_validator). Not a bot identity." + }, + "validation_log_pointer": { + "type": "string", + "description": "Versioned log / receipt path or URI for the validation pass" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at pointer" + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/zero-option-packet.schema.json b/schemas/zero-option-packet.schema.json index dba5e0f..83352cd 100644 --- a/schemas/zero-option-packet.schema.json +++ b/schemas/zero-option-packet.schema.json @@ -8,7 +8,8 @@ "opportunities", "shadow_flags", "system_state", - "completion_proof" + "completion_proof", + "logic_label" ], "properties": { "constraints": {}, @@ -20,10 +21,19 @@ "description": "Observable proof of first cash/signal or honest NOT_COMPUTABLE reason" }, "proof_path": { - "description": "Micro-loop steps: narrative → action → result → reinforcement" + "description": "Micro-loop steps: narrative \u2192 action \u2192 result \u2192 reinforcement" }, "status": {}, - "reason": {} + "reason": {}, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + } }, "additionalProperties": true } diff --git a/scripts/build_envelope.py b/scripts/build_envelope.py index f37bdd0..7a80875 100644 --- a/scripts/build_envelope.py +++ b/scripts/build_envelope.py @@ -191,6 +191,7 @@ def build_envelope( "request_id": req_id, "skill": "neon-genie", "skill_version": skill_ver, + "stage": (receipt.get("stage") or summary.get("stage") or "shape"), "created_at": lineage.utc_now(), "authority": "advisory_only", "grants_execution": False, diff --git a/scripts/recipe_run.py b/scripts/recipe_run.py old mode 100755 new mode 100644 index e8c9d8f..f529146 --- a/scripts/recipe_run.py +++ b/scripts/recipe_run.py @@ -59,6 +59,7 @@ def recipe_product_audit(out: Path) -> int: "experience_architecture": "operator CLI + Hermes skill prose", "validation_path": ["do check", "do eval", "human review"], "completion_proof": "Operator accepts product packet + handoff stub in review without intent rewrite", + "logic_label": "causal", "proof_path": [ "human reviews product-packet.stub.json", "confirm open DataRequests listed", @@ -130,6 +131,7 @@ def recipe_zero_option(out: Path) -> int: "status": "NOT_COMPUTABLE", "reason": "No executable capabilities or access supplied", "completion_proof": "NOT_COMPUTABLE: no skills/access to prove first cash", + "logic_label": "effectual", "proof_path": [ "declare skills and access", "re-run zero-option-executable recipe or Hermes zero_option profile", @@ -192,6 +194,7 @@ def recipe_zero_option_executable(out: Path) -> int: "reinforcement": "log outcome; no fictional pipeline", }, "completion_proof": "Paid engagement booked or written refusal within 7 days", + "logic_label": "effectual", "proof_path": [ "list warm contacts from declared access", "send one bounded paid diagnostic offer", @@ -690,6 +693,25 @@ def recipe_evidence(out: Path) -> int: }, ], "evidence_items": [], + "evidence_ledger": { + "claims": [ + { + "claim_id": "c-evidence-stub-1", + "text": "Public comps require host fetch + cite for OBSERVED", + "label": "SPECULATIVE", + "active": True, + } + ], + "relations": [ + { + "relation_id": "r-evidence-stub-1", + "from_id": "c-evidence-stub-1", + "to_id": "evidence-pending", + "relation": "Depend-on", + "resolved": True, + } + ], + }, "claim_ledger": [ { "claim": "Public comps require host fetch + cite for OBSERVED", @@ -792,6 +814,7 @@ def recipe_opportunity(out: Path) -> int: "track invoice or no", ], "completion_proof": "first paid diagnostic invoice or signed SOW within 14 days", + "logic_label": "mixed", "proof_path": [ "satisfy DataRequest for skills/access/buyer", "send bounded offer to declared warm contacts only", diff --git a/scripts/run_hermes_evals.py b/scripts/run_hermes_evals.py old mode 100755 new mode 100644 index 167de22..a8d62d3 --- a/scripts/run_hermes_evals.py +++ b/scripts/run_hermes_evals.py @@ -346,6 +346,143 @@ def eval_privacy_consent_purpose_bound(inp: dict[str, Any]) -> dict[str, Any]: } + +def eval_effectual_missing_means(inp: dict[str, Any]) -> dict[str, Any]: + label = str(inp.get("logic_label") or "") + means = inp.get("means_inventory") + if means is None: + means = inp.get("means") or [] + empty = not means + requested = bool(inp.get("data_request_emitted")) + status_nc = str(inp.get("status") or "").upper() == "NOT_COMPUTABLE" + if label in {"effectual", "mixed"} and empty and not requested and not status_nc: + return { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE", + } + if label == "effectual" and empty and not requested and not status_nc: + return { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE", + } + return {"status": "PASS", "gate": "BRIC", "reason": "means present or NC/DataRequest"} + + +def eval_scale_without_test(inp: dict[str, Any]) -> dict[str, Any]: + stage = str(inp.get("stage") or "") + has_test = bool(inp.get("test_evidence_present")) + if stage == "scale" and not has_test: + return { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence", + } + missing = stage == "" and bool(inp.get("require_stage")) + if missing: + return { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "stage missing on opportunity/agentic run", + } + return {"status": "PASS", "gate": "STAGE", "reason": "stage ok"} + + +def eval_fabricated_cite(inp: dict[str, Any]) -> dict[str, Any]: + cite = inp.get("citation") or inp.get("arxiv_id") or inp.get("doi") + verified = bool(inp.get("verified_fetch") or inp.get("operator_source")) + if cite and not verified: + return { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)", + } + return {"status": "PASS", "gate": "CITE", "reason": "cite verified or absent"} + + + +def eval_ledger_uncited(inp: dict[str, Any]) -> dict[str, Any]: + material = bool(inp.get("material_claim")) + cited = bool(inp.get("active_ledger_cite")) + invent = str(inp.get("claim_label") or "") == "OBSERVED" and str( + inp.get("claim_source") or "" + ) in {"model_prior_only", "model_prior", ""} + if material and not cited: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite", + } + if invent and not cited and material: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite", + } + return {"status": "PASS", "gate": "LEDGER", "reason": "ledger cite present"} + + +def eval_ledger_contradict_testable(inp: dict[str, Any]) -> dict[str, Any]: + promo = str(inp.get("promotion_state") or "RAW_SIGNAL") + high = promo in { + "TESTABLE", + "SERVICE_FIRST", + "SERVICE_PROVEN", + "SPEC_COMPLETE", + "WAYFINDER_READY", + "BUILD_READY", + "CANON_CANDIDATE", + } + unresolved = bool(inp.get("unresolved_contradict_or_invalidate")) + if high and unresolved: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks ≥TESTABLE", + } + return {"status": "PASS", "gate": "LEDGER", "reason": "no unresolved contradict at TESTABLE+"} + + + +def eval_irreversible_without_validation(inp: dict[str, Any]) -> dict[str, Any]: + irreversible = bool(inp.get("has_irreversible_action")) + present = bool(inp.get("validation_step_present") or inp.get("validation_isolation_enabled")) + independent = bool(inp.get("validation_independent") or inp.get("independent_of_planner")) + log_ptr = str(inp.get("validation_log_pointer") or inp.get("log_pointer") or "").strip() + log_ver = str(inp.get("validation_log_version") or "").strip() + versioned_log = bool(log_ptr and log_ver) + if irreversible: + if not (present and independent and versioned_log): + # Prefer specific reason when independence present but log missing + if present and independent and not versioned_log: + return { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent ∧ versioned log pointer", + } + return { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step", + } + return {"status": "PASS", "gate": "ISO", "reason": "independent ∧ versioned log pointer"} + + + +def eval_research_ran_without_dag(inp: dict[str, Any]) -> dict[str, Any]: + ran = bool(inp.get("research_ran")) + present = bool(inp.get("dag_present")) + stages = inp.get("dag_stages") or [] + if ran and (not present or not stages): + return { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag", + } + return {"status": "PASS", "gate": "PILOT", "reason": "dag present when research ran"} + + EVALUATORS: dict[str, EvalFn] = { "zero-option.json": eval_zero_option, "x402-misfit.json": eval_x402_misfit, @@ -366,6 +503,15 @@ def eval_privacy_consent_purpose_bound(inp: dict[str, Any]) -> dict[str, Any]: "privacy-egress-local-only.json": eval_privacy_egress_local_only, "privacy-secret-blocks-egress.json": eval_privacy_secret_blocks_egress, "privacy-consent-purpose-bound.json": eval_privacy_consent_purpose_bound, + "effectual-missing-means.json": eval_effectual_missing_means, + "scale-without-test.json": eval_scale_without_test, + "fabricated-cite.json": eval_fabricated_cite, + "uncited-claim.json": eval_ledger_uncited, + "contradict-unresolved-testable.json": eval_ledger_contradict_testable, + "irreversible-without-validation.json": eval_irreversible_without_validation, + "irreversible-missing-log-pointer.json": eval_irreversible_without_validation, + "research-ran-without-dag.json": eval_research_ran_without_dag, + "dag-fabricated-cite.json": eval_fabricated_cite, } diff --git a/scripts/test_distribution_spine.py b/scripts/test_distribution_spine.py index de36cc2..88c66ef 100644 --- a/scripts/test_distribution_spine.py +++ b/scripts/test_distribution_spine.py @@ -108,8 +108,8 @@ def test_dir_style_hub_ref_fails() -> None: text = skill.read_text(encoding="utf-8") # inject a bare directory hub path that Hermes would reject text = text.replace( - "## Mission", - "See also `references/profiles` for contracts.\n\n## Mission", + "## Procedure", + "See also `references/profiles` for contracts.\n\n## Procedure", 1, ) skill.write_text(text, encoding="utf-8") diff --git a/scripts/test_hermes_frontmatter.py b/scripts/test_hermes_frontmatter.py new file mode 100644 index 0000000..c2ea594 --- /dev/null +++ b/scripts/test_hermes_frontmatter.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Unit tests for Hermes v0.21 SKILL.md frontmatter gates (stdlib only).""" + +from __future__ import annotations + +import sys +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + +import validate_hermes_skill as vhs # noqa: E402 + +FOLDED = """--- +name: neon-genie +description: > + Evidence-bound product and opportunity intelligence — audits, zero-option + loops, commercial models, agentic graphs, and Wayfinder handoffs with claim + labels and fail-closed gates. Use for product intent, opportunity mining, + and advisory packets — not cinematic work (use Kubrick) or code execution. +version: 3.26.0 +author: Applied Alchemy Labs / Zero State +license: MIT +platforms: [linux, macos, windows] +metadata: + hermes: + tags: + - Product + related_skills: [] +--- + +# Body +""" + + +def test_folded_description_exceeds_limit() -> None: + fields = vhs.parse_frontmatter(FOLDED) + desc = str(fields.get("description", "")) + if len(desc) <= vhs.SKILL_PROMPT_DESC_LIMIT: + raise AssertionError(f"folded description should exceed 60, got {len(desc)}") + errors = vhs.validate_description(desc) + if not any("truncates" in e for e in errors): + raise AssertionError(f"expected length error, got {errors}") + + +def test_short_description_passes() -> None: + desc = "Audit products and opportunities with labeled evidence." + if len(desc) > vhs.SKILL_PROMPT_DESC_LIMIT: + raise AssertionError(f"hunch description is {len(desc)} chars") + errors = vhs.validate_description(desc) + if errors: + raise AssertionError(errors) + + +def test_marketing_and_period() -> None: + errors = vhs.validate_description("A powerful product auditor") + joined = " ".join(errors) + if "marketing" not in joined or "period" not in joined: + raise AssertionError(f"expected marketing + period errors, got {errors}") + + +def test_live_skill_frontmatter() -> None: + text = (vhs.SKILL_ROOT / "SKILL.md").read_text(encoding="utf-8") + if not text.startswith("---\n"): + raise AssertionError("SKILL.md must start at byte 0 with ---") + fields = vhs.parse_frontmatter(text) + missing = vhs.REQUIRED_FRONTMATTER - set(fields) + if missing: + raise AssertionError(f"missing fields: {missing}") + errors = vhs.validate_description(str(fields.get("description", ""))) + if errors: + raise AssertionError(errors) + hermes = fields.get("_hermes") + if not isinstance(hermes, dict): + raise AssertionError("metadata.hermes missing") + missing_h = vhs.REQUIRED_HERMES_KEYS - set(hermes) + if missing_h: + raise AssertionError(f"missing hermes keys: {missing_h}") + + +def main() -> int: + tests = ( + test_folded_description_exceeds_limit, + test_short_description_passes, + test_marketing_and_period, + test_live_skill_frontmatter, + ) + for fn in tests: + fn() + print("ALL PASS: test_hermes_frontmatter") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/test_wave3_cli.py b/scripts/test_wave3_cli.py index 0f0c1f2..ab27f63 100755 --- a/scripts/test_wave3_cli.py +++ b/scripts/test_wave3_cli.py @@ -66,6 +66,7 @@ def main() -> int: "completion_proof": "first paid outcome within 14 days", "scorecard": {}, "promotion_state": "TESTABLE", + "logic_label": "mixed", } packet.write_text(json.dumps(full), encoding="utf-8") r = run(["do", "validate", "--packet", str(packet), "--type", "opportunity"]) diff --git a/scripts/validate_hermes_skill.py b/scripts/validate_hermes_skill.py old mode 100755 new mode 100644 index 8457371..229f593 --- a/scripts/validate_hermes_skill.py +++ b/scripts/validate_hermes_skill.py @@ -24,7 +24,28 @@ SKILL_FILE = SKILL_ROOT / "SKILL.md" -REQUIRED_FRONTMATTER = {"name", "description", "version", "author"} +# Hermes Agent v0.21 hardline (tools/skill_linter.py + skill-authoring SKILL.md). +# Index truncates at SKILL_PROMPT_DESC_LIMIT (57 chars + "..."). +SKILL_PROMPT_DESC_LIMIT = 60 +REQUIRED_FRONTMATTER = { + "name", + "description", + "version", + "author", + "license", + "platforms", +} +REQUIRED_HERMES_KEYS = {"tags", "related_skills"} +MARKETING_WORDS = ( + "powerful", + "comprehensive", + "seamless", + "advanced", + "cutting-edge", + "state-of-the-art", + "revolutionary", + "robust", +) # Paths that must exist either at full-tree location or hub mirror. # Each entry is a list of candidate relative paths (first existing wins). @@ -107,7 +128,6 @@ "docs/PREMIERE.md", "docs/DEMO.md", "install.sh", - ".github/workflows/hermes-evals.yml", "examples/gallery/README.md", "distribution.yaml", ] @@ -119,25 +139,120 @@ ] -def parse_frontmatter(text: str) -> dict[str, str]: +def _strip_yaml_scalar(value: str) -> str: + value = value.strip() + if len(value) >= 2 and value[0] == value[-1] and value[0] in {'"', "'"}: + return value[1:-1] + return value + + +def _fold_block(lines: list[str], start: int, indent: int, literal: bool) -> tuple[str, int]: + collected: list[str] = [] + i = start + while i < len(lines): + line = lines[i] + if not line.strip(): + collected.append("") + i += 1 + continue + leading = len(line) - len(line.lstrip(" ")) + if leading < indent: + break + collected.append(line[indent:] if leading >= indent else line.lstrip()) + i += 1 + while collected and collected[-1] == "": + collected.pop() + if literal: + return "\n".join(collected), i + paragraphs = "\n".join(collected).split("\n\n") + folded = " ".join(" ".join(p.split()) for p in paragraphs if p.strip()) + return folded, i + + +def parse_frontmatter(text: str) -> dict[str, object]: + """Parse SKILL.md YAML frontmatter. Frontmatter must start at byte 0.""" + if text.startswith("\ufeff"): + raise ValueError("SKILL.md frontmatter must start at byte 0 (BOM present)") if not text.startswith("---\n"): raise ValueError("SKILL.md must begin with YAML frontmatter") end = text.find("\n---\n", 4) if end < 0: raise ValueError("SKILL.md frontmatter is not closed") - fields: dict[str, str] = {} - for line in text[4:end].splitlines(): - if not line or line[0].isspace() or ":" not in line: + fields: dict[str, object] = {} + lines = text[4:end].splitlines() + i = 0 + hermes: dict[str, object] = {} + in_hermes = False + hermes_indent = 0 + while i < len(lines): + line = lines[i] + if not line.strip() or line.lstrip().startswith("#"): + i += 1 continue - key, value = line.split(":", 1) - key = key.strip() - val = value.strip().strip('"').strip("'") - if key in fields: + indent = len(line) - len(line.lstrip(" ")) + stripped = line.strip() + if in_hermes and indent <= hermes_indent: + in_hermes = False + if in_hermes and ":" in stripped: + key, value = stripped.split(":", 1) + key = key.strip() + val = value.strip() + if val in {">", "|", ">-", "|-", ">+", "|+"}: + block, i = _fold_block( + lines, i + 1, indent + 2, literal=val.startswith("|") + ) + hermes[key] = block + continue + hermes[key] = _strip_yaml_scalar(val) if val else [] + i += 1 continue - fields[key] = val + if indent == 0 and ":" in stripped: + key, value = stripped.split(":", 1) + key = key.strip() + val = value.strip() + if val in {">", "|", ">-", "|-", ">+", "|+"}: + block, i = _fold_block( + lines, i + 1, 2, literal=val.startswith("|") + ) + fields[key] = block + continue + fields[key] = _strip_yaml_scalar(val) + i += 1 + continue + if stripped == "hermes:" or stripped.startswith("hermes:"): + in_hermes = True + hermes_indent = indent + i += 1 + continue + i += 1 + if hermes: + fields["_hermes"] = hermes return fields +def validate_description(description: str) -> list[str]: + errors: list[str] = [] + desc = str(description or "").strip() + if not desc: + errors.append("Frontmatter description is empty") + return errors + if len(desc) > SKILL_PROMPT_DESC_LIMIT: + errors.append( + f"Frontmatter description is {len(desc)} chars; Hermes index " + f"truncates past {SKILL_PROMPT_DESC_LIMIT} (57 + '...'). " + "Keep one sentence that ends with a period." + ) + if not desc.endswith("."): + errors.append("Frontmatter description must end with a period") + if desc.count(".") > 1: + errors.append("Frontmatter description must be one sentence") + lower = desc.lower() + hits = [w for w in MARKETING_WORDS if re.search(rf"\b{re.escape(w)}\b", lower)] + if hits: + errors.append(f"Frontmatter description contains marketing words: {hits}") + return errors + + def referenced_relative_paths(text: str) -> set[str]: candidates: set[str] = set() for match in re.finditer( @@ -171,11 +286,18 @@ def main(argv: list[str] | None = None) -> int: argv = list(sys.argv[1:] if argv is None else argv) if any(a in {"-h", "--help"} for a in argv): print("Validate Neon Genie as a portable Hermes skill (stdlib only).") - print("Usage: python scripts/validate_hermes_skill.py") + print("Usage: python scripts/validate_hermes_skill.py [--repository]") print("Exit 0 on PASS; non-zero on FAIL with reasons on stderr.") return 0 + if any(a != "--repository" for a in argv): + print("Unknown option; use --repository for CI validation", file=sys.stderr) + return 2 errors: list[str] = [] + if "--repository" in argv: + workflow = SKILL_ROOT / ".github/workflows/hermes-evals.yml" + if not workflow.is_file(): + errors.append("Repository CI workflow missing: .github/workflows/hermes-evals.yml") hub = ng_paths.is_hub_layout() if not SKILL_FILE.is_file(): @@ -194,8 +316,18 @@ def main(argv: list[str] | None = None) -> int: errors.append(f"Missing frontmatter fields: {', '.join(missing_fields)}") if frontmatter.get("name") != "neon-genie": errors.append("Frontmatter name must be 'neon-genie'") + errors.extend(validate_description(str(frontmatter.get("description", "")))) + hermes_meta = frontmatter.get("_hermes") + if not isinstance(hermes_meta, dict): + errors.append("Missing frontmatter metadata.hermes.{tags, related_skills}") + else: + missing_hermes = sorted(REQUIRED_HERMES_KEYS - set(hermes_meta)) + if missing_hermes: + errors.append( + "Missing metadata.hermes fields: " + ", ".join(missing_hermes) + ) - version_fm = frontmatter.get("version", "") + version_fm = str(frontmatter.get("version", "")) try: version_file = ng_paths.version_path().read_text(encoding="utf-8").strip() except (OSError, FileNotFoundError): diff --git a/skills/neon-genie/CHANGELOG.md b/skills/neon-genie/CHANGELOG.md index 63b6e61..b6ba6b6 100644 --- a/skills/neon-genie/CHANGELOG.md +++ b/skills/neon-genie/CHANGELOG.md @@ -7,10 +7,50 @@ and this project uses semantic versioning. ## [Unreleased] +## [3.27.0] — 2026-09-05 + ### Changed -- Public install/docs paths updated for repo rename **NeonGenie** - (`scrimshawlife-ctrl/NeonGenie`, Pages `…/NeonGenie/`) +- Gate ISO: irreversible work requires conjunction `independent` ∧ versioned log pointer; alias table packet `validation_isolation.*` ↔ graph `validation_step.*`; `validation_log_version` on graph `validation_step` (PROMETHEUS gaps). +- **Required fields** (fail closed): `logic_label` on opportunity/product/zero-option packets; + `stage` on run-envelope (`shape`|`test`|`scale`); `evidence_ledger` on EvidenceIntelligence packets. +- Warn-then-require period for 3.26.x closed after dual-logic / U4 / U7 goldens. +- SkillEvaluator `metadata.author` in frontmatter (`Name ` shape) +- Public README / badge strings aligned to **3.27.0** (away from stale v3.23 / 3.26 copy) + +### Added + +- PR-A: optional `validation_isolation` on WayfinderExecutionPacket; Gate ISO. +- PR-B: PaperPilot `research-search-dag` schema + Gate PILOT (optional attach; write when research runs). +- Goldens: LOGIC / STAGE / BRIC / CITE / LEDGER / ISO / PILOT (`effectual-missing-means`, + `scale-without-test`, `fabricated-cite`, `uncited-claim`, `contradict-unresolved-testable`, + `irreversible-without-validation`, `irreversible-missing-log-pointer`, + `research-ran-without-dag`, `dag-fabricated-cite`) + +### Notes (public mirror) + +- 2026-09-17 PT: this public tree (`scrimshawlife-ctrl/NeonGenie`) is synced to the + org 3.27.0 skill surface. Installer/verification safety from **#20** is preserved: + staged `install.sh` + `scripts/install_transaction.py`, `tests_audit/`, and + `references/source-and-upgrades.md`. Advisory only; no spend/publish/contact. + +## [3.26.1] — 2026-09-01 + +### Fixed + +- `SKILL.md` frontmatter now matches Hermes Agent v0.21.0 (tag v2026.8.31): + one-sentence `description` ≤60 characters, required author/license/platforms + and `metadata.hermes.{tags, related_skills}`, frontmatter at byte 0. +- `do check` rejects folded or over-long descriptions so the skill index + no longer truncates routing text at 57 characters. + +### Changed + +- Skill body uses the v0.21 section order (When to Use, Prerequisites, How to + Run, Quick Reference, Procedure, Pitfalls, Verification). +- Packaging examples use `${HERMES_SKILL_DIR}` and Hermes `terminal`. +- Author credit is `Daniel Meyer (scrimshawlife-ctrl), Hermes Agent`. Applied + Alchemy Labs / Zero State credit remains in the skill body. ## [3.26.0] — 2026-08-08 @@ -42,6 +82,8 @@ and this project uses semantic versioning. - `do run --brief` auto-recipe prefers `capital-sprint` over commercial when both match - Hub package no longer ships Pages assets, hallmark, or monorepo ADR/checklist bulk - Public docs/README aligned to **3.25.0** (site link, founder prompts, capital-sprint CLI) +- Public install/docs paths updated for repo rename **NeonGenie** + (`scrimshawlife-ctrl/NeonGenie`, Pages `…/NeonGenie/`) ## [3.25.0] — 2026-08-06 diff --git a/skills/neon-genie/README.md b/skills/neon-genie/README.md index fabc674..15ae56c 100644 --- a/skills/neon-genie/README.md +++ b/skills/neon-genie/README.md @@ -4,7 +4,7 @@ ### Product & opportunity intelligence for Hermes -[![Version](https://img.shields.io/badge/version-3.26.0-7c3aed?style=for-the-badge)](./manifest.json) +[![Version](https://img.shields.io/badge/version-3.27.0-7c3aed?style=for-the-badge)](./manifest.json) [![Hermes Skill Evals](https://img.shields.io/github/actions/workflow/status/scrimshawlife-ctrl/NeonGenie/hermes-evals.yml?branch=main&label=hermes-evals&style=for-the-badge)](./.github/workflows/hermes-evals.yml) [![Authority](https://img.shields.io/badge/authority-advisory%20only-0ea5e9?style=for-the-badge)](#what-it-will-not-do) [![Privacy](https://img.shields.io/badge/privacy-by%20construction-a855f7?style=for-the-badge)](./PRIVACY.md) @@ -217,10 +217,19 @@ python scripts/neon_genie.py do run --recipe commercial --out out/neon-genie/aud | [CHANGELOG.md](./CHANGELOG.md) | What’s new | | [CONTRIBUTING.md](./CONTRIBUTING.md) | Development | -**Version:** 3.26.0 · **License:** MIT · **Maintainers:** [Applied Alchemy Labs / @scrimshawlife-ctrl](https://github.com/scrimshawlife-ctrl) · [Zero-State-LLC](https://github.com/Zero-State-LLC) +**Version:** 3.27.0 · **License:** MIT · **Maintainers:** [Applied Alchemy Labs / @scrimshawlife-ctrl](https://github.com/scrimshawlife-ctrl) · [Zero-State-LLC](https://github.com/Zero-State-LLC) ---
-Neon Genie v3.26.0 · advice only · evidence before invention +Neon Genie v3.27.0 · advice only · evidence before invention
+ + +## License + +This repository now uses the MIT License for original Zero State materials going forward. See [LICENSE](LICENSE). Earlier grants in repository history are not rewritten. + +Third-party components remain subject to their respective licenses. + +Source, profile, and migration rules: `references/source-and-upgrades.md`. diff --git a/skills/neon-genie/SKILL.md b/skills/neon-genie/SKILL.md index 9c2c30f..fd1d204 100644 --- a/skills/neon-genie/SKILL.md +++ b/skills/neon-genie/SKILL.md @@ -1,16 +1,12 @@ --- name: neon-genie -description: > - Evidence-bound product and opportunity intelligence — audits, zero-option - loops, commercial models, agentic graphs, and Wayfinder handoffs with claim - labels and fail-closed gates. Use for product intent, opportunity mining, - and advisory packets — not cinematic work (use Kubrick) or code execution. -version: 3.26.0 -author: Applied Alchemy Labs / Zero State +description: Audit products and opportunities with labeled evidence. +version: 3.27.0 +author: Daniel Meyer (scrimshawlife-ctrl), Hermes Agent license: MIT platforms: [linux, macos, windows] -dependencies: [] metadata: + author: Applied Alchemy Labs / Zero State hermes: tags: - Product @@ -24,452 +20,268 @@ metadata: - AgenticServices category: product related_skills: [] -triggers: - - neon genie - - product audit - - opportunity mining - - blocked transition - - fragmentation scan - - zero option - - first cash - - agentic services - - x402 - - commercial simulation - - evidence intelligence - - wayfinder handoff - - wayfinder execution packet - - cost of inaction - - audit delivery --- -# Neon Genie v3 +# Neon Genie Skill -## Hermes skill identity +Neon Genie is a standalone Hermes skill for evidence-bound product and opportunity intelligence. It drafts audits, opportunity packets, commercial models, agentic graphs, and Wayfinder handoffs with claim labels and fail-closed gates. It does not execute code, spend, publish, contact, or mutate repositories, and it is not cinematic work (use Kubrick). Credit: Applied Alchemy Labs / Zero State. -Neon Genie is a **standalone Hermes skill**. Hermes loads this directory directly and uses `SKILL.md` as the operating contract. No Python package install, Kubrick skill, Wayfinder runtime, or external knowledge base is required to load. +See `references/hermes-runtime-contract.md` for path, artifact, authority, and dependency policy. Profile contracts, packet schemas, and golden tests ship as hub mirrors and as root `profiles/`, `schemas/`, `evals/` on full install. -See `references/hermes-runtime-contract.md` for path, artifact, authority, and dependency policy. +## When to Use -Profile contracts, packet schemas, and golden tests ship as hub mirrors (see **Hermes Hub support files** below) and as root `profiles/`, `schemas/`, `evals/` on full install. +- Product intent, product audit, app/game/system design, or feature coherence. +- Opportunity mining, blocked transitions, roadmaps, or first-cash / zero-option work. +- Fragmentation, commercial simulation, agentic/x402 graphs, or evidence intelligence. +- Wayfinder execution-packet handoff, audit delivery, or capital-sprint planning. +- The operator needs labeled claims (`OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`) and fail-closed gates. -**Optional companions:** host research tools, Wayfinder (handoff consumer). Their absence never blocks local advisory work. +Do not use for: -## Packaging CLI +- Cinematic or motif work (use Kubrick). +- Code execution, repo mutation, spend, publish, contact, or canon promotion. +- Treating packaging envelopes as execution authority. -One pattern (packaging only — not a product brain): +## Prerequisites -```text -python scripts/neon_genie.py do [options] -``` - -| Job | Use | -|-----|-----| -| `doctor` | Full smoke after install | -| `wizard` | Guided packaging: resolve plan or quick onboarding | -| `privacy` | Resolved repository privacy boundary (`--json`) | -| `check` | Skill integrity | -| `run` | Operator packaging run (brief/recipe → envelope) | -| `capabilities` | Machine-readable skill surface (JSON) | -| `dist` | Hub mirrors + package (`verify` / `write`) | -| `recipe` | Named example (`--list` / `--name`) | -| `route` / `validate` / `receipt` / `envelope` | Profiles, schema, receipt, run envelope | -| `eval` / `transcripts` | Golden tests | -| `behavioral` / `runtime` | Semantic agent gates + hub install smoke | -| `learn` / `reconcile` | PROPOSED ledger entry; link entries to run_id | -| `release-check` | Pre-release version / changelog / dist gate | - -```bash -python scripts/neon_genie.py help -python scripts/neon_genie.py do doctor -python scripts/neon_genie.py do wizard --preset product-audit --print-only --json -python scripts/neon_genie.py do wizard --path quick --auto -python scripts/neon_genie.py do run --recipe product-audit --out out/neon-genie/demo -``` - -### Prefer the wizard - -When the operator is new, unsure which packaging job to run, or says “wizard” / -“guide me” / “walk me through”: - -1. Prefer `do wizard` over freestyling `do run` flags. -2. **Chat-driven Q&A** (Desktop-safe): merge answers JSON → - `do wizard --answers answers.json --print-only --json` → confirm → `--run`. -3. **New install:** `do wizard --path quick --auto` (doctor + sample product-audit). -4. After packaging, resume product judgment in chat (OPEN→SEAL). Envelope is not - execution authority. +- Hermes Agent that can load this directory and invoke `terminal`. +- Python 3 on PATH for the packaging CLI (stdlib only). No package install, API key, or secret is required to load. +- Optional companions: host research tools, Wayfinder (handoff consumer). Their absence never blocks local advisory work. +- Path, artifact, and authority rules: `references/hermes-runtime-contract.md`. +- Privacy contract: root `PRIVACY.md` and hub mirror `references/PRIVACY.md`; always-on profile `profiles/privacy.md`. -Load [references/wizard.md](references/wizard.md) while guiding. Packaging only — -no invented opportunities, no ledger writes, no repo mutation. +## How to Run -See `README.md` (How to use) and `QUICKSTART.md`. Golden prose: `examples/evals/transcripts/README.md`. Post-SEAL: `references/post-seal-verification.md`. Gate ontology: `references/gates.yaml`. Privacy contract: root `PRIVACY.md` and hub mirror `references/PRIVACY.md`; always-on profile `profiles/privacy.md`. +Frame every packaging command through Hermes `terminal`. Substitute `${HERMES_SKILL_DIR}` (Hermes replaces it with the installed skill root): -## Mission - -Convert weak signals, blocked state transitions, fragmented systems, raw ideas, and incomplete products into evidence-bound, externally testable, buildable opportunity systems. +```text +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do [options]") +``` -Neon Genie owns product and opportunity intelligence. It does not grant execution, forecast, governance, spending, publication, or canon-promotion authority. +When the operator is new, unsure which packaging job to run, or says “wizard” / “guide me” / “walk me through”: -## Default operator job (transitional builders) +1. Prefer `do wizard` over freestyling `do run` flags. Completion: a resolve plan is printed or a named recipe is queued. +2. Chat-driven Q&A (Desktop-safe): merge answers JSON → `do wizard --answers answers.json --print-only --json` → confirm → `--run`. Completion: plan JSON matches the answers file. +3. New install: `do wizard --path quick --auto` (doctor + sample product-audit). Completion: doctor exits 0 and a demo envelope exists. +4. After packaging, resume product judgment in chat (OPEN→SEAL). The envelope is not execution authority. -When the operator is developing an idea under constraint (solo, transitional, -limited money/time/skills) and has not named a specialized recipe, default to -this job shape — still **advisory only**: +Load [references/wizard.md](references/wizard.md) while guiding. Packaging only — no invented opportunities, no ledger writes, no repo mutation. -1. **Name the stuck point** — who is blocked, current state, what “done” looks like. -2. **Capture constraints** — time, money, skills, access. Never invent resources. -3. **Find → request → refuse** — research public facts; emit `DataRequest` for private - facts; label claims `OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`. -4. **Shape the plan** — roadmap and/or approach options with **completion_proof** - (externally checkable). Prefer profiles `opportunity_mining` and, when resources - are scarce, `zero_option` (plus `product_architecture` only if a product/system - boundary is in scope). -5. **Seal as drafts** — packets + receipt; no spend, publish, contact, or repo mutation. +See `README.md` (How to use) and `QUICKSTART.md`. Golden prose: `examples/evals/transcripts/README.md`. Post-SEAL: `references/post-seal-verification.md`. Gate ontology: `references/gates.yaml`. -**Example Hermes prompt (plain English):** +## Quick Reference ```text -Use Neon Genie. I'm between jobs with limited money and an app idea. -I need a realistic roadmap and first approaches I can actually run. -Do not invent buyers, capital, or skills I did not declare. -Research public facts if you can; request private facts with DataRequest. -Label every important claim. Advisory only — do not modify any repo. +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py help") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do doctor") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do check") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do wizard --preset product-audit --print-only --json") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do wizard --path quick --auto") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do run --recipe product-audit --out out/neon-genie/demo") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do privacy --json") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do eval") ``` -## Research doctrine (default: proactive) +Jobs: `doctor` (full smoke), `wizard` (guided packaging), `privacy` (resolved boundary), `check` (skill integrity), `run` (brief/recipe → envelope), `capabilities` (JSON surface), `dist` (hub mirrors), `recipe` (named example), `route` / `validate` / `receipt` / `envelope`, `eval` / `transcripts`, `behavioral` / `runtime`, `learn` / `reconcile` (PROPOSED ledger only), `release-check`. -**Automatically perform any research the host can run when it improves usefulness of the result.** Do not wait for the operator to name every source. Prefer a researched, labeled answer over a thin `NOT_COMPUTABLE` wall when facts are fetchable. +## Procedure -### Source stack (priority order) +1. **Load as a standalone skill.** Hermes uses this `SKILL.md` as the operating contract. No Python package install, Kubrick skill, Wayfinder runtime, or external knowledge base is required to load. Completion: skill index shows `neon-genie` with an intact description. -1. **Operator-supplied** — pasted evidence, attached files, declared URLs, explicit `canonical_sources` -2. **Workspace / host context** — open repo, local files, prior run artifacts Hermes can read -3. **Live host research** — web search, page fetch, academic indexes (e.g. arXiv), docs, registries, market/public filings, standards bodies, news, competitor sites, grant/board databases — *whatever tools the host exposes* -4. **Model prior** — only as `SPECULATIVE` or scaffolding; never as `OBSERVED` +2. **State the mission.** Convert weak signals, blocked state transitions, fragmented systems, raw ideas, and incomplete products into evidence-bound, externally testable, buildable opportunity systems. Neon Genie owns product and opportunity intelligence. It does not grant execution, forecast, governance, spending, publication, or canon-promotion authority. Completion: the operator can name the blocked transition and the desired state. -No external knowledge base is required to *load* the skill. Research uses **host-available tools at run time**. If a tool class is unavailable, record the gap and continue with the best remaining stack. +3. **Default operator job (transitional builders).** When the operator is developing an idea under constraint (solo, transitional, limited money/time/skills) and has not named a specialized recipe, still stay advisory only: + 1. Name the stuck point — who is blocked, current state, what “done” looks like. + 2. Capture constraints — time, money, skills, access. Never invent resources. + 3. Find → request → refuse — research public facts; emit `DataRequest` for private facts; label claims `OBSERVED` / `INFERRED` / `SPECULATIVE` / `NOT_COMPUTABLE`. + 4. Shape the plan — roadmap and/or approach options with `completion_proof` (externally checkable). Prefer profiles `opportunity_mining` and, when resources are scarce, `zero_option` (plus `product_architecture` only if a product/system boundary is in scope). + 5. Seal as drafts — packets + receipt; no spend, publish, contact, or repo mutation. -### When to research (auto) + Example Hermes prompt: -Run research during `ALIGN` and again in `ASCEND` whenever any of these hold: + ```text + Use Neon Genie. I'm between jobs with limited money and an app idea. + I need a realistic roadmap and first approaches I can actually run. + Do not invent buyers, capital, or skills I did not declare. + Research public facts if you can; request private facts with DataRequest. + Label every important claim. Advisory only — do not modify any repo. + ``` -- a material claim would otherwise be `NOT_COMPUTABLE` or weak `SPECULATIVE` and is fetchable; -- buyer, market, competitor, pricing, regulation, or technical feasibility is decision-critical; -- grants, boards, philanthropy, standards, or “current external facts” affect the scorecard; -- product/system claims depend on public APIs, licenses, or third-party capabilities; -- the operator asked for an audit, opportunity, commercial model, or handoff packet. + Completion: every material claim has a label; missing private facts have a `DataRequest`. -### Research loop +4. **Research doctrine (default: proactive).** Automatically perform any research the host can run when it improves usefulness. Do not wait for the operator to name every source. Prefer a researched, labeled answer over a thin `NOT_COMPUTABLE` wall when facts are fetchable. -```text -GAP_DETECT → QUERY_PLAN → PRIVACY_EGRESS_CHECK → FETCH (host tools) → NORMALIZE → CITE - → LABEL (OBSERVED | INFERRED | SPECULATIVE | NOT_COMPUTABLE) - → RE-SCORE → (repeat until usefulness plateaus or budget/tooling ends) -``` + Source stack (priority order): -Before every host research/tool send: classify → minimize → `RUNE.PRIVACY_EGRESS_CHECK` → only then FETCH. Outcomes: `ALLOW` | `REDACT_THEN_ALLOW` | `REQUEST_CONSENT` | `BLOCK`. Log attempts in receipt `external_actions`. See `profiles/privacy.md` and `references/PRIVACY.md`. + 1. Operator-supplied — pasted evidence, attached files, declared URLs, explicit `canonical_sources` + 2. Workspace / host context — open repo, local files, prior run artifacts Hermes can read + 3. Live host research — web search, page fetch, academic indexes, docs, registries, market/public filings, standards, news, competitor sites, grant/board databases — *whatever tools the host exposes* + 4. Model prior — only as `SPECULATIVE` or scaffolding; never as `OBSERVED` -### Research rules + No external knowledge base is required to *load* the skill. Research uses host-available tools at run time. If a tool class is unavailable, record the gap and continue with the best remaining stack. -- **Proactive by default** — research is on unless the operator sets `research: false` or `offline: true`. -- **Smallest sufficient fetch** — enough evidence for the decision, not infinite crawl. -- **Cite or drop** — every `OBSERVED` claim needs a source pointer (URL, path, title+date, or tool result id). -- **Find → request private → NOT_COMPUTABLE** — for public/fetchable gaps, attempt research first; for operator/private gaps, emit a `DataRequest` before (or instead of) `NOT_COMPUTABLE`; never invent. -- **Never fabricate** — if fetch fails or tools are absent, mark `NOT_COMPUTABLE` with the attempted query (after find was attempted or correctly skipped offline, and after request when private). -- **Freshness** — prefer primary/current sources; note retrieval time for volatile facts. -- **Attribution boundaries** — separate person / company / foundation / model inference. -- **Authority unchanged** — research may draft; it may not submit, contact, spend, publish, or mutate repos. -- **Privacy** — do not probe private systems without declared access; public + operator-granted only; request private facts via `DataRequest`. Run egress check before host tools; credentials never leave; private/operator egress needs consent. + Run research during `ALIGN` and again in `ASCEND` whenever any of these hold: -## Evidence Request Protocol + - a material claim would otherwise be `NOT_COMPUTABLE` or weak `SPECULATIVE` and is fetchable; + - buyer, market, competitor, pricing, regulation, or technical feasibility is decision-critical; + - grants, boards, philanthropy, standards, or current external facts affect the scorecard; + - product/system claims depend on public APIs, licenses, or third-party capabilities; + - the operator asked for an audit, opportunity, commercial model, or handoff packet. -Priority when a material fact is missing: + Research loop: -1. **Find** — if sensitivity is public (or unknown-but-likely-public) and host tools can run, attempt research; cite or drop. -2. **Request** — if sensitivity is operator/private or access is undeclared, emit a `DataRequest` (`references/schemas/data-request.schema.json`) instead of inventing. -3. **NOT_COMPUTABLE** — only after find was attempted (or correctly skipped offline) and/or a DataRequest is open or unanswered. -4. **Never** mark model prior as `OBSERVED`. + ```text + GAP_DETECT → QUERY_PLAN → PRIVACY_EGRESS_CHECK → FETCH (host tools) → NORMALIZE → CITE + → LABEL (OBSERVED | INFERRED | SPECULATIVE | NOT_COMPUTABLE) + → RE-SCORE → (repeat until usefulness plateaus or budget/tooling ends) + ``` -### DataRequest (required fields) + Before every host research/tool send: classify → minimize → `RUNE.PRIVACY_EGRESS_CHECK` → only then FETCH. Outcomes: `ALLOW` | `REDACT_THEN_ALLOW` | `REQUEST_CONSENT` | `BLOCK`. Log attempts in receipt `external_actions`. See `profiles/privacy.md` and `references/PRIVACY.md`. -- `field`, `why_decision_critical`, `sensitivity` (`public`|`operator`|`private`), - `suggested_source`, `blocks_promotion` (bool), `status` (`open`|`satisfied`|`waived`) + Research rules: -### CLEAR rules + - Proactive by default — research is on unless the operator sets `research: false` or `offline: true`. + - Smallest sufficient fetch — enough evidence for the decision, not infinite crawl. + - Cite or drop — every `OBSERVED` claim needs a source pointer (URL, path, title+date, or tool result id). + - Find → request private → `NOT_COMPUTABLE` — for public/fetchable gaps, attempt research first; for operator/private gaps, emit a `DataRequest` before (or instead of) `NOT_COMPUTABLE`; never invent. + - Never fabricate — if fetch fails or tools are absent, mark `NOT_COMPUTABLE` with the attempted query (after find was attempted or correctly skipped offline, and after request when private). + - Freshness — prefer primary/current sources; note retrieval time for volatile facts. + - Attribution boundaries — separate person / company / foundation / model inference. + - Authority unchanged — research may draft; it may not submit, contact, spend, publish, or mutate repos. + - Privacy — do not probe private systems without declared access; public + operator-granted only; request private facts via `DataRequest`. Run egress check before host tools; credentials never leave; private/operator egress needs consent. -- Public gap + tools available + no research attempt → fail (Gate P) -- Private decision-critical gap + no DataRequest → fail (Gate Q) -- Private/unknown fact labeled OBSERVED from model prior without source → fail (Gate R) -- Open DataRequests with `blocks_promotion: true` cap promotion until satisfied or waived -- CLEAR order: authority → evidence P–R → privacy S–Y → remaining anti-overclaim + Completion: every fetch is cited or dropped; egress decisions are logged. -### SEAL +5. **Evidence Request Protocol.** Priority when a material fact is missing: + 1. Find — if sensitivity is public (or unknown-but-likely-public) and host tools can run, attempt research; cite or drop. + 2. Request — if sensitivity is operator/private or access is undeclared, emit a `DataRequest` (`references/schemas/data-request.schema.json`) instead of inventing. + 3. `NOT_COMPUTABLE` — only after find was attempted (or correctly skipped offline) and/or a DataRequest is open or unanswered. + 4. Never mark model prior as `OBSERVED`. -Run receipt must list `data_requests`, `open_blocking_requests`, and `research_attempts` (may be empty arrays). See `references/schemas/run-receipt.schema.json`. + DataRequest required fields: `field`, `why_decision_critical`, `sensitivity` (`public`|`operator`|`private`), `suggested_source`, `blocks_promotion` (bool), `status` (`open`|`satisfied`|`waived`). -Privacy provenance (Gate Y / `RUNE.PRIVACY_SEAL_PROVENANCE`) is also required: `privacy_mode`, `privacy_contract_version`, `data_sources_used`, `external_actions`, `artifact_paths`, `telemetry_status` (`disabled`), `retention_statement`, `privacy_warnings`, `deletion_instructions`, `redaction`, `research_policy`. Contract: `PRIVACY.md` / `references/PRIVACY.md`. + CLEAR rules: + + - Public gap + tools available + no research attempt → fail (Gate P) + - Private decision-critical gap + no DataRequest → fail (Gate Q) + - Private/unknown fact labeled OBSERVED from model prior without source → fail (Gate R) + - Open DataRequests with `blocks_promotion: true` cap promotion until satisfied or waived + - Dual-logic / stage / means / cites (**required** as of 3.27.0): + - Missing or mismatched `logic_label` (`effectual`|`causal`|`mixed`) when opportunity/product/zero-option CLEAR expects it → fail (Gate LOGIC) + - Opportunity/agentic run missing `stage` (`shape`|`test`|`scale`), or `scale` without test evidence → fail (Gate STAGE) + - Effectual / zero-option with empty means inventory and no DataRequest / NOT_COMPUTABLE → fail (Gate BRIC) + - arXiv/DOI/paper claim without verified fetch or operator source → fail (Gate CITE); never fabricate citations + - Claim graph / EviGraph ledger (`evidence_ledger` **required** on EvidenceIntelligence packets as of 3.27.0; optional peer attach): + - Material claim promotes without an **active ledger cite** (claim node + typed relation) → fail (Gate LEDGER) + - Unresolved `Contradict` / `Invalidate` at ≥TESTABLE → fail (Gate LEDGER) + - Invent-OBSERVED from model prior without ledger cite → fail (Gate LEDGER); fabricated paper IDs still Gate CITE + - Final-answer fluency ≠ provenance; no invent Brier / auto-settle + - Irreversible agentic graph / action without independent validation step + versioned log pointer → fail (Gate ISO); PROMETHEUS consumes `validation_isolation` — no Wayfinder/fifth bot + - Research ran without editable PaperPilot `research_search_dag` (keyword→cite-expand→filter→score→extract) → fail (Gate PILOT; still warn-then-require for DAG until next cycle) + - Also apply (registry `references/gates.yaml`): HYP, METRIC, LIVE, CSET, LEDGER, ISO, PILOT + - CLEAR order: authority → evidence P–R → LOGIC/STAGE/BRIC/CITE/LEDGER → HYP/METRIC/LIVE/CSET → privacy S–Y → remaining anti-overclaim -Opportunity, product, and zero-option packets at `TESTABLE` or higher require **`completion_proof`** (externally checkable) and should include a **`proof_path`**. After SEAL, follow `references/post-seal-verification.md`. Record real outcomes with: + SEAL: run receipt must list `data_requests`, `open_blocking_requests`, and `research_attempts` (may be empty arrays). See `references/schemas/run-receipt.schema.json`. -```bash -python scripts/neon_genie.py do learn --class proof_obtained --summary "..." \ - --envelope out/neon-genie/demo/run-envelope.json \ - --ledger out/neon-genie/learning-ledger.jsonl -python scripts/neon_genie.py do reconcile --ledger out/neon-genie/learning-ledger.jsonl \ - --runs-root out/neon-genie -``` + Privacy provenance (Gate Y / `RUNE.PRIVACY_SEAL_PROVENANCE`) is also required: `privacy_mode`, `privacy_contract_version`, `data_sources_used`, `external_actions`, `artifact_paths`, `telemetry_status` (`disabled`), `retention_statement`, `privacy_warnings`, `deletion_instructions`, `redaction`, `research_policy`. Contract: `PRIVACY.md` / `references/PRIVACY.md`. -Learning ledger entries are `PROPOSED` / `OBSERVATION` only — never auto-canon. Prefer linking via `--envelope` / `run_id`. - -## Default operating sequence - -Always execute: - -1. `OPEN` -2. `ALIGN` ← includes gap-driven research plan + first fetch pass -3. `ASCEND` ← continues research when new gaps appear -4. `CLEAR` -5. `SEAL` ← source manifest lists every fetch - -Every material claim must be labeled: - -- `OBSERVED` -- `INFERRED` -- `SPECULATIVE` -- `NOT_COMPUTABLE` - -SHADOW detects drift and anomalies only. FORECAST performs evidence-based inference only. - -## Router - -Determine the smallest sufficient profile set. **Additionally auto-load** `evidence_intelligence` whenever external facts would change the recommendation, scorecard, or handoff quality — even if the operator did not name that profile. - -```yaml -profile_router: - core: always - privacy: - triggers: [always] - default_when: always_with_core - product_architecture: - triggers: [product audit, app design, game design, system design, feature coherence] - opportunity_mining: - triggers: [new venture, unmet need, market opportunity, blocked transition, roadmap, business idea, go into business, side project, app idea, product idea, what should I build, where do I start, next steps] - fragmentation: - triggers: [many portals, repeated handoffs, incompatible systems, coordination problem] - zero_option: - triggers: [zero capital, first cash, immediate executable opportunity, constrained launch, limited money, limited resources, limited capital, between jobs, bootstrapped, no budget, first revenue] - agentic_services: - triggers: [agent workflow, delegated outcome, automation, x402, machine services] - commercial: - triggers: [pricing, buyer, revenue, costs, market pressure, business model] - evidence_intelligence: - triggers: - - grants - - boards - - philanthropy - - competitive research - - current external facts - - auto: any material external gap that research can close - default_when: improves_result - memetic: - triggers: [name, hook, pitch language, public framing, shareability] - audit_delivery: - triggers: [client audit, cost of inaction, diagnostic package, implementation offer] - wayfinder_handoff: - triggers: [build plan, engineering readiness, execution packet] - capital_sprint: - triggers: - - capital sprint - - annual fund - - donation drive - - membership drive - - fundraising deadline - - impact object - - donor sprint - - nonprofit capital raise -``` + Opportunity, product, and zero-option packets at `TESTABLE` or higher require `completion_proof` (externally checkable) and should include a `proof_path`. After SEAL, follow `references/post-seal-verification.md`. Record real outcomes with: + + ```text + terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do learn --class proof_obtained --summary \"...\" --envelope out/neon-genie/demo/run-envelope.json --ledger out/neon-genie/learning-ledger.jsonl") + terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do reconcile --ledger out/neon-genie/learning-ledger.jsonl --runs-root out/neon-genie") + ``` + + Learning ledger entries are `PROPOSED` / `OBSERVATION` only — never auto-canon. Prefer linking via `--envelope` / `run_id`. Completion: receipt lists requests and research attempts; TESTABLE+ packets have `completion_proof`. + +6. **Default operating sequence.** Always execute `OPEN` → `ALIGN` (gap-driven research plan + first fetch) → `ASCEND` (continue research when new gaps appear) → `CLEAR` → `SEAL` (source manifest lists every fetch). Every material claim must be labeled `OBSERVED`, `INFERRED`, `SPECULATIVE`, or `NOT_COMPUTABLE`. SHADOW detects drift and anomalies only. FORECAST performs evidence-based inference only. Completion: all five modes ran; unlabeled material claims are absent. + +7. **Router.** Determine the smallest sufficient profile set. Additionally auto-load `evidence_intelligence` whenever external facts would change the recommendation, scorecard, or handoff quality — even if the operator did not name that profile. + + Load `references/profile-routing.md` when selecting specialized profiles; it preserves the full trigger registry. Core/privacy always apply, and evidence intelligence loads whenever external facts change the result. + + Do not activate a specialized product/commercial profile merely because it exists. Do activate research when usefulness requires it. Completion: selected profiles match triggers; unused specialized profiles stay unloaded. + +8. **Core pipeline.** + + ```text + SIGNAL + → BLOCKED TRANSITION + → OUTCOME MODEL + → EVIDENCE GAPS + → RESEARCH LOOP (PRIVACY_EGRESS_CHECK → host tools) + → SYSTEM TOPOLOGY + → OPPORTUNITY THESIS + → INTERVENTION + → PRODUCT / SERVICE GRAPH + → VALIDATION LOOP + → SCORECARD + → ROUTING + → VERIFIED OUTCOME + → LEARNING MEMORY + ``` + + Core runes: `RUNE.NG.INTAKE`, `RUNE.NG.EVIDENCE.NORMALIZE`, `RUNE.NG.RESEARCH.GAP_DETECT`, `RUNE.NG.RESEARCH.QUERY_PLAN`, `RUNE.NG.RESEARCH.FETCH`, `RUNE.NG.RESEARCH.CITE`, `RUNE.NG.BLOCKED_TRANSITION`, `RUNE.NG.OUTCOME.MODEL`, `RUNE.NG.TOPOLOGY`, `RUNE.NG.DISCOVER`, `RUNE.NG.RECOMBINE`, `RUNE.NG.DIFFERENTIATE`, `RUNE.NG.SHAPE`, `RUNE.NG.SCORE`, `RUNE.NG.VALIDATE_PATH`, `RUNE.NG.ROUTE`, `RUNE.NG.CLEAR_CHECK`, `RUNE.NG.SEAL`, `RUNE.PRIVACY_CLASSIFY`, `RUNE.PRIVACY_MINIMIZE`, `RUNE.PRIVACY_EGRESS_CHECK`, `RUNE.PRIVACY_SEAL_PROVENANCE`. + + Completion: pipeline stages that ran are named in the receipt; skipped stages have a reason. + +9. **Authority boundaries.** Neon Genie may research (proactively, via host tools), infer, generate, compare, score, model, audit, specify, route, draft, and recommend. Neon Genie may not, without explicit downstream authorization: spend or transfer money; submit applications; contact targets; publish content; modify repositories; execute irreversible workflows; promote artifacts to canon; represent forecasts as facts; mutate runtime state. Completion: no output claims execution authority. + +10. **Output selection.** A run emits one or more of: + + Load `references/output-selection.md` for packet-to-schema mapping. Every run still emits a receipt and validates each emitted packet against its schema. + + Anti-overclaim gates: `references/anti-overclaim-patterns.md`. Privacy: `PRIVACY.md`, `references/PRIVACY.md`, `profiles/privacy.md`. Completion: emitted packets validate against the named schema. + +11. **Promotion ladder.** `RAW_SIGNAL` → `MAPPED` → `CONCEPTUAL` → `TESTABLE` → `SERVICE_FIRST` → `SERVICE_PROVEN` → `SPEC_COMPLETE` → `WAYFINDER_READY` → `BUILD_READY` → `CANON_CANDIDATE` → `ARCHIVED` / `NOT_COMPUTABLE`. A composite score may never override a mandatory gate failure. Completion: promotion state matches the weakest mandatory gate. + +12. **Mandatory gates.** Fail closed when: + + - the desired state is ambiguous; + - the affected user is absent; + - buyer and beneficiary are conflated; + - completion proof is undefined; + - critical integration access is unknown; + - claims lack provenance; + - a proposed action exceeds authority; + - x402 is ornamental rather than economically useful; + - Zero State benefit reduces portability or user control; + - a concept duplicates an existing subsystem without wrapper classification; + - the implementation handoff changes product intent; + - missing data is fabricated instead of marked `NOT_COMPUTABLE` after research was attempted (or correctly skipped under offline mode); + - public fetchable facts are skipped without a research attempt (Gate P); + - private decision-critical facts lack a `DataRequest` (Gate Q); + - private facts are silently invented as `OBSERVED` without source or request (Gate R); + - external action sent with unknown/empty destination (Gate S); + - offline / `LOCAL_ONLY` / research disabled but external send recorded (Gate T); + - credential or secret-like payload would be or was sent (Gate U); + - private/operator egress without consent reference (Gate V); + - absolute privacy claim without matching mode and evidence (Gate W); + - telemetry status is not `disabled` (Gate X); + - SEAL without required privacy provenance fields (Gate Y); + - opportunity/product/zero-option CLEAR without a coherent `logic_label` when dual-logic applies (Gate LOGIC); + - opportunity/agentic run missing `stage`, or recommending `scale` without test evidence (Gate STAGE); + - effectual / zero-option spend-buy-build without means inventory, or empty means without NOT_COMPUTABLE + DataRequest (Gate BRIC); + - fabricated or unverified paper/DOI/arXiv citation (Gate CITE); + - ≥TESTABLE without hypothesis↔MVP map (Gate HYP; distinct from Gate H Wayfinder); + - decision-critical metric without role, or guardrail breached (Gate METRIC); + - live A/B or pricing rec without offline causal pass and without human-yes (Gate LIVE); + - market-share / competitive OBSERVED without competitor_set_definition + metric (Gate CSET); + - material claim without active ledger cite, invent-OBSERVED without ledger, or unresolved Contradict/Invalidate at ≥TESTABLE (Gate LEDGER); + - irreversible agentic action without independent validation_isolation / validation_step (Gate ISO); + - research ran without research_search_dag stages (Gate PILOT). + + Also apply anti-overclaim gates A–R and privacy gates S–Y in `references/anti-overclaim-patterns.md` during CLEAR. Registry: `references/gates.yaml` (includes LOGIC, STAGE, BRIC, CITE, HYP, METRIC, LIVE, CSET, LEDGER, ISO, PILOT). Completion: CLEAR lists every failed gate or records none. -Do not activate a specialized product/commercial profile merely because it exists. Do activate research when usefulness requires it. +13. **Profile loading.** Load the relevant profile markdown contracts (hub mirror files listed below, or root profiles on full install) and follow their local contracts. Profile-specific runes must remain namespaced and must not silently change core outputs. Completion: each loaded profile file exists. -## Core pipeline +14. **Wayfinder contract.** Neon Genie determines what should be built, why it should exist, target user and blocked transition, product boundary, system behavior, success criteria, and proof requirements. Wayfinder determines work decomposition, dependency sequence, milestones, engineering validation, and implementation status. Any proposed change to product intent returns to Neon Genie as a change request. Completion: handoff packets do not rewrite product intent. -```text -SIGNAL -→ BLOCKED TRANSITION -→ OUTCOME MODEL -→ EVIDENCE GAPS -→ RESEARCH LOOP (PRIVACY_EGRESS_CHECK → host tools) -→ SYSTEM TOPOLOGY -→ OPPORTUNITY THESIS -→ INTERVENTION -→ PRODUCT / SERVICE GRAPH -→ VALIDATION LOOP -→ SCORECARD -→ ROUTING -→ VERIFIED OUTCOME -→ LEARNING MEMORY -``` +15. **Registry and memory.** Every run should record: source manifest (operator + workspace + live fetches, with tool and timestamp); research queries attempted and outcomes; input hash; selected profiles; assumptions; scores; promotion state; rejected alternatives; failure reasons; output hash; human review status. + + Neon Genie must become harder to impress over time by learning from failed opportunities, brittle integrations, buyer failures, distribution failures, and anti-capture failures. Capture those as append-only learning ledger observations (`references/schemas/learning-ledger-entry.schema.json`, `do learn`) with `canon_status: PROPOSED` only — never auto-apply to the skill corpus. -## Core runes - -- `RUNE.NG.INTAKE` -- `RUNE.NG.EVIDENCE.NORMALIZE` -- `RUNE.NG.RESEARCH.GAP_DETECT` -- `RUNE.NG.RESEARCH.QUERY_PLAN` -- `RUNE.NG.RESEARCH.FETCH` -- `RUNE.NG.RESEARCH.CITE` -- `RUNE.NG.BLOCKED_TRANSITION` -- `RUNE.NG.OUTCOME.MODEL` -- `RUNE.NG.TOPOLOGY` -- `RUNE.NG.DISCOVER` -- `RUNE.NG.RECOMBINE` -- `RUNE.NG.DIFFERENTIATE` -- `RUNE.NG.SHAPE` -- `RUNE.NG.SCORE` -- `RUNE.NG.VALIDATE_PATH` -- `RUNE.NG.ROUTE` -- `RUNE.NG.CLEAR_CHECK` -- `RUNE.NG.SEAL` -- `RUNE.PRIVACY_CLASSIFY` -- `RUNE.PRIVACY_MINIMIZE` -- `RUNE.PRIVACY_EGRESS_CHECK` -- `RUNE.PRIVACY_SEAL_PROVENANCE` - -## Authority boundaries - -Neon Genie may: - -- research (proactively, via host tools); -- infer; -- generate; -- compare; -- score; -- model; -- audit; -- specify; -- route; -- draft; -- recommend. - -Neon Genie may not, without explicit downstream authorization: - -- spend or transfer money; -- submit applications; -- contact targets; -- publish content; -- modify repositories; -- execute irreversible workflows; -- promote artifacts to canon; -- represent forecasts as facts; -- mutate runtime state. - -## Output selection - -A run emits one or more of: - -- `NeonGenieOpportunityPacket` → `references/schemas/opportunity-packet.schema.json` -- `NeonGenieProductPacket` → `references/schemas/product-packet.schema.json` -- `FragmentationOpportunityPacket` → `references/schemas/fragmentation-packet.schema.json` -- `ZeroOptionPacket` → `references/schemas/zero-option-packet.schema.json` -- `AgenticServiceGraph` → `references/schemas/agentic-service-graph.schema.json` -- `CommercialSimulationPacket` → `references/schemas/commercial-simulation.schema.json` -- `EvidenceIntelligencePacket` → `references/schemas/evidence-intelligence-packet.schema.json` -- `MemeticPressurePacket` → `references/schemas/memetic-pressure-packet.schema.json` -- `AuditDeliveryPacket` → `references/schemas/audit-delivery-packet.schema.json` -- `WayfinderExecutionPacket` → `references/schemas/wayfinder-execution-packet.schema.json` -- `CapitalSprintPacket` → `references/schemas/capital-sprint-packet.schema.json` -- `NeonGenieRunReceipt` → `references/schemas/run-receipt.schema.json` - -Anti-overclaim gates: `references/anti-overclaim-patterns.md`. Privacy: `PRIVACY.md`, `references/PRIVACY.md`, `profiles/privacy.md`. - -## Promotion ladder - -- `RAW_SIGNAL` -- `MAPPED` -- `CONCEPTUAL` -- `TESTABLE` -- `SERVICE_FIRST` -- `SERVICE_PROVEN` -- `SPEC_COMPLETE` -- `WAYFINDER_READY` -- `BUILD_READY` -- `CANON_CANDIDATE` -- `ARCHIVED` -- `NOT_COMPUTABLE` - -A composite score may never override a mandatory gate failure. - -## Mandatory gates - -Fail closed when: - -- the desired state is ambiguous; -- the affected user is absent; -- buyer and beneficiary are conflated; -- completion proof is undefined; -- critical integration access is unknown; -- claims lack provenance; -- a proposed action exceeds authority; -- x402 is ornamental rather than economically useful; -- Zero State benefit reduces portability or user control; -- a concept duplicates an existing subsystem without wrapper classification; -- the implementation handoff changes product intent; -- missing data is fabricated instead of marked `NOT_COMPUTABLE` after research was attempted (or correctly skipped under offline mode); -- public fetchable facts are skipped without a research attempt (Gate P); -- private decision-critical facts lack a `DataRequest` (Gate Q); -- private facts are silently invented as `OBSERVED` without source or request (Gate R); -- external action sent with unknown/empty destination (Gate S); -- offline / `LOCAL_ONLY` / research disabled but external send recorded (Gate T); -- credential or secret-like payload would be or was sent (Gate U); -- private/operator egress without consent reference (Gate V); -- absolute privacy claim without matching mode and evidence (Gate W); -- telemetry status is not `disabled` (Gate X); -- SEAL without required privacy provenance fields (Gate Y). - -Also apply anti-overclaim gates A–R and privacy gates S–Y in `references/anti-overclaim-patterns.md` during CLEAR. Registry: `references/gates.yaml`. - -## Profile loading - -Load the relevant profile markdown contracts (hub mirror files listed below, or root profiles on full install) and follow their local contracts. Profile-specific runes must remain namespaced and must not silently change core outputs. - -## Wayfinder contract - -Neon Genie determines: - -- what should be built; -- why it should exist; -- target user and blocked transition; -- product boundary; -- system behavior; -- success criteria; -- proof requirements. - -Wayfinder determines: - -- work decomposition; -- dependency sequence; -- milestones; -- engineering validation; -- implementation status. - -Any proposed change to product intent returns to Neon Genie as a change request. - -## Registry and memory - -Every run should record: - -- source manifest (operator + workspace + live fetches, with tool and timestamp); -- research queries attempted and outcomes; -- input hash; -- selected profiles; -- assumptions; -- scores; -- promotion state; -- rejected alternatives; -- failure reasons; -- output hash; -- human review status. - -Neon Genie must become harder to impress over time by learning from failed opportunities, brittle integrations, buyer failures, distribution failures, and anti-capture failures. Capture those as append-only learning ledger observations (`references/schemas/learning-ledger-entry.schema.json`, `do learn`) with `canon_status: PROPOSED` only — never auto-apply to the skill corpus. +16. **Hermes Hub support files.** Hub installs copy only the generated list below. ### Hermes Hub support files @@ -511,7 +323,13 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `examples/evals/cases/buyer-beneficiary-conflation.json` - `examples/evals/cases/completion-proof-present.json` - `examples/evals/cases/completion-proof-required.json` +- `examples/evals/cases/contradict-unresolved-testable.json` +- `examples/evals/cases/dag-fabricated-cite.json` +- `examples/evals/cases/effectual-missing-means.json` +- `examples/evals/cases/fabricated-cite.json` - `examples/evals/cases/fictional-resource.json` +- `examples/evals/cases/irreversible-missing-log-pointer.json` +- `examples/evals/cases/irreversible-without-validation.json` - `examples/evals/cases/memetic-cannot-promote.json` - `examples/evals/cases/offline-no-fabricated-observed.json` - `examples/evals/cases/privacy-consent-purpose-bound.json` @@ -522,7 +340,10 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `examples/evals/cases/private-gap-silent-invent.json` - `examples/evals/cases/public-gap-must-attempt-research.json` - `examples/evals/cases/public-gap-research-attempted.json` +- `examples/evals/cases/research-ran-without-dag.json` +- `examples/evals/cases/scale-without-test.json` - `examples/evals/cases/scorecard-cannot-override-gate.json` +- `examples/evals/cases/uncited-claim.json` - `examples/evals/cases/wayfinder-change-control.json` - `examples/evals/cases/x402-misfit.json` - `examples/evals/cases/zero-option.json` @@ -563,8 +384,10 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `references/gates.yaml` - `references/hermes-runtime-contract.md` - `references/manifest.json` +- `references/output-selection.md` - `references/post-seal-verification.md` - `references/privacy-contract.md` +- `references/profile-routing.md` - `references/profiles/agentic_services.md` - `references/profiles/audit_delivery.md` - `references/profiles/capital_sprint.md` @@ -585,17 +408,20 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un - `references/schemas/commercial-simulation.schema.json` - `references/schemas/data-request.schema.json` - `references/schemas/evidence-intelligence-packet.schema.json` +- `references/schemas/evidence-ledger.schema.json` - `references/schemas/fragmentation-packet.schema.json` - `references/schemas/learning-ledger-entry.schema.json` - `references/schemas/memetic-pressure-packet.schema.json` - `references/schemas/opportunity-packet.schema.json` - `references/schemas/privacy-context.schema.json` - `references/schemas/product-packet.schema.json` +- `references/schemas/research-search-dag.schema.json` - `references/schemas/run-envelope.schema.json` - `references/schemas/run-receipt.schema.json` - `references/schemas/wayfinder-execution-packet.schema.json` - `references/schemas/wizard-answers.v1.schema.json` - `references/schemas/zero-option-packet.schema.json` +- `references/source-and-upgrades.md` - `references/wizard.md` - `scripts/audit_release_version.py` - `scripts/build_envelope.py` @@ -631,4 +457,37 @@ Hermes Hub installs only `SKILL.md` plus **explicitly path-referenced** files un Full tree also keeps root schemas, profiles, evals, VERSION, and manifest for clone/`./install.sh` installs (scripts resolve either layout via `scripts/paths.py`). +## Pitfalls + +- A folded or multi-sentence `description` loses routing signal: Hermes indexes 60 characters and truncates at 57 + `...`. +- Leading blank lines or a BOM before `---` fail frontmatter parse. +- Treating `do run` / `run-envelope.json` as execution authority. Packaging is not product judgment. +- Inventing buyers, capital, skills, or `OBSERVED` facts. Use Find → `DataRequest` → `NOT_COMPUTABLE`. +- Skipping host research on public fetchable gaps (Gate P) or skipping `DataRequest` on private gaps (Gate Q). +- Sending credentials or private/operator data without consent (Gates U/V). Offline / `LOCAL_ONLY` still recorded as an external send (Gate T). +- Letting a scorecard override a failed mandatory gate. +- Changing product intent inside a Wayfinder handoff. Return a change request to Neon Genie. +- Loading Kubrick, Wayfinder, or an external knowledge base as a load-time dependency. +- Pointing `related_skills` at other-org repos. Keep `related_skills: []`. +- Machine-local home paths in skill docs. Use `${HERMES_SKILL_DIR}` and repo-relative paths. + +## Verification + +Prove the skill loaded and the packaging CLI still works: + +```text +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do check") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do eval") +terminal(command="python ${HERMES_SKILL_DIR}/scripts/neon_genie.py do doctor") +``` + +Pass when: + +- `SKILL.md` starts at byte 0 with `---`; `name` is `neon-genie`. +- `description` is one sentence, ≤60 characters, ends with a period, and has no marketing words. +- `version`, `author`, `license`, `platforms`, `metadata.hermes.tags`, and `metadata.hermes.related_skills` are present. +- VERSION matches frontmatter and `manifest.json`. +- `do check`, `do eval`, and `do doctor` exit 0. +- Advisory authority is unchanged: no spend, publish, contact, or repo mutation. + Source, profile, and migration rules: `references/source-and-upgrades.md`. diff --git a/skills/neon-genie/VERSION b/skills/neon-genie/VERSION index 419ede3..8c53120 100644 --- a/skills/neon-genie/VERSION +++ b/skills/neon-genie/VERSION @@ -1 +1 @@ -3.26.0 +3.27.0 diff --git a/skills/neon-genie/distribution.yaml b/skills/neon-genie/distribution.yaml index 7bc2f86..05d944f 100644 --- a/skills/neon-genie/distribution.yaml +++ b/skills/neon-genie/distribution.yaml @@ -97,12 +97,15 @@ hub_support_globs: - references/hermes-runtime-contract.md - references/privacy-contract.md - references/wizard.md + - references/profile-routing.md + - references/output-selection.md - references/CAPABILITY_MAP.md - references/GOLDEN_TESTS.md - references/anti-overclaim-patterns.md - references/post-seal-verification.md - references/schema-versioning.md - references/PRIVACY.md + - references/source-and-upgrades.md - references/profiles/*.md - references/schemas/*.json - templates/request.yaml diff --git a/skills/neon-genie/docs/ROADMAP.md b/skills/neon-genie/docs/ROADMAP.md index 46be0dc..5429c16 100644 --- a/skills/neon-genie/docs/ROADMAP.md +++ b/skills/neon-genie/docs/ROADMAP.md @@ -86,6 +86,9 @@ Public entry points: | **3.23.0** | Release automation, branch protection, gates.yaml registry, CONTRIBUTING | | **3.24.0** | Privacy-by-construction spine + runtime (issues #15 + #17); tagged `v3.24.0` | | **3.25.0** | Founder cold-start: founder-language routing, capital_sprint recipe, default transitional-builder job shape, hub list after doctrine, judgment honesty | +| **3.26.0** | Hermes packaging wizard (`do wizard`), presets, `references/wizard.md` | +| **3.26.1** | Hermes Agent v0.21 frontmatter (one-sentence description ≤60 chars) | +| **3.27.0** | Gate ISO + PaperPilot PILOT; required `logic_label` / envelope `stage` / `evidence_ledger`; BRIC / CITE / LEDGER / LOGIC / STAGE fail-closed | Also on main around this line: **capital_sprint** profile/protocol and **external-signals** corpus (labeled references). @@ -111,7 +114,17 @@ Also on main around this line: **capital_sprint** profile/protocol and **externa | Helpers & tests | `privacy_preflight.py`, runtime/integration unit tests, 12 behavioral cases (incl. privacy) | | Hub parity | Distribution spine mirrors + package under `skills/neon-genie/` | -**Program next (optional waves):** W2 Outcomes ∥ W3 Judgment in parallel, then W4 distribution/announce polish. Interfaces: privacy fields on receipt/envelope, `do privacy`, Wayfinder remains optional handoff only. +## 3.27.0 epistemic gates — shipped + +| Theme | Shipped | +|-------|---------| +| Dual-logic / stage | Required `logic_label` (`effectual`\|`causal`\|`mixed`); envelope `stage` (`shape`\|`test`\|`scale`); Gates LOGIC / STAGE / BRIC / CITE | +| Evidence ledger | Shared `evidence-ledger.schema.json`; required on EvidenceIntelligence; optional peer attach; Gate LEDGER | +| Isolation | `validation_isolation` on WayfinderExecutionPacket; Gate ISO (independent ∧ versioned log pointer) | +| PaperPilot | `research-search-dag` schema + Gate PILOT (write DAG when research runs) | +| Packaging | VERSION / SKILL / manifest / schemas / CHANGELOG aligned; public mirror keeps #20 installer safety | + +**Program next (optional waves):** W2 Outcomes ∥ W3 Judgment in parallel, then W4 distribution/announce polish. Interfaces: privacy fields on receipt/envelope, `do privacy`, Wayfinder remains optional handoff only. Live multi-turn Hermes LLM evals stay optional (fixture-only when the host has no Hermes / API keys). Design/plan: [privacy spine design](./superpowers/specs/2026-08-06-neon-genie-privacy-spine-design.md) · [implementation plan](./superpowers/plans/2026-08-06-neon-genie-privacy-spine.md) diff --git a/skills/neon-genie/evals/cases/contradict-unresolved-testable.json b/skills/neon-genie/evals/cases/contradict-unresolved-testable.json new file mode 100644 index 0000000..94164c1 --- /dev/null +++ b/skills/neon-genie/evals/cases/contradict-unresolved-testable.json @@ -0,0 +1,12 @@ +{ + "input": { + "promotion_state": "TESTABLE", + "unresolved_contradict_or_invalidate": true, + "active_ledger_cite": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks \u2265TESTABLE" + } +} diff --git a/skills/neon-genie/evals/cases/dag-fabricated-cite.json b/skills/neon-genie/evals/cases/dag-fabricated-cite.json new file mode 100644 index 0000000..5eed61a --- /dev/null +++ b/skills/neon-genie/evals/cases/dag-fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "in_search_dag": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/skills/neon-genie/evals/cases/effectual-missing-means.json b/skills/neon-genie/evals/cases/effectual-missing-means.json new file mode 100644 index 0000000..959e5c2 --- /dev/null +++ b/skills/neon-genie/evals/cases/effectual-missing-means.json @@ -0,0 +1,13 @@ +{ + "input": { + "logic_label": "effectual", + "means_inventory": [], + "data_request_emitted": false, + "proposed_action": "buy_ads" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE" + } +} diff --git a/skills/neon-genie/evals/cases/fabricated-cite.json b/skills/neon-genie/evals/cases/fabricated-cite.json new file mode 100644 index 0000000..e2d66c5 --- /dev/null +++ b/skills/neon-genie/evals/cases/fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/skills/neon-genie/evals/cases/irreversible-missing-log-pointer.json b/skills/neon-genie/evals/cases/irreversible-missing-log-pointer.json new file mode 100644 index 0000000..2152ef7 --- /dev/null +++ b/skills/neon-genie/evals/cases/irreversible-missing-log-pointer.json @@ -0,0 +1,14 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": true, + "validation_independent": true, + "validation_log_pointer": "", + "validation_log_version": "" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent \u2227 versioned log pointer" + } +} diff --git a/skills/neon-genie/evals/cases/irreversible-without-validation.json b/skills/neon-genie/evals/cases/irreversible-without-validation.json new file mode 100644 index 0000000..5c25674 --- /dev/null +++ b/skills/neon-genie/evals/cases/irreversible-without-validation.json @@ -0,0 +1,12 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": false, + "validation_independent": false + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step" + } +} diff --git a/skills/neon-genie/evals/cases/research-ran-without-dag.json b/skills/neon-genie/evals/cases/research-ran-without-dag.json new file mode 100644 index 0000000..856b852 --- /dev/null +++ b/skills/neon-genie/evals/cases/research-ran-without-dag.json @@ -0,0 +1,12 @@ +{ + "input": { + "research_ran": true, + "dag_present": false, + "dag_stages": [] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag" + } +} diff --git a/skills/neon-genie/evals/cases/scale-without-test.json b/skills/neon-genie/evals/cases/scale-without-test.json new file mode 100644 index 0000000..2cef7f7 --- /dev/null +++ b/skills/neon-genie/evals/cases/scale-without-test.json @@ -0,0 +1,15 @@ +{ + "input": { + "stage": "scale", + "test_evidence_present": false, + "profile_set": [ + "opportunity_mining", + "agentic_services" + ] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence" + } +} diff --git a/skills/neon-genie/evals/cases/uncited-claim.json b/skills/neon-genie/evals/cases/uncited-claim.json new file mode 100644 index 0000000..50196d7 --- /dev/null +++ b/skills/neon-genie/evals/cases/uncited-claim.json @@ -0,0 +1,13 @@ +{ + "input": { + "material_claim": true, + "active_ledger_cite": false, + "promotion_state": "CONCEPTUAL", + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite" + } +} diff --git a/skills/neon-genie/evals/rubric.md b/skills/neon-genie/evals/rubric.md index 931faae..408f343 100644 --- a/skills/neon-genie/evals/rubric.md +++ b/skills/neon-genie/evals/rubric.md @@ -35,3 +35,12 @@ Wave 1 captures invariants for later automated runners. Fixtures live in `evals/ | `private-gap-must-request.json` | Gate Q — private decision-critical gap without DataRequest → GATE_FAIL | | `private-gap-request-open.json` | Gate Q — DataRequest open + blocks_promotion → PASS, promotion_capped | | `private-gap-silent-invent.json` | Gate R — private OBSERVED without DataRequest → GATE_FAIL | +| `effectual-missing-means.json` | Gate BRIC — effectual empty means without DataRequest → GATE_FAIL | +| `scale-without-test.json` | Gate STAGE — scale without test evidence → GATE_FAIL | +| `fabricated-cite.json` | Gate CITE — unverified arXiv/DOI → GATE_FAIL | +| `uncited-claim.json` | Gate LEDGER — material claim without active ledger cite → GATE_FAIL | +| `contradict-unresolved-testable.json` | Gate LEDGER — unresolved Contradict/Invalidate at ≥TESTABLE → GATE_FAIL | +| `irreversible-without-validation.json` | Gate ISO — irreversible agentic without independent validation → GATE_FAIL | +| `research-ran-without-dag.json` | Gate PILOT — research ran without DAG → GATE_FAIL | +| `dag-fabricated-cite.json` | Gate CITE — fabricated cite inside DAG → GATE_FAIL | +| `irreversible-missing-log-pointer.json` | Gate ISO — irreversible without versioned log pointer → GATE_FAIL | diff --git a/skills/neon-genie/examples/evals/cases/contradict-unresolved-testable.json b/skills/neon-genie/examples/evals/cases/contradict-unresolved-testable.json new file mode 100644 index 0000000..94164c1 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/contradict-unresolved-testable.json @@ -0,0 +1,12 @@ +{ + "input": { + "promotion_state": "TESTABLE", + "unresolved_contradict_or_invalidate": true, + "active_ledger_cite": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks \u2265TESTABLE" + } +} diff --git a/skills/neon-genie/examples/evals/cases/dag-fabricated-cite.json b/skills/neon-genie/examples/evals/cases/dag-fabricated-cite.json new file mode 100644 index 0000000..5eed61a --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/dag-fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "in_search_dag": true + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/skills/neon-genie/examples/evals/cases/effectual-missing-means.json b/skills/neon-genie/examples/evals/cases/effectual-missing-means.json new file mode 100644 index 0000000..959e5c2 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/effectual-missing-means.json @@ -0,0 +1,13 @@ +{ + "input": { + "logic_label": "effectual", + "means_inventory": [], + "data_request_emitted": false, + "proposed_action": "buy_ads" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE" + } +} diff --git a/skills/neon-genie/examples/evals/cases/fabricated-cite.json b/skills/neon-genie/examples/evals/cases/fabricated-cite.json new file mode 100644 index 0000000..e2d66c5 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/fabricated-cite.json @@ -0,0 +1,13 @@ +{ + "input": { + "citation": "arXiv:9999.99999", + "verified_fetch": false, + "operator_source": false, + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)" + } +} diff --git a/skills/neon-genie/examples/evals/cases/irreversible-missing-log-pointer.json b/skills/neon-genie/examples/evals/cases/irreversible-missing-log-pointer.json new file mode 100644 index 0000000..2152ef7 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/irreversible-missing-log-pointer.json @@ -0,0 +1,14 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": true, + "validation_independent": true, + "validation_log_pointer": "", + "validation_log_version": "" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent \u2227 versioned log pointer" + } +} diff --git a/skills/neon-genie/examples/evals/cases/irreversible-without-validation.json b/skills/neon-genie/examples/evals/cases/irreversible-without-validation.json new file mode 100644 index 0000000..5c25674 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/irreversible-without-validation.json @@ -0,0 +1,12 @@ +{ + "input": { + "has_irreversible_action": true, + "validation_step_present": false, + "validation_independent": false + }, + "expected": { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step" + } +} diff --git a/skills/neon-genie/examples/evals/cases/research-ran-without-dag.json b/skills/neon-genie/examples/evals/cases/research-ran-without-dag.json new file mode 100644 index 0000000..856b852 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/research-ran-without-dag.json @@ -0,0 +1,12 @@ +{ + "input": { + "research_ran": true, + "dag_present": false, + "dag_stages": [] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag" + } +} diff --git a/skills/neon-genie/examples/evals/cases/scale-without-test.json b/skills/neon-genie/examples/evals/cases/scale-without-test.json new file mode 100644 index 0000000..2cef7f7 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/scale-without-test.json @@ -0,0 +1,15 @@ +{ + "input": { + "stage": "scale", + "test_evidence_present": false, + "profile_set": [ + "opportunity_mining", + "agentic_services" + ] + }, + "expected": { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence" + } +} diff --git a/skills/neon-genie/examples/evals/cases/uncited-claim.json b/skills/neon-genie/examples/evals/cases/uncited-claim.json new file mode 100644 index 0000000..50196d7 --- /dev/null +++ b/skills/neon-genie/examples/evals/cases/uncited-claim.json @@ -0,0 +1,13 @@ +{ + "input": { + "material_claim": true, + "active_ledger_cite": false, + "promotion_state": "CONCEPTUAL", + "claim_label": "OBSERVED" + }, + "expected": { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite" + } +} diff --git a/skills/neon-genie/examples/evals/rubric.md b/skills/neon-genie/examples/evals/rubric.md index 931faae..408f343 100644 --- a/skills/neon-genie/examples/evals/rubric.md +++ b/skills/neon-genie/examples/evals/rubric.md @@ -35,3 +35,12 @@ Wave 1 captures invariants for later automated runners. Fixtures live in `evals/ | `private-gap-must-request.json` | Gate Q — private decision-critical gap without DataRequest → GATE_FAIL | | `private-gap-request-open.json` | Gate Q — DataRequest open + blocks_promotion → PASS, promotion_capped | | `private-gap-silent-invent.json` | Gate R — private OBSERVED without DataRequest → GATE_FAIL | +| `effectual-missing-means.json` | Gate BRIC — effectual empty means without DataRequest → GATE_FAIL | +| `scale-without-test.json` | Gate STAGE — scale without test evidence → GATE_FAIL | +| `fabricated-cite.json` | Gate CITE — unverified arXiv/DOI → GATE_FAIL | +| `uncited-claim.json` | Gate LEDGER — material claim without active ledger cite → GATE_FAIL | +| `contradict-unresolved-testable.json` | Gate LEDGER — unresolved Contradict/Invalidate at ≥TESTABLE → GATE_FAIL | +| `irreversible-without-validation.json` | Gate ISO — irreversible agentic without independent validation → GATE_FAIL | +| `research-ran-without-dag.json` | Gate PILOT — research ran without DAG → GATE_FAIL | +| `dag-fabricated-cite.json` | Gate CITE — fabricated cite inside DAG → GATE_FAIL | +| `irreversible-missing-log-pointer.json` | Gate ISO — irreversible without versioned log pointer → GATE_FAIL | diff --git a/skills/neon-genie/examples/packets/sample-opportunity.packet.json b/skills/neon-genie/examples/packets/sample-opportunity.packet.json index 41a3743..d8bbd67 100644 --- a/skills/neon-genie/examples/packets/sample-opportunity.packet.json +++ b/skills/neon-genie/examples/packets/sample-opportunity.packet.json @@ -8,11 +8,20 @@ "proof": "invoice or signed SOW" }, "system_topology": { - "actors": ["operator", "buyer"], - "systems": ["outreach", "delivery"] + "actors": [ + "operator", + "buyer" + ], + "systems": [ + "outreach", + "delivery" + ] }, "opportunity_thesis": "Warm-network micro-audit converts faster than cold content", - "validation_path": ["offer to 10 warm contacts", "track yes/no"], + "validation_path": [ + "offer to 10 warm contacts", + "track yes/no" + ], "completion_proof": "first paid diagnostic invoice or signed SOW within 14 days", "proof_path": [ "list 10 warm contacts", @@ -25,5 +34,6 @@ "outcome_clarity": 0.7 }, "promotion_state": "TESTABLE", - "authority": "advisory_only" + "authority": "advisory_only", + "logic_label": "mixed" } diff --git a/skills/neon-genie/examples/packets/sample-run-envelope.json b/skills/neon-genie/examples/packets/sample-run-envelope.json index e65d9b1..099d1eb 100644 --- a/skills/neon-genie/examples/packets/sample-run-envelope.json +++ b/skills/neon-genie/examples/packets/sample-run-envelope.json @@ -273,5 +273,6 @@ "provider_retention": "NOT_COMPUTABLE", "provider_processing": "NOT_COMPUTABLE" }, - "learning_ledger_disclosure": "Learning ledger entries are local operator artifacts under the chosen output path; they are never auto-applied to the skill corpus and must not contain raw secrets or private source payloads." + "learning_ledger_disclosure": "Learning ledger entries are local operator artifacts under the chosen output path; they are never auto-applied to the skill corpus and must not contain raw secrets or private source payloads.", + "stage": "shape" } diff --git a/skills/neon-genie/manifest.json b/skills/neon-genie/manifest.json index eab956d..b7fdb41 100644 --- a/skills/neon-genie/manifest.json +++ b/skills/neon-genie/manifest.json @@ -1,6 +1,6 @@ { "skill": "neon-genie", - "version": "3.26.0", + "version": "3.27.0", "profiles": [ "core", "privacy", diff --git a/skills/neon-genie/profiles/agentic_services.md b/skills/neon-genie/profiles/agentic_services.md index 16a3d96..b491613 100644 --- a/skills/neon-genie/profiles/agentic_services.md +++ b/skills/neon-genie/profiles/agentic_services.md @@ -45,3 +45,26 @@ Reject x402 when subscription, account billing, or a persistent relationship is - `NeonGenieRunReceipt` Schema: `schemas/agentic-service-graph.schema.json` + +## Stage vocab (U2 · P0) + +Bind agent/service graphs to envelope stage `shape` | `test` | `scale`. + +- Do not recommend scale automation without test evidence. +- Autonomy gates remain advisory in Neon Genie drafts (no packet elevates execution). + +## Planner / worker / validator roles (P2-1 · no new bots) + +Operational roles **inside** an existing Neon Genie run or PROMETHEUS consume — never a fifth growth bot. + +| Role | Owns | Does not | +|------|------|----------| +| Planner | Goal decomposition, tool plan, CLEAR gate list | Mute tool noise; invent OBSERVED | +| Worker | Tool fetch / transform; noisy output stays in worker context | Bypass privacy S–Y egress checks | +| Validator | Independent non-circular check before irreversible action | Rewrite product intent; grant execution | + +- Multi-step `AgenticServiceGraph` with irreversible action and **no** validation step → autonomy gate fail (CLEAR). Keepers: arXiv:2510.04678, 2503.11951, 2511.03094. +- GenAI empowerment-entrapment checklist (arXiv:2604.02567): hallucinations / overconfidence → anti-overclaim, not phenomenology. +- Privacy S–Y still bind tool workers (egress known, offline no-send, secrets, consent). + +CLEAR (Gate **ISO**): `has_irreversible_action: true` requires conjunction **`validation_step.independent: true` ∧ versioned log pointer** (`log_pointer` + `validation_log_version`). Missing either → GATE_FAIL. Independence is a boolean attestation at SHADOW — no proof protocol. See alias table in `profiles/wayfinder_handoff.md`. Do not invent a fifth bot for the validator role. diff --git a/skills/neon-genie/profiles/capital_sprint.md b/skills/neon-genie/profiles/capital_sprint.md index c9eedeb..ba18139 100644 --- a/skills/neon-genie/profiles/capital_sprint.md +++ b/skills/neon-genie/profiles/capital_sprint.md @@ -104,3 +104,16 @@ Schema: `schemas/capital-sprint-packet.schema.json` ## Related profiles Often co-triggered: `evidence_intelligence`, `commercial`, `memetic`, `opportunity_mining`, `agentic_services`. + +## Bricolage before spend (U3 · P0) + +Before recommending buy/build of new fundraising tooling or paid channels: + +1. Inventory existing rails, warm-network classes, and declared access. +2. Fail CLEAR (Gate BRIC) if proposed spend lacks repertoire scan. +3. Neon remains advisory — spend is always human-yes. + +## Offline-causal before live (P1-3 · secondary) + +Prefer offline/historical raise analysis before recommending live donor A/B or irreversible ask experiments. Thresholds = org policy, not OBSERVED. Live tests need human-yes (AUTHORITY). Gate LIVE. + diff --git a/skills/neon-genie/profiles/commercial.md b/skills/neon-genie/profiles/commercial.md index 138ac89..3122378 100644 --- a/skills/neon-genie/profiles/commercial.md +++ b/skills/neon-genie/profiles/commercial.md @@ -46,3 +46,32 @@ Unsupported numerical projections remain `SPECULATIVE` or `NOT_COMPUTABLE` — n - `NeonGenieRunReceipt` Schema: `schemas/commercial-simulation.schema.json` + +## Metric roles (P0-3) + +Every scored metric in commercial / validation plans must declare a **role**: + +| Role | Meaning | +|------|---------| +| `success` | Primary outcome we want to move | +| `guardrail` | Must not breach; **breach blocks promotion** | +| `deterioration` | Early-warning decline signal | +| `quality` | Evidence / sample / measurement integrity | + +- Guardrail breach or missing role on a decision-critical metric → fail CLEAR (Gate METRIC). +- Never invent conversion rates or volumes (Gate B). +- Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Offline-causal before live (P1-3) + +Do not recommend live pricing tests or user-facing A/B that can irreversibly hurt users until an offline/logged causal pass is noted (or operator human-yes waives). Thresholds are policy, not OBSERVED. `recommended_test_n` stays SPECULATIVE. Gate LIVE. Keepers: arXiv:2001.05699, 1710.03410, 1811.00457. + +## Competitor set before share claims (P2-2) + +Market-share or competitive claims require: + +1. Explicit `competitor_set_definition` (who is in/out). +2. Explicit metric definition (numerator/denominator/time window). + +Missing set when the claim `blocks_promotion` → emit DataRequest `competitor_set_definition` (Gate Q / Gate CSET). “10% share” labeled `OBSERVED` without competitor_set → Gate B/Q/CSET. Keeper: arXiv:2212.04810. + diff --git a/skills/neon-genie/profiles/core.md b/skills/neon-genie/profiles/core.md index 9903167..58f21cd 100644 --- a/skills/neon-genie/profiles/core.md +++ b/skills/neon-genie/profiles/core.md @@ -82,3 +82,37 @@ Composite score never overrides a mandatory gate failure. ## Outputs Always consider `NeonGenieRunReceipt`. Other packets by profile selection. + +## Dual-logic + stage + cite (doctrine 2026-09-05) + +On opportunity/product/zero-option runs, CLEAR also checks: + +- **logic_label** present (`effectual` | `causal` | `mixed`) — Gate LOGIC. +- **stage** on envelope when opportunity/agentic profiles resolve (`shape` | `test` | `scale`) — Gate STAGE; `scale` needs test evidence. +- **Citation integrity** — never invent arXiv/DOI; Gate CITE. +- **Bricolage** — no proposed spend/buy/build without repertoire inventory — Gate BRIC. + +`logic_label` and envelope `stage` are **required** as of 3.27.0 (Gate LOGIC / STAGE). + +## Reconcile 2026-09-05 (prose-only) + +Schema/SKILL field lift **HOLD** (Danny skipped intent). Additional CLEAR prose: + +- Empty means → `NOT_COMPUTABLE` + DataRequest (P0-1). +- Hypothesis↔MVP map before ≥TESTABLE — Gate HYP (P0-2; not Wayfinder Gate H). +- Metric roles; guardrail blocks promotion — Gate METRIC (P0-3). + +## Continue 2026-09-05 (LIVE + CSET) + +- Gate LIVE: offline/logged causal pass before live A/B or pricing recs that can hurt users; human-yes required; no auto-roll. +- Gate CSET: competitor_set_definition + metric before share/competitive OBSERVED claims. + +## Claim graph / Gate LEDGER (U4 · required evidence_ledger on EvidenceIntelligence as of 3.27.0) + +When `evidence_intelligence` resolves (or any material external claim is promoted): + +- Treat the claim graph as CLEAR **control plane**: every promoting claim needs an active ledger cite. +- Relations: `Support` | `Depend-on` | `Contradict` | `Invalidate` | `Update`. +- Gate **LEDGER**: uncited material claim, or invent-OBSERVED from model prior without ledger cite → fail CLEAR. +- Fluency of the final answer is **not** provenance. Do not invent Brier scores or auto-settle. +- `evidence_ledger` required on EvidenceIntelligence packets (3.27.0). diff --git a/skills/neon-genie/profiles/evidence_intelligence.md b/skills/neon-genie/profiles/evidence_intelligence.md index 35fb60b..844ef82 100644 --- a/skills/neon-genie/profiles/evidence_intelligence.md +++ b/skills/neon-genie/profiles/evidence_intelligence.md @@ -71,3 +71,71 @@ Schema: `schemas/evidence-intelligence-packet.schema.json` ## Offline When `research.enabled=false` / offline: use operator + workspace only; model prior ≤ `SPECULATIVE` (Gate N). + +## Citation policy (U8 · P2 lock-now) + +**Never generate** arXiv IDs, DOIs, or paper titles. Only rank / cite IDs that were verified fetched or operator-supplied. + +- Fabricated cite → Gate fail (Gate CITE / anti-overclaim A). +- PaperPilot search DAG (U7): keyword → cite-expand → filter → score → extract. Emit optional `research_search_dag` **only when research runs** (`schemas/research-search-dag.schema.json`). Gate PILOT. Keeper: arXiv:2607.00597. +- Keeper: arXiv:2605.14306 (never-generate-cites). + + +## Metric roles (P0-3) + +When this profile scores or recommends metrics, label each as `success` | `guardrail` | `deterioration` | `quality`. Guardrail breach blocks promotion (Gate METRIC). Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Claim → evidence → stance (P1-1 prose) + +For material claims, prefer the spine **claim → evidence item → stance**. Stance values may still use `Support` | `Contradict` | `Invalidate` | `Unknown`. Keeper: arXiv:2506.16383. + +## Claim graph as control plane (U4 · EviGraph prose · intent DRAFT) + +The **claim graph / evidence ledger** is the CLEAR control plane, not a post-hoc appendix log. Schema/SKILL field lift waits on accepted intent (`intent/2026-09-05-evigraph-ledger.md`); until then emit ledger cites in narrative / `gate_results` notes. + +| Rule | Hold | +|------|------| +| No material claim promotes without an **active ledger cite** (pointer to claim node + evidence edge) | Gate LEDGER | +| Typed relations | `Support` · `Depend-on` · `Contradict` · `Invalidate` · `Update` | +| Do not invent ledger IDs as `OBSERVED` | Gate R / CITE / LEDGER | +| Final-answer fluency ≠ provenance | Anti-overclaim; execution traces ≠ truth (arXiv:2606.04990, 2608.04738, 2607.28374) | +| Contradict / Invalidate without resolution | Block ≥TESTABLE until Update or explicit waive | +| Ready(G)-style closure | SPECULATIVE until schema + goldens; do not invent Brier / auto-settle | + +Keepers: arXiv:2606.04990, 2608.04738, 2607.28374 (plus P1-1 2506.16383). No phenomenology / new bots. + +## Proxy vs construct (P1-2) + +When a metric is a **proxy** for a latent construct, say so. Do not treat proxy movement as construct proof. Keeper: arXiv:2507.02819. + +## Offline-causal before live (P1-3) + +Prefer an **offline / logged-data causal pass** before recommending live A/B, pricing, or other irreversible user-harming tests. + +| Rule | Label / gate | +|------|----------------| +| Offline causal / logged analysis first | Keeper arXiv:2001.05699 | +| Decision thresholds = operator policy | `SPECULATIVE` / policy — not `OBSERVED` (arXiv:1710.03410) | +| `recommended_test_n` | Always `SPECULATIVE` advisory; AUTHORITY forbids auto-roll (arXiv:1811.00457) | +| `p<0.05` (or any significance) as OBSERVED truth without source | Fail CLEAR (Gate B / Gate LIVE) | + +CLEAR: live pricing or A/B recommendation with **no offline pass** and **no human-yes** → blocked (Gate LIVE). + +## Planner / worker / validator in research loop (P2-1) + +- **Planner** (GAP run): gap list, query plan, which CLEAR gates apply. +- **Worker**: host-tool fetches; keep raw/noisy tool output in worker context — do not promote noise to OBSERVED (arXiv:2510.04678). +- **Validator**: independent check that claim→evidence→stance holds before promotion; no circular self-grade. +- Roles are operational only. No phenomenology (“agent feels/wants”). No new bot names for validator. + +## PaperPilot search DAG (U7) + +When research runs, write an editable `research_search_dag`: + +1. `keyword` — seed queries +2. `cite-expand` — expand from verified cites only +3. `filter` — drop irrelevant / contradictory retrieval +4. `score` — rank candidates (no invent Brier / auto-settle) +5. `extract` — pull claims into evidence ledger cites + +CLEAR (Gate **PILOT**): `research_ran: true` but missing/empty DAG → fail (warn-then-require in 3.26.x). Fabricated citation IDs inside DAG nodes → Gate **CITE** (arXiv:2605.14306). Do not invent OBSERVED cites. diff --git a/skills/neon-genie/profiles/fragmentation.md b/skills/neon-genie/profiles/fragmentation.md index b10996d..7b23dca 100644 --- a/skills/neon-genie/profiles/fragmentation.md +++ b/skills/neon-genie/profiles/fragmentation.md @@ -42,3 +42,8 @@ Schema: `schemas/fragmentation-packet.schema.json` - Do not propose a platform “because everything is fragmented” without a measured coordination gap. - Classify wrappers vs silent subsystem duplicates (Gate M). + +## Competitor set before share claims (P2-2) + +If a defrag / aggregator thesis claims market share or “everyone else is fragmented,” define `competitor_set_definition` + the share metric. Otherwise Gate CSET / Gate B. Do not invent competitor lists from model prior (Gate R). + diff --git a/skills/neon-genie/profiles/memetic.md b/skills/neon-genie/profiles/memetic.md index d2dea6e..86379a3 100644 --- a/skills/neon-genie/profiles/memetic.md +++ b/skills/neon-genie/profiles/memetic.md @@ -36,3 +36,10 @@ Schema: `schemas/memetic-pressure-packet.schema.json` - Reject candidates that force untrue claims. - Route approved public language downstream; Neon does not publish. + +## Imitation evidence (P1-4) + +Gate D still holds: memetic strength cannot raise promotion past failed evidence/feasibility. + +When claiming imitation / share pressure, cite **imitation evidence** (observed copies, quotes, remixes) — not vibes. Public language execution stays with **SIGNAL** (or Level 99 when present); Neon only drafts candidates. Keeper: arXiv:2407.11861. + diff --git a/skills/neon-genie/profiles/opportunity_mining.md b/skills/neon-genie/profiles/opportunity_mining.md index 21f2f1a..cb8f0f6 100644 --- a/skills/neon-genie/profiles/opportunity_mining.md +++ b/skills/neon-genie/profiles/opportunity_mining.md @@ -56,3 +56,46 @@ Schema: `schemas/opportunity-packet.schema.json` - High monetization cannot override missing user, proof, or authority. - Weak signals stay `SPECULATIVE` until evidence density rises. + +## Dual-logic label (U1 · P0) + +Every Opportunity / Product / Zero-Option run must emit `logic_label`: `effectual` | `causal` | `mixed`. + +| Label | When | CLEAR | +|-------|------|-------| +| `effectual` | Means-driven explore; affordable loss; partner co-creation | Requires means inventory (declared skills/access/partners). Missing means → fail CLEAR. | +| `causal` | Goal-driven verify; predicted market → build → test | Requires `completion_proof` + test evidence path. Missing proof → Gate G. | +| `mixed` | Explicit split of explore vs verify legs | Each leg must satisfy its own CLEAR rules. | + +Cite keepers: arXiv:2103.07999, arXiv:1711.07045 (OBSERVED). Do not invent OBSERVED citations. + +## Stage vocab (U2 · P0) + +Envelope / opportunity stage: `shape` → `test` (nano-MVP) → `scale`. + +- `shape`: intervention still forming; promotion capped below TESTABLE without proof. +- `test`: nano-MVP / external check running; needs completion_proof definition. +- `scale`: blocked without test evidence (Gate STAGE). + +Keeper: arXiv:2511.09533. + +## Hypothesis↔MVP map (P0-2) + +Before promotion ≥ `TESTABLE`, require an explicit **hypothesis ↔ MVP** map: + +| Field | Rule | +|-------|------| +| falsifiable hypothesis | What must be true for the opportunity to work | +| MVP / nano-test | Smallest external check that could falsify it | +| kill criteria | What evidence stops the path | + +Missing map → fail CLEAR (Gate HYP). Do not promote on thesis prose alone. Keepers: arXiv:1808.05630, arXiv:2506.16334. + +Note: Gate HYP is distinct from Wayfinder **Gate H** (intent-rewrite handoff). + +## Competitor set + recognition basis (P2-2) + +- Competitive / share claims need `competitor_set_definition` + metric definition (Gate CSET; arXiv:2212.04810). +- Opportunity recognition must cite **knowledge_basis** and/or **network_basis** with epistemic labels (arXiv:2401.17448). +- Model-prior networks or access paths → Gate R / DataRequest — never silent `OBSERVED`. + diff --git a/skills/neon-genie/profiles/product_architecture.md b/skills/neon-genie/profiles/product_architecture.md index bb20b6a..ce8386e 100644 --- a/skills/neon-genie/profiles/product_architecture.md +++ b/skills/neon-genie/profiles/product_architecture.md @@ -51,3 +51,16 @@ Schema: `schemas/product-packet.schema.json` - Do not invent technical feasibility; mark `NOT_COMPUTABLE` when critical access is unknown. - Do not silently expand product intent in handoff packets (Gate H). + +## Dual-logic label (U1 · P0) + +Emit `logic_label`: `effectual` | `causal` | `mixed` on product packets. + +- Effectual PD ≠ standard waterfall SE (arXiv:1711.07045). Do not force causal SE process onto means-driven builds. +- Causal verify paths still need completion_proof + acceptance criteria. +- Never invent technical feasibility (Gate K / NOT_COMPUTABLE). + +## Hypothesis↔MVP map (P0-2) + +Product packets promoting ≥ `TESTABLE` need the same hypothesis ↔ MVP map as opportunity_mining (Gate HYP). Validation path must name the falsifier, not only the happy path. Keepers: arXiv:1808.05630, arXiv:2506.16334. + diff --git a/skills/neon-genie/profiles/wayfinder_handoff.md b/skills/neon-genie/profiles/wayfinder_handoff.md index bea1849..43cca98 100644 --- a/skills/neon-genie/profiles/wayfinder_handoff.md +++ b/skills/neon-genie/profiles/wayfinder_handoff.md @@ -37,3 +37,24 @@ Schema: `schemas/wayfinder-execution-packet.schema.json` ## Authority Handoff is still **advisory**. It does not authorize spend, deploy, or repo mutation. Wayfinder runtime is optional; absence never blocks emitting a local packet. + +## Validation isolation (P2-1 · PROMETHEUS consumes) + +Schema: `schemas/wayfinder-execution-packet.schema.json` (`validation_isolation`, optional until a later require-bump). + +**Irreversible conjunction (PROMETHEUS gap close):** when work can irreversibly affect users/spend/egress, CLEAR needs: + +`independent` ∧ versioned log pointer + +i.e. `validation_isolation.independent_of_planner: true` **and** both `validation_log_pointer` + `validation_log_version` (or graph aliases below). Schema if-then remains optional; doctrine is fail-closed in CLEAR. + +### Alias table (packet ↔ graph ↔ eval) + +| Concept | Wayfinder packet | Agentic graph | Eval fixture keys | +|---------|------------------|---------------|-------------------| +| Validation present | `validation_isolation.enabled` | `validation_step.present` | `validation_step_present` / `validation_isolation_enabled` | +| Independence (boolean attestation; SHADOW — no proof protocol) | `validation_isolation.independent_of_planner` | `validation_step.independent` | `validation_independent` / `independent_of_planner` | +| Versioned log pointer | `validation_isolation.validation_log_pointer` | `validation_step.log_pointer` | `validation_log_pointer` | +| Log version / content-hash | `validation_isolation.validation_log_version` | `validation_step.validation_log_version` | `validation_log_version` | + +PROMETHEUS consumes these fields — **no Wayfinder bot**, no fifth growth bot. Gate H (intent rewrite) still binds. Gate **ISO** when irreversible work lacks the conjunction above. Keepers: arXiv:2503.11951, 2511.03094. diff --git a/skills/neon-genie/profiles/zero_option.md b/skills/neon-genie/profiles/zero_option.md index a8fc9fa..fe77fec 100644 --- a/skills/neon-genie/profiles/zero_option.md +++ b/skills/neon-genie/profiles/zero_option.md @@ -56,3 +56,24 @@ Schema: `schemas/zero-option-packet.schema.json` ## Fail closed If skills and access are empty or unusable under constraints → `NOT_COMPUTABLE` with reason (see `evals/cases/zero-option.json`). + +## Dual-logic + bricolage (U1 · U3 · P0) + +Default Zero-Option posture is **effectual** (means → optional loops). Emit `logic_label`. + +**Bricolage checklist (before buy/build):** +1. Inventory declared repertoire: skills, access, tools, inventory, relationships (operator-supplied only). +2. Prefer recombine existing means over purchase or invent. +3. Affordable-loss framing when any spend is proposed — still advisory; human-yes on spend. +4. Forbid inventing missing resources (Gate G / Gate BRIC). + +Keepers: arXiv:2108.09943, arXiv:2507.02819 (cite Sarasvathy / Baker&Nelson via these; NOT_COMPUTABLE as direct arXiv). + +## Means inventory empty (P0-1) + +Tighten U3 / effectual CLEAR: + +- **Means** = declared skills + access + tools + inventory + relationships (operator-supplied only). +- If means inventory is **empty or unusable** under constraints → `NOT_COMPUTABLE` **and** emit a `DataRequest` for the missing means (Gate Q / Gate BRIC). Do not invent means. Do not promote. +- Keepers: arXiv:2312.00916, arXiv:2311.14340, arXiv:2108.09943. + diff --git a/skills/neon-genie/references/VERSION b/skills/neon-genie/references/VERSION index 419ede3..8c53120 100644 --- a/skills/neon-genie/references/VERSION +++ b/skills/neon-genie/references/VERSION @@ -1 +1 @@ -3.26.0 +3.27.0 diff --git a/skills/neon-genie/references/anti-overclaim-patterns.md b/skills/neon-genie/references/anti-overclaim-patterns.md index 9f08836..921b97c 100644 --- a/skills/neon-genie/references/anti-overclaim-patterns.md +++ b/skills/neon-genie/references/anti-overclaim-patterns.md @@ -4,6 +4,8 @@ Gates that keep Neon Genie evidence-bound and advisory. Fail closed when a patte Use alongside mandatory gates in `SKILL.md`. Labels: `OBSERVED` · `INFERRED` · `SPECULATIVE` · `NOT_COMPUTABLE`. +**Fluency ≠ provenance:** a fluent final answer (or a tidy agent trace) is not evidence that claims are grounded. Execution provenance ≠ final-answer accuracy. Prefer claim-graph ledger cites over narrative polish (arXiv:2606.04990, 2608.04738, 2607.28374). Do not invent Brier / auto-settle scores. + | Gate | Pattern | Repair | |------|---------|--------| | **A — Fabricated fact** | Claim presented as true without source or research attempt | Label `NOT_COMPUTABLE` or re-fetch; never invent `OBSERVED` | @@ -36,6 +38,27 @@ Gates **A–R** apply during CLEAR (evidence + anti-overclaim). Gates **S–Y** CLEAR order: **authority → evidence P–R → privacy S–Y → remaining anti-overclaim**. + +| **LOGIC — Dual-logic missing** | Opportunity/Product/Zero-Option run without `effectual`/`causal`/`mixed`, or effectual without means inventory | Emit label; inventory means or fail CLEAR | +| **STAGE — Scale without test** | Envelope/stage `scale` without test evidence, or missing stage on opp/agentic run | Set `shape`/`test`/`scale`; block scale | +| **BRIC — Buy/build without repertoire** | Proposed spend/buy/build without declared-means inventory | Inventory first; Gate G if inventing resources | +| **CITE — Generated citation** | arXiv/DOI/title invented rather than verified fetch or operator-supplied | Drop or re-fetch; never invent OBSERVED cites | + + +| **HYP — Hypothesis↔MVP missing** | ≥TESTABLE without falsifiable hypothesis ↔ MVP ↔ kill map | Emit map; distinct from Wayfinder Gate H | +| **METRIC — Role/guardrail** | Decision metric lacks success\|guardrail\|deterioration\|quality, or guardrail breached | Label roles; guardrail blocks promotion | + + +| **LIVE — Offline before live** | Live A/B or pricing rec without offline/logged causal pass + human-yes; or p-value as OBSERVED without source | Offline pass or human-yes; keep n SPECULATIVE; no auto-roll | +| **CSET — Competitor set missing** | Share/competitive OBSERVED without competitor_set_definition + metric | Define set/metric or DataRequest; else Gate B/Q | + + +| **LEDGER — Uncited claim / invent OBSERVED** | Material claim promotes without active ledger cite, or OBSERVED from model prior without ledger edge; unresolved Contradict/Invalidate at ≥TESTABLE | Emit ledger cite + typed relation (`Support`/`Depend-on`/`Contradict`/`Invalidate`/`Update`); else relabel or block | + +| **ISO — Missing validation isolation** | Irreversible agentic action / graph without independent validation step + log pointer | Emit validation_step / validation_isolation; PROMETHEUS consumes — no fifth bot | + +| **PILOT — Research DAG missing** | Research ran but `research_search_dag` missing/empty | Emit keyword→cite-expand→filter→score→extract DAG; fabricated IDs → CITE | + ## Scorecard rule A composite score **never** overrides a mandatory gate failure or an anti-overclaim fail-closed outcome. diff --git a/skills/neon-genie/references/gates.yaml b/skills/neon-genie/references/gates.yaml index 70dd70f..7bede76 100644 --- a/skills/neon-genie/references/gates.yaml +++ b/skills/neon-genie/references/gates.yaml @@ -171,3 +171,145 @@ gates: - profiles/privacy.md - schemas/run-receipt.schema.json - references/PRIVACY.md + + # Doctrine 2026-09-05 (arXiv keepers / Boof P0). Schema fields pending accepted intent. + LOGIC: + name: dual_logic_label_required + severity: blocking + condition: opportunity_or_product_or_zero_option_run && logic_label_missing_or_invalid + remediation: emit_effectual_or_causal_or_mixed_with_matching_CLEAR_inputs + refs: + - profiles/opportunity_mining.md + - profiles/product_architecture.md + - profiles/zero_option.md + - /workspace/neon-genie-adapt/arxiv/UPGRADE-BRIEF.md + - arXiv:2103.07999 + - arXiv:1711.07045 + + STAGE: + name: stage_vocab_and_scale_gate + severity: blocking + condition: (scale_without_test_evidence) || (opportunity_or_agentic_run && stage_missing) + remediation: set_shape_test_or_scale_and_block_scale_without_test + refs: + - profiles/opportunity_mining.md + - profiles/agentic_services.md + - profiles/core.md + - arXiv:2511.09533 + + BRIC: + name: bricolage_before_buy_build + severity: blocking + condition: proposed_spend_or_buy_or_build_without_repertoire_inventory || means_inventory_empty_on_effectual_or_zero_option + remediation: inventory_declared_means_or_NOT_COMPUTABLE_plus_DataRequest + refs: + - profiles/zero_option.md + - profiles/capital_sprint.md + - arXiv:2108.09943 + - arXiv:2507.02819 + + CITE: + name: never_generate_citations + severity: blocking + condition: arxiv_doi_or_paper_claim_without_verified_fetch_or_operator_source + remediation: drop_cite_or_fetch_then_cite_only_verified_ids + refs: + - profiles/evidence_intelligence.md + - profiles/core.md + - references/anti-overclaim-patterns.md + - arXiv:2605.14306 + + # Reconcile 2026-09-05 — prose-only (schema HOLD) + HYP: + name: hypothesis_mvp_map_before_testable + severity: blocking + condition: promotion_gte_testable && hypothesis_mvp_map_missing + remediation: emit_falsifiable_hypothesis_mvp_and_kill_criteria + refs: + - profiles/opportunity_mining.md + - profiles/product_architecture.md + - arXiv:1808.05630 + - arXiv:2506.16334 + note: Distinct from Gate H / WAYFINDER (intent-rewrite handoff). + + METRIC: + name: metric_roles_and_guardrail + severity: blocking + condition: decision_critical_metric_without_role || guardrail_breached + remediation: label_success_guardrail_deterioration_or_quality_and_block_on_guardrail + refs: + - profiles/commercial.md + - profiles/evidence_intelligence.md + - arXiv:2402.11609 + - arXiv:2210.17187 + + # Continue 2026-09-05 — prose-only (schema HOLD) + LIVE: + name: offline_causal_before_live_test + severity: blocking + condition: live_ab_or_pricing_rec_without_offline_pass_and_without_human_yes || significance_claimed_observed_without_source + remediation: require_offline_logged_causal_pass_or_human_yes_keep_recommended_test_n_speculative + refs: + - profiles/evidence_intelligence.md + - profiles/commercial.md + - profiles/capital_sprint.md + - arXiv:2001.05699 + - arXiv:1710.03410 + - arXiv:1811.00457 + + CSET: + name: competitor_set_before_share_claims + severity: blocking + condition: market_share_or_competitive_observed_without_competitor_set_definition || missing_metric_definition + remediation: emit_competitor_set_definition_DataRequest_when_blocks_promotion_or_relabel + refs: + - profiles/opportunity_mining.md + - profiles/commercial.md + - profiles/fragmentation.md + - arXiv:2212.04810 + - arXiv:2401.17448 + + # U4 EviGraph — prose scaffolding (intent DRAFT; no SKILL/schema rewrite yet) + LEDGER: + name: claim_graph_ledger_cite_required + severity: blocking + condition: material_claim_without_active_ledger_cite || invent_observed_from_model_prior_without_ledger || unresolved_contradict_at_testable + remediation: emit_ledger_cite_with_typed_relation_or_relabel_or_block_promotion + refs: + - profiles/evidence_intelligence.md + - profiles/core.md + - intent/2026-09-05-evigraph-ledger.md + - arXiv:2606.04990 + - arXiv:2608.04738 + - arXiv:2607.28374 + note: Intent ACCEPTED 2026-09-05; schemas/evidence-ledger.schema.json optional in 3.26.x (warn-then-require). Relation enum Support|Depend-on|Contradict|Invalidate|Update. + + # PR-A 2026-09-05 — validation_isolation (P2-1) + ISO: + name: validation_isolation_before_irreversible + severity: blocking + condition: irreversible_action_and_not_(independent_and_versioned_log_pointer) + remediation: emit_independent_true_and_log_pointer_plus_validation_log_version + refs: + - profiles/wayfinder_handoff.md + - profiles/agentic_services.md + - schemas/wayfinder-execution-packet.schema.json + - intent/2026-09-05-validation-isolation.md + - arXiv:2503.11951 + - arXiv:2511.03094 + note: Conjunction independent ∧ versioned log pointer when irreversible. Independence = boolean attestation (SHADOW, no proof). Alias table in profiles/wayfinder_handoff.md. PROMETHEUS consumes; no Wayfinder/fifth bot. + + # PR-B 2026-09-05 — U7 PaperPilot search DAG + PILOT: + name: research_search_dag_when_research_runs + severity: blocking + condition: research_ran_without_search_dag || empty_dag_stages_when_research_ran + remediation: emit_research_search_dag_keyword_cite_expand_filter_score_extract + refs: + - profiles/evidence_intelligence.md + - schemas/research-search-dag.schema.json + - intent/2026-09-05-paperpilot-search-dag.md + - arXiv:2607.00597 + - arXiv:2605.14306 + note: Warn-then-require in 3.26.x. Fabricated cites remain Gate CITE. No invent Brier. + diff --git a/skills/neon-genie/references/manifest.json b/skills/neon-genie/references/manifest.json index eab956d..b7fdb41 100644 --- a/skills/neon-genie/references/manifest.json +++ b/skills/neon-genie/references/manifest.json @@ -1,6 +1,6 @@ { "skill": "neon-genie", - "version": "3.26.0", + "version": "3.27.0", "profiles": [ "core", "privacy", diff --git a/skills/neon-genie/references/output-selection.md b/skills/neon-genie/references/output-selection.md new file mode 100644 index 0000000..bc7cb19 --- /dev/null +++ b/skills/neon-genie/references/output-selection.md @@ -0,0 +1,16 @@ +# Output packet selection + +Load when selecting or validating a specialized output. These schemas do not grant execution authority. + + - `NeonGenieOpportunityPacket` → `references/schemas/opportunity-packet.schema.json` + - `NeonGenieProductPacket` → `references/schemas/product-packet.schema.json` + - `FragmentationOpportunityPacket` → `references/schemas/fragmentation-packet.schema.json` + - `ZeroOptionPacket` → `references/schemas/zero-option-packet.schema.json` + - `AgenticServiceGraph` → `references/schemas/agentic-service-graph.schema.json` + - `CommercialSimulationPacket` → `references/schemas/commercial-simulation.schema.json` + - `EvidenceIntelligencePacket` → `references/schemas/evidence-intelligence-packet.schema.json` + - `MemeticPressurePacket` → `references/schemas/memetic-pressure-packet.schema.json` + - `AuditDeliveryPacket` → `references/schemas/audit-delivery-packet.schema.json` + - `WayfinderExecutionPacket` → `references/schemas/wayfinder-execution-packet.schema.json` + - `CapitalSprintPacket` → `references/schemas/capital-sprint-packet.schema.json` + - `NeonGenieRunReceipt` → `references/schemas/run-receipt.schema.json` diff --git a/skills/neon-genie/references/profile-routing.md b/skills/neon-genie/references/profile-routing.md new file mode 100644 index 0000000..b3517f8 --- /dev/null +++ b/skills/neon-genie/references/profile-routing.md @@ -0,0 +1,48 @@ +# Profile routing (load when choosing specialized modes) + +Core and privacy always apply. Auto-load evidence intelligence when external facts matter. + + ```yaml + profile_router: + core: always + privacy: + triggers: [always] + default_when: always_with_core + product_architecture: + triggers: [product audit, app design, game design, system design, feature coherence] + opportunity_mining: + triggers: [new venture, unmet need, market opportunity, blocked transition, roadmap, business idea, go into business, side project, app idea, product idea, what should I build, where do I start, next steps] + fragmentation: + triggers: [many portals, repeated handoffs, incompatible systems, coordination problem] + zero_option: + triggers: [zero capital, first cash, immediate executable opportunity, constrained launch, limited money, limited resources, limited capital, between jobs, bootstrapped, no budget, first revenue] + agentic_services: + triggers: [agent workflow, delegated outcome, automation, x402, machine services] + commercial: + triggers: [pricing, buyer, revenue, costs, market pressure, business model] + evidence_intelligence: + triggers: + - grants + - boards + - philanthropy + - competitive research + - current external facts + - auto: any material external gap that research can close + default_when: improves_result + memetic: + triggers: [name, hook, pitch language, public framing, shareability] + audit_delivery: + triggers: [client audit, cost of inaction, diagnostic package, implementation offer] + wayfinder_handoff: + triggers: [build plan, engineering readiness, execution packet] + capital_sprint: + triggers: + - capital sprint + - annual fund + - donation drive + - membership drive + - fundraising deadline + - impact object + - donor sprint + - nonprofit capital raise + ``` diff --git a/skills/neon-genie/references/profiles/agentic_services.md b/skills/neon-genie/references/profiles/agentic_services.md index 16a3d96..b491613 100644 --- a/skills/neon-genie/references/profiles/agentic_services.md +++ b/skills/neon-genie/references/profiles/agentic_services.md @@ -45,3 +45,26 @@ Reject x402 when subscription, account billing, or a persistent relationship is - `NeonGenieRunReceipt` Schema: `schemas/agentic-service-graph.schema.json` + +## Stage vocab (U2 · P0) + +Bind agent/service graphs to envelope stage `shape` | `test` | `scale`. + +- Do not recommend scale automation without test evidence. +- Autonomy gates remain advisory in Neon Genie drafts (no packet elevates execution). + +## Planner / worker / validator roles (P2-1 · no new bots) + +Operational roles **inside** an existing Neon Genie run or PROMETHEUS consume — never a fifth growth bot. + +| Role | Owns | Does not | +|------|------|----------| +| Planner | Goal decomposition, tool plan, CLEAR gate list | Mute tool noise; invent OBSERVED | +| Worker | Tool fetch / transform; noisy output stays in worker context | Bypass privacy S–Y egress checks | +| Validator | Independent non-circular check before irreversible action | Rewrite product intent; grant execution | + +- Multi-step `AgenticServiceGraph` with irreversible action and **no** validation step → autonomy gate fail (CLEAR). Keepers: arXiv:2510.04678, 2503.11951, 2511.03094. +- GenAI empowerment-entrapment checklist (arXiv:2604.02567): hallucinations / overconfidence → anti-overclaim, not phenomenology. +- Privacy S–Y still bind tool workers (egress known, offline no-send, secrets, consent). + +CLEAR (Gate **ISO**): `has_irreversible_action: true` requires conjunction **`validation_step.independent: true` ∧ versioned log pointer** (`log_pointer` + `validation_log_version`). Missing either → GATE_FAIL. Independence is a boolean attestation at SHADOW — no proof protocol. See alias table in `profiles/wayfinder_handoff.md`. Do not invent a fifth bot for the validator role. diff --git a/skills/neon-genie/references/profiles/capital_sprint.md b/skills/neon-genie/references/profiles/capital_sprint.md index c9eedeb..ba18139 100644 --- a/skills/neon-genie/references/profiles/capital_sprint.md +++ b/skills/neon-genie/references/profiles/capital_sprint.md @@ -104,3 +104,16 @@ Schema: `schemas/capital-sprint-packet.schema.json` ## Related profiles Often co-triggered: `evidence_intelligence`, `commercial`, `memetic`, `opportunity_mining`, `agentic_services`. + +## Bricolage before spend (U3 · P0) + +Before recommending buy/build of new fundraising tooling or paid channels: + +1. Inventory existing rails, warm-network classes, and declared access. +2. Fail CLEAR (Gate BRIC) if proposed spend lacks repertoire scan. +3. Neon remains advisory — spend is always human-yes. + +## Offline-causal before live (P1-3 · secondary) + +Prefer offline/historical raise analysis before recommending live donor A/B or irreversible ask experiments. Thresholds = org policy, not OBSERVED. Live tests need human-yes (AUTHORITY). Gate LIVE. + diff --git a/skills/neon-genie/references/profiles/commercial.md b/skills/neon-genie/references/profiles/commercial.md index 138ac89..3122378 100644 --- a/skills/neon-genie/references/profiles/commercial.md +++ b/skills/neon-genie/references/profiles/commercial.md @@ -46,3 +46,32 @@ Unsupported numerical projections remain `SPECULATIVE` or `NOT_COMPUTABLE` — n - `NeonGenieRunReceipt` Schema: `schemas/commercial-simulation.schema.json` + +## Metric roles (P0-3) + +Every scored metric in commercial / validation plans must declare a **role**: + +| Role | Meaning | +|------|---------| +| `success` | Primary outcome we want to move | +| `guardrail` | Must not breach; **breach blocks promotion** | +| `deterioration` | Early-warning decline signal | +| `quality` | Evidence / sample / measurement integrity | + +- Guardrail breach or missing role on a decision-critical metric → fail CLEAR (Gate METRIC). +- Never invent conversion rates or volumes (Gate B). +- Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Offline-causal before live (P1-3) + +Do not recommend live pricing tests or user-facing A/B that can irreversibly hurt users until an offline/logged causal pass is noted (or operator human-yes waives). Thresholds are policy, not OBSERVED. `recommended_test_n` stays SPECULATIVE. Gate LIVE. Keepers: arXiv:2001.05699, 1710.03410, 1811.00457. + +## Competitor set before share claims (P2-2) + +Market-share or competitive claims require: + +1. Explicit `competitor_set_definition` (who is in/out). +2. Explicit metric definition (numerator/denominator/time window). + +Missing set when the claim `blocks_promotion` → emit DataRequest `competitor_set_definition` (Gate Q / Gate CSET). “10% share” labeled `OBSERVED` without competitor_set → Gate B/Q/CSET. Keeper: arXiv:2212.04810. + diff --git a/skills/neon-genie/references/profiles/core.md b/skills/neon-genie/references/profiles/core.md index 9903167..58f21cd 100644 --- a/skills/neon-genie/references/profiles/core.md +++ b/skills/neon-genie/references/profiles/core.md @@ -82,3 +82,37 @@ Composite score never overrides a mandatory gate failure. ## Outputs Always consider `NeonGenieRunReceipt`. Other packets by profile selection. + +## Dual-logic + stage + cite (doctrine 2026-09-05) + +On opportunity/product/zero-option runs, CLEAR also checks: + +- **logic_label** present (`effectual` | `causal` | `mixed`) — Gate LOGIC. +- **stage** on envelope when opportunity/agentic profiles resolve (`shape` | `test` | `scale`) — Gate STAGE; `scale` needs test evidence. +- **Citation integrity** — never invent arXiv/DOI; Gate CITE. +- **Bricolage** — no proposed spend/buy/build without repertoire inventory — Gate BRIC. + +`logic_label` and envelope `stage` are **required** as of 3.27.0 (Gate LOGIC / STAGE). + +## Reconcile 2026-09-05 (prose-only) + +Schema/SKILL field lift **HOLD** (Danny skipped intent). Additional CLEAR prose: + +- Empty means → `NOT_COMPUTABLE` + DataRequest (P0-1). +- Hypothesis↔MVP map before ≥TESTABLE — Gate HYP (P0-2; not Wayfinder Gate H). +- Metric roles; guardrail blocks promotion — Gate METRIC (P0-3). + +## Continue 2026-09-05 (LIVE + CSET) + +- Gate LIVE: offline/logged causal pass before live A/B or pricing recs that can hurt users; human-yes required; no auto-roll. +- Gate CSET: competitor_set_definition + metric before share/competitive OBSERVED claims. + +## Claim graph / Gate LEDGER (U4 · required evidence_ledger on EvidenceIntelligence as of 3.27.0) + +When `evidence_intelligence` resolves (or any material external claim is promoted): + +- Treat the claim graph as CLEAR **control plane**: every promoting claim needs an active ledger cite. +- Relations: `Support` | `Depend-on` | `Contradict` | `Invalidate` | `Update`. +- Gate **LEDGER**: uncited material claim, or invent-OBSERVED from model prior without ledger cite → fail CLEAR. +- Fluency of the final answer is **not** provenance. Do not invent Brier scores or auto-settle. +- `evidence_ledger` required on EvidenceIntelligence packets (3.27.0). diff --git a/skills/neon-genie/references/profiles/evidence_intelligence.md b/skills/neon-genie/references/profiles/evidence_intelligence.md index 35fb60b..844ef82 100644 --- a/skills/neon-genie/references/profiles/evidence_intelligence.md +++ b/skills/neon-genie/references/profiles/evidence_intelligence.md @@ -71,3 +71,71 @@ Schema: `schemas/evidence-intelligence-packet.schema.json` ## Offline When `research.enabled=false` / offline: use operator + workspace only; model prior ≤ `SPECULATIVE` (Gate N). + +## Citation policy (U8 · P2 lock-now) + +**Never generate** arXiv IDs, DOIs, or paper titles. Only rank / cite IDs that were verified fetched or operator-supplied. + +- Fabricated cite → Gate fail (Gate CITE / anti-overclaim A). +- PaperPilot search DAG (U7): keyword → cite-expand → filter → score → extract. Emit optional `research_search_dag` **only when research runs** (`schemas/research-search-dag.schema.json`). Gate PILOT. Keeper: arXiv:2607.00597. +- Keeper: arXiv:2605.14306 (never-generate-cites). + + +## Metric roles (P0-3) + +When this profile scores or recommends metrics, label each as `success` | `guardrail` | `deterioration` | `quality`. Guardrail breach blocks promotion (Gate METRIC). Keepers: arXiv:2402.11609, arXiv:2210.17187. + +## Claim → evidence → stance (P1-1 prose) + +For material claims, prefer the spine **claim → evidence item → stance**. Stance values may still use `Support` | `Contradict` | `Invalidate` | `Unknown`. Keeper: arXiv:2506.16383. + +## Claim graph as control plane (U4 · EviGraph prose · intent DRAFT) + +The **claim graph / evidence ledger** is the CLEAR control plane, not a post-hoc appendix log. Schema/SKILL field lift waits on accepted intent (`intent/2026-09-05-evigraph-ledger.md`); until then emit ledger cites in narrative / `gate_results` notes. + +| Rule | Hold | +|------|------| +| No material claim promotes without an **active ledger cite** (pointer to claim node + evidence edge) | Gate LEDGER | +| Typed relations | `Support` · `Depend-on` · `Contradict` · `Invalidate` · `Update` | +| Do not invent ledger IDs as `OBSERVED` | Gate R / CITE / LEDGER | +| Final-answer fluency ≠ provenance | Anti-overclaim; execution traces ≠ truth (arXiv:2606.04990, 2608.04738, 2607.28374) | +| Contradict / Invalidate without resolution | Block ≥TESTABLE until Update or explicit waive | +| Ready(G)-style closure | SPECULATIVE until schema + goldens; do not invent Brier / auto-settle | + +Keepers: arXiv:2606.04990, 2608.04738, 2607.28374 (plus P1-1 2506.16383). No phenomenology / new bots. + +## Proxy vs construct (P1-2) + +When a metric is a **proxy** for a latent construct, say so. Do not treat proxy movement as construct proof. Keeper: arXiv:2507.02819. + +## Offline-causal before live (P1-3) + +Prefer an **offline / logged-data causal pass** before recommending live A/B, pricing, or other irreversible user-harming tests. + +| Rule | Label / gate | +|------|----------------| +| Offline causal / logged analysis first | Keeper arXiv:2001.05699 | +| Decision thresholds = operator policy | `SPECULATIVE` / policy — not `OBSERVED` (arXiv:1710.03410) | +| `recommended_test_n` | Always `SPECULATIVE` advisory; AUTHORITY forbids auto-roll (arXiv:1811.00457) | +| `p<0.05` (or any significance) as OBSERVED truth without source | Fail CLEAR (Gate B / Gate LIVE) | + +CLEAR: live pricing or A/B recommendation with **no offline pass** and **no human-yes** → blocked (Gate LIVE). + +## Planner / worker / validator in research loop (P2-1) + +- **Planner** (GAP run): gap list, query plan, which CLEAR gates apply. +- **Worker**: host-tool fetches; keep raw/noisy tool output in worker context — do not promote noise to OBSERVED (arXiv:2510.04678). +- **Validator**: independent check that claim→evidence→stance holds before promotion; no circular self-grade. +- Roles are operational only. No phenomenology (“agent feels/wants”). No new bot names for validator. + +## PaperPilot search DAG (U7) + +When research runs, write an editable `research_search_dag`: + +1. `keyword` — seed queries +2. `cite-expand` — expand from verified cites only +3. `filter` — drop irrelevant / contradictory retrieval +4. `score` — rank candidates (no invent Brier / auto-settle) +5. `extract` — pull claims into evidence ledger cites + +CLEAR (Gate **PILOT**): `research_ran: true` but missing/empty DAG → fail (warn-then-require in 3.26.x). Fabricated citation IDs inside DAG nodes → Gate **CITE** (arXiv:2605.14306). Do not invent OBSERVED cites. diff --git a/skills/neon-genie/references/profiles/fragmentation.md b/skills/neon-genie/references/profiles/fragmentation.md index b10996d..7b23dca 100644 --- a/skills/neon-genie/references/profiles/fragmentation.md +++ b/skills/neon-genie/references/profiles/fragmentation.md @@ -42,3 +42,8 @@ Schema: `schemas/fragmentation-packet.schema.json` - Do not propose a platform “because everything is fragmented” without a measured coordination gap. - Classify wrappers vs silent subsystem duplicates (Gate M). + +## Competitor set before share claims (P2-2) + +If a defrag / aggregator thesis claims market share or “everyone else is fragmented,” define `competitor_set_definition` + the share metric. Otherwise Gate CSET / Gate B. Do not invent competitor lists from model prior (Gate R). + diff --git a/skills/neon-genie/references/profiles/memetic.md b/skills/neon-genie/references/profiles/memetic.md index d2dea6e..86379a3 100644 --- a/skills/neon-genie/references/profiles/memetic.md +++ b/skills/neon-genie/references/profiles/memetic.md @@ -36,3 +36,10 @@ Schema: `schemas/memetic-pressure-packet.schema.json` - Reject candidates that force untrue claims. - Route approved public language downstream; Neon does not publish. + +## Imitation evidence (P1-4) + +Gate D still holds: memetic strength cannot raise promotion past failed evidence/feasibility. + +When claiming imitation / share pressure, cite **imitation evidence** (observed copies, quotes, remixes) — not vibes. Public language execution stays with **SIGNAL** (or Level 99 when present); Neon only drafts candidates. Keeper: arXiv:2407.11861. + diff --git a/skills/neon-genie/references/profiles/opportunity_mining.md b/skills/neon-genie/references/profiles/opportunity_mining.md index 21f2f1a..cb8f0f6 100644 --- a/skills/neon-genie/references/profiles/opportunity_mining.md +++ b/skills/neon-genie/references/profiles/opportunity_mining.md @@ -56,3 +56,46 @@ Schema: `schemas/opportunity-packet.schema.json` - High monetization cannot override missing user, proof, or authority. - Weak signals stay `SPECULATIVE` until evidence density rises. + +## Dual-logic label (U1 · P0) + +Every Opportunity / Product / Zero-Option run must emit `logic_label`: `effectual` | `causal` | `mixed`. + +| Label | When | CLEAR | +|-------|------|-------| +| `effectual` | Means-driven explore; affordable loss; partner co-creation | Requires means inventory (declared skills/access/partners). Missing means → fail CLEAR. | +| `causal` | Goal-driven verify; predicted market → build → test | Requires `completion_proof` + test evidence path. Missing proof → Gate G. | +| `mixed` | Explicit split of explore vs verify legs | Each leg must satisfy its own CLEAR rules. | + +Cite keepers: arXiv:2103.07999, arXiv:1711.07045 (OBSERVED). Do not invent OBSERVED citations. + +## Stage vocab (U2 · P0) + +Envelope / opportunity stage: `shape` → `test` (nano-MVP) → `scale`. + +- `shape`: intervention still forming; promotion capped below TESTABLE without proof. +- `test`: nano-MVP / external check running; needs completion_proof definition. +- `scale`: blocked without test evidence (Gate STAGE). + +Keeper: arXiv:2511.09533. + +## Hypothesis↔MVP map (P0-2) + +Before promotion ≥ `TESTABLE`, require an explicit **hypothesis ↔ MVP** map: + +| Field | Rule | +|-------|------| +| falsifiable hypothesis | What must be true for the opportunity to work | +| MVP / nano-test | Smallest external check that could falsify it | +| kill criteria | What evidence stops the path | + +Missing map → fail CLEAR (Gate HYP). Do not promote on thesis prose alone. Keepers: arXiv:1808.05630, arXiv:2506.16334. + +Note: Gate HYP is distinct from Wayfinder **Gate H** (intent-rewrite handoff). + +## Competitor set + recognition basis (P2-2) + +- Competitive / share claims need `competitor_set_definition` + metric definition (Gate CSET; arXiv:2212.04810). +- Opportunity recognition must cite **knowledge_basis** and/or **network_basis** with epistemic labels (arXiv:2401.17448). +- Model-prior networks or access paths → Gate R / DataRequest — never silent `OBSERVED`. + diff --git a/skills/neon-genie/references/profiles/product_architecture.md b/skills/neon-genie/references/profiles/product_architecture.md index bb20b6a..ce8386e 100644 --- a/skills/neon-genie/references/profiles/product_architecture.md +++ b/skills/neon-genie/references/profiles/product_architecture.md @@ -51,3 +51,16 @@ Schema: `schemas/product-packet.schema.json` - Do not invent technical feasibility; mark `NOT_COMPUTABLE` when critical access is unknown. - Do not silently expand product intent in handoff packets (Gate H). + +## Dual-logic label (U1 · P0) + +Emit `logic_label`: `effectual` | `causal` | `mixed` on product packets. + +- Effectual PD ≠ standard waterfall SE (arXiv:1711.07045). Do not force causal SE process onto means-driven builds. +- Causal verify paths still need completion_proof + acceptance criteria. +- Never invent technical feasibility (Gate K / NOT_COMPUTABLE). + +## Hypothesis↔MVP map (P0-2) + +Product packets promoting ≥ `TESTABLE` need the same hypothesis ↔ MVP map as opportunity_mining (Gate HYP). Validation path must name the falsifier, not only the happy path. Keepers: arXiv:1808.05630, arXiv:2506.16334. + diff --git a/skills/neon-genie/references/profiles/wayfinder_handoff.md b/skills/neon-genie/references/profiles/wayfinder_handoff.md index bea1849..43cca98 100644 --- a/skills/neon-genie/references/profiles/wayfinder_handoff.md +++ b/skills/neon-genie/references/profiles/wayfinder_handoff.md @@ -37,3 +37,24 @@ Schema: `schemas/wayfinder-execution-packet.schema.json` ## Authority Handoff is still **advisory**. It does not authorize spend, deploy, or repo mutation. Wayfinder runtime is optional; absence never blocks emitting a local packet. + +## Validation isolation (P2-1 · PROMETHEUS consumes) + +Schema: `schemas/wayfinder-execution-packet.schema.json` (`validation_isolation`, optional until a later require-bump). + +**Irreversible conjunction (PROMETHEUS gap close):** when work can irreversibly affect users/spend/egress, CLEAR needs: + +`independent` ∧ versioned log pointer + +i.e. `validation_isolation.independent_of_planner: true` **and** both `validation_log_pointer` + `validation_log_version` (or graph aliases below). Schema if-then remains optional; doctrine is fail-closed in CLEAR. + +### Alias table (packet ↔ graph ↔ eval) + +| Concept | Wayfinder packet | Agentic graph | Eval fixture keys | +|---------|------------------|---------------|-------------------| +| Validation present | `validation_isolation.enabled` | `validation_step.present` | `validation_step_present` / `validation_isolation_enabled` | +| Independence (boolean attestation; SHADOW — no proof protocol) | `validation_isolation.independent_of_planner` | `validation_step.independent` | `validation_independent` / `independent_of_planner` | +| Versioned log pointer | `validation_isolation.validation_log_pointer` | `validation_step.log_pointer` | `validation_log_pointer` | +| Log version / content-hash | `validation_isolation.validation_log_version` | `validation_step.validation_log_version` | `validation_log_version` | + +PROMETHEUS consumes these fields — **no Wayfinder bot**, no fifth growth bot. Gate H (intent rewrite) still binds. Gate **ISO** when irreversible work lacks the conjunction above. Keepers: arXiv:2503.11951, 2511.03094. diff --git a/skills/neon-genie/references/profiles/zero_option.md b/skills/neon-genie/references/profiles/zero_option.md index a8fc9fa..fe77fec 100644 --- a/skills/neon-genie/references/profiles/zero_option.md +++ b/skills/neon-genie/references/profiles/zero_option.md @@ -56,3 +56,24 @@ Schema: `schemas/zero-option-packet.schema.json` ## Fail closed If skills and access are empty or unusable under constraints → `NOT_COMPUTABLE` with reason (see `evals/cases/zero-option.json`). + +## Dual-logic + bricolage (U1 · U3 · P0) + +Default Zero-Option posture is **effectual** (means → optional loops). Emit `logic_label`. + +**Bricolage checklist (before buy/build):** +1. Inventory declared repertoire: skills, access, tools, inventory, relationships (operator-supplied only). +2. Prefer recombine existing means over purchase or invent. +3. Affordable-loss framing when any spend is proposed — still advisory; human-yes on spend. +4. Forbid inventing missing resources (Gate G / Gate BRIC). + +Keepers: arXiv:2108.09943, arXiv:2507.02819 (cite Sarasvathy / Baker&Nelson via these; NOT_COMPUTABLE as direct arXiv). + +## Means inventory empty (P0-1) + +Tighten U3 / effectual CLEAR: + +- **Means** = declared skills + access + tools + inventory + relationships (operator-supplied only). +- If means inventory is **empty or unusable** under constraints → `NOT_COMPUTABLE` **and** emit a `DataRequest` for the missing means (Gate Q / Gate BRIC). Do not invent means. Do not promote. +- Keepers: arXiv:2312.00916, arXiv:2311.14340, arXiv:2108.09943. + diff --git a/skills/neon-genie/references/schemas/agentic-service-graph.schema.json b/skills/neon-genie/references/schemas/agentic-service-graph.schema.json index 01f2d0c..4fa635c 100644 --- a/skills/neon-genie/references/schemas/agentic-service-graph.schema.json +++ b/skills/neon-genie/references/schemas/agentic-service-graph.schema.json @@ -14,7 +14,34 @@ "actions": {}, "authority_gates": {}, "exception_paths": {}, - "completion_proof": {} + "completion_proof": {}, + "validation_step": { + "type": "object", + "description": "Independent non-circular validation before irreversible actions. When has_irreversible_action is true, CLEAR requires independent=true AND a versioned log pointer (log_pointer + validation_log_version). Absence \u2192 Gate ISO fail. PROMETHEUS consumes; no fifth bot.", + "properties": { + "present": { + "type": "boolean", + "description": "True when a validation step exists. Alias of validation_isolation.enabled" + }, + "independent": { + "type": "boolean", + "description": "Boolean attestation that validator is non-circular vs planner (SHADOW \u2014 no proof protocol). Alias of validation_isolation.independent_of_planner" + }, + "log_pointer": { + "type": "string", + "description": "Alias of packet validation_isolation.validation_log_pointer \u2014 versioned log / receipt path or URI" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at log_pointer (parity with wayfinder validation_isolation.validation_log_version)" + } + }, + "additionalProperties": true + }, + "has_irreversible_action": { + "type": "boolean", + "description": "True when any action can irreversibly affect users/spend/egress" + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/skills/neon-genie/references/schemas/evidence-intelligence-packet.schema.json b/skills/neon-genie/references/schemas/evidence-intelligence-packet.schema.json index b54d6fa..6c757b2 100644 --- a/skills/neon-genie/references/schemas/evidence-intelligence-packet.schema.json +++ b/skills/neon-genie/references/schemas/evidence-intelligence-packet.schema.json @@ -10,7 +10,8 @@ "tooling_gaps", "attribution_boundaries", "research_log", - "not_computable_fields" + "not_computable_fields", + "evidence_ledger" ], "properties": { "decision_questions": {}, @@ -24,7 +25,229 @@ "competitive_scan": {}, "grant_or_funder_map": {}, "board_or_stakeholder_map": {}, - "freshness_notes": {} + "freshness_notes": {}, + "evidence_ledger": { + "description": "Required as of 3.27.0 when EvidenceIntelligence packet is emitted. Typed EviGraph claim graph; see evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + }, + "research_search_dag": { + "description": "Optional in 3.26.x (warn-then-require). Write only when research runs. Canonical: schemas/research-search-dag.schema.json. Gate PILOT.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true } diff --git a/skills/neon-genie/references/schemas/evidence-ledger.schema.json b/skills/neon-genie/references/schemas/evidence-ledger.schema.json new file mode 100644 index 0000000..4480ec6 --- /dev/null +++ b/skills/neon-genie/references/schemas/evidence-ledger.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/evidence-ledger/1.0.0", + "title": "Evidence Ledger (EviGraph claim graph)", + "description": "Shared claim graph for Gate LEDGER. Required on EvidenceIntelligence packets as of 3.27.0. No invent Brier / auto-settle.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/skills/neon-genie/references/schemas/opportunity-packet.schema.json b/skills/neon-genie/references/schemas/opportunity-packet.schema.json index 1a89042..992f09c 100644 --- a/skills/neon-genie/references/schemas/opportunity-packet.schema.json +++ b/skills/neon-genie/references/schemas/opportunity-packet.schema.json @@ -10,7 +10,8 @@ "validation_path", "completion_proof", "scorecard", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "blocked_transition": {}, @@ -25,6 +26,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/skills/neon-genie/references/schemas/product-packet.schema.json b/skills/neon-genie/references/schemas/product-packet.schema.json index 5c2f2b9..aafe3e4 100644 --- a/skills/neon-genie/references/schemas/product-packet.schema.json +++ b/skills/neon-genie/references/schemas/product-packet.schema.json @@ -12,7 +12,8 @@ "experience_architecture", "validation_path", "completion_proof", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "target_user": {}, @@ -29,6 +30,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered eng/operator steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/skills/neon-genie/references/schemas/research-search-dag.schema.json b/skills/neon-genie/references/schemas/research-search-dag.schema.json new file mode 100644 index 0000000..5cf589f --- /dev/null +++ b/skills/neon-genie/references/schemas/research-search-dag.schema.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/research-search-dag/1.0.0", + "title": "Research Search DAG (PaperPilot)", + "description": "Editable search DAG written only when research runs. Stages: keyword \u2192 cite-expand \u2192 filter \u2192 score \u2192 extract. Optional in 3.26.x (warn-then-require). Never invent citations (Gate CITE). Keeper arXiv:2607.00597.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/skills/neon-genie/references/schemas/run-envelope.schema.json b/skills/neon-genie/references/schemas/run-envelope.schema.json index 674a24c..5aec5bc 100644 --- a/skills/neon-genie/references/schemas/run-envelope.schema.json +++ b/skills/neon-genie/references/schemas/run-envelope.schema.json @@ -16,7 +16,8 @@ "artifacts", "promotion", "receipt", - "generator" + "generator", + "stage" ], "properties": { "schema_id": { @@ -55,59 +56,118 @@ "request": { "type": "object", "properties": { - "request_id": { "type": "string" }, - "summary": { "type": "string" }, - "brief_path": { "type": "string" }, - "recipe": { "type": "string" }, + "request_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "brief_path": { + "type": "string" + }, + "recipe": { + "type": "string" + }, "requested_profiles": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } } } }, "resolved_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "minItems": 1 }, "mode_status": { "type": "object", - "required": ["OPEN", "ALIGN", "ASCEND", "CLEAR", "SEAL"], + "required": [ + "OPEN", + "ALIGN", + "ASCEND", + "CLEAR", + "SEAL" + ], "properties": { - "OPEN": { "type": "string" }, - "ALIGN": { "type": "string" }, - "ASCEND": { "type": "string" }, - "CLEAR": { "type": "string" }, - "SEAL": { "type": "string" } + "OPEN": { + "type": "string" + }, + "ALIGN": { + "type": "string" + }, + "ASCEND": { + "type": "string" + }, + "CLEAR": { + "type": "string" + }, + "SEAL": { + "type": "string" + } }, "additionalProperties": false }, "primary_artifact": { "type": "object", - "required": ["type", "path", "artifact_id"], + "required": [ + "type", + "path", + "artifact_id" + ], "properties": { - "type": { "type": "string" }, - "path": { "type": "string" }, - "artifact_id": { "type": "string" }, - "content_hash": { "type": "string" } + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "artifact_id": { + "type": "string" + }, + "content_hash": { + "type": "string" + } } }, "artifacts": { "type": "array", "items": { "type": "object", - "required": ["artifact_id", "type", "path", "content_hash"], + "required": [ + "artifact_id", + "type", + "path", + "content_hash" + ], "properties": { - "artifact_id": { "type": "string" }, - "type": { "type": "string" }, - "path": { "type": "string" }, - "content_hash": { "type": "string" }, + "artifact_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "content_hash": { + "type": "string" + }, "parent_artifact_ids": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } + }, + "schema_id": { + "type": "string" }, - "schema_id": { "type": "string" }, - "schema_version": { "type": "string" } + "schema_version": { + "type": "string" + } } } }, @@ -119,20 +179,32 @@ "items": { "type": "object", "properties": { - "gate": { "type": "string" }, - "status": { "type": "string" }, - "detail": { "type": "string" } + "gate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "detail": { + "type": "string" + } } } }, "promotion": { "type": "object", - "required": ["state"], + "required": [ + "state" + ], "properties": { - "state": { "type": "string" }, + "state": { + "type": "string" + }, "blocking_gates": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } }, "open_blocking_requests": { "type": "array" @@ -146,45 +218,96 @@ "receipt_path": { "type": "string" }, - "privacy": { "$ref": "privacy-context.schema.json" }, - "privacy_mode": { "enum": ["local_only", "external_research_allowed", "custom"] }, - "external_actions": { "type": "array" }, - "artifact_paths": { "type": "array" }, - "telemetry_status": { "const": "disabled" }, - "deletion_instructions": { "type": "string" }, + "privacy": { + "$ref": "privacy-context.schema.json" + }, + "privacy_mode": { + "enum": [ + "local_only", + "external_research_allowed", + "custom" + ] + }, + "external_actions": { + "type": "array" + }, + "artifact_paths": { + "type": "array" + }, + "telemetry_status": { + "const": "disabled" + }, + "deletion_instructions": { + "type": "string" + }, "content_hash": { "type": "string", "description": "sha256 of envelope body without content_hash field" }, "generator": { "type": "object", - "required": ["skill", "version", "tool"], + "required": [ + "skill", + "version", + "tool" + ], "properties": { - "skill": { "type": "string" }, - "version": { "type": "string" }, - "tool": { "type": "string" } + "skill": { + "type": "string" + }, + "version": { + "type": "string" + }, + "tool": { + "type": "string" + } } }, "wayfinder": { "type": "object", "description": "Canonical Wayfinder ingestion hints", "properties": { - "ingest": { "type": "string", "const": "run-envelope.json" }, - "product_intent_changes_require_neon_genie_review": { "type": "boolean" }, - "handoff_path": { "type": ["string", "null"] } + "ingest": { + "type": "string", + "const": "run-envelope.json" + }, + "product_intent_changes_require_neon_genie_review": { + "type": "boolean" + }, + "handoff_path": { + "type": [ + "string", + "null" + ] + } } }, "selected_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "description": "Deprecated alias for resolved_profiles" }, "outputs": { "type": "array", "description": "Deprecated alias for artifacts (v0 compatibility)" }, - "canonical_sources": { "type": "array" }, - "assumptions": { "type": "array" } + "canonical_sources": { + "type": "array" + }, + "assumptions": { + "type": "array" + }, + "stage": { + "type": "string", + "enum": [ + "shape", + "test", + "scale" + ], + "description": "Required as of 3.27.0. Gate STAGE. Enum shape|test|scale. scale needs test evidence." + } }, "additionalProperties": true } diff --git a/skills/neon-genie/references/schemas/wayfinder-execution-packet.schema.json b/skills/neon-genie/references/schemas/wayfinder-execution-packet.schema.json index 44d2804..0c56da1 100644 --- a/skills/neon-genie/references/schemas/wayfinder-execution-packet.schema.json +++ b/skills/neon-genie/references/schemas/wayfinder-execution-packet.schema.json @@ -20,7 +20,36 @@ "acceptance_criteria": {}, "workstreams": {}, "validation_gates": {}, - "change_control": {} + "change_control": {}, + "validation_isolation": { + "type": "object", + "description": "Optional. Independent eng validation step separate from the planner that authored the packet. PROMETHEUS consumes \u2014 no Wayfinder bot. Gate ISO / P2-1.", + "properties": { + "enabled": { + "type": "boolean" + }, + "independent_of_planner": { + "type": "boolean", + "description": "True when validator is non-circular vs the planner that wrote the packet" + }, + "validator_role": { + "type": "string", + "description": "Operational role label only (e.g. eng_validator). Not a bot identity." + }, + "validation_log_pointer": { + "type": "string", + "description": "Versioned log / receipt path or URI for the validation pass" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at pointer" + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/skills/neon-genie/references/schemas/zero-option-packet.schema.json b/skills/neon-genie/references/schemas/zero-option-packet.schema.json index dba5e0f..83352cd 100644 --- a/skills/neon-genie/references/schemas/zero-option-packet.schema.json +++ b/skills/neon-genie/references/schemas/zero-option-packet.schema.json @@ -8,7 +8,8 @@ "opportunities", "shadow_flags", "system_state", - "completion_proof" + "completion_proof", + "logic_label" ], "properties": { "constraints": {}, @@ -20,10 +21,19 @@ "description": "Observable proof of first cash/signal or honest NOT_COMPUTABLE reason" }, "proof_path": { - "description": "Micro-loop steps: narrative → action → result → reinforcement" + "description": "Micro-loop steps: narrative \u2192 action \u2192 result \u2192 reinforcement" }, "status": {}, - "reason": {} + "reason": {}, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + } }, "additionalProperties": true } diff --git a/skills/neon-genie/references/source-and-upgrades.md b/skills/neon-genie/references/source-and-upgrades.md index ec14b69..0a8f1ab 100644 --- a/skills/neon-genie/references/source-and-upgrades.md +++ b/skills/neon-genie/references/source-and-upgrades.md @@ -1,7 +1,7 @@ # Source identity and upgrades -This distribution is `scrimshawlife-ctrl/NeonGenie`, version `3.26.0`, based on commit -`9e7e6d388a77a9f6103fba6f982457afc873084b` before the local audit-fix commit. Record the actual installed commit +This distribution is `scrimshawlife-ctrl/NeonGenie`, version `3.27.0`, based on commit +`516689f1308d3a5e009e901343bbc119a3f39cc6` (#20 installer safety) plus the 3.27.0 skill-surface sync. Record the actual installed commit with `git rev-parse HEAD` before installation; do not use a version string alone as a source identity. Root and hub packaging are distribution surfaces, not a claim that organizational, personal, or legacy embedded variants are identical. diff --git a/skills/neon-genie/schemas/agentic-service-graph.schema.json b/skills/neon-genie/schemas/agentic-service-graph.schema.json index 01f2d0c..4fa635c 100644 --- a/skills/neon-genie/schemas/agentic-service-graph.schema.json +++ b/skills/neon-genie/schemas/agentic-service-graph.schema.json @@ -14,7 +14,34 @@ "actions": {}, "authority_gates": {}, "exception_paths": {}, - "completion_proof": {} + "completion_proof": {}, + "validation_step": { + "type": "object", + "description": "Independent non-circular validation before irreversible actions. When has_irreversible_action is true, CLEAR requires independent=true AND a versioned log pointer (log_pointer + validation_log_version). Absence \u2192 Gate ISO fail. PROMETHEUS consumes; no fifth bot.", + "properties": { + "present": { + "type": "boolean", + "description": "True when a validation step exists. Alias of validation_isolation.enabled" + }, + "independent": { + "type": "boolean", + "description": "Boolean attestation that validator is non-circular vs planner (SHADOW \u2014 no proof protocol). Alias of validation_isolation.independent_of_planner" + }, + "log_pointer": { + "type": "string", + "description": "Alias of packet validation_isolation.validation_log_pointer \u2014 versioned log / receipt path or URI" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at log_pointer (parity with wayfinder validation_isolation.validation_log_version)" + } + }, + "additionalProperties": true + }, + "has_irreversible_action": { + "type": "boolean", + "description": "True when any action can irreversibly affect users/spend/egress" + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/skills/neon-genie/schemas/evidence-intelligence-packet.schema.json b/skills/neon-genie/schemas/evidence-intelligence-packet.schema.json index b54d6fa..6c757b2 100644 --- a/skills/neon-genie/schemas/evidence-intelligence-packet.schema.json +++ b/skills/neon-genie/schemas/evidence-intelligence-packet.schema.json @@ -10,7 +10,8 @@ "tooling_gaps", "attribution_boundaries", "research_log", - "not_computable_fields" + "not_computable_fields", + "evidence_ledger" ], "properties": { "decision_questions": {}, @@ -24,7 +25,229 @@ "competitive_scan": {}, "grant_or_funder_map": {}, "board_or_stakeholder_map": {}, - "freshness_notes": {} + "freshness_notes": {}, + "evidence_ledger": { + "description": "Required as of 3.27.0 when EvidenceIntelligence packet is emitted. Typed EviGraph claim graph; see evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + }, + "research_search_dag": { + "description": "Optional in 3.26.x (warn-then-require). Write only when research runs. Canonical: schemas/research-search-dag.schema.json. Gate PILOT.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true } diff --git a/skills/neon-genie/schemas/evidence-ledger.schema.json b/skills/neon-genie/schemas/evidence-ledger.schema.json new file mode 100644 index 0000000..4480ec6 --- /dev/null +++ b/skills/neon-genie/schemas/evidence-ledger.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/evidence-ledger/1.0.0", + "title": "Evidence Ledger (EviGraph claim graph)", + "description": "Shared claim graph for Gate LEDGER. Required on EvidenceIntelligence packets as of 3.27.0. No invent Brier / auto-settle.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/skills/neon-genie/schemas/opportunity-packet.schema.json b/skills/neon-genie/schemas/opportunity-packet.schema.json index 1a89042..992f09c 100644 --- a/skills/neon-genie/schemas/opportunity-packet.schema.json +++ b/skills/neon-genie/schemas/opportunity-packet.schema.json @@ -10,7 +10,8 @@ "validation_path", "completion_proof", "scorecard", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "blocked_transition": {}, @@ -25,6 +26,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/skills/neon-genie/schemas/product-packet.schema.json b/skills/neon-genie/schemas/product-packet.schema.json index 5c2f2b9..aafe3e4 100644 --- a/skills/neon-genie/schemas/product-packet.schema.json +++ b/skills/neon-genie/schemas/product-packet.schema.json @@ -12,7 +12,8 @@ "experience_architecture", "validation_path", "completion_proof", - "promotion_state" + "promotion_state", + "logic_label" ], "properties": { "target_user": {}, @@ -29,6 +30,124 @@ "promotion_state": {}, "proof_path": { "description": "Ordered eng/operator steps to obtain completion_proof" + }, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + }, + "evidence_ledger": { + "description": "Optional attach when evidence_intelligence co-resolves. See schemas/evidence-ledger.schema.json. Gate LEDGER.", + "type": "object", + "required": [ + "claims", + "relations" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/evidence-ledger" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "claims": { + "type": "array", + "description": "Claim nodes. Every material promoting claim needs an active cite into this set.", + "items": { + "type": "object", + "required": [ + "claim_id", + "text", + "label" + ], + "properties": { + "claim_id": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "label": { + "type": "string", + "enum": [ + "OBSERVED", + "INFERRED", + "SPECULATIVE", + "NOT_COMPUTABLE" + ] + }, + "active": { + "type": "boolean", + "description": "False = retired/superseded; inactive cites do not satisfy Gate LEDGER" + }, + "source_refs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": true + } + }, + "relations": { + "type": "array", + "description": "Typed edges between claims and/or evidence items", + "items": { + "type": "object", + "required": [ + "relation_id", + "from_id", + "to_id", + "relation" + ], + "properties": { + "relation_id": { + "type": "string", + "minLength": 1 + }, + "from_id": { + "type": "string", + "minLength": 1 + }, + "to_id": { + "type": "string", + "minLength": 1 + }, + "relation": { + "type": "string", + "enum": [ + "Support", + "Depend-on", + "Contradict", + "Invalidate", + "Update" + ] + }, + "resolved": { + "type": "boolean", + "description": "Required true (or Update edge) before \u2265TESTABLE when relation is Contradict/Invalidate" + }, + "note": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true } }, "additionalProperties": true diff --git a/skills/neon-genie/schemas/research-search-dag.schema.json b/skills/neon-genie/schemas/research-search-dag.schema.json new file mode 100644 index 0000000..5cf589f --- /dev/null +++ b/skills/neon-genie/schemas/research-search-dag.schema.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "neon-genie/research-search-dag/1.0.0", + "title": "Research Search DAG (PaperPilot)", + "description": "Editable search DAG written only when research runs. Stages: keyword \u2192 cite-expand \u2192 filter \u2192 score \u2192 extract. Optional in 3.26.x (warn-then-require). Never invent citations (Gate CITE). Keeper arXiv:2607.00597.", + "type": "object", + "required": [ + "stages", + "research_ran" + ], + "properties": { + "schema_id": { + "type": "string", + "const": "neon-genie/research-search-dag" + }, + "schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "research_ran": { + "type": "boolean", + "description": "True only when host research/fetch actually ran this run" + }, + "stages": { + "type": "array", + "minItems": 1, + "description": "Ordered DAG stages", + "items": { + "type": "object", + "required": [ + "stage_id", + "kind" + ], + "properties": { + "stage_id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "keyword", + "cite-expand", + "filter", + "score", + "extract" + ] + }, + "inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "queries": { + "type": "array", + "items": { + "type": "string" + } + }, + "citations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "verified_fetch": { + "type": "boolean" + }, + "operator_supplied": { + "type": "boolean" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": [ + "from_stage", + "to_stage" + ], + "properties": { + "from_stage": { + "type": "string" + }, + "to_stage": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true +} diff --git a/skills/neon-genie/schemas/run-envelope.schema.json b/skills/neon-genie/schemas/run-envelope.schema.json index 674a24c..5aec5bc 100644 --- a/skills/neon-genie/schemas/run-envelope.schema.json +++ b/skills/neon-genie/schemas/run-envelope.schema.json @@ -16,7 +16,8 @@ "artifacts", "promotion", "receipt", - "generator" + "generator", + "stage" ], "properties": { "schema_id": { @@ -55,59 +56,118 @@ "request": { "type": "object", "properties": { - "request_id": { "type": "string" }, - "summary": { "type": "string" }, - "brief_path": { "type": "string" }, - "recipe": { "type": "string" }, + "request_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "brief_path": { + "type": "string" + }, + "recipe": { + "type": "string" + }, "requested_profiles": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } } } }, "resolved_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "minItems": 1 }, "mode_status": { "type": "object", - "required": ["OPEN", "ALIGN", "ASCEND", "CLEAR", "SEAL"], + "required": [ + "OPEN", + "ALIGN", + "ASCEND", + "CLEAR", + "SEAL" + ], "properties": { - "OPEN": { "type": "string" }, - "ALIGN": { "type": "string" }, - "ASCEND": { "type": "string" }, - "CLEAR": { "type": "string" }, - "SEAL": { "type": "string" } + "OPEN": { + "type": "string" + }, + "ALIGN": { + "type": "string" + }, + "ASCEND": { + "type": "string" + }, + "CLEAR": { + "type": "string" + }, + "SEAL": { + "type": "string" + } }, "additionalProperties": false }, "primary_artifact": { "type": "object", - "required": ["type", "path", "artifact_id"], + "required": [ + "type", + "path", + "artifact_id" + ], "properties": { - "type": { "type": "string" }, - "path": { "type": "string" }, - "artifact_id": { "type": "string" }, - "content_hash": { "type": "string" } + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "artifact_id": { + "type": "string" + }, + "content_hash": { + "type": "string" + } } }, "artifacts": { "type": "array", "items": { "type": "object", - "required": ["artifact_id", "type", "path", "content_hash"], + "required": [ + "artifact_id", + "type", + "path", + "content_hash" + ], "properties": { - "artifact_id": { "type": "string" }, - "type": { "type": "string" }, - "path": { "type": "string" }, - "content_hash": { "type": "string" }, + "artifact_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "path": { + "type": "string" + }, + "content_hash": { + "type": "string" + }, "parent_artifact_ids": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } + }, + "schema_id": { + "type": "string" }, - "schema_id": { "type": "string" }, - "schema_version": { "type": "string" } + "schema_version": { + "type": "string" + } } } }, @@ -119,20 +179,32 @@ "items": { "type": "object", "properties": { - "gate": { "type": "string" }, - "status": { "type": "string" }, - "detail": { "type": "string" } + "gate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "detail": { + "type": "string" + } } } }, "promotion": { "type": "object", - "required": ["state"], + "required": [ + "state" + ], "properties": { - "state": { "type": "string" }, + "state": { + "type": "string" + }, "blocking_gates": { "type": "array", - "items": { "type": "string" } + "items": { + "type": "string" + } }, "open_blocking_requests": { "type": "array" @@ -146,45 +218,96 @@ "receipt_path": { "type": "string" }, - "privacy": { "$ref": "privacy-context.schema.json" }, - "privacy_mode": { "enum": ["local_only", "external_research_allowed", "custom"] }, - "external_actions": { "type": "array" }, - "artifact_paths": { "type": "array" }, - "telemetry_status": { "const": "disabled" }, - "deletion_instructions": { "type": "string" }, + "privacy": { + "$ref": "privacy-context.schema.json" + }, + "privacy_mode": { + "enum": [ + "local_only", + "external_research_allowed", + "custom" + ] + }, + "external_actions": { + "type": "array" + }, + "artifact_paths": { + "type": "array" + }, + "telemetry_status": { + "const": "disabled" + }, + "deletion_instructions": { + "type": "string" + }, "content_hash": { "type": "string", "description": "sha256 of envelope body without content_hash field" }, "generator": { "type": "object", - "required": ["skill", "version", "tool"], + "required": [ + "skill", + "version", + "tool" + ], "properties": { - "skill": { "type": "string" }, - "version": { "type": "string" }, - "tool": { "type": "string" } + "skill": { + "type": "string" + }, + "version": { + "type": "string" + }, + "tool": { + "type": "string" + } } }, "wayfinder": { "type": "object", "description": "Canonical Wayfinder ingestion hints", "properties": { - "ingest": { "type": "string", "const": "run-envelope.json" }, - "product_intent_changes_require_neon_genie_review": { "type": "boolean" }, - "handoff_path": { "type": ["string", "null"] } + "ingest": { + "type": "string", + "const": "run-envelope.json" + }, + "product_intent_changes_require_neon_genie_review": { + "type": "boolean" + }, + "handoff_path": { + "type": [ + "string", + "null" + ] + } } }, "selected_profiles": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "description": "Deprecated alias for resolved_profiles" }, "outputs": { "type": "array", "description": "Deprecated alias for artifacts (v0 compatibility)" }, - "canonical_sources": { "type": "array" }, - "assumptions": { "type": "array" } + "canonical_sources": { + "type": "array" + }, + "assumptions": { + "type": "array" + }, + "stage": { + "type": "string", + "enum": [ + "shape", + "test", + "scale" + ], + "description": "Required as of 3.27.0. Gate STAGE. Enum shape|test|scale. scale needs test evidence." + } }, "additionalProperties": true } diff --git a/skills/neon-genie/schemas/wayfinder-execution-packet.schema.json b/skills/neon-genie/schemas/wayfinder-execution-packet.schema.json index 44d2804..0c56da1 100644 --- a/skills/neon-genie/schemas/wayfinder-execution-packet.schema.json +++ b/skills/neon-genie/schemas/wayfinder-execution-packet.schema.json @@ -20,7 +20,36 @@ "acceptance_criteria": {}, "workstreams": {}, "validation_gates": {}, - "change_control": {} + "change_control": {}, + "validation_isolation": { + "type": "object", + "description": "Optional. Independent eng validation step separate from the planner that authored the packet. PROMETHEUS consumes \u2014 no Wayfinder bot. Gate ISO / P2-1.", + "properties": { + "enabled": { + "type": "boolean" + }, + "independent_of_planner": { + "type": "boolean", + "description": "True when validator is non-circular vs the planner that wrote the packet" + }, + "validator_role": { + "type": "string", + "description": "Operational role label only (e.g. eng_validator). Not a bot identity." + }, + "validation_log_pointer": { + "type": "string", + "description": "Versioned log / receipt path or URI for the validation pass" + }, + "validation_log_version": { + "type": "string", + "description": "Version or content-hash of the validation log at pointer" + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": true + } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/skills/neon-genie/schemas/zero-option-packet.schema.json b/skills/neon-genie/schemas/zero-option-packet.schema.json index dba5e0f..83352cd 100644 --- a/skills/neon-genie/schemas/zero-option-packet.schema.json +++ b/skills/neon-genie/schemas/zero-option-packet.schema.json @@ -8,7 +8,8 @@ "opportunities", "shadow_flags", "system_state", - "completion_proof" + "completion_proof", + "logic_label" ], "properties": { "constraints": {}, @@ -20,10 +21,19 @@ "description": "Observable proof of first cash/signal or honest NOT_COMPUTABLE reason" }, "proof_path": { - "description": "Micro-loop steps: narrative → action → result → reinforcement" + "description": "Micro-loop steps: narrative \u2192 action \u2192 result \u2192 reinforcement" }, "status": {}, - "reason": {} + "reason": {}, + "logic_label": { + "type": "string", + "enum": [ + "effectual", + "causal", + "mixed" + ], + "description": "Dual-logic label (U1). Required as of 3.27.0. Gate LOGIC." + } }, "additionalProperties": true } diff --git a/skills/neon-genie/scripts/build_envelope.py b/skills/neon-genie/scripts/build_envelope.py index f37bdd0..7a80875 100644 --- a/skills/neon-genie/scripts/build_envelope.py +++ b/skills/neon-genie/scripts/build_envelope.py @@ -191,6 +191,7 @@ def build_envelope( "request_id": req_id, "skill": "neon-genie", "skill_version": skill_ver, + "stage": (receipt.get("stage") or summary.get("stage") or "shape"), "created_at": lineage.utc_now(), "authority": "advisory_only", "grants_execution": False, diff --git a/skills/neon-genie/scripts/recipe_run.py b/skills/neon-genie/scripts/recipe_run.py old mode 100755 new mode 100644 index e8c9d8f..f529146 --- a/skills/neon-genie/scripts/recipe_run.py +++ b/skills/neon-genie/scripts/recipe_run.py @@ -59,6 +59,7 @@ def recipe_product_audit(out: Path) -> int: "experience_architecture": "operator CLI + Hermes skill prose", "validation_path": ["do check", "do eval", "human review"], "completion_proof": "Operator accepts product packet + handoff stub in review without intent rewrite", + "logic_label": "causal", "proof_path": [ "human reviews product-packet.stub.json", "confirm open DataRequests listed", @@ -130,6 +131,7 @@ def recipe_zero_option(out: Path) -> int: "status": "NOT_COMPUTABLE", "reason": "No executable capabilities or access supplied", "completion_proof": "NOT_COMPUTABLE: no skills/access to prove first cash", + "logic_label": "effectual", "proof_path": [ "declare skills and access", "re-run zero-option-executable recipe or Hermes zero_option profile", @@ -192,6 +194,7 @@ def recipe_zero_option_executable(out: Path) -> int: "reinforcement": "log outcome; no fictional pipeline", }, "completion_proof": "Paid engagement booked or written refusal within 7 days", + "logic_label": "effectual", "proof_path": [ "list warm contacts from declared access", "send one bounded paid diagnostic offer", @@ -690,6 +693,25 @@ def recipe_evidence(out: Path) -> int: }, ], "evidence_items": [], + "evidence_ledger": { + "claims": [ + { + "claim_id": "c-evidence-stub-1", + "text": "Public comps require host fetch + cite for OBSERVED", + "label": "SPECULATIVE", + "active": True, + } + ], + "relations": [ + { + "relation_id": "r-evidence-stub-1", + "from_id": "c-evidence-stub-1", + "to_id": "evidence-pending", + "relation": "Depend-on", + "resolved": True, + } + ], + }, "claim_ledger": [ { "claim": "Public comps require host fetch + cite for OBSERVED", @@ -792,6 +814,7 @@ def recipe_opportunity(out: Path) -> int: "track invoice or no", ], "completion_proof": "first paid diagnostic invoice or signed SOW within 14 days", + "logic_label": "mixed", "proof_path": [ "satisfy DataRequest for skills/access/buyer", "send bounded offer to declared warm contacts only", diff --git a/skills/neon-genie/scripts/run_hermes_evals.py b/skills/neon-genie/scripts/run_hermes_evals.py old mode 100755 new mode 100644 index 167de22..a8d62d3 --- a/skills/neon-genie/scripts/run_hermes_evals.py +++ b/skills/neon-genie/scripts/run_hermes_evals.py @@ -346,6 +346,143 @@ def eval_privacy_consent_purpose_bound(inp: dict[str, Any]) -> dict[str, Any]: } + +def eval_effectual_missing_means(inp: dict[str, Any]) -> dict[str, Any]: + label = str(inp.get("logic_label") or "") + means = inp.get("means_inventory") + if means is None: + means = inp.get("means") or [] + empty = not means + requested = bool(inp.get("data_request_emitted")) + status_nc = str(inp.get("status") or "").upper() == "NOT_COMPUTABLE" + if label in {"effectual", "mixed"} and empty and not requested and not status_nc: + return { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE", + } + if label == "effectual" and empty and not requested and not status_nc: + return { + "status": "GATE_FAIL", + "gate": "BRIC", + "reason": "Effectual/zero-option empty means without DataRequest or NOT_COMPUTABLE", + } + return {"status": "PASS", "gate": "BRIC", "reason": "means present or NC/DataRequest"} + + +def eval_scale_without_test(inp: dict[str, Any]) -> dict[str, Any]: + stage = str(inp.get("stage") or "") + has_test = bool(inp.get("test_evidence_present")) + if stage == "scale" and not has_test: + return { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "scale without test evidence", + } + missing = stage == "" and bool(inp.get("require_stage")) + if missing: + return { + "status": "GATE_FAIL", + "gate": "STAGE", + "reason": "stage missing on opportunity/agentic run", + } + return {"status": "PASS", "gate": "STAGE", "reason": "stage ok"} + + +def eval_fabricated_cite(inp: dict[str, Any]) -> dict[str, Any]: + cite = inp.get("citation") or inp.get("arxiv_id") or inp.get("doi") + verified = bool(inp.get("verified_fetch") or inp.get("operator_source")) + if cite and not verified: + return { + "status": "GATE_FAIL", + "gate": "CITE", + "reason": "Unverified paper/DOI/arXiv citation forbidden (never generate citations)", + } + return {"status": "PASS", "gate": "CITE", "reason": "cite verified or absent"} + + + +def eval_ledger_uncited(inp: dict[str, Any]) -> dict[str, Any]: + material = bool(inp.get("material_claim")) + cited = bool(inp.get("active_ledger_cite")) + invent = str(inp.get("claim_label") or "") == "OBSERVED" and str( + inp.get("claim_source") or "" + ) in {"model_prior_only", "model_prior", ""} + if material and not cited: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite", + } + if invent and not cited and material: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Material claim without active ledger cite", + } + return {"status": "PASS", "gate": "LEDGER", "reason": "ledger cite present"} + + +def eval_ledger_contradict_testable(inp: dict[str, Any]) -> dict[str, Any]: + promo = str(inp.get("promotion_state") or "RAW_SIGNAL") + high = promo in { + "TESTABLE", + "SERVICE_FIRST", + "SERVICE_PROVEN", + "SPEC_COMPLETE", + "WAYFINDER_READY", + "BUILD_READY", + "CANON_CANDIDATE", + } + unresolved = bool(inp.get("unresolved_contradict_or_invalidate")) + if high and unresolved: + return { + "status": "GATE_FAIL", + "gate": "LEDGER", + "reason": "Unresolved Contradict/Invalidate blocks ≥TESTABLE", + } + return {"status": "PASS", "gate": "LEDGER", "reason": "no unresolved contradict at TESTABLE+"} + + + +def eval_irreversible_without_validation(inp: dict[str, Any]) -> dict[str, Any]: + irreversible = bool(inp.get("has_irreversible_action")) + present = bool(inp.get("validation_step_present") or inp.get("validation_isolation_enabled")) + independent = bool(inp.get("validation_independent") or inp.get("independent_of_planner")) + log_ptr = str(inp.get("validation_log_pointer") or inp.get("log_pointer") or "").strip() + log_ver = str(inp.get("validation_log_version") or "").strip() + versioned_log = bool(log_ptr and log_ver) + if irreversible: + if not (present and independent and versioned_log): + # Prefer specific reason when independence present but log missing + if present and independent and not versioned_log: + return { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible action requires independent ∧ versioned log pointer", + } + return { + "status": "GATE_FAIL", + "gate": "ISO", + "reason": "Irreversible agentic action without independent validation step", + } + return {"status": "PASS", "gate": "ISO", "reason": "independent ∧ versioned log pointer"} + + + +def eval_research_ran_without_dag(inp: dict[str, Any]) -> dict[str, Any]: + ran = bool(inp.get("research_ran")) + present = bool(inp.get("dag_present")) + stages = inp.get("dag_stages") or [] + if ran and (not present or not stages): + return { + "status": "GATE_FAIL", + "gate": "PILOT", + "reason": "Research ran without research_search_dag", + } + return {"status": "PASS", "gate": "PILOT", "reason": "dag present when research ran"} + + EVALUATORS: dict[str, EvalFn] = { "zero-option.json": eval_zero_option, "x402-misfit.json": eval_x402_misfit, @@ -366,6 +503,15 @@ def eval_privacy_consent_purpose_bound(inp: dict[str, Any]) -> dict[str, Any]: "privacy-egress-local-only.json": eval_privacy_egress_local_only, "privacy-secret-blocks-egress.json": eval_privacy_secret_blocks_egress, "privacy-consent-purpose-bound.json": eval_privacy_consent_purpose_bound, + "effectual-missing-means.json": eval_effectual_missing_means, + "scale-without-test.json": eval_scale_without_test, + "fabricated-cite.json": eval_fabricated_cite, + "uncited-claim.json": eval_ledger_uncited, + "contradict-unresolved-testable.json": eval_ledger_contradict_testable, + "irreversible-without-validation.json": eval_irreversible_without_validation, + "irreversible-missing-log-pointer.json": eval_irreversible_without_validation, + "research-ran-without-dag.json": eval_research_ran_without_dag, + "dag-fabricated-cite.json": eval_fabricated_cite, } diff --git a/skills/neon-genie/scripts/test_distribution_spine.py b/skills/neon-genie/scripts/test_distribution_spine.py index de36cc2..88c66ef 100644 --- a/skills/neon-genie/scripts/test_distribution_spine.py +++ b/skills/neon-genie/scripts/test_distribution_spine.py @@ -108,8 +108,8 @@ def test_dir_style_hub_ref_fails() -> None: text = skill.read_text(encoding="utf-8") # inject a bare directory hub path that Hermes would reject text = text.replace( - "## Mission", - "See also `references/profiles` for contracts.\n\n## Mission", + "## Procedure", + "See also `references/profiles` for contracts.\n\n## Procedure", 1, ) skill.write_text(text, encoding="utf-8") diff --git a/skills/neon-genie/scripts/test_hermes_frontmatter.py b/skills/neon-genie/scripts/test_hermes_frontmatter.py new file mode 100644 index 0000000..c2ea594 --- /dev/null +++ b/skills/neon-genie/scripts/test_hermes_frontmatter.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Unit tests for Hermes v0.21 SKILL.md frontmatter gates (stdlib only).""" + +from __future__ import annotations + +import sys +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + +import validate_hermes_skill as vhs # noqa: E402 + +FOLDED = """--- +name: neon-genie +description: > + Evidence-bound product and opportunity intelligence — audits, zero-option + loops, commercial models, agentic graphs, and Wayfinder handoffs with claim + labels and fail-closed gates. Use for product intent, opportunity mining, + and advisory packets — not cinematic work (use Kubrick) or code execution. +version: 3.26.0 +author: Applied Alchemy Labs / Zero State +license: MIT +platforms: [linux, macos, windows] +metadata: + hermes: + tags: + - Product + related_skills: [] +--- + +# Body +""" + + +def test_folded_description_exceeds_limit() -> None: + fields = vhs.parse_frontmatter(FOLDED) + desc = str(fields.get("description", "")) + if len(desc) <= vhs.SKILL_PROMPT_DESC_LIMIT: + raise AssertionError(f"folded description should exceed 60, got {len(desc)}") + errors = vhs.validate_description(desc) + if not any("truncates" in e for e in errors): + raise AssertionError(f"expected length error, got {errors}") + + +def test_short_description_passes() -> None: + desc = "Audit products and opportunities with labeled evidence." + if len(desc) > vhs.SKILL_PROMPT_DESC_LIMIT: + raise AssertionError(f"hunch description is {len(desc)} chars") + errors = vhs.validate_description(desc) + if errors: + raise AssertionError(errors) + + +def test_marketing_and_period() -> None: + errors = vhs.validate_description("A powerful product auditor") + joined = " ".join(errors) + if "marketing" not in joined or "period" not in joined: + raise AssertionError(f"expected marketing + period errors, got {errors}") + + +def test_live_skill_frontmatter() -> None: + text = (vhs.SKILL_ROOT / "SKILL.md").read_text(encoding="utf-8") + if not text.startswith("---\n"): + raise AssertionError("SKILL.md must start at byte 0 with ---") + fields = vhs.parse_frontmatter(text) + missing = vhs.REQUIRED_FRONTMATTER - set(fields) + if missing: + raise AssertionError(f"missing fields: {missing}") + errors = vhs.validate_description(str(fields.get("description", ""))) + if errors: + raise AssertionError(errors) + hermes = fields.get("_hermes") + if not isinstance(hermes, dict): + raise AssertionError("metadata.hermes missing") + missing_h = vhs.REQUIRED_HERMES_KEYS - set(hermes) + if missing_h: + raise AssertionError(f"missing hermes keys: {missing_h}") + + +def main() -> int: + tests = ( + test_folded_description_exceeds_limit, + test_short_description_passes, + test_marketing_and_period, + test_live_skill_frontmatter, + ) + for fn in tests: + fn() + print("ALL PASS: test_hermes_frontmatter") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/skills/neon-genie/scripts/test_wave3_cli.py b/skills/neon-genie/scripts/test_wave3_cli.py index 0f0c1f2..ab27f63 100755 --- a/skills/neon-genie/scripts/test_wave3_cli.py +++ b/skills/neon-genie/scripts/test_wave3_cli.py @@ -66,6 +66,7 @@ def main() -> int: "completion_proof": "first paid outcome within 14 days", "scorecard": {}, "promotion_state": "TESTABLE", + "logic_label": "mixed", } packet.write_text(json.dumps(full), encoding="utf-8") r = run(["do", "validate", "--packet", str(packet), "--type", "opportunity"]) diff --git a/skills/neon-genie/scripts/validate_hermes_skill.py b/skills/neon-genie/scripts/validate_hermes_skill.py old mode 100755 new mode 100644 index 8457371..229f593 --- a/skills/neon-genie/scripts/validate_hermes_skill.py +++ b/skills/neon-genie/scripts/validate_hermes_skill.py @@ -24,7 +24,28 @@ SKILL_FILE = SKILL_ROOT / "SKILL.md" -REQUIRED_FRONTMATTER = {"name", "description", "version", "author"} +# Hermes Agent v0.21 hardline (tools/skill_linter.py + skill-authoring SKILL.md). +# Index truncates at SKILL_PROMPT_DESC_LIMIT (57 chars + "..."). +SKILL_PROMPT_DESC_LIMIT = 60 +REQUIRED_FRONTMATTER = { + "name", + "description", + "version", + "author", + "license", + "platforms", +} +REQUIRED_HERMES_KEYS = {"tags", "related_skills"} +MARKETING_WORDS = ( + "powerful", + "comprehensive", + "seamless", + "advanced", + "cutting-edge", + "state-of-the-art", + "revolutionary", + "robust", +) # Paths that must exist either at full-tree location or hub mirror. # Each entry is a list of candidate relative paths (first existing wins). @@ -107,7 +128,6 @@ "docs/PREMIERE.md", "docs/DEMO.md", "install.sh", - ".github/workflows/hermes-evals.yml", "examples/gallery/README.md", "distribution.yaml", ] @@ -119,25 +139,120 @@ ] -def parse_frontmatter(text: str) -> dict[str, str]: +def _strip_yaml_scalar(value: str) -> str: + value = value.strip() + if len(value) >= 2 and value[0] == value[-1] and value[0] in {'"', "'"}: + return value[1:-1] + return value + + +def _fold_block(lines: list[str], start: int, indent: int, literal: bool) -> tuple[str, int]: + collected: list[str] = [] + i = start + while i < len(lines): + line = lines[i] + if not line.strip(): + collected.append("") + i += 1 + continue + leading = len(line) - len(line.lstrip(" ")) + if leading < indent: + break + collected.append(line[indent:] if leading >= indent else line.lstrip()) + i += 1 + while collected and collected[-1] == "": + collected.pop() + if literal: + return "\n".join(collected), i + paragraphs = "\n".join(collected).split("\n\n") + folded = " ".join(" ".join(p.split()) for p in paragraphs if p.strip()) + return folded, i + + +def parse_frontmatter(text: str) -> dict[str, object]: + """Parse SKILL.md YAML frontmatter. Frontmatter must start at byte 0.""" + if text.startswith("\ufeff"): + raise ValueError("SKILL.md frontmatter must start at byte 0 (BOM present)") if not text.startswith("---\n"): raise ValueError("SKILL.md must begin with YAML frontmatter") end = text.find("\n---\n", 4) if end < 0: raise ValueError("SKILL.md frontmatter is not closed") - fields: dict[str, str] = {} - for line in text[4:end].splitlines(): - if not line or line[0].isspace() or ":" not in line: + fields: dict[str, object] = {} + lines = text[4:end].splitlines() + i = 0 + hermes: dict[str, object] = {} + in_hermes = False + hermes_indent = 0 + while i < len(lines): + line = lines[i] + if not line.strip() or line.lstrip().startswith("#"): + i += 1 continue - key, value = line.split(":", 1) - key = key.strip() - val = value.strip().strip('"').strip("'") - if key in fields: + indent = len(line) - len(line.lstrip(" ")) + stripped = line.strip() + if in_hermes and indent <= hermes_indent: + in_hermes = False + if in_hermes and ":" in stripped: + key, value = stripped.split(":", 1) + key = key.strip() + val = value.strip() + if val in {">", "|", ">-", "|-", ">+", "|+"}: + block, i = _fold_block( + lines, i + 1, indent + 2, literal=val.startswith("|") + ) + hermes[key] = block + continue + hermes[key] = _strip_yaml_scalar(val) if val else [] + i += 1 continue - fields[key] = val + if indent == 0 and ":" in stripped: + key, value = stripped.split(":", 1) + key = key.strip() + val = value.strip() + if val in {">", "|", ">-", "|-", ">+", "|+"}: + block, i = _fold_block( + lines, i + 1, 2, literal=val.startswith("|") + ) + fields[key] = block + continue + fields[key] = _strip_yaml_scalar(val) + i += 1 + continue + if stripped == "hermes:" or stripped.startswith("hermes:"): + in_hermes = True + hermes_indent = indent + i += 1 + continue + i += 1 + if hermes: + fields["_hermes"] = hermes return fields +def validate_description(description: str) -> list[str]: + errors: list[str] = [] + desc = str(description or "").strip() + if not desc: + errors.append("Frontmatter description is empty") + return errors + if len(desc) > SKILL_PROMPT_DESC_LIMIT: + errors.append( + f"Frontmatter description is {len(desc)} chars; Hermes index " + f"truncates past {SKILL_PROMPT_DESC_LIMIT} (57 + '...'). " + "Keep one sentence that ends with a period." + ) + if not desc.endswith("."): + errors.append("Frontmatter description must end with a period") + if desc.count(".") > 1: + errors.append("Frontmatter description must be one sentence") + lower = desc.lower() + hits = [w for w in MARKETING_WORDS if re.search(rf"\b{re.escape(w)}\b", lower)] + if hits: + errors.append(f"Frontmatter description contains marketing words: {hits}") + return errors + + def referenced_relative_paths(text: str) -> set[str]: candidates: set[str] = set() for match in re.finditer( @@ -171,11 +286,18 @@ def main(argv: list[str] | None = None) -> int: argv = list(sys.argv[1:] if argv is None else argv) if any(a in {"-h", "--help"} for a in argv): print("Validate Neon Genie as a portable Hermes skill (stdlib only).") - print("Usage: python scripts/validate_hermes_skill.py") + print("Usage: python scripts/validate_hermes_skill.py [--repository]") print("Exit 0 on PASS; non-zero on FAIL with reasons on stderr.") return 0 + if any(a != "--repository" for a in argv): + print("Unknown option; use --repository for CI validation", file=sys.stderr) + return 2 errors: list[str] = [] + if "--repository" in argv: + workflow = SKILL_ROOT / ".github/workflows/hermes-evals.yml" + if not workflow.is_file(): + errors.append("Repository CI workflow missing: .github/workflows/hermes-evals.yml") hub = ng_paths.is_hub_layout() if not SKILL_FILE.is_file(): @@ -194,8 +316,18 @@ def main(argv: list[str] | None = None) -> int: errors.append(f"Missing frontmatter fields: {', '.join(missing_fields)}") if frontmatter.get("name") != "neon-genie": errors.append("Frontmatter name must be 'neon-genie'") + errors.extend(validate_description(str(frontmatter.get("description", "")))) + hermes_meta = frontmatter.get("_hermes") + if not isinstance(hermes_meta, dict): + errors.append("Missing frontmatter metadata.hermes.{tags, related_skills}") + else: + missing_hermes = sorted(REQUIRED_HERMES_KEYS - set(hermes_meta)) + if missing_hermes: + errors.append( + "Missing metadata.hermes fields: " + ", ".join(missing_hermes) + ) - version_fm = frontmatter.get("version", "") + version_fm = str(frontmatter.get("version", "")) try: version_file = ng_paths.version_path().read_text(encoding="utf-8").strip() except (OSError, FileNotFoundError): diff --git a/skills/neon-genie/tests_audit/PLAN.md b/skills/neon-genie/tests_audit/PLAN.md new file mode 100644 index 0000000..b2442b9 --- /dev/null +++ b/skills/neon-genie/tests_audit/PLAN.md @@ -0,0 +1,4 @@ +# Audit remediation + +User explicitly authorized C1–C6 and relevant A1/A4 fixes, local commits only. +Plan: reproduce each defect before its fix; stage installs and validate before activation; preserve legacy output; isolate new state; repair session recipe and repository-only CI validation; align only current organizational license metadata; preserve personal variants and advisory boundaries; run sandbox regressions and existing offline checks; parent independently reviews before remote action. diff --git a/skills/neon-genie/tests_audit/test_install.py b/skills/neon-genie/tests_audit/test_install.py new file mode 100644 index 0000000..2d0b598 --- /dev/null +++ b/skills/neon-genie/tests_audit/test_install.py @@ -0,0 +1,123 @@ +"""Installer runs only in temporary homes, never a real Hermes profile.""" + +import os +import subprocess +import tempfile +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SKILL = "neon-genie" + + +class InstallAudit(unittest.TestCase): + def test_profile_dry_run_has_no_writes(self): + with tempfile.TemporaryDirectory() as tmp: + home = Path(tmp) / "home" + home.mkdir() + profile = home / "named profile" + env = dict(os.environ, HOME=str(home), HERMES_HOME=str(profile)) + r = subprocess.run( + check=False, + args=["bash", str(ROOT / "install.sh"), "--dry-run"], + cwd=tmp, + env=env, + capture_output=True, + text=True, + ) + self.assertEqual(r.returncode, 0, r.stdout + r.stderr) + self.assertIn(str(profile / "skills" / SKILL), r.stdout) + self.assertEqual(list(home.iterdir()), []) + + def test_failed_check_preserves_previous_install(self): + with tempfile.TemporaryDirectory() as tmp: + home = Path(tmp) / "home" + home.mkdir() + profile = home / "profile" + dest = profile / "skills" / SKILL + dest.mkdir(parents=True) + (dest / "SKILL.md").write_text("previous package") + (dest / "out/wizard-sessions").mkdir(parents=True) + sentinel = dest / "out/wizard-sessions/keep.json" + sentinel.write_text("previous session") + import shutil + + source = Path(tmp) / "source" + shutil.copytree( + ROOT, + source, + ignore=shutil.ignore_patterns( + ".git", "skills", "out", "__pycache__", ".venv" + ), + ) + script = { + "neon-genie": "validate_hermes_skill.py", + "sigil-forge": "sigil_forge.py", + "hyperlex": "hyperlex.py", + }[SKILL] + (source / "scripts" / script).write_text("import sys\nsys.exit(42)\n") + env = dict(os.environ, HOME=str(home), HERMES_HOME=str(profile)) + r = subprocess.run( + check=False, + args=["bash", str(source / "install.sh")], + cwd=tmp, + env=env, + capture_output=True, + text=True, + ) + self.assertNotEqual(r.returncode, 0, r.stdout + r.stderr) + self.assertEqual((dest / "SKILL.md").read_text(), "previous package") + self.assertEqual(sentinel.read_text(), "previous session") + self.assertFalse((home / ".hermes").exists()) + + def test_reinstall_preserves_outputs_and_sessions(self): + with tempfile.TemporaryDirectory() as tmp: + home = Path(tmp) / "home" + home.mkdir() + profile = home / "profile" + dest = profile / "skills" / SKILL + (dest / "out/wizard-sessions").mkdir(parents=True) + sentinel = dest / "out/wizard-sessions/keep.json" + sentinel.write_text("previous session") + wallpaper = dest / "out/wallpaper.png" + wallpaper.write_bytes(b"previous wallpaper") + env = dict(os.environ, HOME=str(home), HERMES_HOME=str(profile)) + r = subprocess.run( + check=False, + args=["bash", str(ROOT / "install.sh")], + cwd=tmp, + env=env, + capture_output=True, + text=True, + ) + self.assertEqual(r.returncode, 0, r.stdout + r.stderr) + self.assertTrue(sentinel.is_file(), "saved session disappeared") + self.assertEqual(sentinel.read_text(), "previous session") + self.assertEqual(wallpaper.read_bytes(), b"previous wallpaper") + self.assertFalse((home / ".hermes").exists()) + self.assertFalse((dest.parent / (SKILL + ".bak")).exists()) + + def test_profile_skills_symlink_cannot_redirect_install(self): + with tempfile.TemporaryDirectory() as tmp: + home = Path(tmp) / "home" + profile = home / "profile-a" + foreign = home / "profile-b/skills" + profile.mkdir(parents=True) + foreign.mkdir(parents=True) + (profile / "skills").symlink_to(foreign, target_is_directory=True) + env = dict(os.environ, HOME=str(home), HERMES_HOME=str(profile)) + r = subprocess.run( + ["bash", str(ROOT / "install.sh")], + cwd=tmp, + env=env, + capture_output=True, + text=True, + check=False, + ) + self.assertNotEqual(r.returncode, 0, r.stdout + r.stderr) + self.assertEqual(list(foreign.iterdir()), []) + self.assertTrue((profile / "skills").is_symlink()) + + +if __name__ == "__main__": + unittest.main() diff --git a/skills/neon-genie/tests_audit/test_install_followup.py b/skills/neon-genie/tests_audit/test_install_followup.py new file mode 100644 index 0000000..5660e21 --- /dev/null +++ b/skills/neon-genie/tests_audit/test_install_followup.py @@ -0,0 +1,191 @@ +"""Regression coverage for installer PR follow-up; shared across distributions.""" + +import hashlib +import importlib.util +import json +import os +import shutil +import subprocess +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +spec = importlib.util.spec_from_file_location( + "transaction_followup", ROOT / "scripts/install_transaction.py" +) +assert spec is not None and spec.loader is not None +transaction = importlib.util.module_from_spec(spec) +spec.loader.exec_module(transaction) + + +class FollowupTests(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.base = Path(self.tmp.name) + self.source = self.base / "source" + self.source.mkdir() + (self.source / "SKILL.md").write_text("new") + (self.source / "VERSION").write_text("1") + self.target = self.base / "target" + self.home = self.base / "profile" + env = patch.dict(os.environ, HERMES_HOME=str(self.home)) + env.start() + self.addCleanup(env.stop) + key = hashlib.sha256(str(self.target).encode()).hexdigest()[:20] + self.backups = self.home / "backups/hyperlex" / key + + def install(self): + transaction.install(self.source, self.target, "hyperlex", True) + + def receipt(self): + return json.loads((self.target / ".install-provenance.json").read_text()) + + def test_archive_dirty_state_is_unknown(self): + self.install() + self.assertIsNone(self.receipt()["source_dirty"]) + + def test_enclosing_repository_is_not_source_provenance(self): + subprocess.run(["git", "init", str(self.base)], check=True, capture_output=True) + subprocess.run( + [ + "git", + "-C", + str(self.base), + "-c", + "user.name=Test", + "-c", + "user.email=test@example.invalid", + "commit", + "--allow-empty", + "-m", + "unrelated", + ], + check=True, + capture_output=True, + ) + subprocess.run( + [ + "git", + "-C", + str(self.base), + "remote", + "add", + "origin", + "https://example.invalid/unrelated", + ], + check=True, + ) + self.install() + for field in ("repository", "source_commit", "source_dirty"): + self.assertIsNone(self.receipt()[field], field) + + def test_missing_git_does_not_block_install(self): + with patch.dict(os.environ, PATH=str(self.base / "no-executables")): + self.install() + for field in ("repository", "source_commit", "source_dirty"): + self.assertIsNone(self.receipt()[field], field) + + def test_stale_lock_error_and_docs_are_actionable(self): + lock = self.target.parent / ("." + self.target.name + ".install-lock") + lock.mkdir() + with self.assertRaisesRegex( + FileExistsError, "Do not reclaim automatically" + ) as error: + self.install() + self.assertIn(str(lock), str(error.exception)) + self.assertIn("rmdir", str(error.exception)) + self.assertTrue(lock.is_dir()) + self.assertFalse(self.target.exists()) + docs = (ROOT / "references/source-and-upgrades.md").read_text() + for phrase in ( + "rmdir", + "SIGKILL", + "no installer", + ".install-lock", + ".backup-incomplete-", + ): + self.assertIn(phrase, docs) + + def test_tracked_neon_hub_retains_repository_and_subtree(self): + repo = self.base / "neon" + hub = repo / "skills/neon-genie" + hub.mkdir(parents=True) + for directory in (repo, hub): + license_id = "MIT" if directory == repo else "Apache-2.0" + (directory / "SKILL.md").write_text( + f"---\nname: neon-genie\nlicense: {license_id}\n---\n" + ) + (directory / "VERSION").write_text("1") + subprocess.run(["git", "init", str(repo)], check=True, capture_output=True) + subprocess.run(["git", "-C", str(repo), "add", "."], check=True) + subprocess.run( + [ + "git", + "-C", + str(repo), + "-c", + "user.name=Test", + "-c", + "user.email=test@example.invalid", + "commit", + "-m", + "hub", + ], + check=True, + capture_output=True, + ) + transaction.install(hub, self.target, "neon-genie", True) + receipt = self.receipt() + self.assertIsNotNone(receipt["source_commit"]) + self.assertIs(receipt["source_dirty"], False) + self.assertEqual(receipt["source_subdirectory"], "skills/neon-genie") + self.assertEqual(receipt["source_repository_root"], str(repo)) + + def test_invalid_utf8_enclosing_root_drops_optional_provenance(self): + self.test_tracked_neon_hub_retains_repository_and_subtree() + repo = self.base / "neon" + hub = repo / "skills/neon-genie" + (repo / "SKILL.md").write_bytes(b"\xff") + transaction.install(hub, self.target, "neon-genie", True) + receipt = self.receipt() + for field in ( + "repository", "source_repository_root", "source_subdirectory", + "source_commit", "source_dirty", + ): + self.assertIsNone(receipt[field], field) + for name in ("SKILL.md", "VERSION"): + self.assertEqual((self.target / name).read_bytes(), (hub / name).read_bytes()) + + def test_partial_backup_never_published(self): + self.install() + self.install() + previous = set(self.backups.iterdir()) + copytree = shutil.copytree + + def interrupt(src, dst, *args, **kwargs): + if Path(src) == self.target: + Path(dst).mkdir() + (Path(dst) / "truncated").write_text("partial") + raise KeyboardInterrupt("backup copy interrupted") + return copytree(src, dst, *args, **kwargs) + + with ( + patch.object(transaction.shutil, "copytree", side_effect=interrupt), + self.assertRaises(KeyboardInterrupt), + ): + self.install() + self.assertEqual(set(self.backups.iterdir()), previous) + self.assertEqual((self.target / "SKILL.md").read_text(), "new") + transaction.rollback(self.target, "hyperlex", True) + + def test_rollback_skips_legacy_partial_backup(self): + self.install() + self.install() + partial = self.backups / "partial" + partial.mkdir() + os.utime(partial, (2000000000, 2000000000)) + transaction.rollback(self.target, "hyperlex", True) + self.assertEqual((self.target / "SKILL.md").read_text(), "new") diff --git a/skills/neon-genie/tests_audit/test_transaction.py b/skills/neon-genie/tests_audit/test_transaction.py new file mode 100644 index 0000000..0c7c502 --- /dev/null +++ b/skills/neon-genie/tests_audit/test_transaction.py @@ -0,0 +1,198 @@ +"""Adversarial transactions: sandbox only, no mocked runtime successes.""" + +import importlib.util +import io +import os +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +spec = importlib.util.spec_from_file_location( + "install_transaction", ROOT / "scripts/install_transaction.py" +) +assert spec is not None and spec.loader is not None +m = importlib.util.module_from_spec(spec) +spec.loader.exec_module(m) + + +class TransactionAudit(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.root = Path(self.tmp.name) + self.source = self.root / "source" + self.source.mkdir() + (self.source / "VERSION").write_text("1") + (self.source / "SKILL.md").write_text("new") + self.target = self.root / "profile/skills/test" + self.env = patch.dict( + os.environ, + HOME=str(self.root / "home"), + HERMES_HOME=str(self.root / "profile"), + ) + self.env.start() + self.addCleanup(self.env.stop) + + def install(self): + m.install(self.source, self.target, "hyperlex", skip_checks=True) + + def previous(self): + self.target.mkdir(parents=True) + (self.target / "SKILL.md").write_text("old") + + def test_final_and_dangling_target_symlinks_rejected(self): + self.target.parent.mkdir(parents=True) + for exists in (True, False): + referent = self.root / str(exists) + if exists: + referent.mkdir() + self.target.symlink_to(referent, target_is_directory=True) + with self.assertRaises(ValueError): + self.install() + self.assertTrue(self.target.is_symlink()) + self.assertFalse((referent / "SKILL.md").exists()) + self.target.unlink() + + def test_source_ancestor_rejected(self): + self.target = self.root + with self.assertRaises(ValueError): + self.install() + + def test_secrets_not_packaged(self): + (self.source / ".env").write_text("FAKE_SECRET=do-not-copy") + (self.source / ".env.local").write_text("do-not-copy") + self.install() + self.assertFalse((self.target / ".env").exists()) + self.assertFalse((self.target / ".env.local").exists()) + + def test_source_symlink_rejected(self): + (self.source / "linked-secret").symlink_to(self.root / "private") + with self.assertRaises(ValueError): + self.install() + + def test_output_symlink_preserved_without_crawling(self): + self.previous() + private = self.root / "private" + private.mkdir() + (private / "keep").write_text("keep") + (self.target / "out").symlink_to(private, target_is_directory=True) + self.install() + self.assertTrue((self.target / "out").is_symlink()) + self.assertEqual((private / "keep").read_text(), "keep") + + def test_activation_failure_restores_previous(self): + self.previous() + replace = os.replace + + def fail(src, dst): + if Path(src).name == "package": + raise OSError("injected activation failure") + return replace(src, dst) + + with ( + patch.object(m.os, "replace", side_effect=fail), + self.assertRaises(OSError), + ): + self.install() + self.assertEqual((self.target / "SKILL.md").read_text(), "old") + + def test_restoration_failure_retains_recovery_tree(self): + self.previous() + replace = os.replace + + def fail(src, dst): + if Path(src).name in ("package", "previous"): + raise OSError("injected rename failure") + return replace(src, dst) + + with ( + patch.object(m.os, "replace", side_effect=fail), + self.assertRaises(RuntimeError), + ): + self.install() + recovered = list(self.target.parent.glob(".hyperlex-stage-*/previous/SKILL.md")) + self.assertEqual(len(recovered), 1) + self.assertEqual(recovered[0].read_text(), "old") + + def check_interrupted_rename(self, boundary, after, recovery): + self.previous() + replace = os.replace + interrupted = False + + def fail(src, dst): + nonlocal interrupted + src, dst = Path(src), Path(dst) + if src.name == "previous": + if recovery == "error": + raise OSError("injected restoration failure") + if recovery == "interrupt-before": + raise KeyboardInterrupt("restoration before rename") + if recovery == "interrupt-after": + replace(src, dst) + raise KeyboardInterrupt("restoration after rename") + at_boundary = ( + dst.name == "previous" if boundary == "displacement" + else src.name == "package" + ) + if at_boundary and not interrupted: + interrupted = True + if after: + replace(src, dst) # Real side effect before the exception. + raise KeyboardInterrupt("injected installation interruption") + return replace(src, dst) + + needs_recovery = boundary == "activation" or after + retained = needs_recovery and recovery != "ok" + with ( + patch.object(m.os, "replace", side_effect=fail), + patch("sys.stdout", new_callable=io.StringIO) as output, + self.assertRaises(RuntimeError if retained else KeyboardInterrupt) as caught, + ): + self.install() # Explicit skip_checks=True; no fake runtime success. + self.assertTrue(interrupted) + self.assertNotIn("Installed", output.getvalue()) + self.assertFalse((self.target.parent / ".test.install-lock").exists()) + backups = list((self.root / "profile/backups").glob("*/*/*/SKILL.md")) + self.assertEqual(len(backups), 1) + self.assertEqual(backups[0].read_text(), "old") + workspaces = list(self.target.parent.glob(".*-stage-*")) + if retained: + self.assertEqual(len(workspaces), 1) + self.assertIn(str(workspaces[0]), str(caught.exception)) + self.assertIn(str(backups[0].parent), str(caught.exception)) + old = (self.target if recovery == "interrupt-after" + else workspaces[0] / "previous") + self.assertEqual((old / "SKILL.md").read_text(), "old") + else: + self.assertEqual((self.target / "SKILL.md").read_text(), "old") + self.assertEqual(workspaces, []) + + def test_interrupted_displacement_restores_previous(self): + self.check_interrupted_rename("displacement", True, "ok") + + def test_interrupted_rename_boundaries(self): + for boundary in ("displacement", "activation"): + for after in (False, True): + for recovery in ("ok", "error", "interrupt-before", "interrupt-after"): + with self.subTest(boundary=boundary, after=after, recovery=recovery): + # Each fault gets an independent real filesystem sandbox. + case = TransactionAudit() + case.setUp() + try: + case.check_interrupted_rename(boundary, after, recovery) + finally: + case.doCleanups() + + def test_existing_lock_fails_closed(self): + self.target.parent.mkdir(parents=True) + lock = self.target.parent / ("." + self.target.name + ".install-lock") + lock.mkdir() + with self.assertRaises(FileExistsError): + self.install() + self.assertTrue(lock.is_dir()) + + +if __name__ == "__main__": + unittest.main()