Knowledge base and review workspace for gnolang/gno.
gno/— gnolang/gno submoduleskills/— AI skill definitions.skills/core/is a submodule ofdavd-gzl/skills, the canonical shared rules; the top-level files carry the gno deltas and point at it. Edit core rules there, edit gno deltas here. The submodule tracksmain, sogit submodule update --init --remote skills/coreafter cloning or pulling takes the tip. Never commit the moved gitlink on its own: it rides along with the next commit this repo makes.reviews/pr/— PR review reportsreports/weekly/— Weekly team reports (Samourai)reports/weekly-ux/— Weekly UX team reports (a/ux label)scripts/— Data-gathering and helper scriptsdocs/— architecture references (overview.md,gnovm-architecture.md), the site that serves them on GitHub Pages, andfigures/gen.py, which draws everyfigures/*.svg: edit the script, never an SVG
When given a PR number or URL, read and follow skills/review.md.
Every gno review uses this repo's skills/review.md, whatever the target repo is. That file is
the delta; the core it overrides is the submodule beside it at skills/core/review.md, and the
delta wins wherever the two disagree. Read both, in that order, and never the core alone: it is
repo-agnostic by design and carries none of the gno rules, so a review written against it comes
out confident and well-formed in the wrong house style, missing the comment anchor format, the
Fix: sentence, the banned finding classes and the repro conventions. Nothing in the output
announces the miss, which is what makes it worth stating here. The rule holds for a fork or a
mirror of gno as much as for gnolang/gno itself: the target changes, the skill does not.
When asked to review all (e.g. "review all", "review all non-reviewed recent PRs"), read and follow skills/review.md — see its "Review all" section: review every open, non-draft PR whose number is absent from reviews/pr/, excluding WIP-titled and dependabot PRs unless explicitly included.
When the user says post pointing at a comment_<model>.md draft (open file or path in the message), that is one-shot approval for any event: run ./scripts/post-pr-review.py <number> <path> directly, without reading the draft or the review file. The PR number is the <number>-<slug>/ segment of the path. If it reports invalid anchors, follow the "GitHub review draft" section of skills/review.md. When the draft already carries a Posted: line, the script rewrites the posted review in place (body and [posted]-linked inline comments); the event doesn't change. After a successful post, commit and push the script-updated draft: review: PR <number> posted (<event>). post as an AI is the exception to any event: the Body opens on the marker line skills/review-comment.md quotes, the event is COMMENT whatever the draft's verdict, and nothing is composed beside the marker. This script has no --as-ai, so set Event: COMMENT and the marker in the draft before running it.
When asked what was already reviewed (whether a PR was reviewed, what a past review found, which drafts were posted, recurring patterns across reviews), read and follow skills/review-history.md. Read-only over reviews/; never re-review to answer a history question.
When asked to fix a gnolang/gno issue (bug, security fix, etc.), read and follow skills/fix-issue.md. Supports two modes: fix to implement and open a PR, cleanup to remove worktrees for merged PRs.
When asked to verify a security finding against deployed/merged gnolang/gno code and write it up for private disclosure, read and follow skills/security-advisory.md. Verify by execution (filetest repro), route output to the private disclosure repo, produce a CVSS vector and a paste-ready body for the GitHub Security Advisory form. Findings against an open PR's own diff are reviews, not disclosures: use skills/review.md.
When asked to generate or update the weekly team report, read and follow skills/weekly-report.md. The data-gathering script is scripts/weekly-report.sh. Reports are saved in reports/weekly/.
The script dies on ERROR: 'jq' is required but not found in PATH on a machine with no jq and no sudo. Fetch the static binary and put it on the path for the run; it needs no privileges:
mkdir -p ~/bin && curl -fsSL -o ~/bin/jq https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64 && chmod +x ~/bin/jq
export PATH="$HOME/bin:$PATH"The full fetch takes about four minutes: it walks every open PR one GraphQL call at a time.
:: Done. Open PRs: 0 with no error is a token-scope failure, not an empty week. gh pr list --json reviewRequests resolves login on the Team variant, which needs read:org; without it the whole call fails and every member silently contributes zero PRs. Check with gh auth status (! Missing required token scopes: 'read:org'). The script now asks for requested reviewers through its own GraphQL query restricted to the User variant, so no scope beyond repo is needed. Never accept a zero count from that line — compare against last week's context.md.
When asked to generate or update the weekly UX report (a/ux label), read and follow skills/weekly-ux-report.md. Data is fetched directly via gh CLI. Reports are saved in reports/weekly-ux/.
When a fix needs an issue and none covers it upstream, read and follow skills/issue.md. It searches first and records what the search covered.
When writing the title and body of a PR, read and follow skills/pr-body.md. It loops on the draft until a pass changes nothing, and covers when a change ships a screenshot or a video.
When writing or editing gno docs (docs/resources/*.md, READMEs), code comments, or PR review comments, read and follow skills/writing-style.md.
- This repository is public. Everything committed here is world-readable the moment it is pushed, commit messages and branch names included. Never commit: credentials or tokens; private infrastructure names, hostnames, or repo names; absolute local paths; or a security finding that is exploitable against deployed code. Check
gh repo view <repo> --json visibilitybefore committing anything sensitive to any repo. Force-pushing does not erase: orphaned commits stay reachable by SHA until GitHub Support removes them, so a leak is permanent until reported. Treat anything already pushed as exposed. - Security findings follow deployment, not severity. A finding against an open PR's own diff publishes normally, at any severity. A finding exploitable against already-merged or deployed code is a disclosure: keep it out of this repo, store it privately, and raise it with the user before writing anything.
gno/SECURITY.mdforbids a public issue, and a public fix PR telegraphs the vector just as loudly. Audit output stays out of the tree;reviews/security/is gitignored. - Sync this checkout before reading any state out of it. A fetch in a parent directory does not reach inside a submodule, and this repo may be checked out as one. Before the first task:
git remote -v, fetch every remote listed, and for each comparegit rev-list --left-right --count HEAD...<remote>/<branch>.samouraiworldis canonical; a personal fork onoriginmay sit hundreds of commits behind it, carrying a stalereviews/and staleskills/. Fast-forward only; on diverged history report and stop. Passgit -C <path>on every command — the shell working directory does not persist between commands. - Always read
gno/AGENTS.mdat the start of any task involving the gno repository. It contains project-specific conventions, build instructions, and coding guidelines that must be followed. bash: go: command not foundmeans the toolchain is missing, not that the test failed. A container without Go onPATHfails everygo test, everygnobuild and every filetest with that one line, so a review that reports it as a test result reports nothing.gno/go.modrequiresgo 1.25.9; install it without privileges and link it onto~/bin:curl -fsSL https://go.dev/dl/go1.25.9.linux-amd64.tar.gz | tar -xz -C /tmp && ln -sf /tmp/go/bin/go /tmp/go/bin/gofmt ~/bin/
~/binis not onPATH. Measure it rather than assuming: a session has run with~/bin/gopresent andgo versionstill answeringcommand not found, because the defaultPATHcarries neither~/binnor/tmp/go/bin. Every shell that needs the toolchain opens withexport PATH=$HOME/bin:$PATH, and every dispatched agent's prompt says so, since the export does not survive into another shell./tmpis wiped between sessions, so the symlink can outlive its target: checkgo version, notls ~/bin, before dispatching a batch.- Never write into the
gno/submodule in-place. Any task that modifies files undergno/— code, docs, READMEs, anything — happens inside a worktree at.worktrees/gno-<slug>/. Seeskills/fix-issue.mdfor the worktree-creation procedure. Docs/README work is not an exception: "small" is not a reason to skip a worktree. - Never push to gnolang/gno for review purposes. Pushing to a fork of gnolang/gno is acceptable for specific cases (e.g. cherry-picks).
- When working on the fork, always pull from
origin(upstream master) first, then run the command. - After writing a review, commit and push to this repo only:
git add reviews/pr/<thousand>xxx/<slug> && git commit -m "review: PR <number>" && git push origin HEAD:refs/heads/main. Stage the review's own directory, neverreviews/whole, which sweeps up another session's unfinished round. The explicit refspec is not optional: this repo is usually consumed as a submodule, soHEADis detached and a baregit pushanswersYou must fully qualify the ref. No bare#<number>in the subject: it autolinks to this repo, not gnolang/gno. - Every
scripts/*.shcarries the NOT AUDITED line as line 2, right after the shebang:# NOT AUDITED — AI-generated tooling. Review before executing in any privileged context.then a#separator. Never on adversarial test files underreviews/.../tests/.
- Strip rationale, justifications, and war-stories; keep only directives, in imperative form. State a non-obvious condition tersely, never the historical reason. When a template defines the full output, removing a section is the rule: don't add a "No X section" note explaining the absence. Applies to skills, agent prompts, and
AGENTS.md; not to commit messages, PR descriptions, code comments, or chat. - A prompt that delegates to a skill points at it, never restates its steps. A routine or dispatched-agent prompt carries only: the skill pointer, automation-specific deltas, output requirements, error boundaries.
- When one of a skill's rules proves unclear, missing, or wrong during use, update the skill in the same turn — don't wait to be asked. Cross-PR conventions belong in the skill; one-off PR specifics don't.