--- name: ratecard description: Generate professional rate card document from service definition with pricing validation disable-model-invocation: true --- ## Configuration Read `.jobops/config.json`. If missing, stop with: > JOBOPS NOT CONFIGURED > Run /jobops:setup (then /jobops-ic:setup) to initialize your workspace. Use `config.directories.contractor_root` for output paths in this skill. Use `config.preferences.default_currency` for pricing if applicable. ## Arguments Generate professional rate card from service definition with pricing validation. - `$1`: Format (default: md): `md` | `pdf` | `html` - `$2`: Currency (default: CAD): `CAD` | `USD` - `$3`: `--include-justification` to add credentials/ROI section --- ## Phase 1: Validate Prerequisites ### 1.1 Find and Load Service Definition Find most recent: `{config.directories.contractor_root}/services/service_definition_*.md` **If not found:** ``` PREREQUISITE MISSING: Service Definition Run /defineservices first to create service catalog and pricing. ``` **Load and validate:** - rate_card (hourly/daily rates for minimum/target/premium tiers) - consultant identity (name, tagline, credentials) - services catalog (>=1 service) - payment_terms **If rate_card missing:** ``` INVALID SERVICE DEFINITION: Missing Rate Card Required structure: ## Rate Card ### Hourly Rates - **Minimum**: $[X]/hr - **Target**: $[Y]/hr - **Premium**: $[Z]/hr ### Daily Rates - **Minimum**: $[A]/day - **Target**: $[B]/day - **Premium**: $[C]/day Fix with: /defineservices --update ``` ### 1.2 Load Source Data (if --include-justification) For rate-card generation, read these source files: - `Preferences/Vision.md` — explicit rate preferences if user has stated them (overrides market research) - `Technology/TechStack.md` — identify Expert-level skills (judged in-context from WorkHistory mentions, not from a precomputed enum) - `Technology/Certifications.md` — Active certifications only - `WorkHistory/*.md` — for years of experience, leadership scope, budget magnitude Compute `years_total_experience` from earliest WorkHistory Start date to today. Do NOT load `candidate_profile.json` — removed in v2.2.0. - If source files missing: Warn but continue without justification section --- ## Phase 2: Pricing Validation ### 2.1 Validation Checks **Check 1: Daily Rate Consistency** - Rule: `daily_rate ~ hourly_rate x 8` (+/-10% tolerance) - If fails: Offer auto-correction or keep with explanation **Check 2: Rate Tier Progression** - Rule: `minimum < target < premium` (both hourly and daily) - If fails: Refuse generation, require manual fix **Check 3: Premium Multiplier** - Rule: `1.3x <= premium/target <= 2.0x` - If outside: Advisory warning only, continue **Check 4: Retainer Discounts (if applicable)** - Rule: Discounts increase with commitment length - Warn if discount <5% or >40% ### 2.2 Validation Summary Display results: ``` PRICING VALIDATION COMPLETE - Daily rates align with hourly x 8 - Rate tiers ascending - Premium multiplier reasonable (1.3x-2.0x) [Advisory warnings if any] [Auto-corrections if any] ``` --- ## Phase 3: Generate Rate Card ### 3.1 Parse Arguments - Format: Default md, fallback to md if invalid - Currency: Default CAD, assume CAD if unspecified in service definition - Justification: Check for `--include-justification` flag ### 3.2 Currency Conversion (if needed) If output currency != service definition currency: 1. Web search for current CAD/USD exchange rate 2. Convert all monetary values 3. Add footnote with conversion rate and date ### 3.3 Markdown Rate Card Structure **YAML Frontmatter:** ```yaml consultant: "[Name]" effective_date: [YYYY-MM-DD] valid_until: [+6 months] currency: [CAD|USD] generated_on: [ISO8601] pricing_validated: [true/false] source_definition: "{config.directories.contractor_root}/services/service_definition_[Date].md" ``` **Sections:** 1. **Header**: Consultant name, tagline, credentials 2. **Service Offerings**: Top 5 services with descriptions, deliverables 3. **Engagement Models & Rates**: - Hourly: Standard/Premium with use cases, minimum engagement - Daily: Standard/Premium (8-hour equivalents) - Retainer (if applicable): Part/half/full-time with effective rates and discounts - Project-Based (if applicable): Typical ranges by service type 4. **Volume & Term Discounts**: 3/6/12-month retainer, project thresholds, referrals 5. **Expense Policy**: Included (standard tools, local travel) vs. Billed separately (travel, specialized licenses) 6. **Terms & Conditions**: - Payment terms (retainers, projects, hourly, late fees) - Cancellation policy (30-day notice retainers, prorated projects, 48-hour session notice) - Confidentiality & IP (standard confidentiality, work product ownership, anonymized case studies) - Rate validity (6 months, annual review) 7. **Why These Rates?** (if --include-justification): - Credentials (certifications, years experience, publications, speaking) - Proven ROI (top 3-5 proof points with business impact) - Unique value proposition 8. **Contact & Next Steps**: Contact details, 4-step engagement process 9. **Footer**: Version, generation date, source file Save to: `{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].md` --- ## Phase 4: HTML/PDF Generation (if requested) ### 4.1 HTML Template **CSS Styling (embedded):** - Professional B2B aesthetic: Blue (#2c5282) gradient header, clean tables - Layout: 900px container, 2.5rem content padding - Typography: System fonts, 1.6 line-height - Tables: Header (#2c5282), alternating row backgrounds - Print styles: Letter size, 0.75in margins, page-break-avoid for headings/tables **HTML Structure:** - Header: Gradient background with name/tagline/credentials - Content sections: Parse markdown to HTML with styled classes - Contact: Gray background callout box - Footer: Metadata (version, date, source) ### 4.2 PDF Generation with Playwright If format is `pdf`: 1. Save HTML to `/tmp/ratecard_temp_[timestamp].html` 2. Navigate: `mcp__playwright__browser_navigate` to `file://[tmp_html]` 3. Wait: 2 seconds for content load 4. Generate PDF via `browser_run_code`: ```javascript await page.pdf({ path: '{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].pdf', format: 'Letter', printBackground: true, margin: { top: '0.75in', bottom: '0.75in', left: '0.75in', right: '0.75in' } }); ``` 5. Close browser and cleanup temp file **If PDF fails:** Fallback to HTML with manual conversion instructions If format is `html`: - Save to `{config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].html` and skip Phase 5 --- ## Phase 5: Final Report ### 5.1 Success Report ``` PROFESSIONAL RATE CARD GENERATED **Output:** {config.directories.contractor_root}/rate-cards/rate_card_[YYYYMMDD].[format] ([XX] KB) **Source:** service_definition_[Date].md **Pricing:** Hourly: $[min]-$[premium]/hr ([Currency]) Daily: $[min]-$[premium]/day [Retainer: $[min]-$[max]/mo] **Services:** [X] offerings ([List names]) **Validation:** - Daily = hourly x 8 (+/-10%) - Tiers ascending - Premium multiplier: [X.X]x [Auto-corrections: [count] | Warnings: [count]] **Validity:** [Start] to [End] (6 months) [Currency conversion note if applicable] [Credentials section if --include-justification] **Next Steps:** 1. Review for accuracy 2. Customize: Company-specific terms, volume discounts, special tiers 3. Distribute: Email PDF, host HTML, include in proposals 4. Maintain: Quarterly reviews, annual updates 5. Related: /defineservices --update, /proposaltemplate, /findclient **Rate Card Summary:** ================================================================ [CONSULTANT] | [CURRENCY] | VALID: [Start] to [End] ---------------------------------------------------------------- Hourly: $[min]/hr | $[target]/hr | $[premium]/hr Daily: $[min]/day | $[target]/day | $[premium]/day [Retainer: Part-time $[X]/mo, Half-time $[Y]/mo, Full-time $[Z]/mo] ---------------------------------------------------------------- PAYMENT: [Deposit]% upfront, Net [days] | MINIMUM: [hours] ================================================================ ``` --- ## Error Handling **Missing Prerequisites:** - No service definition -> Run /defineservices - Missing rate_card section -> Show required structure, suggest /defineservices --update - Missing source files (with --include-justification) -> Warn, continue without justification **Validation Failures:** - Invalid rate progression (min > target > premium) -> Refuse generation, require manual fix - Daily != hourly x 8 (>10% variance) -> Offer auto-correction (yes/no/cancel) **Generation Failures:** - PDF generation fails -> Fallback to HTML with manual conversion instructions - Currency conversion unavailable -> Keep original, warn user - Invalid format -> Default to markdown --- ## Implementation Notes **Pricing Validation Philosophy:** - Auto-correct: Daily rate alignment, minor rounding - Refuse: Rate progression violations, missing required fields - Warn but continue: Premium multiplier outside 1.3x-2.0x, unusual retainer discounts **Rate Card Best Practices:** - 6-month validity, annual reviews - Version control in YAML frontmatter - Keep old versions for reference - Professional B2B aesthetic: blue/gray, clean tables, generous whitespace **Playwright PDF Pattern:** Same as /formatresume - HTML with embedded CSS -> temp file -> navigate -> page.pdf() -> cleanup --- Now executing rate card generation with format `$1`, currency `$2`, and justification flag `$3`...