Job application
Create truthful, role-specific application documents from the bundled structured profile or a profile supplied by the user.
Privacy and authorization
- Treat all profile and application data as private.
- Never invent qualifications, employment, education, or contact details.
- The bundled profile is fictional demonstration data and may be replaced by the user.
- Do not submit, email, upload, or message an application without explicit authorization for that specific destination.
Persistent data and inputs
- Profile data:
$JOB_APPLICATION_PROFILE_DIR/*.jsonwhen configured, otherwise the fictional demonstration data inassets/profile/*.json - Application output:
$JOB_APPLICATION_OUTPUT_DIRwhen configured, otherwise$JOB_APPLICATION_DATA_DIR/applications(or the platform data directory's equivalent) - Job data: a
job.jsonshaped likeexamples/job.json - Templates:
assets/templates/
Keep real profiles, photographs, signatures, generated documents, and application history outside the installed skill directory. ClawHub updates may replace that directory. Resolve bundled resources relative to this skill directory, but honor the persistent-data environment variables. Do not assume a username, home directory, workspace layout, messaging channel, or recipient ID. For ClawHub, export the whitelist-only staging directory described in PUBLISHING.md, then run the publish dry-run against that staging directory.
Workflow
-
Create the application folder with
python3 scripts/prepare_application.py --slug <yyyy-mm-company-role>. For a derived application, add--base-application <absolute/base-directory>; its readable, validcv_selection.jsonis checked before a new directory is created. Use the printed absolute path for all following files. Never overwrite an existing application directory unless the user explicitly requests reuse. -
Save normalized job details as
job.json. -
Run
scripts/generate_cv_selection.py --job <job.json> --output <cv_selection.json>. Use--limits <limits.json>for reviewed CV limits, and optionally--base <base/cv_selection.json> --mode adaptive|strictfor a derived application. Review its deterministic suggestion and adjust only with facts supported by the profile. -
Create one
application_content.jsonwithschema_version: 2,job,cover_letter, andplain_textas inexamples/application_content.json. Keep claims grounded in selected profile records. The legacycover_letter.jsonandindeed_text.jsonadapters are transitional; usescripts/convert_application_content.pyto migrate them. The cover-letter template rendersjob.companyas its own first recipient line. Thereforecover_letter.recipientmust name only the contact or team, andcover_letter.company_addressmust contain only address/location lines, never the company name again. -
Generate source documents:
python3 scripts/generate_cv.py --selection <cv_selection.json> --output <CV.tex> python3 scripts/generate_cover_letter.py --content <application_content.json> --output <cover_letter.tex> --profile-dir <profile-directory> python3 scripts/generate_plain_text.py --content <application_content.json> --output <indeed_text.txt> -
If
pdflatexis available and PDFs are requested, run the cross-platform renderer:python3 scripts/render_application.py <application-dir>Rendering runs
validate_application.pyby default; Poppler'spdfinfoandpdftotextare required. The visible--skip-validationswitch is for debugging only. Usevalidate_application.py <application-dir> --strict-fillto make an underfilled CV fail. For an external profile, pass the same--profile-dirto the cover-letter generator and renderer (or configureJOB_APPLICATION_PROFILE_DIR). The generator refuses an external letter that would silently use the bundled fictional profile, and the validator checks the letterhead against the selected profile. On Windows,py -3can be used instead ofpython3. Linux and macOS users may alternatively use thescripts/render_application.shwrapper. -
Return the generated paths and validation result. Deliver files externally only after destination-specific approval.
- If the user explicitly asks to receive the documents in the current chat and the channel supports attachments, send the validated
CV.pdf,cover_letter.pdf, and (when useful)indeed_text.txtas native downloadable document attachments in that conversation. - Do not present local filesystem paths or
file://links as downloadable chat links. They are references for the local host only and are not usable by most chat clients. - Never attach source JSON, profile data, signature assets, credentials, or intermediate files. Attach only the final requested deliverables after validation has passed.
- Treat every chat attachment as destination-specific external delivery. A request such as “send the documents here” authorizes only that current conversation, never an application submission or delivery to a recruiter.
- If the user explicitly asks to receive the documents in the current chat and the channel supports attachments, send the validated
Installation requirements and platform-specific commands are documented in README.md. Generated sample PDFs using only fictional data are in examples/generated/.
Content policy
- Default to a one-page CV.
- Default CV limits are five skills, three experience entries, two education entries, one project, three languages, and two achievement sentences per experience. They may be intentionally changed only in the reviewed selection limits; the generator enforces them.
- Prefer evidence relevant to the posting over generic claims.
- Keep each experience entry to the reviewed
achievement_sentences_per_experiencelimit (two by default) and make every sentence concise. - Preserve optional project attribution fields (
organization,context, andcontext_label) so generated CVs can distinguish employer projects from work performed through the candidate's own company. - Include the profile's available address or location by default, including a street address when supplied. Omit date of birth and a signature image by default. Include a signature image only when the user requests it through
cover_letter.signature_image. Include a profile photograph only when the user requests one or the supplied profile explicitly declaresprofile_picture; the bundled photo is fictional demonstration material. - Match the job's language unless the user requests another language.
JSON contains content, Python performs deterministic transformation, and LaTeX handles layout. Do not hand-edit generated LaTeX when the source JSON can be corrected instead.
