Skip to content

Releases: easyvibecoding/vibe-resume

v0.35.0 — gate-mode emit guard + detailed-variant review budget + remote-less dedup

Choose a tag to compare

@easyvibecoding easyvibecoding released this 02 Jun 08:20

Fixed

  • Gate-mode run --continue silently rendered UN-enriched groups when G4
    wasn't armed
    (#94, silent-corruption class). The enrich emit only fired when
    the pending gate was G4; arming e.g. --gates G1,G2,G7,G8 skipped emit, ingested
    nothing, and rendered raw/curated groups (a contentless résumé) with no error.
    Now, on --continue with G4 not armed and no enrich manifest present, the run
    emits the manifests and stops with a process-then-continue message instead
    of rendering un-enriched.
  • review scored the _detailed variant against the fixed locale page budget
    → misleading C / "Page 2/10"
    (#95). #88 made the detailed variant uncapped at
    render, but review still judged it against the ATS/locale target (≤2.0). Now a
    _detailed file is scored against a detailed-appropriate budget — the configured
    config.render.variants detailed max_pages if set, else 2.5× the locale target
    — and the budget used is disclosed in the header. --max-pages still overrides.
    Applies per-file, so review --variants scores each variant on its own budget.

Added

  • Remote-less local dirs are now matched against the same-named remote repo at
    curate
    (#93, residual of #37). A working dir with no git remote
    (canonical_key: None) whose basename uniquely matches the repo basename of
    a remote-keyed group (e.g. local vibecoding ↔ a repo …/vibecoding) is
    surfaced as a needs_decision merge_into suggestion — never a silent
    auto-merge (basename collisions are possible; 0 or >1 matches → left as-is, and
    auto_drop precedence is preserved).

v0.34.1 — review --file crash + locale inference fix (#92)

Choose a tag to compare

@easyvibecoding easyvibecoding released this 02 Jun 07:36

Fixed

  • review --file <relative path> crashed with ValueError (#92, regression
    from the #86 Scored: print). The new header printed md_path.relative_to(ROOT),
    which raises when --file is a relative or out-of-repo path. Now resolves first
    and guards relative_to, falling back to the absolute path.
  • review --file mis-inferred en_US for a locale-tagged filename (#92). The
    filename→locale regex ([a-zA-Z_]+) greedily captured the persona/variant
    suffix too (zh_TW_agentic_ats from resume_v012_zh_TW_agentic_ats.md),
    yielding an invalid locale that fell back to en_US — so a non-English résumé
    under-scored AI-proficiency. Now captures only the xx_YY locale token. Affects
    every suffixed filename, not just --file.

v0.34.0 — agent-operation batch: silent-corruption fixes + disclosure

Choose a tag to compare

@easyvibecoding easyvibecoding released this 02 Jun 07:21

A batch of agent-operation fixes surfaced by a real interactive run (#82#91):
silent-corruption bugs first, then disclosure/ergonomics.

Fixed

  • Stale enrich YAML ingested by POSITION after re-aggregate → scrambled
    bullets
    (#84, silent corruption). ingest_jobs matched the old manifest to
    the current groups by list index; after aggregate reordered/added/dropped
    groups, each entry's bullets landed on whatever now sat at that index (only a
    soft "name mismatch … Using raw[N]" warning). Now keyed by group identity
    (namecanonical_key fallback, each group consumed once); an entry that
    matches no current group is skipped + warned loudly, never written onto an
    unrelated group.
  • AI-proficiency human-gate detection scored 0 for every non-English locale
    (#82). gate_terms matched only an exact locale key, but
    human_gate_verbs_by_locale is keyed by base family (zh/ja/…), so zh_TW
    / ja_JP / de_DE missed and a résumé that honestly paired a tool with a
    human gate was structurally pinned at 0/10. Now normalizes to the base family.
  • Detailed render silently truncated each group to 2 achievements (#88).
    The detailed variant inherited the global config.render.page_budget and got
    floored — hiding woven content with no warning. Variants no longer inherit the
    global budget (only their own max_pages caps them), and any per-group
    truncation now prints a warning. New render --bullets-per-group N hard cap.
  • curate --apply silently ignored the edited action (#87). A human edit
    setting action: drop with a non-standard tier (e.g. manual_drop) failed
    tier Literal validation, so the whole record fell back to the auto-only
    classification. tier is now a free str (action is authoritative).
  • review scored a stale non-suffixed version and never said which file
    (#86, #63). The persona+locale default glob excluded _ats/_detailed
    variants and picked the highest non-suffixed file (often stale). Now includes
    variant suffixes, selects by version number (not lexical order), and
    always prints the resolved target path.
  • run --continue replayed the full extract (~4min) on every resume (#83).
    A G1=reextract decision re-fired each --continue. Once the extract cache is
    fresh (the reextract already ran this session), it now honors --max-age-days
    and skips the redundant extract (still re-aggregates).
  • Gate recompute bypassed curate --apply cleanup (#85). The G2/recompute
    aggregate regenerated raw groups and left the curated cache stale, silently
    dropping the human's curation. Now re-applies _curation.yaml after any
    recompute aggregate so curation survives --continue.

Added

  • enrich --candidates evidence-aware first pass (#89). Each group's enrich
    prompt now carries an EVIDENCE DISCLOSURE block — the human-gate phrasing and
    safe_to_surface metrics the evidence layer mines from the activity record —
    so a faithful first-pass bullet can pair tool + gate and surface real numbers
    without the manual evidence→re-edit loop. Anti-fabrication contract intact.
  • curate --drop/--merge/--keep verbs (#87) — set actions without hand-editing
    YAML; unknown names are reported, not silently ignored.
  • review --json and review --variants (#91) — structured scorecard (with
    resolved target path) on stdout, and one-call scoring of every rendered variant
    keyed by variant, for agent consumption.
  • gates state [--json] (#90) — machine-readable run state: armed gates,
    fully-wired vs emit-only, the pending gate, each recorded decision, and per-gate
    recompute suffix, so an agent drives the gate machine deterministically instead
    of parsing console prose. (The full_review G3 stall noted in #90 was already
    fixed in 0.32.3.)

v0.33.1 — document v0.33.0 commands + Interactive Gate Mode (#81)

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 21:39

Documentation

  • v0.33.0 exploration commands + Interactive Gate Mode were undocumented in
    the canonical SKILL.md / AGENTS.md
    (#81) — invisible to skill-discovery
    hosts that never run --help. Added Quick Reference rows for explore,
    jd-check --explain, enrich --candidates + bullets-compare,
    personas-compare --with-scores, run --branch/--branches/--adopt, plus
    curate/emphasis/review-diff; a new Interactive Gate Mode procedure
    subsection (presets autopilot/checkpoints/full_review, the G1–G8 model,
    the run --interactive → decide gate file → run --continue loop); and a
    Pitfalls note on the truthful-lever guarantees. Mirrored into AGENTS.md.
    A new tests/test_skill_spec.py drift guard asserts every top-level CLI
    command (and the v0.33.0 sub-flags) appears in SKILL.md, so a future command
    fails CI until documented.

v0.33.0 — exploration & disclosure backlog

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 21:18

Added — exploration & disclosure backlog

The unifying design principle (per the project goal): give the agent disclosure
capability to self-mine what it needs to see
, and turn single-shot choices into
visible explorations. None of these rewrite bullets or fabricate — they surface
real signals and let the human pick.

  • jd-check --explain (#80). For each MISSING JD keyword, classify it
    groundable (real supporting snippets exist in the activity — shown with source
    refs) vs absent ("honest gap — leave it"). Reuses the evidence-disclosure layer;
    advisory only, never auto-inserts. New core/jd_explain.py.
  • explore command (#76). Sweeps a top_n × page_budget grid, renders+reviews
    each cell, and surfaces the Pareto front (configs not dominated on score↑ /
    pages↓) so the layout sweet-spot is found deliberately instead of by hand. Pure
    layout/selection — same truthful-lever guarantee as iterate. New core/explore.py.
  • personas-compare --with-scores (#78). Joins the per-group bullet diff with a
    per-persona review-score table for the same locale + JD, and highlights the persona
    that maximizes JD fit — turning persona choice from an up-front guess into a
    data-driven comparison. New core/persona_compare.py.
  • run --branch <Gn> --decision <json> + --branches + --adopt (#77). Forks
    the gate ledger to a named branch (original kept intact), applies the alternative
    decision, recomputes only that gate's invalidation suffix, and auto review-diffs the
    branch vs the original — making the gate flow a tree instead of a line. New
    core/run_branch.py (pure, deterministic branch ids; no clock/RNG).
  • enrich --candidates <angles> + bullets-compare (#75). Generates N
    angle-biased candidate bullet-sets per group (impact_first / breadth_first /
    depth_first — each a prompt PREFIX; the anti-fabrication rules are untouched) and
    shows them side by side so the user picks the best framing per group. New
    core/candidates.py; the angle threads through enricher._build_promptemit_jobs.
  • G5 per-metric selection (#79 part 2). The G5 metrics gate is no longer
    all-or-nothing: the decision records pick: [{group, value}] to weave a SUBSET, and
    the gate file scaffolds an empty pick. g5_selected_metrics always intersects the
    pick with safe_to_surface values, so a pick can never smuggle an unsafe/unlisted
    value past the P1 guard (closes #79; part 1 shipped in 0.32.4).

v0.32.4 — evidence classifier hardening (#79 part 1)

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 21:18

Fixed

  • G5 evidence classifier surfaced secret-key fragments and other noise as
    real metrics
    (#79, part 1 — classifier hardening). The metric classifier
    now marks safe_to_surface: false for five additional noise contexts so they
    can never be woven into a résumé:

    • secret/key fragments487B lifted from CWA-BF1B60DA-2A68-487B-…
      (also sk-, ghp_, gho_, github_pat_, AIza…, x-access-token,
      bearer, and dash-delimited hex/UUID groups). This is a genuine
      privacy/secret-leak fix, not just noise reduction.
    • hash digests256 h from SHA-256 (md5, sha1, digest,
      checksum, hash).
    • ANSI / stack-trace markers0m/4m from colour codes, line 42.
    • path / UUID fragments4d/8d from ~/.claude/image-cache/<uuid>.
    • enricher prompt-template self-reference40% lifted from the
      enricher's own template text (寫「…壓縮約 40%」, e.g. …, 範例:…).

    Genuine plainly-stated metrics (壓縮資料前置處理約 40%, handled 2k req/s)
    are unaffected. Part 2 of #79 (per-metric pick-list selection at G5) remains
    open. New rules ordered ahead of the existing kind rules; 6 regression tests
    added.

v0.32.3 — full_review G3 pause fix (#74)

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 21:18

Fixed

  • run --preset full_review skipped the enrich emit and rendered from raw
    output while reporting success
    (#74, silent failure). full_review is the
    only preset that arms G3 (overwrite), and G3 sits before the G4 enrich
    emit but had no pause handler in the run state machine. After G1+G2 were
    decided, first_pending_gate returned G3, the pending is G4 emit branch
    never fired, ingest found no jobs, and render fell back to raw aggregator output
    (no bullets) — then the run printed "gated run complete". Fixed by giving G3
    an emit+pause branch (symmetric with G5/G6/G7) so full_review records
    the overwrite decision and advances to the G4 emit instead of swallowing it.
    Added regression tests driving full_review G1→G2→continue (pauses at G3,
    emits nothing, never claims completion) and G3-decided→continue (emits enrich,
    pauses at G4). GUARD_PHASE now maps G3 → "overwrite".

v0.32.2 — fix claude_code_archive signature drift

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 19:32

Fixed

  • claude_code_archive extractor crash → silent data loss (#73). It reused
    claude_code._process_session but still called it with the old 2-arg signature
    after that function grew to 6 args (sample_n/per_chars/capture_args/
    git_cache). Per-extractor failure isolation masked the TypeError as silent
    data loss — newly-archived sessions were never re-ingested and status kept the
    stale count. Fixed by mirroring claude_code.extract's session-config read +
    per-run git cache and passing the full signature. Added archive-extractor tests
    (happy-path + missing-path) so future signature drift fails at CI, not at a
    user's extract.

v0.32.1 — self-documenting gate-file decision shape

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 13:27

Fixed

  • Self-documenting gate-file decisions (#72). The emitted *.gate.json showed
    "decision": null with no shape hint, and the obvious fill ("decision": "reuse")
    was silently coerced to None and mislabeled "no decision filled in" — stalling
    the documented happy path. Now the gate-file scaffolds "decision": {"choice": null}
    plus a _hint; a bare string is accepted and normalized to {"choice": "reuse"};
    and read_gate_decision distinguishes a genuinely-empty decision from a wrong-shape
    one (decision must be an object like {"choice": ...}; got [...]). The engine was
    already correct — only the affordance is fixed.

v0.32.0 — Interactive Gate Mode wired into run

Choose a tag to compare

@easyvibecoding easyvibecoding released this 30 May 12:27

Added

  • Interactive Gate Mode — wired into run (#71, Phase 2 of #70). The tested
    gate core is now a usable flow:
    • run --interactive / --preset <autopilot|checkpoints|full_review> /
      --gates G1,G2,... arm a gate set (default checkpoints = G1/G2/G8),
      persisted to data/run_ledger.json.
    • A ledger-driven multi-stop pause: before a stage an armed-undecided gate
      guards, run emits a *.gate.json (decision context from the #62#69
      disclosure) and stops; run --continue reads the decision, records it,
      and advances to the next gate. Fully-wired apply: G1 (reuse vs re-extract),
      G2 (top-N → enrich limit, drop-noise), G8 (terminal acceptance); G3–G7
      emit+record (MVP).
    • run --resume-from Gnresume_plan → re-runs only the affected stage
      suffix (e.g. G5 → render → review), then prints an automatic review-diff.
    • Backward compatible: with no gate flags (or --preset autopilot), run
      and run --continue behave exactly as before — no ledger, no pauses. The G5
      fabrication guard (assert_g5_safe) stays active on the run path, with the
      gate context filtered to safe_to_surface metrics only.