Skip to content

fix: real-usage bugs + end-to-end flow test harness#22

Merged
Pantani merged 3 commits into
mainfrom
fix/real-usage-bugs-flow-tests
Jun 6, 2026
Merged

fix: real-usage bugs + end-to-end flow test harness#22
Pantani merged 3 commits into
mainfrom
fix/real-usage-bugs-flow-tests

Conversation

@Pantani

@Pantani Pantani commented Jun 6, 2026

Copy link
Copy Markdown
Owner

Summary

Three CLI bugs that only appeared in real usage (integration tests were green) plus a new flow test harness to prevent regressions.

Bug fixes

  • BUG-001 (src/cli/chain.rs): sunscreen quickstart nft --name X crashed with ENOENT after creating the workspace. Root cause: create_workspace returned a relative PathBuf which Transaction then joined with an already-relative sub-path, producing "my-app/my-app/programs/...". Fix: make dest absolute via current_dir().join() before any downstream use.

  • BUG-002 (src/cli/scaffold.rs): scaffold instruction/account/event/error required --program even when the workspace had exactly one program. Fix: changed all four Args structs from program: String to program: Option<String> and added resolve_program() which auto-detects the single program (prints note: using program \X``) or gives a clear error when 2+ programs exist.

  • BUG-003 (src/onboarding/learn.rs): sunscreen learn list gave "unknown learn topic 'list'". Fix: added Some("list") | None => list_topics(json) arm before Some(topic).

Flow test harness (new)

Complete end-to-end user-journey scripts that run the real compiled binary from an isolated /tmp directory — the only way to catch path bugs and auto-detection failures that unit tests cannot see:

Script Journey Assertions
flow-nft.sh quickstart nft → scaffold instruction/account/event/error → idempotency → learn 18
flow-token.sh quickstart token → mint_to/burn/transfer_checked → accounts/events/errors 17
flow-smart-contract.sh chain new → scaffold program → multi-program instructions/accounts/errors → build 17
flow-runner.sh runs all three, prints summary

New flow-test-runner agent owns these flows and is now mandatory in every test round. offline-ci-owner, test-harness-orchestrator, e2e-qa-fixer, and ux-flow-validator updated to require flow-runner.sh before marking any gate green.

Test plan

  • cargo test --locked — 390/390 pass, 7 ignored (real toolchain)
  • cargo clippy --locked --all-targets --all-features — 0 warnings
  • cargo fmt --all -- --check — clean
  • cargo build --locked --no-default-features — compiles
  • bash .claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh — 3/3 flows, 52/52 assertions pass
  • Manual smoke from /tmp: quickstart nft, scaffold instruction (no --program), learn list

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Workspace path normalization to avoid relative-path crashes
    • learn list now shows available topics
    • doctor --fix adds a "needs inspection" outcome and clearer repair reporting
  • New Features

    • Program auto-detection when a workspace has a single program (no --program needed)
    • End-to-end flow test harness covering zero-to-NFT, zero-to-token, and zero-to-smart-contract journeys; runner aggregates results
  • Documentation

    • Expanded doctor --fix docs with before/after output, logs, and retry/HTTP1.1 download notes
  • Tests

    • New integration tests validating repair outcomes and download failure handling

Pantani and others added 2 commits June 5, 2026 18:35
Bug fixes (all verified with real binary from /tmp):
- BUG-001: quickstart relative-path crash — create_workspace now makes dest
  absolute via current_dir().join() before passing to Transaction/WorkspaceRoot,
  eliminating the double-prefix "my-app/my-app/programs/..." ENOENT.
- BUG-002: scaffold instruction/account/event/error required --program even
  when workspace has exactly one program — resolve_program() now auto-detects
  the single program and prints "note: using program X" to stderr.
- BUG-003: sunscreen learn list gave unknown topic list — added
  Some("list") | None arm to route to list_topics().

Flow test harness (new):
- .claude/skills/sunscreen-flow-tests/ with scripts for three complete user
  journeys: zero-to-NFT (18 assertions), zero-to-token (17), and
  zero-to-smart-contract (17). flow-runner.sh orchestrates all three.
- .claude/agents/flow-test-runner.md — new specialist owning end-to-end flows.
- Updated offline-ci-owner, test-harness-orchestrator, e2e-qa-fixer, and
  ux-flow-validator to require flow tests before marking any gate green.

390/390 unit tests pass. 52/52 flow assertions pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ecc-tools

ecc-tools Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Analyzing 200 commits...

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown

PR changed again? Review this PR in Change Stack to compare snapshots and stay oriented.

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6918f83a-475c-4cf1-9978-95d508a65b07

📥 Commits

Reviewing files that changed from the base of the PR and between 49c8e13 and cf12487.

📒 Files selected for processing (7)
  • .claude/agents/e2e-qa-fixer.md
  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • src/toolchain/fix.rs
📜 Recent review details
🧰 Additional context used
📓 Path-based instructions (2)
src/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke sunscreen-test-harness through the orchestrator rather than implementing tests inline

Use Rust as the implementation language for sunscreen CLI (adapted from Go/solis), with stack: clap, serde, minijinja, rust-embed, tokio, insta

All Rust source code must pass clippy lints, rustfmt formatting, and cargo check compilation without warnings

Files:

  • src/toolchain/fix.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while adapting all stack references from Go/solis to Rust/sunscreen (clap, serde, minijinja, rust-embed, tokio, insta)

Files:

  • src/toolchain/fix.rs
🧠 Learnings (36)
📓 Common learnings
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/**/*.rs : For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke `sunscreen-test-harness` through the orchestrator rather than implementing tests inline
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/onboarding/**/*.rs : Onboarding commands (init, examples, quickstart, wallet, deploy, learn, next_step) must support offline and fake-toolchain testing
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to tests/**/*.rs : Unit and integration tests must remain in-repo (offline deterministic gate, generated workspace compile gate, real Anchor/Solana/Codama gate, real Pinocchio SBF, serve runtime, plugin runtime, frontend typecheck tests); heavy/real-world testing is delegated to `sunscreen-test-harness`
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/onboarding/*.rs : Onboarding commands (`init`, `examples`, `quickstart`, `wallet`, `deploy`, `learn`) must work offline or with fake toolchain substitutes for testing
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Sunscreen v1.0 is scoped to: Phase 0 (CLI scaffolding), Phase 1 (workspace bootstrap), Phase 2 (instruction/account/event/error/program scaffolders), Phase 3 (dev loop—build/serve/watcher), Phase 4 (codegen—clients/IDL/hooks), Phase 5 (recipes—CRUD/SPL-Token/Metaplex), Phase 5.5 (onboarding—init/examples/quickstart/wallet/deploy/learn), Phase 6 (plugin system), Phase 7 (Pinocchio support), Phase 8 (distribution/docs); total effort ~21 weeks
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/**/*.rs : CLI command implementations in sunscreen must invoke the `sunscreen-orchestrator` skill for any request to implement, expand, fix, or refactor CLI features
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain build --headless` must discover the workspace, run `anchor build`, emit NDJSON events, report missing Anchor as exit 2, and preserve Anchor failure exit codes; followed by `pnpm exec codama run` by default unless `--no-codama` is set
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain doctor --fix-markers` must repair safe non-appendable sites without appending invalid Rust; `dispatch` is rebuilt only when generated wrappers are gone and instruction files define `pub fn handler`, and `error_variants` marker insertion refuses ambiguous enum bodies
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to **/*.rs : Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while adapting all stack references from Go/solis to Rust/sunscreen (clap, serde, minijinja, rust-embed, tokio, insta)
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/*integration*.rs : Integration tests must use isolated fake toolchains and run the compiled binary explicitly, not internal APIs, to validate end-to-end CLI behavior
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T07:24:54.378Z
Learning: Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while switching stack references to Rust
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/**/*.rs : For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke `sunscreen-test-harness` through the orchestrator rather than implementing tests inline

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/**/*.rs : Exit codes must follow the convention: 0=success, 2=toolchain_missing, 3=invalid_config, 4=user_input, 5=workspace_missing, 9=plugin_runtime

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Exit codes are standardized: 0 (success), 1 (unhandled error), 2 (toolchain error—missing Anchor/Solana), 3 (invalid config), 4 (user input conflict), 5 (workspace state error), 9 (plugin runtime error)

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain build --headless` must discover the workspace, run `anchor build`, emit NDJSON events, report missing Anchor as exit 2, and preserve Anchor failure exit codes; followed by `pnpm exec codama run` by default unless `--no-codama` is set

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/*.rs : Commands should use exit code 4 (`user_input`) for conflicts or ambiguities requiring user intervention, exit code 2 (`toolchain_missing`) for missing tools, and exit code 3 (`config_invalid`) for configuration errors

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/chain.rs : `chain build` must run Anchor then Codama by default, support `--no-codama` to skip regeneration, and preserve Anchor exit codes on failure

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/runtime/pipeline.rs : Build pipeline must run anchor build followed by pnpm exec codama run with --no-codama skip option

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/{scaffold,generate}.rs : Anchor-only commands (scaffold, generate) must fail with clear error when framework is not Anchor

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/onboarding/*.rs : Onboarding commands (`init`, `examples`, `quickstart`, `wallet`, `deploy`, `learn`) must work offline or with fake toolchain substitutes for testing

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/toolchain/*.rs : Toolchain detection must support framework-specific preflight checks (Anchor for most scaffolds, no Anchor for Pinocchio) and report missing tools with exit code 2

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain new` must create Anchor workspaces with `segment=dispatch` in `lib.rs` and `segment=instructions` in `instructions/mod.rs` templates; first `scaffold instruction` patches without warning (`lib_rs_patched=true`)

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: The dev loop is orchestrated end-to-end: `chain new` → `chain serve` (watcher + build + Codama + frontend notify) → `generate` (clients/IDL/hooks) → `scaffold recipes` → `app` (plugin lifecycle) → deployment via `deploy` command

Applied to files:

  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/onboarding/**/*.rs : Onboarding commands (init, examples, quickstart, wallet, deploy, learn, next_step) must support offline and fake-toolchain testing

Applied to files:

  • .claude/agents/flow-test-runner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to docs/adr/ADR-0001-solis-cli.md : The ADR is the design source of truth but references Go/solis; all stack references must be adapted to Rust/sunscreen for this project

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to **/*.rs : Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while adapting all stack references from Go/solis to Rust/sunscreen (clap, serde, minijinja, rust-embed, tokio, insta)

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain doctor --fix-markers` must repair safe non-appendable sites without appending invalid Rust; `dispatch` is rebuilt only when generated wrappers are gone and instruction files define `pub fn handler`, and `error_variants` marker insertion refuses ambiguous enum bodies

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/scaffold.rs : All scaffold subcommands (instruction, account, event, error, program) must support `--dry-run` and `--json` flags, return exit code 4 on user_input conflicts, and include generator tag on every marker (instruction/account/event/error/program)

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to .github/workflows/ci.yml : CI must enforce `--locked` and no-default-features builds, run command-group smoke tests with compiled binary and isolated fake toolchains, enforce concurrency limits, permissions checks, and timeouts

Applied to files:

  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to tests/**/*.rs : Unit and integration tests must remain in-repo (offline deterministic gate, generated workspace compile gate, real Anchor/Solana/Codama gate, real Pinocchio SBF, serve runtime, plugin runtime, frontend typecheck tests); heavy/real-world testing is delegated to `sunscreen-test-harness`

Applied to files:

  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/*integration*.rs : Integration tests must use isolated fake toolchains and run the compiled binary explicitly, not internal APIs, to validate end-to-end CLI behavior

Applied to files:

  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to tests/integration_*.rs : Integration tests must use Ignite-style CLI smoke tests with isolated fake toolchains and compiled binary invocation

Applied to files:

  • .claude/agents/test-harness-orchestrator.md
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/scaffold.rs : Scaffold command conflicts (e.g., duplicate account definitions) should return exit code 4 with a clear error message identifying the conflict

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to **/*.rs : All scaffolded code must maintain idempotency — running the same scaffold command multiple times produces the same result without errors

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/app.rs : App install must detect duplicate sources and ambiguous plugin names; conflicts must return exit 4

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/scaffold/**/*.rs : Implement idempotency for all scaffolding commands (scaffold instruction/account/event/error/program/recipes)

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/scaffold/**/*.rs : Scaffold commands must support --dry-run flag for preview without side effects

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Sunscreen v1.0 is scoped to: Phase 0 (CLI scaffolding), Phase 1 (workspace bootstrap), Phase 2 (instruction/account/event/error/program scaffolders), Phase 3 (dev loop—build/serve/watcher), Phase 4 (codegen—clients/IDL/hooks), Phase 5 (recipes—CRUD/SPL-Token/Metaplex), Phase 5.5 (onboarding—init/examples/quickstart/wallet/deploy/learn), Phase 6 (plugin system), Phase 7 (Pinocchio support), Phase 8 (distribution/docs); total effort ~21 weeks

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain serve --headless` must start a `notify` watcher, batch relevant changes through debounce, emit NDJSON for watcher-triggered build pipeline runs, and launch managed Surfpool/test-validator runtime with fallback from implicit Surfpool to test-validator

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/*.rs : CLI commands should emit NDJSON (newline-delimited JSON) events for long-running operations like build, serve, and watch to support machine-readable progress

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/**/*.rs : CLI commands must emit NDJSON events for streaming/logging in headless/automated contexts

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/toolchain/preflight.rs : Preflight checks must skip Anchor when `--framework pinocchio` is used; `chain build` must emit `pinocchio_build` and run `cargo build-sbf` for Pinocchio workspaces

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/chain.rs : `chain doctor --fix-markers` must repair safe non-appendable sites without appending invalid Rust and refuse ambiguous enum bodies in marker insertion

Applied to files:

  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/**/*.rs : CLI command implementations in sunscreen must invoke the `sunscreen-orchestrator` skill for any request to implement, expand, fix, or refactor CLI features

Applied to files:

  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/chain.rs : Chain doctor must repair markers safely without appending invalid Rust; non-appendable sites must be rebuilt only when constraints are met

Applied to files:

  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/app.rs : `app` lifecycle commands (install, uninstall, list, describe, update) must manage declarative `plugins[]` entries with idempotent install, `--dry-run` support, basename normalization, semver validation with optional `v` prefix, and duplicate-source detection; exit codes reuse 3/4/5

Applied to files:

  • src/toolchain/fix.rs
🔇 Additional comments (7)
src/toolchain/fix.rs (1)

328-331: LGTM!

.claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh (1)

102-105: LGTM!

Also applies to: 117-127

.claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh (1)

137-144: LGTM!

Also applies to: 155-157

.claude/skills/sunscreen-flow-tests/scripts/flow-token.sh (1)

18-18: LGTM!

.claude/agents/e2e-qa-fixer.md (1)

67-75: LGTM!

.claude/agents/flow-test-runner.md (1)

28-28: LGTM!

Also applies to: 83-84

.claude/agents/test-harness-orchestrator.md (1)

31-37: LGTM!


📝 Walkthrough

Walkthrough

Introduces an end-to-end flow test harness (runner + three journey scripts + skill/docs), mandates real-binary flow validation in CI, fixes three CLI onboarding bugs (path normalization, optional program auto-detect, learn list), and refactors doctor/toolchain repairs with a new NeedsInspection status and safer installer logic.

Changes

End-to-End CLI Fixes and Flow Test Infrastructure

Layer / File(s) Summary
Three Critical CLI Bug Fixes
src/cli/chain.rs, src/cli/scaffold.rs, src/onboarding/learn.rs
Workspace destination path is normalized to absolute; scaffold subcommands accept optional --program with auto-detection when a single program exists; learn treats explicit "list" like None.
Doctor NeedsInspection Status & Safer Repairs
src/toolchain/fix.rs, src/cli/doctor.rs, docs/site/src/reference/cli/doctor.md, tests/doctor_fix.rs
Adds ToolFixStatus::NeedsInspection, centralizes post-repair status mapping, replaces curl
Flow Test Orchestration & Agent Definitions
.claude/agents/flow-test-runner.md, .claude/agents/e2e-qa-fixer.md, .claude/agents/ux-flow-validator.md, .claude/agents/offline-ci-owner.md, .claude/agents/test-harness-orchestrator.md, .claude/skills/sunscreen-flow-tests/SKILL.md
Defines flow-test-runner, e2e-qa-fixer, ux-flow-validator agents and their workflows/bug-report templates; mandates running flow-runner with the real release binary after offline gating; updates orchestration and team communication to include flow-test-runner as a required participant.
Flow Test Script Implementation
.claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh, .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh, .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh, .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
Adds flow-runner orchestrator and three full journey scripts that create isolated temp workspaces, run quickstart/scaffold/build/doctor, assert generated artifacts and outputs, aggregate pass/fail counts, and fail the run when any flow fails.
CI Integration & Documentation
CLAUDE.md
Variation log updated to record three real-usage bug fixes and the new flow-test harness; offline CI owner now documents mandatory post-offline flow validation and routing for failures.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Pantani/sunscreen#13: Related to onboarding changes; both touch src/onboarding/learn.rs and workspace creation behavior.
  • Pantani/sunscreen#1: Related scaffold CLI changes; both PRs adjust program selection and scaffold wiring in src/cli/scaffold.rs.

Poem

🐰 I hopped through /tmp with a checklist bright,

Running flows and scaffolds deep into the night.
Paths straightened, programs found, doctor learned to mind,
Test scripts counted passes so no bug stays behind.
A carrot of CI now guards the release — hop, test, and grind.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.16% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the two main aspects of the PR: bug fixes and a new flow test harness. It is concise and directly relates to the changeset.
Description check ✅ Passed The description follows the template with all major sections completed: Summary, detailed bug fixes with root causes and fixes, flow test harness explanation with comprehensive tables, test plan with verification checkmarks, and proper documentation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ecc-tools

ecc-tools Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Analysis Complete

Generated ECC bundle from 2 commits | Confidence: 50%

View Pull Request #23

Repository Profile
Attribute Value
Language Rust
Framework Not detected
Commit Convention freeform
Test Directory separate
Changed Files (18)
Metric Value
Files changed 18
Additions 1074
Deletions 47

Top hotspots

Path Status +/-
.claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh added +160 / -0
.claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh added +122 / -0
.claude/agents/flow-test-runner.md added +112 / -0
.claude/skills/sunscreen-flow-tests/scripts/flow-token.sh added +108 / -0
.claude/agents/ux-flow-validator.md added +103 / -0

Top directories

Directory Files Total changes
.claude/skills/sunscreen-flow-tests/scripts 4 437
.claude/agents 5 345
src/cli 3 108
.claude/skills/sunscreen-flow-tests 1 98
tests 1 78
Analysis Depth Readiness (evidence-backed, 36%)

ECC Tools uses this to decide whether recommendations should stay at commit-history/setup guidance or expand into CI, security, harness, reference-set, AI-routing, and team backlog work.

Area Status Evidence / Next Step
Commit history Partial 2 commits sampled
CI/CD signals Missing Add workflow files or CI troubleshooting evidence so ECC Tools can reason about pipeline setup.
Security evidence Missing Add AgentShield, audit, SARIF, SBOM, or security review evidence so recommendations can cover security posture.
Harness configuration Ready .claude/agents/e2e-qa-fixer.md, .claude/agents/flow-test-runner.md, .claude/agents/offline-ci-owner.md
Reference/eval evidence Missing Add fixtures, golden traces, reference sets, or evaluator benchmarks so deeper recommendations have regression evidence.
AI routing and cost controls Ready CLAUDE.md
Team handoff and project tracking Missing Add roadmap, runbook, project, Linear, or follow-up tracking docs so generated work can land in a team queue.
Reference Set Readiness (1/7, 14%)
Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Present .claude/agents/e2e-qa-fixer.md, .claude/agents/flow-test-runner.md, .claude/agents/offline-ci-owner.md
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.
Likely Future Issues (5)
Severity Signal Why it may show up
MEDIUM CLI changes may ship without shell or end-to-end coverage 4 CLI surface paths changed; 0 CLI-focused integration or e2e tests changed
HIGH Security-sensitive changes may ship without scanner evidence 5 security-sensitive paths changed; 0 security scanner or security-focused validation artifacts changed
MEDIUM Cost or token-risk changes may ship without budget evidence 1 cost/token-risk paths changed; 0 budget, usage, or cost validation artifacts changed
MEDIUM AI or harness analysis changes may ship without reference-set validation 10 reference-sensitive path(s) changed; 0 eval, golden trace, benchmark, or reference-set artifacts changed
MEDIUM Harness config changes may ship without compatibility evidence 10 harness config paths changed; 0 harness compatibility evidence artifacts changed
  • CLI changes may ship without shell or end-to-end coverage: The PR changes CLI, bin, or command-entry files without touching any obvious CLI-focused integration or end-to-end tests.
  • Security-sensitive changes may ship without scanner evidence: The PR touches billing, secrets, auth, webhooks, agent, or CI-sensitive surfaces without adding obvious security scanner, code scanning, or security-focused validation evidence.
  • Cost or token-risk changes may ship without budget evidence: The PR changes AI routing, usage, token budget, or model-call surfaces without touching obvious budget, usage-limit, or cost regression evidence.
  • AI or harness analysis changes may ship without reference-set validation: The PR changes analyzer, skill, agent, command, or harness guidance without updating any obvious eval, golden trace, benchmark, or reference-set artifact.
  • Harness config changes may ship without compatibility evidence: The PR changes harness, MCP, plugin, or agent configuration without touching harness audit, adapter matrix, cross-harness docs, or compatibility regression evidence.
Suggested Follow-up Work (5)
Type Suggested title Targets
PR test: add CLI coverage for docs/site/src/reference/cli/doctor.md + src/cli/chain.rs docs/site/src/reference/cli/doctor.md, src/cli/chain.rs
PR security: add scanner evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md .claude/agents/e2e-qa-fixer.md, .claude/agents/flow-test-runner.md
PR test: add budget evidence for CLAUDE.md CLAUDE.md
PR analysis: add reference-set evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md .claude/agents/e2e-qa-fixer.md, .claude/agents/flow-test-runner.md
PR harness: add config quality evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md .claude/agents/e2e-qa-fixer.md, .claude/agents/flow-test-runner.md
  • test: add CLI coverage for docs/site/src/reference/cli/doctor.md + src/cli/chain.rs: Backfill CLI coverage before another command-surface change lands on the touched paths.
  • security: add scanner evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md: Backfill explicit scanner or code-scanning evidence before another security-sensitive change lands on the touched surface.
  • test: add budget evidence for CLAUDE.md: Backfill cost, token, or usage-limit validation before another model-routing change lands on the touched surface.
  • analysis: add reference-set evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md: Backfill eval, golden trace, benchmark, or reference-set evidence before another AI or harness-analysis change lands on the touched surface.
  • harness: add config quality evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md: Backfill harness audit, adapter matrix, or cross-harness compatibility evidence before another config change lands on the touched surface.

Copy-ready bodies

test: add CLI coverage for docs/site/src/reference/cli/doctor.md + src/cli/chain.rs

## Summary
- Add shell, CLI, or end-to-end coverage for the recently changed command surface.

## Why
- Backfill CLI coverage before another command-surface change lands on the touched paths.

## Touched paths
- `docs/site/src/reference/cli/doctor.md`
- `src/cli/chain.rs`

## Validation
- Add or extend shell, CLI, or end-to-end coverage for the changed command surface.
- Exercise the user-facing command invocation and expected exit/output behavior.

security: add scanner evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md

## Summary
- Add security scanner or code-scanning evidence for the recently changed security-sensitive surface.

## Why
- Backfill explicit scanner or code-scanning evidence before another security-sensitive change lands on the touched surface.

## Touched paths
- `.claude/agents/e2e-qa-fixer.md`
- `.claude/agents/flow-test-runner.md`

## Validation
- Run or add the relevant security scanner, code scanning, secret scanning, or dependency/security review check for the touched surface.
- Attach the scanner output, SARIF/code-scanning result, or focused security regression test to the follow-up PR.
- Confirm the changed auth, billing, webhook, secret-handling, agent, or CI surface has an explicit pass/fail gate.

test: add budget evidence for CLAUDE.md

## Summary
- Add budget or usage-limit validation for the recently changed AI routing or model-call surface.

## Why
- Backfill cost, token, or usage-limit validation before another model-routing change lands on the touched surface.

## Touched paths
- `CLAUDE.md`

## Validation
- Add or extend budget, token, usage-limit, or model-routing regression coverage for the changed path.
- Verify the route still enforces plan limits, retry caps, fallback behavior, or explicit cost controls.

analysis: add reference-set evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md

## Summary
- Add reference-set or eval evidence for the recently changed AI, analyzer, skill, agent, command, or harness guidance surface.

## Why
- Backfill eval, golden trace, benchmark, or reference-set evidence before another AI or harness-analysis change lands on the touched surface.

## Touched paths
- `.claude/agents/e2e-qa-fixer.md`
- `.claude/agents/flow-test-runner.md`

## Validation
- Add or update an eval, golden trace, benchmark, fixture, or reference-set artifact for the changed AI/harness behavior.
- Compare the changed behavior against the maintained reference set and record the pass/fail evidence.
- Confirm the follow-up evidence covers the same analyzer, skill, agent, command, or harness surface touched by this PR.

harness: add config quality evidence for .claude/agents/e2e-qa-fixer.md + .claude/agents/flow-test-runner.md

## Summary
- Add harness compatibility evidence for the recently changed config surface.

## Why
- Backfill harness audit, adapter matrix, or cross-harness compatibility evidence before another config change lands on the touched surface.

## Touched paths
- `.claude/agents/e2e-qa-fixer.md`
- `.claude/agents/flow-test-runner.md`

## Validation
- Run or update the harness audit, adapter compliance matrix, or cross-harness compatibility check for the changed config.
- Add or update a regression, fixture, or doc evidence path that covers the affected harness, MCP, plugin, or agent loading behavior.
Generated Instincts (14)
Domain Count
git 2
code-style 9
testing 2
architecture 1

After merging, import with:

/instinct-import .claude/homunculus/instincts/inherited/sunscreen-instincts.yaml

Files

  • .claude/ecc-tools.json
  • .claude/skills/sunscreen/SKILL.md
  • .agents/skills/sunscreen/SKILL.md
  • .agents/skills/sunscreen/agents/openai.yaml
  • .claude/identity.json
  • .codex/config.toml
  • .codex/AGENTS.md
  • .codex/agents/explorer.toml
  • .codex/agents/reviewer.toml
  • .codex/agents/docs-researcher.toml
  • .claude/homunculus/instincts/inherited/sunscreen-instincts.yaml

ECC Tools | Everything Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 49c8e133e1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +117 to +118
assert_cmd 0 "doctor exits 0 (reports tool status)" \
"$SUNSCREEN_BIN" doctor || true # doctor may exit non-zero if tools missing — accept both

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Accept doctor exit 2 in offline flows

On a normal offline developer/CI machine where required tools like Anchor or Solana are missing, sunscreen doctor exits 2 (per src/cli/doctor.rs), and SUNSCREEN_SKIP_PREFLIGHT does not change doctor detection. This assert_cmd 0 records a failure before the trailing || true can help, so the mandatory flow-runner.sh will fail the zero-to-NFT flow even though the comment says missing tools should be accepted; the doctor step needs to explicitly allow the missing-tool exit code.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/agents/e2e-qa-fixer.md:
- Around line 67-75: Add a language tag to the Markdown code fence that contains
the FLOW block (the triple-backtick fence before "FLOW: zero-to-NFT") so it
satisfies markdownlint MD040; e.g., change ``` to ```text or ```bash to make the
fence language-specified while preserving the block content ("FLOW:
zero-to-NFT", "STEP: scaffold instruction mint", etc.).

In @.claude/agents/flow-test-runner.md:
- Around line 83-92: The fenced bug-report block starting with ``` (the FLOW:
zero-to-NFT ... EXIT: 1 ...) is missing a language tag (markdownlint MD040);
edit the block in .claude/agents/flow-test-runner.md so the opening fence
includes an appropriate language identifier (for example ```text or ```console)
to satisfy the linter and preserve the block contents unchanged.
- Around line 28-29: Update the step text "Run build (expect exit 0 with real
Anchor, exit 2 without)" to list all accepted offline build exit codes (0, 1,
and 2) so documentation matches the implemented smart-contract flow; reference
the smart-contract test script flow-smart-contract.sh to ensure the wording
mirrors the actual accepted outcomes and avoid suggesting only exit 2 for
offline runs.

In @.claude/agents/test-harness-orchestrator.md:
- Around line 31-35: The fenced bash code block using the delimiter "```bash"
needs blank lines immediately before and after the fence to satisfy markdownlint
MD031; update the markdown around the existing "```bash" block (the
three-backtick fence and its closing fence) by inserting a blank line above the
opening fence and a blank line below the closing fence so the block is separated
from surrounding text.

In @.claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh:
- Around line 102-104: The test is asserting duplicate scaffolding returns exit
0 but the validator contract requires exit 4 for user-input conflicts; update
the assertion in the scaffold duplicate test so assert_cmd expects exit code 4
(change the description text from "exit 0 (idempotent no-op)" to "exit 4
(user_input conflict)" and the call that runs "$SUNSCREEN_BIN scaffold
instruction mint" to assert exit 4 instead of 0) so the flow aligns with the
standardized exit-code policy.
- Around line 117-119: The issue is that the assert_cmd assertion is set to
expect exit code 0, but the || true at the end only prevents the shell from
exiting early - it does not prevent the assert_cmd function from incrementing
the FAIL counter when doctor actually exits with code 1. To fix this, modify the
assertion to explicitly handle both valid outcomes: instead of using assert_cmd
with a single expected exit code followed by || true, capture the exit code from
the doctor command execution and then assert that the exit code is either 0 or 1
(both are acceptable), ensuring the assertion logic accepts both possible valid
outcomes rather than relying on || true to suppress the failure.

In @.claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh:
- Around line 119-134: The test currently runs "$SUNSCREEN_BIN chain build
--headless" and claims NDJSON was validated but never requests JSON or checks
event shape; change the invocation to request NDJSON output (add the CLI flag
that emits NDJSON, e.g., --json or the tool's NDJSON flag) when calling chain
build (the line assigning output using "$SUNSCREEN_BIN" chain build --headless)
and then parse/validate the output stored in output to ensure each line is valid
JSON and matches expected event keys (e.g., check for required fields used
elsewhere in the flow); keep using build_exit for allowed codes (0,1,2) but
after the exit check add a lightweight NDJSON validation step that fails the
test if any line is not valid JSON or missing required event-shape fields.
- Line 149: The command invoking "$SUNSCREEN_BIN" doctor uses the wrong
redirection order so stderr still appears; update the invocation that sets
dr_exit (the line using "$SUNSCREEN_BIN" doctor 2>&1 >/dev/null || dr_exit=$?)
to redirect stdout then stderr (i.e., use > /dev/null 2>&1) so both stdout and
stderr are suppressed and dr_exit still captures the exit code.

In @.claude/skills/sunscreen-flow-tests/scripts/flow-token.sh:
- Line 18: The current trap unconditionally removes the FLOW_DIR on EXIT; change
it to a conditional cleanup that only deletes FLOW_DIR when the script exits
successfully and preserves it on failure for debugging. Replace the simple trap
'rm -rf "$FLOW_DIR"' with a cleanup handler invoked on EXIT that checks the exit
status ($?) and calls rm -rf "$FLOW_DIR" only if the status is zero, otherwise
prints/logs that FLOW_DIR is preserved (reference FLOW_DIR and the trap/EXIT
handler).

In `@src/toolchain/fix.rs`:
- Around line 328-331: The passed shell args to the rustup installer include an
unnecessary "-s -- -y"; update the call to download_then_run_shell so the
installer is invoked with only "-y" (i.e., replace the argument string "-s --
-y" with "-y") in the FixStep::shell invocation that launches the rustup script
so the script receives a single "-y" argument.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 413a0e2b-a6b9-4184-a904-2ac8793c0928

📥 Commits

Reviewing files that changed from the base of the PR and between a98b22a and 49c8e13.

📒 Files selected for processing (18)
  • .claude/agents/e2e-qa-fixer.md
  • .claude/agents/flow-test-runner.md
  • .claude/agents/offline-ci-owner.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/agents/ux-flow-validator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • CLAUDE.md
  • docs/site/src/reference/cli/doctor.md
  • src/cli/chain.rs
  • src/cli/doctor.rs
  • src/cli/scaffold.rs
  • src/onboarding/learn.rs
  • src/toolchain/fix.rs
  • tests/doctor_fix.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (6)
src/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke sunscreen-test-harness through the orchestrator rather than implementing tests inline

Files:

  • src/onboarding/learn.rs
  • src/cli/chain.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
  • src/cli/scaffold.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while adapting all stack references from Go/solis to Rust/sunscreen (clap, serde, minijinja, rust-embed, tokio, insta)

Use Rust (clap, serde, minijinja, rust-embed, tokio, insta) for sunscreen CLI implementation instead of Go/solis stack

Preserve strategic decisions from ADR (Anchor IDL as source of truth, marker-based editing, plugin protocol) when translating from Go to Rust

Use exit codes consistently: 0 for success, 2 for toolchain_missing, 3 for invalid config, 4 for user_input/ambiguity/conflict, 5 for workspace_missing, 9 for plugin_runtime errors

Implement --dry-run and --json flags for scaffolding and generation commands to enable idempotent, machine-readable operations

Ensure all scaffolding operations are idempotent and include drift detection to warn users when manual changes conflict with re-scaffolding

Use marker-based editing (segments like 'dispatch', 'instructions', 'error_variants') in generated template files for safe, non-destructive code insertion

Run fmt and clippy checks on all generated code; generated workspaces must pass cargo check and cargo fmt --check

Gate compile coverage for onboarding-specific tests with cfg(feature = "onboarding") to ensure cargo test --no-default-features passes

Files:

  • src/onboarding/learn.rs
  • src/cli/chain.rs
  • tests/doctor_fix.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
  • src/cli/scaffold.rs
src/cli/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

CLI command implementations in sunscreen must invoke the sunscreen-orchestrator skill for any request to implement, expand, fix, or refactor CLI features

Use CommandSpec and ProcessRunner abstraction for subprocess orchestration to enable testable runtime boundaries without direct shell invocation

Files:

  • src/cli/chain.rs
  • src/cli/doctor.rs
  • src/cli/scaffold.rs
src/cli/chain.rs

📄 CodeRabbit inference engine (AGENTS.md)

src/cli/chain.rs: chain new must create Anchor workspaces with segment=dispatch in lib.rs and segment=instructions in instructions/mod.rs templates; first scaffold instruction patches without warning (lib_rs_patched=true)
chain doctor --fix-markers must repair safe non-appendable sites without appending invalid Rust; dispatch is rebuilt only when generated wrappers are gone and instruction files define pub fn handler, and error_variants marker insertion refuses ambiguous enum bodies
chain build --headless must discover the workspace, run anchor build, emit NDJSON events, report missing Anchor as exit 2, and preserve Anchor failure exit codes; followed by pnpm exec codama run by default unless --no-codama is set
chain serve --headless must start a notify watcher, batch relevant changes through debounce, emit NDJSON for watcher-triggered build pipeline runs, and launch managed Surfpool/test-validator runtime with fallback from implicit Surfpool to test-validator

Files:

  • src/cli/chain.rs
tests/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Unit and integration tests must remain in-repo (offline deterministic gate, generated workspace compile gate, real Anchor/Solana/Codama gate, real Pinocchio SBF, serve runtime, plugin runtime, frontend typecheck tests); heavy/real-world testing is delegated to sunscreen-test-harness

Maintain insta snapshots (golden/render_* files) for all code generation outputs; update snapshots when output changes are intentional

Include offline deterministic tests, compile tests (cargo check over generated workspaces), and rustfmt round-trip tests as mandatory gates before release

Create isolated fake-toolchain tests for onboarding and CLI integration; use the compiled binary from /tmp with isolated temp dirs for end-to-end flow tests

Files:

  • tests/doctor_fix.rs
src/cli/scaffold.rs

📄 CodeRabbit inference engine (AGENTS.md)

src/cli/scaffold.rs: All scaffold subcommands (instruction, account, event, error, program) must support --dry-run and --json flags, return exit code 4 on user_input conflicts, and include generator tag on every marker (instruction/account/event/error/program)
Scaffold subcommands must fail clearly when Anchor-only features are invoked in non-Anchor frameworks (e.g., Pinocchio); accept --framework pinocchio parameter where applicable

Files:

  • src/cli/scaffold.rs
🧠 Learnings (48)
📓 Common learnings
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/**/*.rs : For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke `sunscreen-test-harness` through the orchestrator rather than implementing tests inline
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to tests/**/*.rs : Unit and integration tests must remain in-repo (offline deterministic gate, generated workspace compile gate, real Anchor/Solana/Codama gate, real Pinocchio SBF, serve runtime, plugin runtime, frontend typecheck tests); heavy/real-world testing is delegated to `sunscreen-test-harness`
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Sunscreen v1.0 is scoped to: Phase 0 (CLI scaffolding), Phase 1 (workspace bootstrap), Phase 2 (instruction/account/event/error/program scaffolders), Phase 3 (dev loop—build/serve/watcher), Phase 4 (codegen—clients/IDL/hooks), Phase 5 (recipes—CRUD/SPL-Token/Metaplex), Phase 5.5 (onboarding—init/examples/quickstart/wallet/deploy/learn), Phase 6 (plugin system), Phase 7 (Pinocchio support), Phase 8 (distribution/docs); total effort ~21 weeks
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/onboarding/**/*.rs : Onboarding commands (init, examples, quickstart, wallet, deploy, learn, next_step) must support offline and fake-toolchain testing
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/**/*.rs : CLI command implementations in sunscreen must invoke the `sunscreen-orchestrator` skill for any request to implement, expand, fix, or refactor CLI features
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Invoke sunscreen-orchestrator skill for any request to implement, expand, fix, or refactor the sunscreen CLI
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Invoke sunscreen-test-harness through orchestrator for real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, and flake/perf work
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Invoke sunscreen-publisher skill for publish release, distribute via homebrew/snap/apt, expand release pipeline, or configure brew tap / snapcraft / cargo-deb / cloudsmith requests
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Invoke sunscreen-docs-orchestrator skill for requests related to docs, site, tutorials, GitHub Pages, or Phase 8 docs; keep docs-writer agent for ADR-only responsibility
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Answer conceptual questions about Solana/Anchor directly without invoking orchestrator; only invoke orchestrator for implementation requests
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Preserve Anchor failure exit codes in chain build output; report missing Anchor as exit 2 and missing pnpm as toolchain_missing
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Design plugin contract with: runtime manager, tonic gRPC, stdio JSON-RPC, sandbox/trust model, marketplace/local plugins, and reference plugins (spl-token-2022, yellowstone-indexer)
Learnt from: CR
Repo: Pantani/sunscreen

Timestamp: 2026-06-06T04:50:57.010Z
Learning: Run the full end-to-end flow test harness (zero-to-NFT, zero-to-token, zero-to-smart-contract) in every test round and every fix cycle with 52+ assertions
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to tests/**/*.rs : Unit and integration tests must remain in-repo (offline deterministic gate, generated workspace compile gate, real Anchor/Solana/Codama gate, real Pinocchio SBF, serve runtime, plugin runtime, frontend typecheck tests); heavy/real-world testing is delegated to `sunscreen-test-harness`

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • CLAUDE.md
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to .github/workflows/ci.yml : CI must enforce `--locked` and no-default-features builds, run command-group smoke tests with compiled binary and isolated fake toolchains, enforce concurrency limits, permissions checks, and timeouts

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/e2e-qa-fixer.md
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/**/*.rs : For real-world testing, heavy integration, real toolchains, end-to-end QA, release QA, flake/perf work, or proving the app works, invoke `sunscreen-test-harness` through the orchestrator rather than implementing tests inline

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • CLAUDE.md
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • src/toolchain/fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/*integration*.rs : Integration tests must use isolated fake toolchains and run the compiled binary explicitly, not internal APIs, to validate end-to-end CLI behavior

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/onboarding/**/*.rs : Onboarding commands (init, examples, quickstart, wallet, deploy, learn, next_step) must support offline and fake-toolchain testing

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/agents/test-harness-orchestrator.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/toolchain/preflight.rs : Preflight checks must skip Anchor when `--framework pinocchio` is used; `chain build` must emit `pinocchio_build` and run `cargo build-sbf` for Pinocchio workspaces

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • tests/doctor_fix.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/onboarding/*.rs : Onboarding commands (`init`, `examples`, `quickstart`, `wallet`, `deploy`, `learn`) must work offline or with fake toolchain substitutes for testing

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/ux-flow-validator.md
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/runtime/pipeline.rs : Build pipeline must run anchor build followed by pnpm exec codama run with --no-codama skip option

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain build --headless` must discover the workspace, run `anchor build`, emit NDJSON events, report missing Anchor as exit 2, and preserve Anchor failure exit codes; followed by `pnpm exec codama run` by default unless `--no-codama` is set

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh
  • .claude/agents/test-harness-orchestrator.md
  • src/cli/chain.rs
  • .claude/agents/flow-test-runner.md
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/**/*.rs : Compile tests should validate generated Rust workspaces with `cargo check` to ensure syntactic correctness

Applied to files:

  • .claude/agents/offline-ci-owner.md
  • tests/doctor_fix.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to docs/adr/ADR-0001-solis-cli.md : The ADR is the design source of truth but references Go/solis; all stack references must be adapted to Rust/sunscreen for this project

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • docs/site/src/reference/cli/doctor.md
  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to **/*.rs : Preserve strategic decisions from ADR-0001 (Anchor IDL as source of truth, marker-based editing, plugin protocol) while adapting all stack references from Go/solis to Rust/sunscreen (clap, serde, minijinja, rust-embed, tokio, insta)

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/agents/test-harness-orchestrator.md
  • CLAUDE.md
  • tests/doctor_fix.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/**/*.rs : CLI command implementations in sunscreen must invoke the `sunscreen-orchestrator` skill for any request to implement, expand, fix, or refactor CLI features

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • docs/site/src/reference/cli/doctor.md
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Sunscreen v1.0 is scoped to: Phase 0 (CLI scaffolding), Phase 1 (workspace bootstrap), Phase 2 (instruction/account/event/error/program scaffolders), Phase 3 (dev loop—build/serve/watcher), Phase 4 (codegen—clients/IDL/hooks), Phase 5 (recipes—CRUD/SPL-Token/Metaplex), Phase 5.5 (onboarding—init/examples/quickstart/wallet/deploy/learn), Phase 6 (plugin system), Phase 7 (Pinocchio support), Phase 8 (distribution/docs); total effort ~21 weeks

Applied to files:

  • .claude/agents/e2e-qa-fixer.md
  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • docs/site/src/reference/cli/doctor.md
  • CLAUDE.md
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: The dev loop is orchestrated end-to-end: `chain new` → `chain serve` (watcher + build + Codama + frontend notify) → `generate` (clients/IDL/hooks) → `scaffold recipes` → `app` (plugin lifecycle) → deployment via `deploy` command

Applied to files:

  • .claude/agents/test-harness-orchestrator.md
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to tests/integration_*.rs : Integration tests must use Ignite-style CLI smoke tests with isolated fake toolchains and compiled binary invocation

Applied to files:

  • .claude/skills/sunscreen-flow-tests/SKILL.md
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to tests/**/*.rs : Test files must be comprehensive and deterministic; golden snapshots required for complex output

Applied to files:

  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/**/*.rs : All generated workspace snapshots must be committed to `tests/golden/` and validated with `insta` for regression detection

Applied to files:

  • .claude/skills/sunscreen-flow-tests/SKILL.md
  • .claude/agents/flow-test-runner.md
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to tests/golden/**/*.rs : Golden snapshot tests (using `insta`) must validate generated workspace rendering, markers, and compile output; snapshots must be updated and committed with their corresponding source changes

Applied to files:

  • .claude/agents/ux-flow-validator.md
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain new` must create Anchor workspaces with `segment=dispatch` in `lib.rs` and `segment=instructions` in `instructions/mod.rs` templates; first `scaffold instruction` patches without warning (`lib_rs_patched=true`)

Applied to files:

  • src/cli/chain.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/config/loader.rs : Workspace discovery must locate sunscreen.yml config at the root and fail with clear messages if missing

Applied to files:

  • src/cli/chain.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/chain.rs : `chain doctor --fix-markers` must repair safe non-appendable sites without appending invalid Rust; `dispatch` is rebuilt only when generated wrappers are gone and instruction files define `pub fn handler`, and `error_variants` marker insertion refuses ambiguous enum bodies

Applied to files:

  • src/cli/chain.rs
  • tests/doctor_fix.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to tests/**/*.rs : All workspace-creating tests should use isolated temporary directories and clean up after themselves to avoid test coupling

Applied to files:

  • src/cli/chain.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/chain.rs : `chain build` must run Anchor then Codama by default, support `--no-codama` to skip regeneration, and preserve Anchor exit codes on failure

Applied to files:

  • src/cli/chain.rs
  • tests/doctor_fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to .github/workflows/release.yml : Release workflow must use `cargo-dist` for tag-driven distribution, generate Linux/macOS archives and shell installer, enforce SemVer preview policy for pre-release versions, and publish to GitHub Releases

Applied to files:

  • CLAUDE.md
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/chain.rs : `chain doctor --fix-markers` must repair safe non-appendable sites without appending invalid Rust and refuse ambiguous enum bodies in marker insertion

Applied to files:

  • tests/doctor_fix.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/chain.rs : Chain doctor must repair markers safely without appending invalid Rust; non-appendable sites must be rebuilt only when constraints are met

Applied to files:

  • tests/doctor_fix.rs
  • src/toolchain/fix.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/toolchain/*.rs : Toolchain detection must support framework-specific preflight checks (Anchor for most scaffolds, no Anchor for Pinocchio) and report missing tools with exit code 2

Applied to files:

  • tests/doctor_fix.rs
  • src/cli/doctor.rs
  • src/toolchain/fix.rs
  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/toolchain/preflight.rs : Preflight checks must skip Anchor for non-Anchor frameworks (e.g., Pinocchio)

Applied to files:

  • tests/doctor_fix.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/scaffold.rs : Scaffold subcommands must fail clearly when Anchor-only features are invoked in non-Anchor frameworks (e.g., Pinocchio); accept `--framework pinocchio` parameter where applicable

Applied to files:

  • tests/doctor_fix.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/*.rs : Commands should use exit code 4 (`user_input`) for conflicts or ambiguities requiring user intervention, exit code 2 (`toolchain_missing`) for missing tools, and exit code 3 (`config_invalid`) for configuration errors

Applied to files:

  • src/cli/doctor.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/**/*.rs : Exit codes must follow the convention: 0=success, 2=toolchain_missing, 3=invalid_config, 4=user_input, 5=workspace_missing, 9=plugin_runtime

Applied to files:

  • src/cli/doctor.rs
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/app.rs : `app` lifecycle commands (install, uninstall, list, describe, update) must manage declarative `plugins[]` entries with idempotent install, `--dry-run` support, basename normalization, semver validation with optional `v` prefix, and duplicate-source detection; exit codes reuse 3/4/5

Applied to files:

  • src/toolchain/fix.rs
  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:59:42.882Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.882Z
Learning: Exit codes are standardized: 0 (success), 1 (unhandled error), 2 (toolchain error—missing Anchor/Solana), 3 (invalid config), 4 (user input conflict), 5 (workspace state error), 9 (plugin runtime error)

Applied to files:

  • .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
📚 Learning: 2026-06-02T22:59:42.881Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-06-02T22:59:42.881Z
Learning: Applies to src/cli/scaffold.rs : All scaffold subcommands (instruction, account, event, error, program) must support `--dry-run` and `--json` flags, return exit code 4 on user_input conflicts, and include generator tag on every marker (instruction/account/event/error/program)

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/scaffold/**/*.rs : Implement idempotency for all scaffolding commands (scaffold instruction/account/event/error/program/recipes)

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/scaffold/**/*.rs : Scaffold commands must support --dry-run flag for preview without side effects

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/scaffold/*.rs : Scaffold operations must support `--dry-run` and `--json` flags for preview and machine-readable output

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/scaffold.rs : Scaffold command conflicts (e.g., duplicate account definitions) should return exit code 4 with a clear error message identifying the conflict

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/scaffold/*.rs : Composite recipe scaffolds (CRUD, SPL-Token, Metaplex NFT) must compose Phase 2 primitives (program, instruction, account, event, error) and support optional frontend recipe hooks

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/error.rs : All error types must include actionable messages and context; PathConflict and Network errors must guide users

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/**/*.rs : All error types must implement `std::error::Error` and use structured error variants with actionable messages for end users

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/app.rs : Plugin installation must be idempotent, support `--dry-run`, validate semver (with optional `v` prefix), detect duplicate sources, and normalize plugin names from git URLs

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T19:16:09.338Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T19:16:09.338Z
Learning: Applies to src/cli/*.rs : CLI commands should emit NDJSON (newline-delimited JSON) events for long-running operations like build, serve, and watch to support machine-readable progress

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/**/*.rs : CLI commands must emit NDJSON events for streaming/logging in headless/automated contexts

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/cli/scaffold.rs : Plugin-backed scaffolders must invoke plugin run hook with noun and optional json argument

Applied to files:

  • src/cli/scaffold.rs
📚 Learning: 2026-06-02T22:58:57.757Z
Learnt from: CR
Repo: Pantani/sunscreen PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-06-02T22:58:57.757Z
Learning: Applies to src/runtime/pipeline.rs : Pinocchio build must run cargo build-sbf and emit pinocchio_build event instead of anchor build

Applied to files:

  • src/cli/scaffold.rs
🪛 LanguageTool
.claude/agents/test-harness-orchestrator.md

[style] ~42-~42: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...teardown. - frontend-codegen-owner for frontend typecheck. 7. Dispatch `plugin...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

.claude/skills/sunscreen-flow-tests/SKILL.md

[style] ~93-~93: The double modal “requires funded” is nonstandard (only accepted in certain dialects). Consider “to be funded”.
Context: ...-owner`) - Real Solana deploy (requires funded wallet + network — outside offline scop...

(NEEDS_FIXED)

🪛 markdownlint-cli2 (0.22.1)
.claude/agents/e2e-qa-fixer.md

[warning] 22-22: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 67-67: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.claude/agents/test-harness-orchestrator.md

[warning] 31-31: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 35-35: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 48-48: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

.claude/skills/sunscreen-flow-tests/SKILL.md

[warning] 22-22: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

.claude/agents/ux-flow-validator.md

[warning] 37-37: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 41-41: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 47-47: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 55-55: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 60-60: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 66-66: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 73-73: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 81-81: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 81-81: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.claude/agents/flow-test-runner.md

[warning] 45-45: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 46-46: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 48-48: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 51-51: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 52-52: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 54-54: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 57-57: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 58-58: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 64-64: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 67-67: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 68-68: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 83-83: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 83-83: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🪛 Shellcheck (0.11.0)
.claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh

[warning] 149-149: To redirect stdout+stderr, 2>&1 must be last (or use '{ cmd > file; } 2>&1' to clarify).

(SC2069)

🔇 Additional comments (8)
CLAUDE.md (1)

62-63: LGTM!

src/cli/chain.rs (1)

589-599: LGTM!

src/cli/scaffold.rs (1)

126-129: LGTM!

Also applies to: 142-145, 158-160, 174-177, 433-434, 445-446, 457-458, 474-475, 693-697, 863-864, 915-916, 935-936, 1439-1463, 1570-1573, 1684-1685, 1718-1719, 1842-1845, 1945-1946, 1976-1977, 2162-2166, 2253-2254, 2284-2285

src/onboarding/learn.rs (1)

49-50: LGTM!

src/cli/doctor.rs (1)

96-103: LGTM!

Also applies to: 226-227, 321-323

docs/site/src/reference/cli/doctor.md (1)

44-47: LGTM!

tests/doctor_fix.rs (1)

113-155: LGTM!

Also applies to: 223-255

.claude/skills/sunscreen-flow-tests/scripts/flow-runner.sh (1)

1-48: LGTM!

Comment thread .claude/agents/e2e-qa-fixer.md Outdated
Comment thread .claude/agents/flow-test-runner.md Outdated
Comment thread .claude/agents/flow-test-runner.md Outdated
Comment thread .claude/agents/test-harness-orchestrator.md
Comment thread .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh Outdated
Comment thread .claude/skills/sunscreen-flow-tests/scripts/flow-nft.sh Outdated
Comment thread .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh
Comment thread .claude/skills/sunscreen-flow-tests/scripts/flow-smart-contract.sh Outdated
Comment thread .claude/skills/sunscreen-flow-tests/scripts/flow-token.sh Outdated
Comment thread src/toolchain/fix.rs
… cleanup trap, markdown lints

- flow-nft.sh: accept doctor exit 0/1/2 in offline flows (|| true did not protect FAIL counter)
- flow-nft.sh: clarify idempotency comment (same-content → exit 0, not 4)
- flow-smart-contract.sh: add NDJSON contract check for chain_build_started/finished events
- flow-smart-contract.sh: fix redirect order 2>&1 >/dev/null → >/dev/null 2>&1 (SC2069)
- flow-smart-contract.sh: accept doctor exit 2 (missing tools) as valid offline outcome
- flow-token.sh: preserve FLOW_DIR on failure for debugging instead of unconditional cleanup
- fix.rs: remove redundant -s from rustup installer args (use -y only)
- e2e-qa-fixer.md, flow-test-runner.md: add language tag to bare code fences (MD040)
- flow-test-runner.md: align offline build exit docs with implemented behavior (exit 0/1/2)
- test-harness-orchestrator.md: add blank lines around fenced block (MD031)
@Pantani Pantani merged commit 211fa73 into main Jun 6, 2026
14 checks passed
@Pantani Pantani deleted the fix/real-usage-bugs-flow-tests branch June 6, 2026 07:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant