Guidelines for developing the verifyOS-cli App Store rejection risk scanner.
- "Shift Left" Validation: Catch App Store Connect rejections as early as possible on the developer's local machine or CI runner.
- Local Analysis: Do not transmit app bundles to external servers. All analysis must be performed locally using Rust.
- Zero Placeholders: Implement actual business logic for App Store rules. If a rule is requested, implement the core engine logic or use established patterns.
- Inlined Variables: Always inline variables into
format!strings (format!("{var}")) where possible. - Clippy Compliance:
- Always collapse
ifstatements when possible. - Use method references over closures when possible (
.map(|x| x.foo())->.map(X::foo)).
- Always collapse
- Match Statements: Ensure
matchstatements are exhaustive. Avoid wildcard arms (_) if the set of variants is known and stable. - Modules:
- Target module files under 500 lines of code.
- Follow the established directory structure:
core/: Orchestration and top-level pipeline logic (Engine).parsers/: File format handles (zip,plist,macho).rules/: Trait-based validation logic (AppStoreRule).
- Trait Usage: All validation rules must implement the
AppStoreRuletrait found insrc/rules/core.rs. - Context Awareness: Use the
ArtifactContextto accessInfo.plistdata and the app bundle path during evaluation. - Error Handling:
- Use
miettefor user-facing diagnostics. - Use
thiserrorfor internal rule-specific errors (EntitlementsError,PlistError). - Use absolute
verifyos_cli::paths for cross-module imports.
- Use
- IPAs/App Bundles: Treat
.ipafiles as ZIP archives. Extract to temporary directories and clean up after analysis. - Info.plist: Use the
plistcrate for robust parsing. Map keys to structuredInfoPliststructs insrc/parsers/plist_reader.rs. - Mach-O: Use
goblinorapple-codesignfor deep binary inspection (entitlements, architectures).
- Integration Tests: Place major test flows in
tests/cli_test.rsandtests/rules_test.rs. - Fixtures: Use the
.ipaand.appfixtures inexamples/andtests/fixtures/. - Path Resolution: Use
CARGO_MANIFEST_DIRbase paths to locate test fixtures reliably across different environments.
- Cargo: Standard commands:
cargo fmt,cargo clippy,cargo test. - Release: Follow conventional commits (
feat:,fix:,chore:,docs:) to facilitate therelease-plzworkflow.
The Cass Memory System (cm) is a tool for giving agents an effective memory based on the ability to quickly search across previous coding agent sessions across an array of different coding agent tools (e.g., Claude Code, Codex, Gemini-CLI, Cursor, etc.) and projects (and even across multiple machines, optionally) and then reflect on what they find and learn in new sessions to draw out useful lessons and takeaways; these lessons are then stored and can be queried and retrieved later, much like how human memory works.
The cm onboard command guides you through analyzing historical sessions and extracting valuable rules.
# 1. Check status and see recommendations
cm onboard status
# 2. Get sessions to analyze (filtered by gaps in your playbook)
cm onboard sample --fill-gaps
# 3. Read a session with rich context
cm onboard read /path/to/session.jsonl --template
# 4. Add extracted rules (one at a time or batch)
cm playbook add "Your rule content" --category "debugging"
# Or batch add:
cm playbook add --file rules.json
# 5. Mark session as processed
cm onboard mark-done /path/to/session.jsonlBefore starting complex tasks, retrieve relevant context:
cm context "<task description>" --jsonThis returns:
- relevantBullets: Rules that may help with your task
- antiPatterns: Pitfalls to avoid
- historySnippets: Past sessions that solved similar problems
- suggestedCassQueries: Searches for deeper investigation
- START: Run
cm context "<task>" --jsonbefore non-trivial work - WORK: Reference rule IDs when following them (e.g., "Following b-8f3a2c...")
- FEEDBACK: Leave inline comments when rules help/hurt:
// [cass: helpful b-xyz] - reason// [cass: harmful b-xyz] - reason
- END: Just finish your work. Learning happens automatically.
| Flag | Purpose |
|---|---|
--json |
Machine-readable JSON output (required!) |
--limit N |
Cap number of rules returned |
--no-history |
Skip historical snippets for faster response |
stdout = data only, stderr = diagnostics. Exit 0 = success.
- Keep commits small. Prefer one behavioral change per commit.
- Split work into separate commits when it improves reviewability:
feat:for behaviortest:for meaningful test additions or coverage changesdocs:for README, architecture, examples, or agent-playbook updateschore(ci):for workflow or automation changes
- Do not bundle unrelated code, tests, docs, and CI changes into one large commit unless they must ship together for correctness.
- Before every push, run:
cargo fmt --all -- --checkcargo testcargo clippy --all-targets --all-features -- -D warnings
- Keep conventional commit messages concise and scope-specific.
All frontend development MUST adhere to the taste-skill design philosophy for a premium, high-performance UI.
- DESIGN_VARIANCE: 8 (Modern, asymmetric, overlapping elements).
- MOTION_INTENSITY: 6 (Fluid transitions, staggered reveals, tactile feedback).
- VISUAL_DENSITY: 4 (Spacious, "Art Gallery" feel, luxury spacing).
- Anti-Slop: Banned "AI Purple/Blue" glows and generic 3-column card layouts.
- Typography: Strictly use
Geist,Outfit, orSatoshifor Sans-Serif. Serif fonts are BANNED for software UIs. - Icons: Exclusively use
@phosphor-icons/reactor@radix-ui/react-icons. Emojis are BANNED. - Materiality: Use "Liquid Glass" refraction (1px inner borders + tinted shadows). Omit physical cards/boxes where spacing can define grouping.
- Viewport Stability: ALWAYS use
min-h-[100dvh]for full-height sections to prevent mobile layout jumping.
- Framer Motion: Use for UI/Bento interactions. Use
layoutandlayoutIdfor smooth state transitions. - Spring Physics: Use
type: "spring", stiffness: 100, damping: 20for a premium, weighty feel. - Hardware Acceleration: Animate ONLY
transformandopacity. Usewill-changesparingly. - Isolation:CPU-heavy perpetual animations MUST be isolated in their own microscopic Client Components.