@brainervirus/workit-codex 8.35.0 → 8.36.0

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workit",
3
- "version": "8.35.0",
3
+ "version": "8.36.0",
4
4
  "description": "Adaptive engineering workflow rails for Codex",
5
5
  "author": {
6
6
  "name": "BrainerVirus"
@@ -14926,7 +14926,11 @@ var releaseTrackSchema = object({
14926
14926
  ["requiredChecks", track.requiredChecks ?? []]
14927
14927
  ]) {
14928
14928
  if (new Set(values).size !== values.length) {
14929
- context.addIssue({ code: "custom", path: [field], message: "entries must be unique" });
14929
+ context.addIssue({
14930
+ code: "custom",
14931
+ path: [field],
14932
+ message: "entries must be unique"
14933
+ });
14930
14934
  }
14931
14935
  }
14932
14936
  if (track.versionSource?.kind === "package-json" && (path4.posix.isAbsolute(track.versionSource.path.replaceAll("\\", "/")) || /^[A-Za-z]:\//u.test(track.versionSource.path.replaceAll("\\", "/")) || track.versionSource.path.replaceAll("\\", "/").split("/").includes(".."))) {
@@ -14959,7 +14963,10 @@ var workspaceConfigSchema = object({
14959
14963
  kind,
14960
14964
  union([boolean2(), literal("verified")]).optional()
14961
14965
  ]))).passthrough().optional(),
14962
- youtrack: object({ baseUrl: nonBlank.optional(), link_issues: boolean2().optional() }).passthrough().optional(),
14966
+ youtrack: object({
14967
+ baseUrl: nonBlank.optional(),
14968
+ link_issues: boolean2().optional()
14969
+ }).passthrough().optional(),
14963
14970
  issues: object({
14964
14971
  provider: _enum(["github", "gitlab", "youtrack"]).optional(),
14965
14972
  link: boolean2().optional(),
@@ -15000,9 +15007,16 @@ var workspacesFileSchema = object({
15000
15007
  var workspacesRevision = (contents) => createHash2("sha256").update(contents ?? "<missing>").digest("hex");
15001
15008
  var validateWorkspacesDocument = (parsed, file) => {
15002
15009
  if (!isConfigObject(parsed)) {
15003
- return { status: "malformed", path: file, entries: [], error: `${file} is not a JSON object` };
15010
+ return {
15011
+ status: "malformed",
15012
+ path: file,
15013
+ entries: [],
15014
+ error: `${file} is not a JSON object`
15015
+ };
15004
15016
  }
15005
- const validated = workspacesFileSchema.safeParse(parsed, { reportInput: true });
15017
+ const validated = workspacesFileSchema.safeParse(parsed, {
15018
+ reportInput: true
15019
+ });
15006
15020
  if (!validated.success) {
15007
15021
  const detail = validated.error.issues.map((issue) => {
15008
15022
  const field = String(issue.path[issue.path.length - 1] ?? "");
@@ -15042,7 +15056,12 @@ var readWorkspacesResult = (dir = configDir()) => {
15042
15056
  raw = readFileSync2(file, "utf8");
15043
15057
  } catch (error) {
15044
15058
  if (error.code === "ENOENT")
15045
- return { status: "missing", path: file, entries: [], revision: workspacesRevision(null) };
15059
+ return {
15060
+ status: "missing",
15061
+ path: file,
15062
+ entries: [],
15063
+ revision: workspacesRevision(null)
15064
+ };
15046
15065
  return {
15047
15066
  status: "malformed",
15048
15067
  path: file,
@@ -15062,7 +15081,10 @@ var readWorkspacesResult = (dir = configDir()) => {
15062
15081
  error: `${file} is not valid JSON`
15063
15082
  };
15064
15083
  }
15065
- return { ...validateWorkspacesDocument(parsed, file), revision: workspacesRevision(raw) };
15084
+ return {
15085
+ ...validateWorkspacesDocument(parsed, file),
15086
+ revision: workspacesRevision(raw)
15087
+ };
15066
15088
  };
15067
15089
  var globToRegExp = (glob) => {
15068
15090
  let out = "";
@@ -15273,7 +15295,10 @@ var matchRuntimeWorkspace = (cwd, dir = configDir()) => {
15273
15295
  };
15274
15296
  var resolveRuntimeReleaseTracks = (cwd) => {
15275
15297
  const matched = matchRuntimeWorkspace(cwd);
15276
- return matched ? { workspace: matched.selected.name, releaseTracks: matched.selected.releaseTracks } : null;
15298
+ return matched ? {
15299
+ workspace: matched.selected.name,
15300
+ releaseTracks: matched.selected.releaseTracks
15301
+ } : null;
15277
15302
  };
15278
15303
  var modelSources = (cwd, dir) => {
15279
15304
  const out = [];
@@ -20644,7 +20669,12 @@ function readLedger(cwd, options = {}) {
20644
20669
  });
20645
20670
  return {
20646
20671
  ok: true,
20647
- value: { path: file.value, rows, skipped, integrity: options.integrity ? integrity : null }
20672
+ value: {
20673
+ path: file.value,
20674
+ rows,
20675
+ skipped,
20676
+ integrity: options.integrity ? integrity : null
20677
+ }
20648
20678
  };
20649
20679
  }
20650
20680
  var TAMPER_REASONS = new Set(["hash_mismatch", "broken_link"]);
@@ -20737,7 +20767,10 @@ var renameAwareBranch = (scopeOf, branch) => {
20737
20767
  return scopeOf(own)({ branch: theirs, at: target.at });
20738
20768
  };
20739
20769
  };
20740
- function authorSessions(cwd, rows, branch, range = { base: null, head: null }, scope = branchScope(cwd, branch)) {
20770
+ function authorSessions(cwd, rows, branch, range = {
20771
+ base: null,
20772
+ head: null
20773
+ }, scope = branchScope(cwd, branch)) {
20741
20774
  const sessions = new Set;
20742
20775
  for (const row of rows) {
20743
20776
  if (!scope(row) || row.type !== "commit.recorded" && row.type !== "task.opened")
@@ -20848,12 +20881,13 @@ function restackCarries(exactIn, rows, branch, from, to) {
20848
20881
  const cwd = exactIn;
20849
20882
  let known = restackExact.get(row);
20850
20883
  if (known === undefined) {
20851
- known = typeof row.fromBase === "string" && typeof row.toBase === "string" && sameOwnChange(cwd, {
20884
+ const range = typeof row.fromBase === "string" && typeof row.toBase === "string" ? {
20852
20885
  from: fromHead,
20853
20886
  to: head,
20854
20887
  fromBase: row.fromBase,
20855
20888
  toBase: row.toBase
20856
- });
20889
+ } : null;
20890
+ known = range !== null && (sameOwnChange(cwd, range) || cleanRebase(cwd, range));
20857
20891
  restackExact.set(row, known);
20858
20892
  }
20859
20893
  return known;
@@ -20888,7 +20922,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
20888
20922
  const cacheKey = `${base}\x00${at}`;
20889
20923
  let key = keyCache.get(cacheKey);
20890
20924
  if (!key) {
20891
- key = { patchId: patchId(cwd, base, at), diffHash: diffHash(cwd, base, at) };
20925
+ key = {
20926
+ patchId: patchId(cwd, base, at),
20927
+ diffHash: diffHash(cwd, base, at)
20928
+ };
20892
20929
  keyCache.set(cacheKey, key);
20893
20930
  }
20894
20931
  return key;
@@ -20928,7 +20965,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
20928
20965
  };
20929
20966
  const exactCarry = (row) => FAILING.has(String(row.result)) || exactMatch(row) !== null;
20930
20967
  const keyBasis = (row) => {
20931
- const basis = verdictBasis(row, { head, ...keyFor(row.base ?? fallbackBase) });
20968
+ const basis = verdictBasis(row, {
20969
+ head,
20970
+ ...keyFor(row.base ?? fallbackBase)
20971
+ });
20932
20972
  return basis === "carried" && !exactCarry(row) ? "stale" : basis;
20933
20973
  };
20934
20974
  const rebaseNote = (row) => row.head && head && row.head !== head && !FAILING.has(String(row.result)) && keyBasis(row) === "carried" && exactMatch(row) === "rebase" ? { rule: "rebase", since: row.head, files: [] } : null;
@@ -21033,7 +21073,11 @@ function checkVerdicts(cwd, branch, ledgerRows) {
21033
21073
  const newestCurrent = verdicts.findLast((entry) => entry.current) ?? verdicts.at(-1) ?? null;
21034
21074
  const failing = verdicts.find((entry) => entry.current && entry.independent && FAILING.has(String(entry.verdict.result)));
21035
21075
  const newestAccepted = verdicts.findLast((entry) => entry.accepted && STRONG_RESULTS.has(String(entry.verdict.result))) ?? null;
21036
- const accepted = tampered.length ? { accepted: false, verdict: null, reasons: ["ledger_tampered"] } : newestAccepted && !failing ? { accepted: true, verdict: newestAccepted.verdict, reasons: [] } : {
21076
+ const accepted = tampered.length ? {
21077
+ accepted: false,
21078
+ verdict: null,
21079
+ reasons: ["ledger_tampered"]
21080
+ } : newestAccepted && !failing ? { accepted: true, verdict: newestAccepted.verdict, reasons: [] } : {
21037
21081
  accepted: false,
21038
21082
  verdict: failing?.verdict ?? null,
21039
21083
  reasons: failing ? ["failing_verdict"] : !newestCurrent ? ["no_verdict"] : newestCurrent.reasons.length ? newestCurrent.reasons : ["type_check_only"]
@@ -21051,7 +21095,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
21051
21095
  selfVerdict: accepted.accepted ? null : selfEntry?.verdict ?? null,
21052
21096
  base: newestCurrent?.verdict.base ?? fallbackBase,
21053
21097
  patchId: keyFor(newestCurrent?.verdict.base ?? fallbackBase).patchId,
21054
- current: { basis: newestCurrent?.basis ?? "none", verdict: newestCurrent?.verdict ?? null },
21098
+ current: {
21099
+ basis: newestCurrent?.basis ?? "none",
21100
+ verdict: newestCurrent?.verdict ?? null
21101
+ },
21055
21102
  carry: carryEntry?.carry ?? null,
21056
21103
  reverify,
21057
21104
  accepted,
@@ -6261,7 +6261,11 @@ var releaseTrackSchema = object({
6261
6261
  ["requiredChecks", track.requiredChecks ?? []]
6262
6262
  ]) {
6263
6263
  if (new Set(values).size !== values.length) {
6264
- context.addIssue({ code: "custom", path: [field], message: "entries must be unique" });
6264
+ context.addIssue({
6265
+ code: "custom",
6266
+ path: [field],
6267
+ message: "entries must be unique"
6268
+ });
6265
6269
  }
6266
6270
  }
6267
6271
  if (track.versionSource?.kind === "package-json" && (path2.posix.isAbsolute(track.versionSource.path.replaceAll("\\", "/")) || /^[A-Za-z]:\//u.test(track.versionSource.path.replaceAll("\\", "/")) || track.versionSource.path.replaceAll("\\", "/").split("/").includes(".."))) {
@@ -6294,7 +6298,10 @@ var workspaceConfigSchema = object({
6294
6298
  kind,
6295
6299
  union([boolean2(), literal("verified")]).optional()
6296
6300
  ]))).passthrough().optional(),
6297
- youtrack: object({ baseUrl: nonBlank.optional(), link_issues: boolean2().optional() }).passthrough().optional(),
6301
+ youtrack: object({
6302
+ baseUrl: nonBlank.optional(),
6303
+ link_issues: boolean2().optional()
6304
+ }).passthrough().optional(),
6298
6305
  issues: object({
6299
6306
  provider: _enum(["github", "gitlab", "youtrack"]).optional(),
6300
6307
  link: boolean2().optional(),
@@ -6335,9 +6342,16 @@ var workspacesFileSchema = object({
6335
6342
  var workspacesRevision = (contents) => createHash("sha256").update(contents ?? "<missing>").digest("hex");
6336
6343
  var validateWorkspacesDocument = (parsed, file) => {
6337
6344
  if (!isConfigObject(parsed)) {
6338
- return { status: "malformed", path: file, entries: [], error: `${file} is not a JSON object` };
6345
+ return {
6346
+ status: "malformed",
6347
+ path: file,
6348
+ entries: [],
6349
+ error: `${file} is not a JSON object`
6350
+ };
6339
6351
  }
6340
- const validated = workspacesFileSchema.safeParse(parsed, { reportInput: true });
6352
+ const validated = workspacesFileSchema.safeParse(parsed, {
6353
+ reportInput: true
6354
+ });
6341
6355
  if (!validated.success) {
6342
6356
  const detail = validated.error.issues.map((issue) => {
6343
6357
  const field = String(issue.path[issue.path.length - 1] ?? "");
@@ -6377,7 +6391,12 @@ var readWorkspacesResult = (dir = configDir()) => {
6377
6391
  raw = readFileSync2(file, "utf8");
6378
6392
  } catch (error) {
6379
6393
  if (error.code === "ENOENT")
6380
- return { status: "missing", path: file, entries: [], revision: workspacesRevision(null) };
6394
+ return {
6395
+ status: "missing",
6396
+ path: file,
6397
+ entries: [],
6398
+ revision: workspacesRevision(null)
6399
+ };
6381
6400
  return {
6382
6401
  status: "malformed",
6383
6402
  path: file,
@@ -6397,7 +6416,10 @@ var readWorkspacesResult = (dir = configDir()) => {
6397
6416
  error: `${file} is not valid JSON`
6398
6417
  };
6399
6418
  }
6400
- return { ...validateWorkspacesDocument(parsed, file), revision: workspacesRevision(raw) };
6419
+ return {
6420
+ ...validateWorkspacesDocument(parsed, file),
6421
+ revision: workspacesRevision(raw)
6422
+ };
6401
6423
  };
6402
6424
  var globToRegExp = (glob) => {
6403
6425
  let out = "";
@@ -6608,7 +6630,10 @@ var matchRuntimeWorkspace = (cwd, dir = configDir()) => {
6608
6630
  };
6609
6631
  var resolveRuntimeReleaseTracks = (cwd) => {
6610
6632
  const matched = matchRuntimeWorkspace(cwd);
6611
- return matched ? { workspace: matched.selected.name, releaseTracks: matched.selected.releaseTracks } : null;
6633
+ return matched ? {
6634
+ workspace: matched.selected.name,
6635
+ releaseTracks: matched.selected.releaseTracks
6636
+ } : null;
6612
6637
  };
6613
6638
  var inheritedSetting = (cwd, dir, has) => {
6614
6639
  let matched;
@@ -6621,7 +6646,10 @@ var inheritedSetting = (cwd, dir, has) => {
6621
6646
  return null;
6622
6647
  const { selected, matches } = matched;
6623
6648
  const enclosing = matches.filter((entry) => entry !== selected).toSorted((a, b) => globSpecificity(b.glob) - globSpecificity(a.glob));
6624
- return { workspace: selected.name, source: [selected, ...enclosing].find(has) ?? null };
6649
+ return {
6650
+ workspace: selected.name,
6651
+ source: [selected, ...enclosing].find(has) ?? null
6652
+ };
6625
6653
  };
6626
6654
  var workspaceTrailers = (cwd, dir) => {
6627
6655
  const found = inheritedSetting(cwd, dir, (entry) => typeof entry.trailers === "boolean");
@@ -13458,7 +13486,12 @@ function readLedger(cwd, options = {}) {
13458
13486
  });
13459
13487
  return {
13460
13488
  ok: true,
13461
- value: { path: file.value, rows, skipped, integrity: options.integrity ? integrity : null }
13489
+ value: {
13490
+ path: file.value,
13491
+ rows,
13492
+ skipped,
13493
+ integrity: options.integrity ? integrity : null
13494
+ }
13462
13495
  };
13463
13496
  }
13464
13497
  var TAMPER_REASONS = new Set(["hash_mismatch", "broken_link"]);
@@ -13551,7 +13584,10 @@ var renameAwareBranch = (scopeOf, branch) => {
13551
13584
  return scopeOf(own)({ branch: theirs, at: target.at });
13552
13585
  };
13553
13586
  };
13554
- function authorSessions(cwd, rows, branch, range = { base: null, head: null }, scope = branchScope(cwd, branch)) {
13587
+ function authorSessions(cwd, rows, branch, range = {
13588
+ base: null,
13589
+ head: null
13590
+ }, scope = branchScope(cwd, branch)) {
13555
13591
  const sessions = new Set;
13556
13592
  for (const row of rows) {
13557
13593
  if (!scope(row) || row.type !== "commit.recorded" && row.type !== "task.opened")
@@ -13662,12 +13698,13 @@ function restackCarries(exactIn, rows, branch, from, to) {
13662
13698
  const cwd = exactIn;
13663
13699
  let known = restackExact.get(row);
13664
13700
  if (known === undefined) {
13665
- known = typeof row.fromBase === "string" && typeof row.toBase === "string" && sameOwnChange(cwd, {
13701
+ const range = typeof row.fromBase === "string" && typeof row.toBase === "string" ? {
13666
13702
  from: fromHead,
13667
13703
  to: head,
13668
13704
  fromBase: row.fromBase,
13669
13705
  toBase: row.toBase
13670
- });
13706
+ } : null;
13707
+ known = range !== null && (sameOwnChange(cwd, range) || cleanRebase(cwd, range));
13671
13708
  restackExact.set(row, known);
13672
13709
  }
13673
13710
  return known;
@@ -13702,7 +13739,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
13702
13739
  const cacheKey = `${base}\x00${at}`;
13703
13740
  let key = keyCache.get(cacheKey);
13704
13741
  if (!key) {
13705
- key = { patchId: patchId(cwd, base, at), diffHash: diffHash(cwd, base, at) };
13742
+ key = {
13743
+ patchId: patchId(cwd, base, at),
13744
+ diffHash: diffHash(cwd, base, at)
13745
+ };
13706
13746
  keyCache.set(cacheKey, key);
13707
13747
  }
13708
13748
  return key;
@@ -13742,7 +13782,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
13742
13782
  };
13743
13783
  const exactCarry = (row) => FAILING.has(String(row.result)) || exactMatch(row) !== null;
13744
13784
  const keyBasis = (row) => {
13745
- const basis = verdictBasis(row, { head, ...keyFor(row.base ?? fallbackBase) });
13785
+ const basis = verdictBasis(row, {
13786
+ head,
13787
+ ...keyFor(row.base ?? fallbackBase)
13788
+ });
13746
13789
  return basis === "carried" && !exactCarry(row) ? "stale" : basis;
13747
13790
  };
13748
13791
  const rebaseNote = (row) => row.head && head && row.head !== head && !FAILING.has(String(row.result)) && keyBasis(row) === "carried" && exactMatch(row) === "rebase" ? { rule: "rebase", since: row.head, files: [] } : null;
@@ -13847,7 +13890,11 @@ function checkVerdicts(cwd, branch, ledgerRows) {
13847
13890
  const newestCurrent = verdicts.findLast((entry) => entry.current) ?? verdicts.at(-1) ?? null;
13848
13891
  const failing = verdicts.find((entry) => entry.current && entry.independent && FAILING.has(String(entry.verdict.result)));
13849
13892
  const newestAccepted = verdicts.findLast((entry) => entry.accepted && STRONG_RESULTS.has(String(entry.verdict.result))) ?? null;
13850
- const accepted = tampered.length ? { accepted: false, verdict: null, reasons: ["ledger_tampered"] } : newestAccepted && !failing ? { accepted: true, verdict: newestAccepted.verdict, reasons: [] } : {
13893
+ const accepted = tampered.length ? {
13894
+ accepted: false,
13895
+ verdict: null,
13896
+ reasons: ["ledger_tampered"]
13897
+ } : newestAccepted && !failing ? { accepted: true, verdict: newestAccepted.verdict, reasons: [] } : {
13851
13898
  accepted: false,
13852
13899
  verdict: failing?.verdict ?? null,
13853
13900
  reasons: failing ? ["failing_verdict"] : !newestCurrent ? ["no_verdict"] : newestCurrent.reasons.length ? newestCurrent.reasons : ["type_check_only"]
@@ -13865,7 +13912,10 @@ function checkVerdicts(cwd, branch, ledgerRows) {
13865
13912
  selfVerdict: accepted.accepted ? null : selfEntry?.verdict ?? null,
13866
13913
  base: newestCurrent?.verdict.base ?? fallbackBase,
13867
13914
  patchId: keyFor(newestCurrent?.verdict.base ?? fallbackBase).patchId,
13868
- current: { basis: newestCurrent?.basis ?? "none", verdict: newestCurrent?.verdict ?? null },
13915
+ current: {
13916
+ basis: newestCurrent?.basis ?? "none",
13917
+ verdict: newestCurrent?.verdict ?? null
13918
+ },
13869
13919
  carry: carryEntry?.carry ?? null,
13870
13920
  reverify,
13871
13921
  accepted,
@@ -17439,7 +17489,10 @@ function entryCompactContext(store, entry, session, context) {
17439
17489
  const task = entry ? store.readTask(entry.id) : null;
17440
17490
  if (task && !task.ok)
17441
17491
  return null;
17442
- const freshness = { mode: "signal", current: () => recentSignal(store.root) };
17492
+ const freshness = {
17493
+ mode: "signal",
17494
+ current: () => recentSignal(store.root)
17495
+ };
17443
17496
  const observed = task?.data.evidence.some(isObservedCheck) ?? false;
17444
17497
  const files = (task?.data.decisions ?? []).flatMap((decision) => decision.data.binding.contentRefs.flatMap((ref) => ref.kind === "file" ? [path18.resolve(store.root, ref.path)] : []));
17445
17498
  const observedFiles = filesKey(files);
@@ -17505,7 +17558,10 @@ var checkoutAt = (cwd) => {
17505
17558
  if (fs13.existsSync(dotGit)) {
17506
17559
  const admin = fs13.statSync(dotGit).isFile() ? path18.resolve(dir, /^gitdir:\s*(.+)$/mu.exec(fs13.readFileSync(dotGit, "utf8"))?.[1]?.trim() ?? "") : dotGit;
17507
17560
  const head = fs13.readFileSync(path18.join(admin, "HEAD"), "utf8").trim();
17508
- return { root: dir, branch: /^ref: refs\/heads\/(.+)$/u.exec(head)?.[1] ?? null };
17561
+ return {
17562
+ root: dir,
17563
+ branch: /^ref: refs\/heads\/(.+)$/u.exec(head)?.[1] ?? null
17564
+ };
17509
17565
  }
17510
17566
  if (path18.dirname(dir) === dir)
17511
17567
  return null;
@@ -82,6 +82,6 @@ if (quiet) {
82
82
  process.stdout.write(`${JSON.stringify({ hookSpecificOutput: { hookEventName: quiet } })}
83
83
  `);
84
84
  } else {
85
- const { runCodexHook } = await import("./workit-hook-h4ryf1zq.js");
85
+ const { runCodexHook } = await import("./workit-hook-7dqgrrwd.js");
86
86
  await runCodexHook([payload]);
87
87
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-codex",
3
- "version": "8.35.0",
3
+ "version": "8.36.0",
4
4
  "private": false,
5
5
  "description": "Workit Codex CLI/desktop plugin — shared MCP transport, hooks, method skills, and verifier/reviewer/implementer agents",
6
6
  "keywords": [
@@ -39,8 +39,8 @@
39
39
  "build": "bun scripts/build.ts"
40
40
  },
41
41
  "devDependencies": {
42
- "@brainervirus/workit-core": "^8.35.0",
43
- "@brainervirus/workit-mcp": "^8.35.0"
42
+ "@brainervirus/workit-core": "^8.36.0",
43
+ "@brainervirus/workit-mcp": "^8.36.0"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=24"
@@ -23,7 +23,7 @@ description: Build a requested change in small verified steps - follow local pat
23
23
  (`workit check test`, plus `lint` and `typecheck` when the repo has them),
24
24
  not after every edit. Heavy work runs under one machine-wide lease: an ad-hoc
25
25
  suite is `workit check --heavy -- <cmd>`, never a hand-made flock; a busy
26
- lease waits and names its holder (`workit lock status`).
26
+ lease waits and names its holder (`workit lock status`). A tool warning is a finding: fix it in this PR in the right layer, or record the false positive with evidence; pre-existing ones get their own PR.
27
27
  5. Prove the feature on its real surface with the project's `verify-<app>`
28
28
  skill; none yet? Write one (read the `workit-verify-app` skill's SKILL.md and follow it). Tests show branch behavior,
29
29
  not that the feature works. The report carries what you observed: a UI
@@ -49,7 +49,7 @@ the same check. Fix round and recheck both failed: a decider (read the `workit-f
49
49
  5. **CI.** Local gates mirror CI: push and continue; `workit ci wait` once on
50
50
  the final head, in the background where the host allows. Red: read `logTail`, classify. Flake or infra: one
51
51
  `workit ci rerun --failed --reason flake|infra` per head. Real: reproduce
52
- with `workit check`, fix the root cause, batch every fix in one push.
52
+ with `workit check`, fix the root cause, batch every fix in one push. A tool warning is a finding: fix it in this PR in the right layer, or record the false positive with evidence; pre-existing ones get their own PR.
53
53
  6. **Verified.** The lane in `workit pr status` decides: none, no verdict; self, your `--self` verdict; focused or full (or `verification: self|independent`), one non-author verifier per PR after the last push, never per push (read the `workit-review` skill's SKILL.md and follow it), on Claude Code with the `model` and `effort` of `workit models show --role verifier`. A docs-only push (or test-only under a unit verdict) keeps the verdict (`carried`); `reverify: focused` re-checks only the new diff, reusing green CI; one verdict at a stack's top covers its unchanged lower PRs. Land only when
54
54
  granted: `workit stack land` or `workit pr merge`; `--unverified --reason` if user-asked.
55
55
  7. **Observe it landed:** `workit verify-delivery pr` or `merge`. After a failed