Refine curator sprint planning flow
This commit is contained in:
+90
-155
@@ -33,7 +33,7 @@ const VALID_COMPLETION_TYPES = [
|
||||
] as const;
|
||||
|
||||
const CURATOR_SOURCE = "curator-v1";
|
||||
const CURATOR_PLAN_VERSION = "icp-v3";
|
||||
const CURATOR_PLAN_VERSION = "icp-v4";
|
||||
const SPRINT_DURATION_DAYS = 30;
|
||||
const DAYS_PER_WEEK = 7;
|
||||
const PLAN_WEEK_COUNT = 5;
|
||||
@@ -98,146 +98,146 @@ type SprintState = {
|
||||
|
||||
const FRESHER_WEEK_TEMPLATES: WeekTemplate[] = [
|
||||
{
|
||||
theme: "Baseline + Direction",
|
||||
summary: "Understand where you stand and choose a clear direction.",
|
||||
theme: "Baseline + First Proof",
|
||||
summary: "Establish your Q Score baseline, choose a target outcome, and create the first useful proof assets.",
|
||||
days: [
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review your current readiness baseline", "See your current signals and pick the weakest readiness driver.", "5 min", "+5 projected", "Review Q Score", ["baseline", "readiness"]),
|
||||
proof: seed("proof", "resume-service", "Upload your current resume or profile proof", "Bring in your existing resume or raw experience so the sprint starts from something real.", "10 min", "+7 projected", "Open resume workspace", ["resume", "proof"]),
|
||||
practice: seed("practice", "matchmaking-service", "Choose the role direction for this sprint", "Set the target role family you want the next four weeks to optimize toward.", "5 min", "+4 projected", "Open pathways", ["role direction", "goal"]),
|
||||
measurement: seed("measurement", "qscore-service", "Complete your Q Score baseline", "Anchor the sprint in a real baseline so the next 30 days improve from measured signal, not guesswork.", "5 min", "+5 projected", "Review Q Score", ["q score baseline", "readiness"]),
|
||||
proof: seed("proof", "resume-service", "Import your resume, LinkedIn, and proof sources", "Upload your working resume and pull in LinkedIn, portfolio, GitHub, website, or deck context once so the sprint starts from real evidence.", "10 min", "+7 projected", "Open resume workspace", ["resume import", "proof sources"]),
|
||||
practice: seed("practice", "matchmaking-service", "Pick one target outcome for this sprint", "Choose the target role, path, or outcome this sprint should optimize toward before the practice loop begins.", "5 min", "+4 projected", "Open pathways", ["target outcome", "direction"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Log your confidence for the target role", "Capture how confident you feel today so the sprint can measure movement honestly.", "5 min", "+4 projected", "Review Q Score", ["confidence", "baseline"]),
|
||||
proof: seed("proof", "resume-service", "Turn one project into usable proof", "Pick one project or experience and shape it into two concrete outcome bullets.", "10 min", "+7 projected", "Open resume workspace", ["project proof", "outcomes"]),
|
||||
practice: seed("practice", "interview-service", "Run your first easy interview warm-up", "Start with a short behavioral preview so the sprint builds momentum early.", "10 min", "+10 projected", "Open interview preview", ["behavioral", "warm-up"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review the baseline and choose the weakest driver", "Use the baseline to identify the one readiness gap that matters most right now.", "5 min", "+4 projected", "Review Q Score", ["baseline review", "weakest driver"]),
|
||||
proof: seed("proof", "resume-service", "Turn one project into first useful proof", "Convert one real project or experience into two outcome-driven bullets that the rest of the sprint can reuse.", "10 min", "+7 projected", "Open resume workspace", ["first proof", "project outcomes"]),
|
||||
practice: seed("practice", "interview-service", "Generate your first guided service preview", "Open the first live preview so the sprint moves from planning into a real interview-style handoff.", "10 min", "+10 projected", "Open interview preview", ["first preview", "interview handoff"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Tag the biggest skill gap right now", "Identify the clearest gap between your current profile and your target direction.", "5 min", "+4 projected", "Review Q Score", ["gap analysis", "skill"]),
|
||||
proof: seed("proof", "resume-service", "Scan your resume for missing evidence", "Check where your resume is still missing role-fit proof or concrete outcomes.", "10 min", "+7 projected", "Open resume workspace", ["resume gap", "evidence"]),
|
||||
practice: seed("practice", "interview-service", "Practice your introduction story", "Work on a concise tell-me-about-yourself answer anchored in your real background.", "10 min", "+10 projected", "Open interview preview", ["introduction", "storytelling"]),
|
||||
measurement: seed("measurement", "qscore-service", "Log confidence after the first live rep", "Check what changed after your first real service action so the day stays grounded in signal.", "5 min", "+4 projected", "Review Q Score", ["confidence check", "first rep"]),
|
||||
proof: seed("proof", "social-branding-service", "Set up your first social proof cadence", "Draft the first post plan or profile update so your sprint starts producing visible credibility, not just private edits.", "10 min", "+6 projected", "Open social profile flow", ["social cadence", "first post plan"]),
|
||||
practice: seed("practice", "roleplay-service", "Complete one confidence-building practice", "Run one guided rep that helps you speak more clearly about your current role, goals, or transition.", "10 min", "+9 projected", "Open roleplay preview", ["confidence practice", "guided rep"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review which signals need proof next", "Use your readiness signals to decide what kind of evidence matters most this week.", "5 min", "+4 projected", "Review Q Score", ["signals", "proof planning"]),
|
||||
proof: seed("proof", "resume-service", "Start your proof bank", "List three experiences with metrics or outcomes you can reuse across services.", "10 min", "+7 projected", "Open resume workspace", ["proof bank", "metrics"]),
|
||||
practice: seed("practice", "roleplay-service", "Rehearse a recruiter-style introduction", "Practice a short roleplay so you can explain who you are with more clarity.", "10 min", "+9 projected", "Open roleplay preview", ["recruiter intro", "communication"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review which signals need proof next", "Use the analytics view to decide which missing evidence should be built next.", "5 min", "+4 projected", "Review Q Score", ["signals review", "proof priority"]),
|
||||
proof: seed("proof", "resume-service", "Build your first proof bank", "Capture projects, wins, traction, and metrics in one place so later tasks stop depending on memory.", "10 min", "+7 projected", "Open resume workspace", ["proof bank", "metrics"]),
|
||||
practice: seed("practice", "matchmaking-service", "Map your first opportunities or job targets", "Open pathways and shortlist the first realistic opportunities that match your current direction.", "10 min", "+5 projected", "Open pathways", ["first opportunities", "job targets"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Rate your confidence after the first reps", "Check whether this week is already improving your self-assessment and clarity.", "5 min", "+4 projected", "Review Q Score", ["confidence pulse", "movement"]),
|
||||
proof: seed("proof", "social-branding-service", "Refine your public headline", "Write a clearer headline so your profile signals where you want to go.", "10 min", "+6 projected", "Open social profile flow", ["headline", "positioning"]),
|
||||
practice: seed("practice", "interview-service", "Run one more easy practice question", "Repeat with a simple interview rep so fluency starts to feel natural.", "10 min", "+10 projected", "Open interview preview", ["interview repetition", "fluency"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check whether confidence is improving", "Review whether the first few actions are already making your target outcome feel more believable.", "5 min", "+4 projected", "Review Q Score", ["confidence pulse", "movement"]),
|
||||
proof: seed("proof", "resume-service", "Generate a cleaner role-fit artifact", "Turn your strongest imported material into a cleaner artifact such as sharper bullets, a summary, or a proof snippet.", "10 min", "+7 projected", "Open resume workspace", ["role-fit artifact", "proof upgrade"]),
|
||||
practice: seed("practice", "interview-service", "Run one focused interview rep", "Use a single focused question to keep momentum building from signal into practice.", "10 min", "+10 projected", "Open interview preview", ["focused rep", "momentum"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Choose the next driver to improve", "Pick the one readiness driver that should get extra focus next week.", "5 min", "+4 projected", "Review Q Score", ["driver review", "focus"]),
|
||||
proof: seed("proof", "resume-service", "Rewrite one bullet with stronger outcomes", "Tighten one weak bullet using action, scope, and result language.", "10 min", "+7 projected", "Open resume workspace", ["bullet rewrite", "impact"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a screen-style conversation", "Use roleplay to get comfortable answering early screening questions.", "10 min", "+9 projected", "Open roleplay preview", ["screen practice", "clarity"]),
|
||||
measurement: seed("measurement", "qscore-service", "Choose the next blocker to remove", "Pick the one blocker surfaced this week that should lead the next round of work.", "5 min", "+4 projected", "Review Q Score", ["blocker review", "focus"]),
|
||||
proof: seed("proof", "social-branding-service", "Draft your first credibility update", "Turn a real project, learning, or win into the first visible credibility artifact for this sprint.", "10 min", "+6 projected", "Open social profile flow", ["credibility update", "public proof"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a recruiter or intro conversation", "Run a roleplay rep so you can explain your direction with more clarity and less hesitation.", "10 min", "+9 projected", "Open roleplay preview", ["intro conversation", "clarity"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review your Week 1 movement", "Compare today against Day 1 and capture the most useful change so far.", "5 min", "+5 projected", "Review Q Score", ["week review", "movement"]),
|
||||
proof: seed("proof", "resume-service", "Create your first reusable story asset", "Turn one experience into a structured story you can reuse later in the sprint.", "10 min", "+7 projected", "Open resume workspace", ["story asset", "proof"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review your first aligned opportunities", "Open the opportunity flow and save the roles that best fit your current direction.", "10 min", "+5 projected", "Open pathways", ["opportunities", "market"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review your Week 1 baseline movement", "Compare Day 1 to today and record what changed in confidence, proof, and direction.", "5 min", "+5 projected", "Review Q Score", ["week 1 review", "baseline movement"]),
|
||||
proof: seed("proof", "resume-service", "Package your first reusable story asset", "Turn one experience into a structured proof asset that later practice and applications can reuse.", "10 min", "+7 projected", "Open resume workspace", ["story asset", "reusable proof"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review your first aligned opportunities", "Use the paths you chose this week to save the best-fit opportunities worth carrying forward.", "10 min", "+5 projected", "Open pathways", ["aligned opportunities", "carry forward"]),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
theme: "Proof + Positioning",
|
||||
summary: "Turn experience into stronger visible proof.",
|
||||
theme: "Fix Obvious Gaps",
|
||||
summary: "Remove the blockers surfaced by onboarding, baseline review, and the first week of real practice.",
|
||||
days: [
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Pick the next proof gap to close", "Find the next missing proof area that is blocking role-fit confidence.", "5 min", "+4 projected", "Review Q Score", ["proof gap", "readiness"]),
|
||||
proof: seed("proof", "resume-service", "Strengthen your education or foundation section", "Add the most relevant coursework, tools, or foundations that support your direction.", "10 min", "+7 projected", "Open resume workspace", ["foundations", "resume"]),
|
||||
practice: seed("practice", "interview-service", "Run a role-related interview rep", "Practice one medium-difficulty interview round tied to your target role.", "10 min", "+10 projected", "Open interview preview", ["role practice", "interview"]),
|
||||
measurement: seed("measurement", "qscore-service", "Pick the clearest blocker from Week 1", "Use analytics and the first week of action to choose the one gap that should be fixed next.", "5 min", "+4 projected", "Review Q Score", ["week 1 blocker", "gap priority"]),
|
||||
proof: seed("proof", "resume-service", "Rewrite the weakest headline or summary", "Tighten the first thing a recruiter sees so your direction and value are immediately clearer.", "10 min", "+7 projected", "Open resume workspace", ["headline rewrite", "summary fix"]),
|
||||
practice: seed("practice", "interview-service", "Practice the top interview blocker", "Run one guided rep focused on the question or hesitation that is holding you back most.", "10 min", "+10 projected", "Open interview preview", ["top blocker", "interview practice"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Check whether your proof is improving clarity", "Review if the work you are adding is actually making your story sharper.", "5 min", "+4 projected", "Review Q Score", ["clarity", "proof"]),
|
||||
proof: seed("proof", "social-branding-service", "Refine your About section", "Turn your current role and direction into a sharper public summary.", "10 min", "+6 projected", "Open social profile flow", ["about section", "positioning"]),
|
||||
practice: seed("practice", "interview-service", "Explain a project in depth", "Practice describing one project clearly with scope, decisions, and outcomes.", "10 min", "+10 projected", "Open interview preview", ["project explanation", "depth"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check which missing proof still hurts trust", "Review what still feels thin, vague, or unsupported in your profile after the first fixes.", "5 min", "+4 projected", "Review Q Score", ["trust gap", "missing proof"]),
|
||||
proof: seed("proof", "resume-service", "Rewrite weak bullets into stronger outcomes", "Turn low-signal bullets into clearer action, scope, and result proof.", "10 min", "+7 projected", "Open resume workspace", ["bullet rewrite", "outcomes"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice the hardest conversation blocker", "Use roleplay to work on the hesitation, objection, or confidence issue that keeps repeating.", "10 min", "+9 projected", "Open roleplay preview", ["conversation blocker", "confidence"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Check which signals moved this week", "Review whether any readiness signal has improved from your early sprint work.", "5 min", "+4 projected", "Review Q Score", ["signal movement", "measurement"]),
|
||||
proof: seed("proof", "resume-service", "Run a keyword-fit pass", "Align your language more closely with the roles you actually want.", "10 min", "+7 projected", "Open resume workspace", ["keywords", "role fit"]),
|
||||
practice: seed("practice", "interview-service", "Complete a medium mock interview", "Push past the warm-up stage and complete a more realistic interview practice.", "10 min", "+10 projected", "Open interview preview", ["mock interview", "medium"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check whether the fixes are moving signals", "Review which readiness signals are starting to move now that the first blockers are being addressed.", "5 min", "+4 projected", "Review Q Score", ["signal movement", "gap fixing"]),
|
||||
proof: seed("proof", "resume-service", "Build your proof bank with metrics and wins", "Add stronger projects, client wins, traction, and metrics so later positioning is grounded in evidence.", "10 min", "+7 projected", "Open resume workspace", ["proof bank", "metrics and wins"]),
|
||||
practice: seed("practice", "interview-service", "Complete a medium interview review", "Push beyond warm-up mode and finish a more realistic guided interview rep.", "10 min", "+10 projected", "Open interview preview", ["medium rep", "review"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Check communication clarity", "Evaluate whether your story is getting easier to explain to another person.", "5 min", "+4 projected", "Review Q Score", ["communication", "clarity"]),
|
||||
proof: seed("proof", "social-branding-service", "Polish a public proof artifact", "Turn one outcome or project into a profile-ready proof signal.", "10 min", "+6 projected", "Open social profile flow", ["public proof", "artifact"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice your weakness or conflict answer", "Use roleplay to rehearse a harder explanation with stronger composure.", "10 min", "+9 projected", "Open roleplay preview", ["weakness", "conflict"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review where your profile still feels weak", "Use the current signal mix to find the next public-facing credibility gap.", "5 min", "+4 projected", "Review Q Score", ["profile gap", "credibility"]),
|
||||
proof: seed("proof", "social-branding-service", "Create your first public credibility artifact", "Turn one strong lesson, result, or project into a visible profile or post asset.", "10 min", "+6 projected", "Open social profile flow", ["credibility artifact", "public proof"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a weakness or conflict answer", "Rehearse a harder explanation with stronger calm and clarity.", "10 min", "+9 projected", "Open roleplay preview", ["weakness answer", "conflict"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Audit application quality", "Check whether the roles you are considering actually fit your current proof level.", "5 min", "+4 projected", "Review Q Score", ["application quality", "fit"]),
|
||||
proof: seed("proof", "resume-service", "Tailor one resume version to a target role", "Create one sharper role-specific version instead of a generic export.", "10 min", "+7 projected", "Open resume workspace", ["tailoring", "target role"]),
|
||||
practice: seed("practice", "roleplay-service", "Roleplay a recruiter callback", "Practice the flow of a recruiter call with more confidence and structure.", "10 min", "+9 projected", "Open roleplay preview", ["recruiter callback", "roleplay"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check fit quality before you apply wider", "Review whether your target opportunities now fit the proof you have built.", "5 min", "+4 projected", "Review Q Score", ["fit quality", "opportunity check"]),
|
||||
proof: seed("proof", "resume-service", "Tailor one resume version to a real target", "Create one sharper role-specific version instead of staying generic.", "10 min", "+7 projected", "Open resume workspace", ["resume tailoring", "real target"]),
|
||||
practice: seed("practice", "matchmaking-service", "Match with 3 to 5 relevant opportunities", "Open pathways and shortlist the roles that now fit your proof better.", "10 min", "+5 projected", "Open pathways", ["3-5 matches", "opportunities"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review your latest interview feedback pattern", "Identify the one repeated weakness still showing up in practice.", "5 min", "+4 projected", "Review Q Score", ["feedback pattern", "weakness"]),
|
||||
proof: seed("proof", "resume-service", "Strengthen a teamwork or collaboration story", "Improve one story that proves how you work with others under real constraints.", "10 min", "+7 projected", "Open resume workspace", ["teamwork story", "proof"]),
|
||||
practice: seed("practice", "interview-service", "Replay the weakest part of your last round", "Go back to the soft spot and improve it through repetition.", "10 min", "+10 projected", "Open interview preview", ["replay", "weakest round"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review the repeated weak pattern", "Identify the one weakness still showing up after the first fix cycle.", "5 min", "+4 projected", "Review Q Score", ["repeated weakness", "pattern"]),
|
||||
proof: seed("proof", "resume-service", "Strengthen one collaboration or execution story", "Improve one story that proves how you work with others under real constraints.", "10 min", "+7 projected", "Open resume workspace", ["collaboration story", "execution proof"]),
|
||||
practice: seed("practice", "interview-service", "Replay the weakest part of your last round", "Go straight back to the soft spot and improve it through repetition.", "10 min", "+10 projected", "Open interview preview", ["weakest round", "replay"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review Week 2 conversion signals", "Check whether better proof is beginning to improve your role readiness.", "5 min", "+5 projected", "Review Q Score", ["week review", "conversion"]),
|
||||
proof: seed("proof", "social-branding-service", "Draft one credibility signal for public visibility", "Package one insight or result so it can reinforce your positioning externally.", "10 min", "+6 projected", "Open social profile flow", ["credibility", "visibility"]),
|
||||
practice: seed("practice", "interview-service", "Run a full behavioral review", "Complete a stronger behavioral round with your updated proof and positioning.", "10 min", "+10 projected", "Open interview preview", ["behavioral review", "practice"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review Week 2 gap removal progress", "Check whether removing obvious blockers is improving role readiness.", "5 min", "+5 projected", "Review Q Score", ["week 2 review", "gap removal"]),
|
||||
proof: seed("proof", "social-branding-service", "Publish or save one credibility signal", "Package one insight or result into a visible signal you can reuse publicly.", "10 min", "+6 projected", "Open social profile flow", ["credibility signal", "visibility"]),
|
||||
practice: seed("practice", "interview-service", "Run a stronger behavioral review", "Complete a fuller guided rep with the updated proof and positioning you now have.", "10 min", "+10 projected", "Open interview preview", ["behavioral review", "stronger rep"]),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
theme: "Practice + Market Action",
|
||||
summary: "Build confidence through repetition and real market action.",
|
||||
theme: "Repetition + Market Action",
|
||||
summary: "Repeat high-value reps, take market-facing action, and keep improving proof from live feedback.",
|
||||
days: [
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Check your story bank coverage", "Review how many reusable stories you now have across common interview themes.", "5 min", "+4 projected", "Review Q Score", ["story bank", "coverage"]),
|
||||
proof: seed("proof", "resume-service", "Sharpen your role-targeted summary", "Make sure your top summary matches the direction you are actively pushing toward.", "10 min", "+7 projected", "Open resume workspace", ["summary", "role targeting"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice expectation or negotiation pressure", "Rehearse a higher-stakes conversation where confidence matters.", "10 min", "+9 projected", "Open roleplay preview", ["expectation setting", "negotiation"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check your story bank and readiness coverage", "Review whether you now have enough reusable stories and signals for real market action.", "5 min", "+4 projected", "Review Q Score", ["story bank", "readiness coverage"]),
|
||||
proof: seed("proof", "resume-service", "Sharpen your strongest target-role summary", "Make sure your top summary matches the direction you are actively moving toward.", "10 min", "+7 projected", "Open resume workspace", ["target summary", "role direction"]),
|
||||
practice: seed("practice", "interview-service", "Run the first market-facing interview rep", "Start the repetition phase with a realistic rep tied to the role you want.", "10 min", "+10 projected", "Open interview preview", ["market-facing rep", "interview"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Drill three likely role questions", "Check how well you can respond quickly to common role-fit questions.", "5 min", "+4 projected", "Review Q Score", ["question drill", "speed"]),
|
||||
proof: seed("proof", "resume-service", "Run a final polish pass on your primary artifact", "Clean up weak phrasing so your best asset is ready for active use.", "10 min", "+7 projected", "Open resume workspace", ["final polish", "artifact"]),
|
||||
practice: seed("practice", "interview-service", "Practice hard interview questions", "Move beyond comfort and rehearse the questions that create the most pressure.", "10 min", "+10 projected", "Open interview preview", ["hard questions", "pressure"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check which question types still slow you down", "Use your latest signal to find the questions or scenarios that still break flow.", "5 min", "+4 projected", "Review Q Score", ["question types", "slowdown"]),
|
||||
proof: seed("proof", "resume-service", "Polish the artifact you will actually use", "Tighten phrasing so your strongest resume or proof asset is ready for real use.", "10 min", "+7 projected", "Open resume workspace", ["artifact polish", "real use"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a high-pressure conversation rep", "Rehearse a harder conversation where confidence and structure matter.", "10 min", "+9 projected", "Open roleplay preview", ["pressure rep", "conversation"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review your lowest readiness signal", "Identify the weakest remaining signal that still hurts market confidence.", "5 min", "+4 projected", "Review Q Score", ["lowest signal", "readiness"]),
|
||||
proof: seed("proof", "social-branding-service", "Polish one proof signal for visibility", "Make one strong outcome easier to see in your public profile or positioning.", "10 min", "+6 projected", "Open social profile flow", ["proof signal", "visibility"]),
|
||||
practice: seed("practice", "interview-service", "Run a deeper project discussion", "Practice explaining a project with decisions, tradeoffs, and real constraints.", "10 min", "+10 projected", "Open interview preview", ["deep dive", "tradeoffs"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review the weakest remaining market signal", "Identify the weakest signal still hurting confidence in interviews, outreach, or applications.", "5 min", "+4 projected", "Review Q Score", ["weakest signal", "market confidence"]),
|
||||
proof: seed("proof", "social-branding-service", "Turn proof into a visible profile update", "Make one strong outcome easier to see in your public positioning.", "10 min", "+6 projected", "Open social profile flow", ["profile update", "visible proof"]),
|
||||
practice: seed("practice", "interview-service", "Run a deeper project discussion rep", "Practice explaining one project with decisions, tradeoffs, and real constraints.", "10 min", "+10 projected", "Open interview preview", ["project deep dive", "tradeoffs"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Audit your current pipeline quality", "Look at where interest is dropping off so you can act on the real bottleneck.", "5 min", "+4 projected", "Review Q Score", ["pipeline", "drop-off"]),
|
||||
proof: seed("proof", "social-branding-service", "Update a profile proof link or featured section", "Expose one stronger proof artifact where recruiters can actually see it.", "10 min", "+6 projected", "Open social profile flow", ["featured proof", "profile"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice rejection recovery or feedback ask", "Rehearse how you respond when momentum stalls or feedback is unclear.", "10 min", "+9 projected", "Open roleplay preview", ["recovery", "feedback"]),
|
||||
measurement: seed("measurement", "qscore-service", "Audit your current pipeline quality", "Check where interest is dropping off so the next action attacks the real bottleneck.", "5 min", "+4 projected", "Review Q Score", ["pipeline quality", "drop-off"]),
|
||||
proof: seed("proof", "social-branding-service", "Update one featured proof link", "Expose a stronger proof artifact where recruiters can actually see it.", "10 min", "+6 projected", "Open social profile flow", ["featured proof", "profile"]),
|
||||
practice: seed("practice", "matchmaking-service", "Act on the top matched opportunities", "Open pathways and choose the best-fit roles or leads to move on now.", "10 min", "+5 projected", "Open pathways", ["top matches", "market action"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Link your stories to likely questions", "Check whether your evidence matches the situations you will actually be asked about.", "5 min", "+4 projected", "Review Q Score", ["question mapping", "stories"]),
|
||||
proof: seed("proof", "resume-service", "Package one case-style proof asset", "Turn a before-after-result arc into something you can reuse in the sprint.", "10 min", "+7 projected", "Open resume workspace", ["case study", "proof asset"]),
|
||||
practice: seed("practice", "interview-service", "Run a full mid-sprint mock", "Complete a realistic practice round and push for smoother delivery.", "10 min", "+10 projected", "Open interview preview", ["full mock", "mid-sprint"]),
|
||||
measurement: seed("measurement", "qscore-service", "Map your stories to the real questions ahead", "Check whether your evidence matches the situations you are now likely to face.", "5 min", "+4 projected", "Review Q Score", ["story mapping", "real questions"]),
|
||||
proof: seed("proof", "resume-service", "Package one case-style proof asset", "Turn a before-after-result arc into something reusable in applications and interviews.", "10 min", "+7 projected", "Open resume workspace", ["case-style proof", "reusable asset"]),
|
||||
practice: seed("practice", "interview-service", "Run a full market-ready mock", "Complete a realistic practice round and push for smoother delivery.", "10 min", "+10 projected", "Open interview preview", ["market-ready mock", "delivery"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Check whether confidence is holding under pressure", "Measure whether harder reps are improving resilience instead of just fluency.", "5 min", "+4 projected", "Review Q Score", ["confidence", "pressure"]),
|
||||
proof: seed("proof", "resume-service", "Export and save your current best version", "Make sure your strongest artifact is saved and ready for actual use.", "10 min", "+7 projected", "Open resume workspace", ["export", "ready state"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a crisp one-minute pitch", "Train a short answer you can use in intros, calls, and outreach.", "10 min", "+9 projected", "Open roleplay preview", ["pitch", "short form"]),
|
||||
measurement: seed("measurement", "qscore-service", "Check whether confidence holds under pressure", "Measure whether harder reps are improving resilience instead of just fluency.", "5 min", "+4 projected", "Review Q Score", ["confidence", "pressure"]),
|
||||
proof: seed("proof", "social-branding-service", "Turn current progress into a weekly proof signal", "Use the latest work to create one profile or content update that supports inbound credibility.", "10 min", "+6 projected", "Open social profile flow", ["weekly proof", "inbound credibility"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a crisp one-minute pitch", "Train a short answer you can use in intros, calls, and outreach.", "10 min", "+9 projected", "Open roleplay preview", ["one-minute pitch", "outreach"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review the Week 3 bottleneck", "Pick the one issue still limiting conversion into real opportunities.", "5 min", "+5 projected", "Review Q Score", ["week review", "bottleneck"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review the Week 3 conversion bottleneck", "Pick the one issue still limiting applications, outreach, or interview conversion.", "5 min", "+5 projected", "Review Q Score", ["week 3 review", "conversion bottleneck"]),
|
||||
proof: seed("proof", "resume-service", "Tailor one version for a top target", "Adapt your strongest proof to a company or role you care about most.", "10 min", "+7 projected", "Open resume workspace", ["top target", "tailoring"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review opportunities with Week 3 confidence", "Use your improved readiness to look again at the roles worth acting on.", "10 min", "+5 projected", "Open pathways", ["market action", "opportunities"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review opportunities with Week 3 confidence", "Use your improved readiness to look again at the roles worth acting on.", "10 min", "+5 projected", "Open pathways", ["week 3 opportunities", "market action"]),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
theme: "Conversion + Closeout",
|
||||
summary: "Convert readiness into outcomes and close the sprint strong.",
|
||||
theme: "Conversion Loop",
|
||||
summary: "Turn readiness into outcomes through repeated action, conversion feedback, and a clearer next-step loop.",
|
||||
days: [
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Refine the weakest remaining signal", "Use the last week to focus on the one readiness gap still holding you back.", "5 min", "+4 projected", "Review Q Score", ["weakest signal", "refinement"]),
|
||||
proof: seed("proof", "social-branding-service", "Strengthen one final visibility action", "Make one small but meaningful profile move that supports conversion.", "10 min", "+6 projected", "Open social profile flow", ["visibility action", "final polish"]),
|
||||
measurement: seed("measurement", "qscore-service", "Review the weakest remaining conversion signal", "Use the last stretch to focus on the one gap still blocking real outcomes.", "5 min", "+4 projected", "Review Q Score", ["conversion signal", "final gap"]),
|
||||
proof: seed("proof", "resume-service", "Refresh one artifact using live results", "Use recent outcomes, feedback, or signals to improve the artifact that now matters most.", "10 min", "+7 projected", "Open resume workspace", ["artifact refresh", "live results"]),
|
||||
practice: seed("practice", "roleplay-service", "Replay a screening or recruiter conversation", "Practice a conversion-style conversation with sharper positioning.", "10 min", "+9 projected", "Open roleplay preview", ["screen replay", "conversion"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Stress test your current readiness", "Check how stable your confidence and clarity feel under harder scenarios.", "5 min", "+4 projected", "Review Q Score", ["stress test", "readiness"]),
|
||||
proof: seed("proof", "resume-service", "Export your final working versions", "Save the strongest versions you will actually use going forward.", "10 min", "+7 projected", "Open resume workspace", ["final versions", "export"]),
|
||||
practice: seed("practice", "interview-service", "Run a hard interview review", "Complete a harder final-phase mock to see if your answers now hold up.", "10 min", "+10 projected", "Open interview preview", ["hard review", "final-phase"]),
|
||||
proof: seed("proof", "social-branding-service", "Publish or queue a weekly visibility update", "Keep the weekly social branding cadence alive with a real signal from your sprint progress.", "10 min", "+6 projected", "Open social profile flow", ["weekly visibility", "social cadence"]),
|
||||
practice: seed("practice", "interview-service", "Run a hard interview review", "Complete a harder rep to see if your answers now hold up under pressure.", "10 min", "+10 projected", "Open interview preview", ["hard review", "pressure test"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Compare now versus your starting point", "Look at your movement directly so the sprint closes with evidence, not guesswork.", "5 min", "+5 projected", "Review Q Score", ["comparison", "baseline"]),
|
||||
measurement: seed("measurement", "qscore-service", "Compare now versus your starting point", "Look at your movement directly so the sprint closes with evidence, not guesswork.", "5 min", "+5 projected", "Review Q Score", ["comparison", "starting point"]),
|
||||
proof: seed("proof", "resume-service", "Polish the proof that best represents you", "Choose the strongest proof asset and make it cleaner and more credible.", "10 min", "+7 projected", "Open resume workspace", ["proof polish", "credibility"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice objection or setback handling", "Rehearse how you respond when conversations do not go exactly your way.", "10 min", "+9 projected", "Open roleplay preview", ["objections", "setbacks"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review the top roles worth acting on now", "Use your stronger proof and practice signals to decide which opportunities deserve action next.", "10 min", "+5 projected", "Open pathways", ["top roles", "act now"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Review readiness for your best-fit role", "Check whether your strongest role target now feels realistic and supported.", "5 min", "+4 projected", "Review Q Score", ["best-fit role", "readiness"]),
|
||||
@@ -245,19 +245,19 @@ const FRESHER_WEEK_TEMPLATES: WeekTemplate[] = [
|
||||
practice: seed("practice", "roleplay-service", "Practice a referral or outreach ask", "Use roleplay to tighten how you ask for support or opportunity access.", "10 min", "+9 projected", "Open roleplay preview", ["referral ask", "outreach"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Run an application or action sprint review", "Check if you are acting on the right roles with the proof you now have.", "5 min", "+4 projected", "Review Q Score", ["action sprint", "application review"]),
|
||||
proof: seed("proof", "social-branding-service", "Do a final profile polish pass", "Make one last improvement so your public positioning is consistent with your sprint progress.", "10 min", "+6 projected", "Open social profile flow", ["profile polish", "consistency"]),
|
||||
measurement: seed("measurement", "qscore-service", "Run an action and application review", "Check if you are acting on the right roles with the proof you now have.", "5 min", "+4 projected", "Review Q Score", ["action review", "applications"]),
|
||||
proof: seed("proof", "social-branding-service", "Do a consistency polish pass", "Make one last improvement so your public positioning stays aligned with sprint progress.", "10 min", "+6 projected", "Open social profile flow", ["consistency pass", "positioning"]),
|
||||
practice: seed("practice", "roleplay-service", "Practice a confidence-forward pitch", "Rehearse a short pitch that sounds more decisive and grounded.", "10 min", "+9 projected", "Open roleplay preview", ["confidence pitch", "delivery"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Replay your weakest signal one last time", "Use one final measurement check to confirm whether the gap is really closing.", "5 min", "+4 projected", "Review Q Score", ["replay", "weak signal"]),
|
||||
proof: seed("proof", "resume-service", "Save the versions you want after the sprint", "Keep the best versions organized so momentum does not get lost after closeout.", "10 min", "+7 projected", "Open resume workspace", ["save versions", "after sprint"]),
|
||||
practice: seed("practice", "interview-service", "Prepare smarter final-round questions", "Practice the conversation stance you want when the opportunity gets serious.", "10 min", "+10 projected", "Open interview preview", ["final-round", "questions"]),
|
||||
measurement: seed("measurement", "qscore-service", "Replay your weakest signal one last time", "Use one final measurement check to confirm whether the gap is really closing.", "5 min", "+4 projected", "Review Q Score", ["weak signal", "replay"]),
|
||||
proof: seed("proof", "resume-service", "Update one proof artifact using conversion feedback", "Use the latest reactions, blockers, or interviews to improve the artifact that needs it most.", "10 min", "+7 projected", "Open resume workspace", ["conversion feedback", "artifact update"]),
|
||||
practice: seed("practice", "interview-service", "Prepare smarter final-round questions", "Practice the conversation stance you want when the opportunity gets serious.", "10 min", "+10 projected", "Open interview preview", ["final-round questions", "serious opportunity"]),
|
||||
},
|
||||
{
|
||||
measurement: seed("measurement", "qscore-service", "Record the sprint outcome and next focus", "Capture the actual movement from this sprint and choose the next improvement direction.", "5 min", "+5 projected", "Review Q Score", ["closeout", "next focus"]),
|
||||
proof: seed("proof", "resume-service", "Save your final proof set for the next sprint", "Finish with a clean, reusable set of proof assets and working materials.", "10 min", "+7 projected", "Open resume workspace", ["final proof set", "next sprint"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review next-step opportunities for the next sprint", "Use the improved profile and practice signals to decide what comes next.", "10 min", "+5 projected", "Open pathways", ["next sprint", "opportunities"]),
|
||||
measurement: seed("measurement", "qscore-service", "Record the sprint outcome and next focus", "Capture the actual movement from this sprint and choose the next improvement direction.", "5 min", "+5 projected", "Review Q Score", ["sprint outcome", "next focus"]),
|
||||
proof: seed("proof", "resume-service", "Save your strongest reusable proof set", "Finish with a clean set of proof assets and working materials that the next sprint can build on.", "10 min", "+7 projected", "Open resume workspace", ["reusable proof set", "next sprint"]),
|
||||
practice: seed("practice", "matchmaking-service", "Review next-step opportunities for the next sprint", "Use the improved profile and practice signals to decide what comes next.", "10 min", "+5 projected", "Open pathways", ["next-step opportunities", "next sprint"]),
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -877,57 +877,13 @@ function practiceServiceLabel(serviceId: CuratorServiceId) {
|
||||
}
|
||||
|
||||
function overnightSignalTaskSeed(signal: CuratorImprovementSignal, weekTheme: string): TaskSeed {
|
||||
const serviceId = signal.recommendedServiceId ?? "qscore-service";
|
||||
const nudge = signal.nudgeText?.trim() || signal.reason;
|
||||
|
||||
if (serviceId === "resume-service") {
|
||||
return seed(
|
||||
"proof",
|
||||
"resume-service",
|
||||
"Turn the overnight curator signal into stronger proof",
|
||||
`${nudge} Use the resume workspace to convert that signal into a clearer proof asset for ${weekTheme.toLowerCase()}.`,
|
||||
"10 min",
|
||||
"+7 projected",
|
||||
"Open resume workspace",
|
||||
["overnight signal", "resume proof"],
|
||||
);
|
||||
}
|
||||
|
||||
if (serviceId === "social-branding-service") {
|
||||
return seed(
|
||||
"proof",
|
||||
"social-branding-service",
|
||||
"Turn the overnight curator signal into stronger positioning",
|
||||
`${nudge} Use your public profile or headline to make that signal visible.`,
|
||||
"10 min",
|
||||
"+6 projected",
|
||||
"Open social profile flow",
|
||||
["overnight signal", "positioning"],
|
||||
);
|
||||
}
|
||||
|
||||
if (serviceId === "interview-service" || serviceId === "roleplay-service" || serviceId === "matchmaking-service") {
|
||||
return seed(
|
||||
"practice",
|
||||
serviceId,
|
||||
`Practice the overnight curator signal in a ${practiceServiceLabel(serviceId)}`,
|
||||
`${nudge} Use a live ${practiceServiceLabel(serviceId)} so the next sprint move is backed by a real event.`,
|
||||
"10 min",
|
||||
serviceId === "matchmaking-service" ? "+5 projected" : "+9 projected",
|
||||
serviceId === "interview-service"
|
||||
? "Open interview preview"
|
||||
: serviceId === "roleplay-service"
|
||||
? "Open roleplay preview"
|
||||
: "Open pathways",
|
||||
["overnight signal", "practice loop"],
|
||||
);
|
||||
}
|
||||
|
||||
return seed(
|
||||
"measurement",
|
||||
"qscore-service",
|
||||
"Review the overnight curator signal before continuing",
|
||||
`${nudge} Use analytics first so today starts from a measured signal instead of guesswork.`,
|
||||
`${nudge} Use analytics first so only the measurement lane looks back before proof and practice move forward.`,
|
||||
"5 min",
|
||||
"+5 projected",
|
||||
"Review Q Score",
|
||||
@@ -966,6 +922,7 @@ function normalizeEventBackedTask(task: PlannedTask, planDay: PlanDaySeed, recen
|
||||
if (hasDirectServiceCompletion(task.serviceId)) return task;
|
||||
|
||||
if (task.taskType === "proof") {
|
||||
if (task.serviceId === "social-branding-service") return task;
|
||||
return makePlannedTask(
|
||||
seed(
|
||||
"proof",
|
||||
@@ -983,6 +940,7 @@ function normalizeEventBackedTask(task: PlannedTask, planDay: PlanDaySeed, recen
|
||||
}
|
||||
|
||||
if (task.taskType === "practice") {
|
||||
if (task.serviceId === "matchmaking-service") return task;
|
||||
const prefersRoleplay = hasRecentServiceSignal(recentRows, /\binterview(\.|-|\s)|mock\b/);
|
||||
return makePlannedTask(
|
||||
seed(
|
||||
@@ -1268,7 +1226,7 @@ function adaptCurrentDayPlan(
|
||||
let adapted = false;
|
||||
const reasons: string[] = [];
|
||||
|
||||
if (!hasResumeSignal) {
|
||||
if (!hasResumeSignal && focusDayIndex === 1) {
|
||||
current.plannedTasks[1] = makePlannedTask(
|
||||
seed("proof", "resume-service", "Upload or refresh your resume baseline", "Bring in your resume or raw experience so the rest of the sprint can work from real proof.", "10 min", "+7 projected", "Open resume workspace", ["resume baseline", "proof"]),
|
||||
current.weekTheme,
|
||||
@@ -1308,30 +1266,7 @@ function adaptCurrentDayPlan(
|
||||
current.weekTheme,
|
||||
current.weekSummary,
|
||||
);
|
||||
|
||||
const unfinishedPractice = previous.plannedTasks.find((task) => (
|
||||
task.taskType === "practice" &&
|
||||
!taskCompletedByTaskId(
|
||||
taskIdFor(sprintStartDate, previous.dayIndex, task.taskType),
|
||||
completionEventsForService(task.serviceId),
|
||||
completionRows,
|
||||
)
|
||||
));
|
||||
|
||||
if (unfinishedPractice) {
|
||||
current.plannedTasks[2] = makePlannedTask(
|
||||
{
|
||||
...unfinishedPractice,
|
||||
title: `Close the loop on ${unfinishedPractice.title.toLowerCase()}`,
|
||||
subtitle: `Yesterday finished ${previousCompleted}/3 tasks. Use today to close the unfinished practice gap before moving on.`,
|
||||
cta: unfinishedPractice.cta,
|
||||
},
|
||||
current.weekTheme,
|
||||
current.weekSummary,
|
||||
);
|
||||
}
|
||||
|
||||
current.focus = `Recover momentum after Day ${previous.dayIndex} finished ${previousCompleted}/3 tasks.`;
|
||||
current.focus = `Review what blocked Day ${previous.dayIndex}, then continue with today’s proof and practice plan.`;
|
||||
adapted = true;
|
||||
reasons.push(`day ${previous.dayIndex} incomplete`);
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ export async function prepareHandoffForTask(
|
||||
route,
|
||||
actionId,
|
||||
actionRoute: route,
|
||||
actionLabel: actionLabel(task),
|
||||
actionLabel: actionLabel({ ...task, serviceId }),
|
||||
status: "prepared",
|
||||
};
|
||||
}
|
||||
@@ -399,6 +399,16 @@ export function buildCuratorTools(ctx: { userId: string; date: string; conversat
|
||||
if (!task) return { error: "task_not_found" };
|
||||
const handoff = await prepareHandoffForTask(ctx.userId, task, "resume-service");
|
||||
const evidence = await latestInterviewResumeEvidence(ctx.userId);
|
||||
if (!evidence?.carryForward?.length) {
|
||||
const interviewFallback = await prepareHandoffForTask(ctx.userId, task, "interview-service");
|
||||
return {
|
||||
handoff,
|
||||
carryForward: [],
|
||||
requiresInterviewEvidence: true,
|
||||
recommendedNextAction: "No recent interview or roleplay review evidence is available yet. Run an interview rep first so the resume proof can be generated from real conversation evidence.",
|
||||
fallbackHandoff: interviewFallback,
|
||||
};
|
||||
}
|
||||
return {
|
||||
handoff,
|
||||
carryForward: evidence?.carryForward ?? [],
|
||||
|
||||
Reference in New Issue
Block a user