Replies: 1 comment
-
|
Acknowledged, @devty — and thank you for turning this around within hours, filed exactly per the process (#284), with the core-vs-shared-layer self-classification done right. That makes evaluating it much easier. What happens next: I'll give this a proper architectural read (the new pipeline state is the part with the widest blast radius — every tool that parses pipeline.md/states.yml needs to understand it), and I'd genuinely like community input here too: if you'd use create-a-role pursuits, say so in this thread — appetite is a real input to whether a new category earns its complexity. No timeline promises, but it's on the list and PR #824 stays open waiting on this. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
RFC:
gambitmode + theSpeculativepipeline state (create-a-role pursuits)This RFC is filed at the maintainer's request: PR #824 was flagged as needing the architect's call because it introduces a new mode category and new pipeline semantics, and categories enter through the RFC process rather than PR review. The PR is already implemented and green (157 JS assertions + Go dashboard tests pass) — but I'm treating it as the reference implementation behind the proposal, not a fait accompli. The point of this RFC is to validate appetite and settle the open questions below before anything merges.
1. Problem
Every existing career-ops mode is reactive — it starts from an artifact that already exists:
oferta,pdfscan,pipelineapplycontactoIntelligence flows inward: given this opening, how do I fit it? That covers the posted job market well.
It leaves a gap. Some of the highest-leverage opportunities are unposted — a developer-facing product with zero DevRel headcount, an API nobody has productized, an AI capability with no one shipping it. The play there is the inverse: pick a company, diagnose the function it is conspicuously missing given its trajectory, and pitch a role that does not exist yet to the person who could create it.
career-ops has no home for that. Today it gets handled with ad-hoc prompting, which is exactly where the system's guardrails don't apply — and a cold, speculative pitch to an executive is the highest annoyance-risk action in the entire system. A bad one wastes a decision-maker's attention and burns a company you actually wanted. So this is precisely the workflow that most needs first-class, ethically-bounded support, not the one that should be left to freehand prompts.
Two things are missing, and they are coupled:
Evaluatedloses all three distinctions.2. Proposed solution
Two coupled pieces. I'm presenting the state first because it's the concrete, reviewable, cross-cutting artifact — the mode is the use case that motivates it.
2a. The
Speculativestate — the spineA new canonical state in
templates/states.yml(aliasesspec,gambit):Lifecycle:
Speculative→Responded/Interview/Offer(if the pitch lands) or→ Discarded(if it goes nowhere). It marks a pursuit that has no posting behind it yet.Why a new state and not
Evaluated:LegitimacyisN/A, not a tier.Evaluatedrows carry a real legitimacy tier; conflating them corrupts that signal.rolecell carries the invented title + a(gambit)marker so a speculative pursuit doesn't collide with a future real posting at the same company.Blast radius (the real reason this needs an RFC, not just a PR).
states.ymlis the named source of truth, but several consumers hardcode the state list, so a new state fans out to every one of them — and if any consumer is missed, it silently downgrades aSpeculativerow back toEvaluated:templates/states.ymlnormalize-statuses.mjs,verify-pipeline.mjs,dedup-tracker.mjs,merge-tracker.mjsdashboard/internal/data/career.go(normalize + sort priority),dashboard/internal/ui/screens/pipeline.go(render, filter tab, color, group order)This is genuinely new pipeline semantics across two languages — which is why it deserves the architect's sign-off rather than a quiet merge.
2b. The
gambitmode — the use case/career-ops gambit {company}runs the create-a-role play. High-level flow (full spec in PR #824 /modes/gambit.md):The keystone is a synthetic-JD bridge. The mode writes the invented role as the posting the company should publish — and from that point on, the entire reactive engine works unchanged:
pdf.mdkeyword-extracts and tailors the CV, the_shared.mdcover-letter rule fires, report blocks A–F apply almost verbatim. The system is inverted exactly once, at the thesis; everything after it is trusted, already-tested machinery. That's what keeps the mode small instead of a parallel pipeline.Three design points worth flagging to reviewers:
2c. Ethics — the conviction gate (a feature, not a footnote)
This is the part I'd most want the community and the architect to pressure-test, because it's where the repo's stated soul — "quality over quantity, respect the recruiter's time" — is most load-bearing. A speculative cold pitch is the highest-annoyance-risk action the system can take, so the mode holds itself to the strictest bar in career-ops:
This is the "respect their time" ethos turned up a notch for the one action where it matters most — and it's why this belongs in the core, governed by these guardrails, rather than left to freehand prompting.
3. Files affected
All changed files are system-layer (auto-updatable). No user data is touched; the personalization hook is via template placeholders only (see §4).
templates/states.ymlnormalize-statuses.mjs,verify-pipeline.mjs,dedup-tracker.mjs,merge-tracker.mjsdashboard/internal/data/career.go(+career_test.go),dashboard/internal/ui/screens/pipeline.go(+pipeline_test.go)modes/gambit.md(new).agents/skills/career-ops/SKILL.md,CLAUDE.md,AGENTS.mdmodes/_profile.template.md(adds two fill-in-yourself sections)test-all.mjs(mode-integrity + Speculative-state assertions)4. Data Contract impact
modes/gambit.mdis a new system-layer mode (auto-updatable), exactly likeoferta.md.gambit.mdreads two sections from the user'smodes/_profile.md—## Your Natural Level & Company-Stage Calibrationand## Gambit Playbook— the same wayofertareads_profile.mdfor archetype framing. The PR seeds these as bio-free, fill-in-yourself scaffolds inmodes/_profile.template.md(system-layer template), so a fresh install resolves them to a prompt rather than to nothing. The user's actual_profile.mdis never overwritten by updates.Speculativestate is system-layer intemplates/states.yml. Reports and the tracker remain user-layer as today.## Machine Summarykeeps every existing key, setslegitimacy: "N/A (speculative)"as a safe sentinel, and only adds keys (mode: gambit,decision_maker). Existing parsers (merge-tracker.mjs,analyze-patterns.mjs) are unaffected.Net: this is a clean system-layer addition with a user-layer hook via the established template mechanism — no change to how user vs. system data is classified.
5. Phases
The reference PR (#824) currently bundles both pieces. For merge, I'd split it into two independently-shippable phases (this mirrors the build sequence in the design spec — land the riskiest cross-cutting change first, alone, where it's independently verifiable):
Speculativestate contract.states.yml+ the 4 JS consumers + the 2 Go dashboard files + tests. This is the riskiest change (cross-language, hardcoded-list blast radius) and is verifiable on its own: a sampleSpeculativetracker row survivesnormalize-statuses,verify-pipeline,dedup-tracker,merge-tracker, and renders/sorts correctly in the dashboard. Mergeable without the mode.gambitmode.modes/gambit.md+ the_profile.template.mdscaffolds + routing/docs (SKILL.md,CLAUDE.md,AGENTS.md) + the CI mode-integrity check. Depends on Phase 1.I'm happy to split #824 into two PRs along this line if the RFC is approved — or leave it as one if the architect prefers to review the category whole. Either way, Phase 1 is the natural first merge.
6. Open questions (community + architect input wanted)
These are genuinely open — the RFC is here to settle them, not to ratify a finished answer.
Naming. Is
gambitthe right public-facing name? Alternatives:create-a-role,speculative,pitch.gambitis memorable but jargon-y; a plainer name might be more discoverable. (The state could keep a neutral name even if the mode is renamed.)State generality. Should
Speculativebe a generic state for any unposted pursuit — referral-chasing, talent-network intros, "they'll open a req next quarter" — rather than gambit-specific? Making it generic now (gambit being the first consumer) may be the more durable design and is the question most likely to matter long-term. The counter-argument is YAGNI: keep it gambit-scoped until a second use case actually appears.Dashboard grouping. Should
Speculativeget its own dashboard group, or fold into the existingevaluatedband? The PR gives it its own filter tab and color but sorts it at the same priority asevaluated(with a tie-breaker to keep the two contiguous). Open to the maintainers' preference on visual treatment.Conviction-gate configurability. Should the ≥4.0 send threshold and the three-leg go/no-go test be configurable in
config/profile.yml, or hardcoded in the mode? Hardcoding keeps the ethical floor non-negotiable (arguably the point); configuring respects that different users calibrate "high conviction" differently. There's a real values trade-off here, not just a knob.Known follow-up (not a question): CLI-skill routing was wired into
.agents/skills/career-ops/SKILL.mdonly; the.claude/and.qwen/variants are structurally different and were intentionally left to the maintainers' conventions. Easy to extend in-phase or as a follow-up.Closing
PR #824 can wait on this RFC — link it here and I'll hold. If the community sees appetite, Phase 1 (the state contract) is a small, well-tested first merge and the mode follows. If the architect would rather this not enter the core at all, I'd genuinely like to hear why on the record, because the "no posting behind it" pursuit feels like a real and growing slice of how people actually job-hunt — and I'd rather it be governed by career-ops's guardrails than left to ad-hoc prompts.
Thanks for the process, and for the kind words on the PR.
Beta Was this translation helpful? Give feedback.
All reactions