valent-pipeline 0.19.36 → 0.19.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -472,7 +472,7 @@ gitCmd
472
472
  .command('commit-phase')
473
473
  .description('Commit everything dirty as one typed conventional commit `{type}({story}): {summary}` with Story/Phase trailers; no-op when clean')
474
474
  .requiredOption('--story <id>', 'Story identifier')
475
- .requiredOption('--phase <phase>', 'Commit phase: spec | red | build | rework | review | evidence | ship | rollover | snapshot')
475
+ .requiredOption('--phase <phase>', 'Commit phase: spec | red | build | rework | review | evidence | ship | rollover | snapshot | sync | backlog')
476
476
  .option('--gate <gate>', 'Gate name for rework commits (static | critic | green | evidence)')
477
477
  .option('-m, --message <summary>', 'Commit summary (defaults per phase)')
478
478
  .option('--root <dir>', 'Project root (defaults to cwd)')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valent-pipeline",
3
- "version": "0.19.36",
3
+ "version": "0.19.38",
4
4
  "description": "v3 multi-agent AI pipeline for software development lifecycle",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1462,6 +1462,18 @@ const backlog = await persistBacklog(
1462
1462
  integration,
1463
1463
  )
1464
1464
 
1465
+ // (B) Commit the backlog dispositions persistBacklog just wrote (M-28/M-19 root). persistBacklog
1466
+ // runs `backlog ship|reject|requeue` (which WRITE pipeline-backlog.yaml) but nothing committed the
1467
+ // result — it rode the NEXT start-story snapshot, and a plan/checkout that ran first (the following
1468
+ // sprint) discarded the uncommitted write, silently reverting shipped stories to `groomed` (the
1469
+ // 2.9/2.10 status-drift). Commit it NOW, on the target, so no later checkout can drop it. commit-phase
1470
+ // is a no-op when the tree is clean (e.g. an all-skip resume where persist wrote nothing).
1471
+ if (gitFlowEnabled && !(backlog && backlog.skipped)) {
1472
+ await runGitStep('sprint', [
1473
+ `node .valent-pipeline/bin/cli.js git commit-phase --story sprint --phase backlog`,
1474
+ ], 'persist-commit', 'Backlog')
1475
+ }
1476
+
1465
1477
  return {
1466
1478
  shipped: results.every((r) => r.shipped),
1467
1479
  stories_shipped: shippedCount,
@@ -1875,6 +1887,21 @@ async function runStory(story) {
1875
1887
  await runGitStep(storyId, [
1876
1888
  `node .valent-pipeline/bin/cli.js git start-story --story ${storyId}${gitFlags}`,
1877
1889
  ], 'start', 'QA')
1890
+ // Cross-lane pin coherence on the inline-fix revalidation path (2026-06-19, M-28): the blocking
1891
+ // bug's fix already merged INTO this story branch (ship-story --into) and was CRITIC-approved in
1892
+ // its OWN lane — but that merge advanced the story tip PAST the story's last critic pin. The
1893
+ // revalidation runs no CRITIC (by design — the fix was already reviewed) and `commitAndRepin`
1894
+ // no-ops here (no devTasks), so the STALE story critic pin would trip `pins:critic`
1895
+ // (evidence assert --require-pins critic) against the merged tip and FALSE-VOID a genuine SHIP —
1896
+ // exactly the 2.11 reject. Re-pin critic so the pin records the cross-lane coverage that
1897
+ // genuinely exists (story code @ the old pin + the bug fix @ its lane's own approving pin); the
1898
+ // bug only merged here because it SHIPPED through its own CRITIC+JUDGE gates, and this no-rebuild
1899
+ // path introduces no new source, so the coverage is real. The v3 source-delta check still
1900
+ // fails-closed on any genuine un-reviewed change after this point. This is the "revalidation
1901
+ // legitimately re-pins" case the pin-coherence doctrine already anticipates (evidence.js).
1902
+ await runGitStep(storyId, [
1903
+ `node .valent-pipeline/bin/cli.js evidence pin --story ${storyId} --gate critic`,
1904
+ ], 'reval-repin-critic', 'QA')
1878
1905
  }
1879
1906
  await spawn('QA-B', 'qa-b.md',
1880
1907
  'This is a RE-VALIDATION of a previously-rejected story whose blocking bug has since been fixed and ' +
@@ -53,6 +53,7 @@ export const PHASE_TYPES = {
53
53
  ship: 'chore', // final sweep before merge: post-review rework + QA/judge artifacts
54
54
  rollover: 'chore', // reject/blocked sweep so the branch holds everything for the fix/retry
55
55
  sync: 'chore', // re-ship prep: target merged into the retained branch (sync-story)
56
+ backlog: 'chore', // sprint-end backlog dispositions, committed AT persist so a later plan/checkout cannot discard the uncommitted write (M-28/M-19)
56
57
  };
57
58
 
58
59
  const DEFAULT_SUMMARIES = {
@@ -66,6 +67,7 @@ const DEFAULT_SUMMARIES = {
66
67
  rollover: 'roll over story work',
67
68
  snapshot: 'snapshot uncommitted work before story branch',
68
69
  sync: 'sync target into story branch before re-ship',
70
+ backlog: 'persist sprint backlog dispositions',
69
71
  };
70
72
 
71
73
  function git(cwd, args, opts = {}) {