sharpapi/laravel-resume-job-match-score
Laravel package that uses SharpAPI to calculate a resume-to-job match score, helping you rank candidates and assess fit. Simple integration for adding AI-powered job matching to your PHP app.
Architecture fit
This is a thin Laravel service-provider wrapper over sharpapi/php-core, exposing SharpAPI's resume/job-match scoring behind publishable config and a container-bound client. That is the conventional shape for a Laravel integration package and fits cleanly into an existing app's service layer with no architectural concessions. The async job model (submit → poll fetchResults()) is the one substantive architectural constraint: it is blocking, so it belongs inside queued jobs, not the request cycle. v1.2.0 does not change this shape.
Integration feasibility
Composer-only install with a config publish step. No database migrations, no published assets, no middleware. The release corrects the documented publish tag to sharpapi-resume-match-score; the previously documented sharpapi-resume-job-match-score was wrong and would have silently produced no config file—a real onboarding trap now removed. Integration effort is measured in hours, contingent on resolving the sharpapi/php-core floor.
Technical risk
| Change | Risk | Assessment |
|---|---|---|
api_job_status_use_polling_interval now actually honored |
Medium | Previously a no-op, so this is a behavior change masked as a bug fix. Teams that set the flag expecting it to work will now see polling cadence change, with direct effect on request volume and rate-limit exposure. |
Failed job with null result returns SharpApiJob instead of TypeError |
Medium | Improves correctness but alters the error contract. Any code catching TypeError or relying on an exception for null-result failures will break or, worse, silently treat a failure as a success. Callers must now inspect job status rather than assume a returned object means success. |
Missing API key throws InvalidArgumentException |
Low | Fail-fast is right, but this is a new exception type at client construction. Unguarded, it surfaces during container resolution or boot rather than at the call site. |
sharpapi/php-core raised to ^1.4.1 |
Medium | Effectively a hard floor. If another SharpAPI package or a transitive dependency pins below 1.4.1, install fails outright. Verify before committing. |
| Laravel Boost guidelines + skill | Negligible | Dev-time only; no runtime footprint. |
| Pest + Orchestra Testbench suite | Positive | Evidence of CI-backed compatibility and a maintainer investing in regression coverage—the single strongest signal in this release. |
No deprecations and no major-version break. The release is a minor, but two of the changes are contract changes wearing a patch-note costume, which argues for pinning rather than floating.
Key questions
api_job_status_use_polling_interval accept a floor or clamp, or can it be set to an interval low enough to self-inflict rate limiting?Retry-After mode?SharpApiJob, what surface exposes the failure—status enum, error message, raw payload—and is it documented?^1.4.1 constraint permit 1.5+ (forward-compatible) or is it effectively a narrow window?Stack fit
Standard Laravel package conventions: service provider, publishable config, env-backed settings. The Pest + Orchestra Testbench suite implies maintained support across current Laravel majors and a PHP 8.x floor—the package now has a testable compatibility matrix rather than an asserted one. The blocking fetchResults() polling call mandates queued execution with an explicit job timeout; this is a design requirement, not a preference.
Migration path
There is no prior installed base, so this is greenfield: composer require, publish config using the corrected sharpapi-resume-match-score tag, set SHARP_API_JOB_STATUS_USE_POLLING_INTERVAL and SHARP_API_JOB_STATUS_POLLING_INTERVAL explicitly rather than relying on defaults. For any environment already running a pre-1.2.0 build, treat the update as a minor with contract risk and pin the exact version in composer.json while validating.
Compatibility
Two things to confirm before merge: the resolved sharpapi/php-core version satisfies ^1.4.1 against the rest of the lockfile, and the Laravel/PHP version matrix is covered by the new test suite. The polling change is config-gated, so default runtime behavior is unchanged for anyone who never set the flag—a genuinely low-risk default path.
Sequencing
php-core constraint conflict.InvalidArgumentException handling at startup or a health check, so a missing key fails visibly rather than at first customer request.Maintenance
Small, single-purpose surface with one external dependency and a real test suite—maintenance cost is low. The residual risk is upstream: this package's health is coupled to sharpapi/php-core release cadence, and the constraint bump shows that coupling is active. The Boost guidelines modestly reduce onboarding drift by keeping generated code aligned with current core usage.
Support
Documentation accuracy improved materially; the publish-tag fix removes a class of silent-failure support tickets. Remaining sharp edge: the Boost skill is named sharpapi-resume-job-match-score while the config tag is sharpapi-resume-match-score. Minor, but it will generate confused questions—worth a one-line note in the runbook. Add a documented remedy for the missing-API-key path.
Scaling
The polling interval is the primary cost and rate-limit lever, and v1.2.0 is the first release where that lever actually moves. Teams enabling polling should set the interval at or above the API's typical Retry-After; setting it lower trades latency for request volume with no backpressure guarantee. Monitor request rate and 429s after enabling. Blocking polls also consume worker time, so queue concurrency and job timeout must be sized against expected scoring latency.
Failure modes
InvalidArgumentException at construction. Fail-fast is desirable, but unguarded it crashes boot; handle at the boundary.SharpApiJob with no meaningful result. Code that assumes a returned object is a success will record false positives and corrupt downstream scoring data. This is the highest-consequence failure mode in the release.Retry-After, which is correct but leaves cadence outside your control.Ramp-up
Low. An experienced Laravel developer reaches productive use in well under a day, and the new test suite shortens the confidence-building phase considerably. The two items requiring deliberate review are the null-result handling contract and the polling interval value—both are configuration and code-review decisions, not learning curves.
How can I help you explore Laravel packages today?