07-interview-prep.md holds STAR examples, tough-question patterns, questions to ask, and a roleplay protocol - and the job-application- assistant skill names interview preparation as its Step 4 - but no command operationalizes any of it. /apply ends at 'files ready', and the moment an interview is scheduled, nothing picks the thread back up. /interview does, drawing on the archive /outcome now maintains. /apply optimizes what the company reads; /interview optimizes what the company hears. The bridge is consistency: the interviewer read the submitted CV and cover letter, so prep must match what they claim. How it works: - Loads the application context from documents/applications/ <company>_<role>/: the exact posting, the submitted drafts, and outcome.md's stage + recorded feedback (stage-N feedback is the highest-priority input for stage-N+1 prep). Graceful fallbacks for applications that predate /outcome, stating plainly what is missing - Runs the Company Research Checklist that 04-job-evaluation.md defines but nothing executes, plus interviewer-angle notes from public professional info only. Every company claim is independently verified before it enters the pack - same rule as cover-letter claims - Builds a stage-specific prep pack: likely questions (earlier-stage feedback first, then fit-evaluation gaps with honest bridge answers per 07's you-don't-have-X pattern, then posting requirements, then stage type), STAR mapping via 07's Use-for tags with new drafts grounded strictly in profile facts, a consistency brief of the submitted documents' probeable claims, customized tough questions, 4-6 questions to ask, logistics tips - Saves the pack to documents/applications/<company>_<role>/ interview_prep_<stage>.md - one per stage, kept as history, gitignored with the rest of the archive - Offers a mock interview following 07's Roleplay Guidelines verbatim, with feedback calibrated against the behavioral profile (same voice-consistency rule the /apply reviewer applies) - Never edits framework or profile files, except appending user-approved STAR examples to 07 on explicit request Integration: /outcome suggests /interview when an interview stage is recorded; documents/README.md documents the interview_prep_<stage>.md files (and that /setup ignores them); README commands list and file tree.
7.7 KiB
/outcome - Record the Result of an Application
You are recording what happened to a job application: progress updates (interview invitations, stages completed, offers) and final resolutions (hired, rejected, no response). The data lands in two places the framework already reads but nothing systematically writes:
job_search_tracker.csv- the status column that/scrapeand/rankuse for dedup and exclusiondocuments/applications/<company>_<role>/- the per-application archive (posting, submitted drafts,outcome.md) that/setupPath A mines to calibrate04-job-evaluation.mdand surface STAR candidates
/outcome writes the data; /setup interprets it. This command never edits the evaluation framework or profile files itself.
Follow these steps in order.
Step 0: Parse Input
$ARGUMENTS may contain:
- Nothing → list open applications and ask which one to update
- A company name (optionally with a role), e.g.
/outcome acmeor/outcome acme ml engineer→ target that application
Step 1: Load State and Identify the Application
- Read
job_search_tracker.csv. If it does not exist, create it with the standard header:date,company,sector,role,role_type,channel,status,contact_person,fit_rating,notes,cv_file,cover_letter_file,source - With an argument: match rows case-insensitively on company (and role, if given). One match → proceed. Several → list them and ask. None → the application was made outside the workflow; collect company, role, date applied, channel, and posting URL from the user and add a tracker row.
- Without an argument: list all rows whose status is not final (not hired / rejected / no response / withdrawn / offer declined) as a numbered table (company, role, date applied, current status) and ask which to update. If every row is resolved, say so and stop.
- Derive the archive folder name:
documents/applications/<company>_<role>/- lowercase, underscores for spaces (the convention documented indocuments/README.md). Check whether the folder and anoutcome.mdalready exist - if so, you are updating, not creating.
Step 2: Collect What Happened
Ask the user what happened, then classify:
Progress updates (application still open):
- Interview invitation / stage scheduled or completed (phone screen, technical, case, final round)
- Offer received (not yet accepted or declined)
Resolutions (application closed) - these map to the status enum in documents/README.md that /setup parses:
hired- accepted an offeroffer_declined- received an offer, turned it downrejected- explicit rejection at any stageno_response- no reply; if the user is unsure whether to call it, note how long it has been since the last contact and let them decide - do not impose a cutoffinterview_only- reached interviews but the process stalled or was abandoned without an explicit rejection
Also collect, without interrogating - one or two open questions are enough:
- Dates for the stages reached
- Any feedback received, verbatim where the user remembers it
- What they'd do differently, and any signal about what the company valued (these feed
/setup's calibration and STAR-candidate mining, so concrete beats polished)
Step 3: Archive the Application Materials
Create or update documents/applications/<company>_<role>/. All content here is personal data - the folder is already gitignored (documents/applications/**), so nothing needs redacting.
cv_draft.texandcover_letter.tex- copy (never move) the submitted files. Locate them via the tracker row'scv_file/cover_letter_filecolumns; if those are empty, look forcv/main_<company>.texandcover_letters/cover_<company>_*.tex. If a file already exists in the archive, leave it - the archived version is what was actually submitted. If no draft files exist (application made outside/apply), skip with a note.job_posting.md- if it already exists, leave it. Otherwise try WebFetch on the tracker row'ssourceURL and save the posting text. If the URL is dead (postings expire fast - this is exactly why the archive matters), ask the user to paste the posting, or write a stub noting the posting is unavailable. Never reconstruct a posting from memory.outcome.md- write or update it in exactly the format documented indocuments/README.md, so/setupPath A parses it without special cases:
# Outcome: <Company> — <Role>
**Status:** in_progress | hired | offer_declined | rejected | no_response | interview_only
**Date resolved:** YYYY-MM-DD <- only when resolved; omit while in_progress
## Interview stages reached
- [x] Phone screen (YYYY-MM-DD)
- [ ] Technical interview
- [ ] Case interview
- [ ] Final round
- [ ] Offer received
## Notes
<feedback received, what to do differently, signals about what they valued -
appended per update with a date, never overwritten>
Update rules: tick stage checkboxes as they are reached (add the date in parentheses), append dated entries to Notes, and only change Status from in_progress to a final value on resolution. Re-running /outcome on the same application is idempotent - it appends new information, never duplicates or rewrites history.
Step 4: Update the Tracker
Update the matched row's status column (e.g. applied → interview → offer → hired / rejected / no response / offer declined / withdrawn) and append a short dated note to the notes column. Never restructure the CSV, reorder rows, or touch other rows.
Step 5: Calibration Handoff
Count the outcome.md files under documents/applications/ with a final status (not in_progress).
- If 3 or more are resolved (or 2+ share a pattern - same role type rejected twice, same sector going silent), suggest:
"You now have resolved applications on record. Run
/setup(Path A) to fold them into your evaluation framework - it calibrates fit scoring from what actually got interviews, and mines your interview feedback for STAR examples." - Do not write anything into
04-job-evaluation.mdor other skill files yourself./setupPath A owns that merge - it is read-before-write and idempotent, and duplicating its logic here would race it.
Step 6: Confirm
Summarize what was recorded:
Outcome recorded for at .
documents/applications/<company>_<role>/outcome.md- status: ,- Archived: <which of cv_draft.tex / cover_letter.tex / job_posting.md were copied or fetched, and which were skipped and why>
- Tracker: status →
[Calibration suggestion from Step 5, if triggered]
If the update recorded an upcoming or newly scheduled interview stage, also suggest:
"Interview coming up?
/interview <company>builds a prep pack for that stage from this application's archive - the posting, the documents you submitted, and any feedback recorded from earlier rounds."
Important Rules
- Write data, don't interpret it. The archive and tracker are the outputs; calibration belongs to
/setup. This command never edits profile or framework files. - The archived version is the submitted version. Existing files in the application folder are never overwritten by fresher drafts.
- Never fabricate. A dead posting URL gets a user-pasted copy or an explicit "unavailable" stub, not a reconstruction. Feedback is recorded as the user reports it.
- Stay schema-compatible.
outcome.mdfollows the format indocuments/README.mdexactly (in_progressis the one addition, for open applications); the tracker keeps its columns. - Idempotent updates. Re-running on the same application appends new stages and notes; it never duplicates folders, rows, or history.