Skip to content
Back to skills

Node Wizard Scorecard

BSecurity

Use when an agent receives a Cogni node wizard launch pack, takes over a newly published throwaway node, or must prove the node-wizard launch path end-to-end across child customization PR, child CI/image, parent pin, operator flight request, and candidate /version verification.

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 9, 2026
testinggobashsqlnodedockergitapibackendci/cd

Works with

  • terminal
  • cli
  • api

Security analysis

B88/100
  • criticalAccesses sensitive system or user directories

Pro shows the line behind each finding and how to fix it

Scanned September 22, 2026

npx -y skills add cogni-dao/cogni --skill node-wizard-scorecard --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Node Wizard Scorecard?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Node Wizard Scorecard
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/cogni-dao-node-wizard-scorecard/badge)](https://www.skillsdirectory.com/skills/cogni-dao-node-wizard-scorecard)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: node-wizard-scorecard
description: Use when an agent receives a Cogni node wizard launch pack, takes over a newly published throwaway node, or must prove the node-wizard launch path end-to-end across child customization PR, child CI/image, parent pin, operator flight request, and candidate /version verification.
---

# Node Wizard Scorecard

Use this as the first response after receiving a node launch pack. The goal is
not to save the throwaway node; the goal is to prove the node-wizard launch path
is reproducible by an external agent without privileged manual bridges.

## Setup

If the workspace root does not contain `.env.cogni`, run
`/contribute-to-cogni` against the production operator and save the returned env
file at the repo root before doing launch work. Use that token to recall the
launch handoff knowledge block (`node-launch-handoff`) and search for agent
starter-kit knowledge before designing the customization PR.

## First Response

Do not send the full matrix before a child customization PR exists. Before that
point, report only launch facts plus the next concrete action. A status table
with `READY` rows is misleading because the path has not produced a deployable
artifact and human merge latency may still be ahead.

Pre-PR first response:

```markdown
Launch facts:

- node repo:
- parent PR:
- candidate URL:

Current gate: child customization PR not opened
Next action: create a minimal node repo PR and report its URL
```

Humans may send only a repo URL, parent PR, or short status fragment. Recover
the rest from GitHub/operator state; do not ask the human to fill out the
scorecard.

## Required Matrix

Return this matrix only after the child customization PR exists, or when
reporting a terminal blocker that prevents opening one:

| Gate                   | Evidence                                                                 | Status         | Next action                                                                               |
| ---------------------- | ------------------------------------------------------------------------ | -------------- | ----------------------------------------------------------------------------------------- |
| Launch pack facts      | node repo URL, parent PR, candidate URL                                  | `pass/blocked` | missing fact to recover                                                                   |
| Branch protection      | node repo `main` requires the standard CI checks (and a PR) before merge | `pass/blocked` | enable branch protection on the spawned node repo — required checks = the standard CI set |
| Child customization PR | PR URL in node repo                                                      | `pass/blocked` | create PR from node repo branch                                                           |
| Child CI               | required checks green                                                    | `pass/blocked` | fix child PR                                                                              |
| Child main image       | `ghcr.io/<owner>/<repo>:sha-<child-main-sha>` exists after merge         | `pass/blocked` | report missing image/tag                                                                  |
| Parent birth PR        | merged or still open                                                     | `pass/blocked` | wait/ask human to merge parent PR                                                         |
| Parent pin             | parent gitlink pins the image-producing child main SHA                   | `pass/blocked` | ask operator to update/publish parent pin                                                 |
| Candidate flight       | requested through operator API                                           | `pass/blocked` | call operator flight API only when eligible                                               |
| Candidate verification | candidate `/version` matches launched child SHA                          | `pass/blocked` | run agent-first validation                                                                |
| Agent-first validation | candidate API exercised using `docs/guides/agent-api-validation.md`      | `pass/blocked` | present human scorecard                                                                   |

## Rules

- **Every spawned node repo's `main` MUST have branch protection requiring the
  standard CI checks (and a PR) before merge.** This is the precondition that
  gives operator "merge on green" real teeth and a backstop: without it, a PR
  whose checks were skipped or never ran can merge _vacuously_ and the operator's
  own merge gate becomes the only authority. With it, an RBAC-holder can safely
  approve the standard CI workflows on — and merge — external-dev PRs to that
  repo (including PRs the agent itself authored from a fork), because branch
  protection independently enforces that the standard checks went green.
- Do not push directly to child `main`.
- Do not merge your own child or parent PR. Stop at ready/mergeable and report
  the human/operator merge row as pending.
- Do not hand-edit the operator gitlink from the child-repo agent.
- Do not infer GHCR success from a commit existing; the image tag must exist.
- Do not request flight until the parent pin and child image agree.
- Candidate flight must be requested through the operator API. Do not use
  source-repo deploy workflows or other privileged manual deploy paths.
- DNS is automatic — never hand-create a `<node>-test` record. The flight upserts
  it (`reconcile-node-dns.sh`; ci-cd.md Axiom 21). A fresh-flight `NXDOMAIN` is
  almost always negative-cache — re-check `dig <host> +short @1.1.1.1`.
- **Edge is automatic-but-fragile — DO NOT assume a flighted node serves
  externally (KNOWN GAP).** The `node-substrate` edge reconcile writes the Caddy
  route, but on a fresh node the running config may not pick it up → the node is
  Argo-Healthy and serves **in-cluster** yet returns external **000** (proven on
  beacon prod, 2026-06-16). External 000 + DNS resolving + pod Healthy = the
  **edge-reload gap (bug.5031 / PR #1697)**, not negative cache. Heal + the full
  substrate-gaps table (doltgres-DB-missing `Init:CrashLoopBackOff`, preview
  global-lease freeze, prod-promote `sourceSha` footgun, no-LLM-backend) live in
  `node-wizard-expert` SKILL.md → "Substrate E2E is NOT yet hands-off". Mirror
  this into the hub entry `node-formation-wizard-scorecard`.
- After merge, use the child repo's current `main` SHA as `sourceSha`. GitHub
  merge commits differ from PR head commits, and the child push build tags
  `sha-${github.sha}`.
- If a gate is blocked by missing operator authority, report the blocker instead
  of inventing a privileged workaround.

## Human Scorecard Timing

Do not present the node formation scorecard to the human until candidate flight
has succeeded, candidate `/version` matches the launched SHA, and agent-first
API validation has passed. The human-facing report must include critical repo
links, child PR/check status, image tag and digest, parent pin status, flight
status, candidate `/version`, and a short explanation of the child-build ->
operator-pin -> candidate-flight CI/CD path. Use
`docs/spec/node-ci-cd-contract.md` for the CI/CD facts and
`docs/guides/agent-api-validation.md` for the post-flight API exercise.

## Fresh Boot Health

After candidate flight and `/version` match, prove the freshly booted node is
usable, not just deployed:

| Check                                  | Evidence                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | Status         |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- |
| Registration works                     | new agent registration succeeds against the candidate node                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | `pass/blocked` |
| Agent graph call works                 | registered agent gets a successful graph/completions response; ask for a haiku. **Known gap:** a fresh node with no LLM/LiteLLM secret provisioned **times out** here (deployed ≠ usable) — report `blocked` with the timeout, don't paper over it                                                                                                                                                                                                                                                                                   | `pass/blocked` |
| Knowledge is live                      | create a knowledge contribution and confirm the node repo-spec exposes a DoltHub `knowledge.remote.url`                                                                                                                                                                                                                                                                                                                                                                                                                              | `pass/blocked` |
| Knowledge round-trips (sync + recover) | **the load-bearing durability proof, not just "a contribution exists".** Register a domain (bearer, on-demand) → contribute an entry **and** create a work item → human-merge the contribution → `pushMainOnMerge` `dolt_push` lands on the DoltHub remote → recover it by a **fresh clone** and assert the entry + work_item + commit log come back. See "Dolt round-trip recovery" below — this is what proves the node's knowledge actually persists and is recoverable, the gap that silently hid data-loss until it was needed. | `pass/blocked` |
| Epoch is active                        | candidate node reports an active/current epoch or equivalent live epoch state                                                                                                                                                                                                                                                                                                                                                                                                                                                        | `pass/blocked` |
| Base RPC is live                       | `GET /readyz?deep=1` forces a live Base RPC read and returns 200; `GET /api/v1/public/treasury/snapshot` returns `staleWarning:false` with `blockNumber>0`. Missing `EVM_RPC_URL` is fatal, while a transient vendor failure on default `/readyz` remains non-draining and emits `substrate.evm_rpc.unreachable`.                                                                                                                                                                                                                    | `pass/blocked` |

### Dolt round-trip recovery (how to run the `Knowledge round-trips` check)

Proving "recover" is the non-obvious part — **plain `dolt clone` (Dolt CLI) does NOT
work on healthy Doltgres data**: it fails `could not find root value: main; table has
unknown fields`. That is the Dolt engine being unable to read the Doltgres dialect, NOT
corruption. (When the SAME `table has unknown fields` appears from DoltHub's **web-SQL**
runner, that IS a corrupted repo — the diagnostic differs by tool.) Recover doltgres-native:

```bash
# creds: JWK keyid written to the node's OpenBao at cogni/<env>/<node>/DOLT_CREDS_{JWK,KEYID}
docker run -d --name dolt-recover -p 5433:5432 \
  -e DOLTGRES_PASSWORD=recoverpw -v "$HOME/.dolt:/root/.dolt:ro" dolthub/doltgresql:0.57.3
psql "postgresql://doltgres@127.0.0.1:5433/doltgres" \
  -c "SELECT DOLT_CLONE('<owner>/<repo>');"        # SELECT, not CALL
psql "postgresql://doltgres@127.0.0.1:5433/<repo>" \
  -c "SELECT domain,title FROM knowledge WHERE content LIKE '%<marker>%';" \
  -c "SELECT id,type,title FROM work_items WHERE id='<work-item-id>';" \
  -c "SELECT LEFT(commit_hash,10),message FROM dolt_log ORDER BY date DESC LIMIT 6;"
```

Report `blocked` (do NOT paper over) if any of: DoltHub target is the canonical repo
rather than a throwaway (a fresh spawn must sync to a throwaway, e.g. via the per-env
`KNOWLEDGE_DOLTHUB_REMOTE_URL` override), `DOLT_CREDS` absent so the push is a silent
no-op, or the recovered clone is missing the entry / work item / commit. **Known root
cause (2026-08):** DoltHub is an unsupported Doltgres remote — its Dolt-native GC cannot
walk Doltgres roots and can prune a live base chunk, silently corrupting a long-lived
mirror. Prefer a Doltgres-native remote (filesystem/S3) for durable mirrors; back up the
Doltgres volume (the app `db-backup` job does NOT cover it).

Include these rows in the human-facing scorecard when they are relevant to a
fresh node spawn. If a row is blocked by missing credentials or absent endpoint
surface, report the exact blocker instead of substituting a weaker health check.

## Minimal v0 Path

1. Confirm launch-pack facts and recall the knowledge handoff.
2. Confirm the node repo `main` has branch protection requiring the standard CI
   checks before merge (the backstop for operator run-ci + merge-on-green);
   enable it if missing.
3. Open a child node customization PR.
4. Wait for child PR CI, human/operator merge, and child `main` image tag.
5. Right before flighting, ensure the parent birth PR is merged or explicitly
   ask the human to merge it.
6. Confirm the parent pin references that image-producing child SHA.
7. Request candidate-a flight through the operator API.
8. Verify candidate `/version`, run agent-first API validation, and complete
   fresh boot health checks.
9. Run the **Dolt knowledge round-trip health** check (Fresh Boot Health, above):
   contribute + create a work item → human-merge → confirm `dolt_push` landed →
   recover by a fresh doltgres-native `SELECT DOLT_CLONE(...)` and assert the
   entry + work_item + commit log return. Deployed ≠ durable until this passes.
10. Present the node formation scorecard to the human.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.