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-justificationto 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 onlyWorkHistory/*.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-justificationflag
3.2 Currency Conversion (if needed)
If output currency != service definition currency:
- Web search for current CAD/USD exchange rate
- Convert all monetary values
- Add footnote with conversion rate and date
3.3 Markdown Rate Card Structure
YAML Frontmatter:
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:
- Header: Consultant name, tagline, credentials
- Service Offerings: Top 5 services with descriptions, deliverables
- 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
- Volume & Term Discounts: 3/6/12-month retainer, project thresholds, referrals
- Expense Policy: Included (standard tools, local travel) vs. Billed separately (travel, specialized licenses)
- 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)
- 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
- Contact & Next Steps: Contact details, 4-step engagement process
- 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:
- Save HTML to
/tmp/ratecard_temp_[timestamp].html - Navigate:
mcp__playwright__browser_navigatetofile://[tmp_html] - Wait: 2 seconds for content load
- Generate PDF via
browser_run_code: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' } }); - 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].htmland 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...