@codedrifters/configulator 0.0.259 → 0.0.261

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/lib/index.js CHANGED
@@ -4543,7 +4543,7 @@ var jestBundle = {
4543
4543
  // src/agent/bundles/maintenance-audit.ts
4544
4544
  var maintenanceAuditSubAgent = {
4545
4545
  name: "maintenance-audit",
4546
- description: "Audits documentation registries and cross-references for integrity (broken links, registry drift, stale indexes) and applies idempotent fixes. One phase per session, tracked by maint:* GitHub issue labels with filesystem-based durability between phases.",
4546
+ description: "Audits documentation registries and cross-references for integrity (broken links, registry drift, stale indexes), applies idempotent fixes, then re-runs the checks to confirm the fixes cleared the reported findings. One phase per session, tracked by maint:* GitHub issue labels with filesystem-based durability between phases.",
4547
4547
  model: AGENT_MODEL.POWERFUL,
4548
4548
  maxTurns: 80,
4549
4549
  platforms: { cursor: { exclude: true } },
@@ -4601,18 +4601,18 @@ var maintenanceAuditSubAgent = {
4601
4601
  "",
4602
4602
  "## State Machine Overview",
4603
4603
  "",
4604
- "Maintenance audits flow through **2 phases**:",
4604
+ "Maintenance audits flow through **3 phases**:",
4605
4605
  "",
4606
4606
  "```",
4607
- "\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
4608
- "\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. FIX \u2502",
4609
- "\u2502 Walk doc \u2502 \u2502 Read audit \u2502",
4610
- "\u2502 tree, check \u2502 \u2502 report, \u2502",
4611
- "\u2502 xrefs and \u2502 \u2502 apply safe \u2502",
4612
- "\u2502 indexes, \u2502 \u2502 idempotent \u2502",
4613
- "\u2502 write audit \u2502 \u2502 fixes, then \u2502",
4614
- "\u2502 report \u2502 \u2502 verify \u2502",
4615
- "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
4607
+ "\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
4608
+ "\u2502 1. SCAN \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. FIX \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 3. VERIFY \u2502",
4609
+ "\u2502 Walk doc \u2502 \u2502 Read audit \u2502 \u2502 Re-run the \u2502",
4610
+ "\u2502 tree, check \u2502 \u2502 report, \u2502 \u2502 scan checks \u2502",
4611
+ "\u2502 xrefs and \u2502 \u2502 apply safe \u2502 \u2502 scoped to \u2502",
4612
+ "\u2502 indexes, \u2502 \u2502 idempotent \u2502 \u2502 fixed paths,\u2502",
4613
+ "\u2502 write audit \u2502 \u2502 fixes, write\u2502 \u2502 compare pre \u2502",
4614
+ "\u2502 report \u2502 \u2502 fix report \u2502 \u2502 and post \u2502",
4615
+ "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
4616
4616
  "```",
4617
4617
  "",
4618
4618
  "**Issue labels encode the phase:**",
@@ -4620,18 +4620,22 @@ var maintenanceAuditSubAgent = {
4620
4620
  "| Label | Phase | Session work |",
4621
4621
  "|-------|-------|-------------|",
4622
4622
  "| `maint:scan` | 1. Scan | Walk the configured doc tree, check cross-references and registry indexes, write a durable audit report. |",
4623
- "| `maint:fix` | 2. Fix | Read the audit report, apply idempotent fixes, then verify the fixes cleared the reported findings. |",
4623
+ "| `maint:fix` | 2. Fix | Read the audit report, apply idempotent fixes, write a durable fix report. |",
4624
+ "| `maint:verify` | 3. Verify | Re-run the same checks from the parent `maint:scan` issue scoped to the paths and registries the fix phase touched, compare pre and post findings, close the parent scan issue when clean, and file a follow-up `maint:scan` for any residual findings. |",
4624
4625
  "",
4625
4626
  "All issues also carry `type:maintenance` and a `status:*` label.",
4626
4627
  "",
4627
- "**Issue count per audit cycle:** 1 scan + 1 fix = **2 sessions**.",
4628
+ "**Issue count per audit cycle:** 1 scan + 1 fix + 1 verify = **3 sessions**.",
4628
4629
  "",
4629
4630
  "**Shortened paths:**",
4630
4631
  "- Scan finds no issues \u2192 close scan issue with a justification,",
4631
- " do not create a fix issue \u2192 **1 session**.",
4632
+ " do not create a fix or verify issue \u2192 **1 session**.",
4632
4633
  "- Every reported finding requires a human judgment call \u2192 close",
4633
4634
  " scan with the report, open a `status:needs-attention` flag,",
4634
- " do not auto-create a fix issue \u2192 **1 session**.",
4635
+ " do not auto-create a fix or verify issue \u2192 **1 session**.",
4636
+ "- Fix phase applied only `flag-for-human` decisions (no auto-",
4637
+ " fixable findings landed) \u2192 close the fix issue with the",
4638
+ " skipped list and do not create a verify issue \u2192 **2 sessions**.",
4635
4639
  "",
4636
4640
  "---",
4637
4641
  "",
@@ -4661,7 +4665,9 @@ var maintenanceAuditSubAgent = {
4661
4665
  "Run this loop exactly once per session. Never start a second issue.",
4662
4666
  "",
4663
4667
  "1. Claim one open `type:maintenance` issue using phase priority:",
4664
- " `maint:scan` > `maint:fix`.",
4668
+ " `maint:verify` > `maint:fix` > `maint:scan`. Verify ahead of fix",
4669
+ " and scan so the oldest in-flight audit cycle finishes closing",
4670
+ " the loop before a new cycle starts.",
4665
4671
  "2. Transition `status:ready` \u2192 `status:in-progress` and create the",
4666
4672
  " branch per your project's branch-naming convention.",
4667
4673
  "3. Execute the phase handler that matches the issue's `maint:*`",
@@ -4773,24 +4779,30 @@ var maintenanceAuditSubAgent = {
4773
4779
  " - **All findings need human judgment** \u2192 commit the report,",
4774
4780
  " comment on the scan issue summarizing the findings, apply",
4775
4781
  " `status:needs-attention`, and close the issue. Do not create",
4776
- " a `maint:fix` issue.",
4782
+ " a `maint:fix` or `maint:verify` issue.",
4777
4783
  " - **At least one auto-fixable finding** \u2192 create a `maint:fix`",
4778
4784
  " issue (blocked on this scan issue via `Depends on: #N`). The",
4779
- " fix issue body must reference the audit report path and",
4780
- " enumerate the auto-fix categories to apply.",
4785
+ " fix issue body must reference the audit report path, enumerate",
4786
+ " the auto-fix categories to apply, and record the parent scan",
4787
+ " issue number so Phase 3 (Verify) can close the loop.",
4781
4788
  "",
4782
- "6. **Commit and push.**",
4789
+ "6. **Commit and push.** Leave the scan issue open so the downstream",
4790
+ " `maint:verify` phase can close it (or file a follow-up scan)",
4791
+ " after Phase 2 runs.",
4783
4792
  "",
4784
4793
  "---",
4785
4794
  "",
4786
4795
  "## Phase 2: Fix (`maint:fix`)",
4787
4796
  "",
4788
- "**Goal:** Read the audit report, apply idempotent fixes, verify",
4789
- "they cleared the reported findings, and commit the doc-tree changes.",
4797
+ "**Goal:** Read the audit report, apply idempotent fixes, write a",
4798
+ "fix report, and enqueue the verify phase so the audit cycle",
4799
+ "actually closes its loop.",
4790
4800
  "",
4791
- "**Budget:** Bounded edits to files under `<DOCS_ROOT>` plus a final",
4792
- "verification re-run of the checks from Phase 1. No new audit",
4793
- "categories. No fixes that require authoring new content.",
4801
+ "**Budget:** Bounded edits to files under `<DOCS_ROOT>` and one fix",
4802
+ "report file. No new audit categories. No fixes that require",
4803
+ "authoring new content. The formal re-scan lives in Phase 3 \u2014",
4804
+ "Phase 2 confirms only that it did not regress the files it touched",
4805
+ "(a smoke check, not the full pre/post comparison).",
4794
4806
  "",
4795
4807
  "### Fix Categories",
4796
4808
  "",
@@ -4824,11 +4836,13 @@ var maintenanceAuditSubAgent = {
4824
4836
  " mark it `flag-for-human` and skip. Authoring new docs belongs",
4825
4837
  " to the writer agent for that doc type, not this agent.",
4826
4838
  "",
4827
- "5. **Verify.** Re-run the same checks the scan phase ran, scoped",
4828
- " to the files the fix phase touched (plus any index files those",
4829
- " edits affect). Every finding the fix phase claimed to resolve",
4830
- " must now be gone. Any finding that remains is a regression \u2014",
4831
- " revert the corresponding edit and mark it `flag-for-human`.",
4839
+ "5. **Smoke check the touched files.** Before writing the fix",
4840
+ " report, spot-check that the specific findings the fix phase",
4841
+ " claimed to resolve are at least no longer present in the edited",
4842
+ " file(s). This is a narrow local check \u2014 not the full re-scan,",
4843
+ " which is Phase 3's job. If a finding the fix phase targeted",
4844
+ " still reproduces in the edited file, revert that edit and mark",
4845
+ " the finding `flag-for-human` in the fix report instead.",
4832
4846
  "",
4833
4847
  "6. **Write the fix report** to:",
4834
4848
  " ```",
@@ -4859,18 +4873,141 @@ var maintenanceAuditSubAgent = {
4859
4873
  "",
4860
4874
  " ## Skipped",
4861
4875
  " <findings that were stale, flagged for human, or reverted",
4862
- " during verification \u2014 one entry each, with the reason>",
4876
+ " during the smoke check \u2014 one entry each, with the reason>",
4863
4877
  "",
4864
- " ## Verification",
4865
- " - **Re-scan result:** clean / <N> residual findings",
4866
- " - **Residual findings:** <list, with reasons \u2014 each becomes a",
4867
- " follow-up `flag-for-human` note>",
4878
+ " ## Paths Touched",
4879
+ " <ordered list of files edited, plus any index files those edits",
4880
+ " affect. This is the Phase 3 re-scan scope \u2014 the verify phase",
4881
+ " reads this section to decide which paths to re-check.>",
4868
4882
  " ```",
4869
4883
  "",
4870
4884
  "7. **Comment on the scan issue** with a summary of what was fixed,",
4871
- " what was skipped, and any residual findings.",
4885
+ " what was skipped, and that Phase 3 (Verify) will close the loop.",
4886
+ "",
4887
+ "8. **Create the `maint:verify` issue.** Block it on this fix issue",
4888
+ " via `Depends on: #N` so it only runs after the fix PR lands.",
4889
+ " The verify issue body must reference:",
4890
+ " - The parent `maint:scan` issue number",
4891
+ " - The Phase 1 audit report path",
4892
+ " - The Phase 2 fix report path",
4893
+ " - The `Paths Touched` list (so Phase 3 scopes the re-scan",
4894
+ " correctly)",
4895
+ " - The same check catalog the scan phase used",
4896
+ "",
4897
+ " If the fix phase applied **zero** auto-fixes (every finding was",
4898
+ " `stale-finding` or `flag-for-human`), skip the verify issue \u2014",
4899
+ " there is nothing to verify. Close the fix issue with a summary,",
4900
+ " comment on the scan issue, and let a human decide whether to",
4901
+ " re-scan.",
4902
+ "",
4903
+ "9. **Commit and push.**",
4872
4904
  "",
4873
- "8. **Commit and push.**",
4905
+ "---",
4906
+ "",
4907
+ "## Phase 3: Verify (`maint:verify`)",
4908
+ "",
4909
+ "**Goal:** Close the loop on the audit cycle. Re-run the same checks",
4910
+ "the scan phase ran, scoped to the paths and registries the fix",
4911
+ "phase actually touched, compare pre and post findings, and record",
4912
+ "the result in a durable verify report.",
4913
+ "",
4914
+ "**Budget:** Filesystem reads + registry parsing, just like Phase 1,",
4915
+ "but bounded to the paths enumerated in the fix report's",
4916
+ "`Paths Touched` section (plus any index files those paths transit).",
4917
+ "No edits to source docs in this phase \u2014 if the re-scan surfaces a",
4918
+ "regression, record it and file a follow-up `maint:scan` issue,",
4919
+ "but do not attempt to re-fix in-session.",
4920
+ "",
4921
+ "### Steps",
4922
+ "",
4923
+ "1. **Read the verify scope** from the issue body. Confirm the parent",
4924
+ " scan issue number, the audit report path, the fix report path,",
4925
+ " and the `Paths Touched` list. If any of these are missing or",
4926
+ " the files they reference do not exist, close the verify issue",
4927
+ " with `status:needs-attention` and stop.",
4928
+ "",
4929
+ "2. **Re-run the same checks the scan phase ran**, scoped to the",
4930
+ " paths the fix phase touched plus any index or registry files",
4931
+ " those paths transit. Use the identical check catalog that the",
4932
+ " parent scan issue declared \u2014 do not add or remove checks",
4933
+ " between scan and verify.",
4934
+ "",
4935
+ "3. **Compare pre and post findings.** For each finding in the Phase 1",
4936
+ " audit report that fell within the re-scan scope, classify it as:",
4937
+ " - **resolved** \u2014 absent from the re-scan; the fix worked.",
4938
+ " - **still-failing** \u2014 still present in the re-scan; the fix did",
4939
+ " not clear it.",
4940
+ " - **regressed** \u2014 was not in the Phase 1 audit report but appears",
4941
+ " now; the fix introduced it.",
4942
+ " - **out-of-scope** \u2014 was in the Phase 1 audit report but its",
4943
+ " path was not in the fix phase's `Paths Touched` list, so this",
4944
+ " verify pass cannot speak to it.",
4945
+ "",
4946
+ "4. **Write the verify report** to:",
4947
+ " ```",
4948
+ " <AUDIT_ROOT>/maint-verify-<AUDIT_SLUG>-<YYYY-MM-DD>.md",
4949
+ " ```",
4950
+ "",
4951
+ " Format:",
4952
+ " ```markdown",
4953
+ " ---",
4954
+ ' title: "Maintenance Verify: <AUDIT_SLUG>"',
4955
+ " date: YYYY-MM-DD",
4956
+ " parent_issue: <N>",
4957
+ " scan_issue: <N>",
4958
+ " fix_issue: <N>",
4959
+ " audit_report: <path to Phase 1 scan report>",
4960
+ " fix_report: <path to Phase 2 fix report>",
4961
+ " status: complete",
4962
+ " ---",
4963
+ "",
4964
+ " # Maintenance Verify: <AUDIT_SLUG>",
4965
+ "",
4966
+ " ## Source Reports",
4967
+ " - Scan report: <link>",
4968
+ " - Fix report: <link>",
4969
+ "",
4970
+ " ## Re-scan Scope",
4971
+ " - **Paths re-checked:** <list \u2014 from the fix report's",
4972
+ " `Paths Touched` section>",
4973
+ " - **Checks re-run:** <same catalog the scan phase used>",
4974
+ "",
4975
+ " ## Pre/Post Comparison",
4976
+ " | Status | Count | Findings |",
4977
+ " |--------|-------|----------|",
4978
+ " | resolved | N | <one line per finding: category + file:line> |",
4979
+ " | still-failing | N | <one line per finding> |",
4980
+ " | regressed | N | <one line per finding> |",
4981
+ " | out-of-scope | N | <one line per finding> |",
4982
+ "",
4983
+ " ## Verdict",
4984
+ " - **clean** \u2014 every in-scope finding resolved and no regressions;",
4985
+ " the parent scan issue will be closed.",
4986
+ " - **residual** \u2014 one or more still-failing or regressed findings;",
4987
+ " a follow-up `maint:scan` issue is filed and the parent scan",
4988
+ " issue is closed with a reference to the follow-up.",
4989
+ " ```",
4990
+ "",
4991
+ "5. **Decide the next step:**",
4992
+ " - **Clean verdict** (every in-scope finding resolved, no",
4993
+ " regressions, no still-failing entries) \u2192 comment on the parent",
4994
+ " `maint:scan` issue summarizing the result and **close it**.",
4995
+ " Do not file a follow-up scan.",
4996
+ " - **Residual verdict** (one or more `still-failing` or",
4997
+ " `regressed` entries) \u2192 file a new `maint:scan` issue for the",
4998
+ " residual scope, blocked on nothing (it is ready to run on its",
4999
+ " own schedule), and link the verify report from its body. Then",
5000
+ " comment on the parent scan issue with the residual summary and",
5001
+ " **close it**.",
5002
+ " - **Out-of-scope-only verdict** (every finding fell outside the",
5003
+ " fix phase's `Paths Touched`) \u2192 comment on the parent scan",
5004
+ " issue explaining that the fix phase did not cover those paths",
5005
+ " and leave it open with `status:needs-attention` so a human can",
5006
+ " re-scope the cycle. Do not auto-close the parent scan issue",
5007
+ " in this case.",
5008
+ "",
5009
+ "6. **Commit and push.** Close the verify issue with a one-line",
5010
+ " summary of the verdict.",
4874
5011
  "",
4875
5012
  "---",
4876
5013
  "",
@@ -4880,11 +5017,13 @@ var maintenanceAuditSubAgent = {
4880
5017
  "|-----------|-------|------|",
4881
5018
  "| Downstream (last resort) | Writer agent for the audited doc type | When the audit surfaces findings that require authoring new content (missing target, partial coverage that can only be resolved by writing a new doc), the fix phase flags them for human \u2014 the human may then dispatch the appropriate writer agent. This agent never opens writer-agent issues itself. |",
4882
5019
  "",
4883
- "**File boundaries:** Writes audit and fix reports to",
5020
+ "**File boundaries:** Writes audit, fix, and verify reports to",
4884
5021
  "`<AUDIT_ROOT>/`. Applies bounded, idempotent edits under",
4885
- "`<DOCS_ROOT>/` per the fix-policy declared in the fix issue body.",
4886
- "Never writes to source code, never writes to doc trees outside",
4887
- "`<DOCS_ROOT>`, never authors new document files to close a gap.",
5022
+ "`<DOCS_ROOT>/` only in Phase 2 (Fix), per the fix-policy declared",
5023
+ "in the fix issue body. Phase 3 (Verify) never edits doc files \u2014",
5024
+ "it only reads and re-scans. Never writes to source code, never",
5025
+ "writes to doc trees outside `<DOCS_ROOT>`, never authors new",
5026
+ "document files to close a gap.",
4888
5027
  "",
4889
5028
  "---",
4890
5029
  "",
@@ -4896,6 +5035,10 @@ var maintenanceAuditSubAgent = {
4896
5035
  "- All findings are `flag-for-human` and the fix issue has nothing",
4897
5036
  " to auto-apply \u2014 resolve by closing the fix issue with a summary",
4898
5037
  " instead",
5038
+ "- A `maint:verify` issue references a fix report whose",
5039
+ " `Paths Touched` list is empty \u2014 there is nothing to re-scan, so",
5040
+ " close the verify issue with a summary and let a human decide",
5041
+ " whether to re-run the scan",
4899
5042
  "",
4900
5043
  "---",
4901
5044
  "",
@@ -4910,13 +5053,24 @@ var maintenanceAuditSubAgent = {
4910
5053
  " Record out-of-scope observations in the report for human review.",
4911
5054
  "- **No authoring.** Do not invent new document content to close a",
4912
5055
  " finding. That work belongs to the writer agent for the doc type.",
4913
- "- **Verify before closing.** Always re-run the checks after",
4914
- " applying fixes and record the result in the fix report."
5056
+ "- **Verify closes the loop.** Every fix-phase run that lands at",
5057
+ " least one auto-fix must enqueue a `maint:verify` issue. Phase 3",
5058
+ " is the only phase that closes the parent `maint:scan` issue.",
5059
+ " Phase 2 never closes the scan issue itself.",
5060
+ "- **Pre/post comparison is required.** The verify report must",
5061
+ " classify every in-scope finding from the scan report as",
5062
+ " `resolved`, `still-failing`, `regressed`, or `out-of-scope`.",
5063
+ " An unclassified finding means the re-scan was incomplete \u2014 re-",
5064
+ " run the missing checks before writing the verdict.",
5065
+ "- **Residual findings get their own cycle.** When the verify phase",
5066
+ " finds `still-failing` or `regressed` entries, file a follow-up",
5067
+ " `maint:scan` issue rather than attempting to re-fix in-session.",
5068
+ " The new scan starts its own audit cycle with a fresh report."
4915
5069
  ].join("\n")
4916
5070
  };
4917
5071
  var maintenanceAuditSkill = {
4918
5072
  name: "audit-docs",
4919
- description: "Kick off a documentation-maintenance audit cycle (scan \u2192 fix). Creates a maint:scan issue for the supplied scope and dispatches Phase 1.",
5073
+ description: "Kick off a documentation-maintenance audit cycle (scan \u2192 fix \u2192 verify). Creates a maint:scan issue for the supplied scope and dispatches Phase 1.",
4920
5074
  disableModelInvocation: true,
4921
5075
  userInvocable: true,
4922
5076
  context: "fork",
@@ -4928,7 +5082,8 @@ var maintenanceAuditSkill = {
4928
5082
  "Kick off a maintenance-audit cycle against a configurable doc",
4929
5083
  "tree. Creates a `maint:scan` issue targeted at the requested",
4930
5084
  "scope and dispatches Phase 1 (Scan) in the maintenance-audit",
4931
- "agent.",
5085
+ "agent. Subsequent phases (`maint:fix`, `maint:verify`) are",
5086
+ "created automatically as the cycle progresses.",
4932
5087
  "",
4933
5088
  "## Usage",
4934
5089
  "",
@@ -4955,30 +5110,102 @@ var maintenanceAuditSkill = {
4955
5110
  "2. Execute Phase 1 (Scan) of the maintenance-audit agent.",
4956
5111
  "3. If auto-fixable findings exist, a `maint:fix` issue is created",
4957
5112
  " automatically.",
5113
+ "4. When the fix phase lands, a `maint:verify` issue is created",
5114
+ " automatically so Phase 3 can re-run the checks and close the",
5115
+ " parent scan issue.",
4958
5116
  "",
4959
5117
  "## Output",
4960
5118
  "",
4961
5119
  "- A `maint-audit-<slug>-<YYYY-MM-DD>.md` report under",
4962
5120
  " `<AUDIT_ROOT>`.",
4963
- "- A `maint:fix` issue if auto-fixable findings were found."
5121
+ "- A `maint:fix` issue if auto-fixable findings were found.",
5122
+ "- A `maint:verify` issue after the fix phase lands (Phase 3",
5123
+ " produces a `maint-verify-<slug>-<YYYY-MM-DD>.md` report)."
5124
+ ].join("\n")
5125
+ };
5126
+ var maintenanceVerifySkill = {
5127
+ name: "verify-audit",
5128
+ description: "Kick off the verify phase of a documentation-maintenance audit cycle. Creates a maint:verify issue that re-runs the scan checks scoped to the paths a fix phase touched, compares pre/post findings, and closes the parent maint:scan issue when clean or files a follow-up maint:scan for residual findings.",
5129
+ disableModelInvocation: true,
5130
+ userInvocable: true,
5131
+ context: "fork",
5132
+ agent: "maintenance-audit",
5133
+ platforms: { cursor: { exclude: true } },
5134
+ instructions: [
5135
+ "# Verify Audit",
5136
+ "",
5137
+ "Close the loop on a maintenance-audit cycle. Creates a",
5138
+ "`maint:verify` issue and dispatches Phase 3 (Verify) in the",
5139
+ "maintenance-audit agent.",
5140
+ "",
5141
+ "Phase 3 re-runs the same checks the scan phase ran, scoped to the",
5142
+ "paths the fix phase actually touched, compares pre and post",
5143
+ "findings, and writes a verify report. Based on the verdict the",
5144
+ "phase either closes the parent `maint:scan` issue or files a",
5145
+ "follow-up `maint:scan` for residual findings.",
5146
+ "",
5147
+ "## Usage",
5148
+ "",
5149
+ "/verify-audit <scan-issue-number>",
5150
+ "",
5151
+ "Where `<scan-issue-number>` is the `maint:scan` issue that kicked",
5152
+ "off the audit cycle. The skill resolves the scan report, the",
5153
+ "Phase 2 fix report, and the `Paths Touched` list from that scan",
5154
+ "issue's downstream `maint:fix` issue.",
5155
+ "",
5156
+ "Most cycles do not need this skill \u2014 Phase 2 (Fix) creates the",
5157
+ "verify issue automatically. Use this skill when:",
5158
+ "- Phase 2 ran on an older audit cycle that predates the verify",
5159
+ " phase and never enqueued a verify issue, or",
5160
+ "- A human wants to re-run the verify phase after a manual fix",
5161
+ " applied on top of the Phase 2 PR.",
5162
+ "",
5163
+ "## Steps",
5164
+ "",
5165
+ "1. Create a `maint:verify` issue with `type:maintenance`,",
5166
+ " `priority:medium`, and `status:ready`. Body must list:",
5167
+ " - The parent `maint:scan` issue number",
5168
+ " - The Phase 1 audit report path",
5169
+ " - The Phase 2 fix report path (if one exists)",
5170
+ " - The `Paths Touched` list (copied from the fix report)",
5171
+ " - The audit check catalog (copied from the scan issue)",
5172
+ "2. Execute Phase 3 (Verify) of the maintenance-audit agent.",
5173
+ "",
5174
+ "## Output",
5175
+ "",
5176
+ "- A `maint-verify-<slug>-<YYYY-MM-DD>.md` report under",
5177
+ " `<AUDIT_ROOT>` containing the pre/post comparison.",
5178
+ "- The parent `maint:scan` issue is closed (clean verdict) or a",
5179
+ " follow-up `maint:scan` issue is filed (residual verdict)."
4964
5180
  ].join("\n")
4965
5181
  };
4966
5182
  var maintenanceAuditBundle = {
4967
5183
  name: "maintenance-audit",
4968
- description: "Documentation-maintenance agent bundle. 2-phase pipeline (scan, fix) with maint:* phase labels for auditing registries and cross-references and applying idempotent fixes. Enabled by default.",
5184
+ description: "Documentation-maintenance agent bundle. 3-phase pipeline (scan, fix, verify) with maint:* phase labels for auditing registries and cross-references, applying idempotent fixes, and confirming the fixes cleared the originally-flagged findings. Enabled by default.",
4969
5185
  appliesWhen: () => true,
4970
5186
  rules: [
4971
5187
  {
4972
5188
  name: "maintenance-audit-workflow",
4973
- description: "Describes the 2-phase documentation-maintenance pipeline, the maint:* label taxonomy, and the audit-before-fix boundary.",
5189
+ description: "Describes the 3-phase documentation-maintenance pipeline, the maint:* label taxonomy, the audit-before-fix boundary, and the verify-closes-the-loop rule.",
4974
5190
  scope: AGENT_RULE_SCOPE.ALWAYS,
4975
5191
  content: [
4976
5192
  "# Maintenance Audit Workflow",
4977
5193
  "",
4978
5194
  "Use `/audit-docs <scope>` to kick off a documentation-maintenance",
4979
- "audit cycle. The pipeline runs in 2 phases \u2014 scan and fix \u2014 each",
4980
- "tracked by its own GitHub issue labeled `maint:scan` or",
4981
- "`maint:fix`. All issues carry `type:maintenance`.",
5195
+ "audit cycle. The pipeline runs in 3 phases \u2014 scan, fix, and",
5196
+ "verify \u2014 each tracked by its own GitHub issue labeled",
5197
+ "`maint:scan`, `maint:fix`, or `maint:verify`. All issues carry",
5198
+ "`type:maintenance`.",
5199
+ "",
5200
+ "One additional user-invocable skill drives the verify phase",
5201
+ "on demand:",
5202
+ "",
5203
+ "- `/verify-audit <scan-issue-number>` \u2014 re-run the scan checks",
5204
+ " scoped to the paths the fix phase touched, compare pre/post",
5205
+ " findings, and close the parent `maint:scan` issue (or file a",
5206
+ " follow-up for residual findings). Phase 2 (Fix) normally",
5207
+ " enqueues the verify issue automatically \u2014 this skill is the",
5208
+ " explicit entry point for re-running the phase on demand.",
4982
5209
  "",
4983
5210
  "The maintenance-audit agent *audits doc registries and applies",
4984
5211
  "idempotent fixes*; it does **not** author new document content.",
@@ -4994,7 +5221,7 @@ var maintenanceAuditBundle = {
4994
5221
  tags: ["workflow"]
4995
5222
  }
4996
5223
  ],
4997
- skills: [maintenanceAuditSkill],
5224
+ skills: [maintenanceAuditSkill, maintenanceVerifySkill],
4998
5225
  subAgents: [maintenanceAuditSubAgent],
4999
5226
  labels: [
5000
5227
  {
@@ -5011,6 +5238,11 @@ var maintenanceAuditBundle = {
5011
5238
  name: "maint:fix",
5012
5239
  color: "BFDADC",
5013
5240
  description: "Phase 2: apply idempotent fixes from a maintenance audit report"
5241
+ },
5242
+ {
5243
+ name: "maint:verify",
5244
+ color: "D4C5F9",
5245
+ description: "Phase 3: re-run the scan checks scoped to the paths the fix phase touched, compare pre/post findings, and close or re-queue the parent scan"
5014
5246
  }
5015
5247
  ]
5016
5248
  };
@@ -6271,7 +6503,7 @@ var orchestratorBundle = {
6271
6503
  // src/agent/bundles/people-profile.ts
6272
6504
  var peopleProfileAnalystSubAgent = {
6273
6505
  name: "people-profile-analyst",
6274
- description: "Researches an individual person (colleague, customer contact, vendor contact, partner contact, industry expert, or connector) from public sources and produces a structured markdown profile cross-linked to companies, software, and meeting notes, then enqueues downstream `company:research` and `software:research` issues for unprofiled companies and software products surfaced during profiling. One person per session, tracked by people:* GitHub issue labels.",
6506
+ description: "Researches an individual person (colleague, customer contact, vendor contact, partner contact, industry expert, or connector) from public sources and produces a structured markdown profile cross-linked to companies, software, and meeting notes, then enqueues downstream `company:research` and `software:research` issues for unprofiled companies and software products surfaced during profiling. Also handles maintenance refreshes on a configurable staleness cadence (`people:refresh`). One person per session, tracked by people:* GitHub issue labels.",
6275
6507
  model: AGENT_MODEL.POWERFUL,
6276
6508
  maxTurns: 80,
6277
6509
  platforms: { cursor: { exclude: true } },
@@ -6331,6 +6563,12 @@ var peopleProfileAnalystSubAgent = {
6331
6563
  " the `software-profile` bundle via `software:research` issues.",
6332
6564
  " Meeting notes remain link-only \u2014 this agent never creates",
6333
6565
  " meeting-research issues.",
6566
+ "9. **Refresh is targeted re-verification, not re-research.**",
6567
+ " `people:refresh` runs a small number of targeted searches focused",
6568
+ " on the narrow set of facts that drift (role, employer, primary",
6569
+ " public channel) and updates the profile in place. It never",
6570
+ " re-runs the full research-phase sweep and never forks the profile",
6571
+ " under a new slug.",
6334
6572
  "",
6335
6573
  "---",
6336
6574
  "",
@@ -6365,6 +6603,15 @@ var peopleProfileAnalystSubAgent = {
6365
6603
  "\u2502 bounded notes \u2502 \u2502 the configured path \u2502 \u2502 company/software \u2502",
6366
6604
  "\u2502 file \u2502 \u2502 \u2502 \u2502 research issues \u2502",
6367
6605
  "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
6606
+ "",
6607
+ "\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
6608
+ "\u2502 4. REFRESH \u2502 (cadence-driven, or on-demand)",
6609
+ "\u2502 Re-verify an \u2502",
6610
+ "\u2502 existing profile \u2502",
6611
+ "\u2502 with targeted web \u2502",
6612
+ "\u2502 searches. Update \u2502",
6613
+ "\u2502 in place. \u2502",
6614
+ "\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
6368
6615
  "```",
6369
6616
  "",
6370
6617
  "**Issue labels encode the phase:**",
@@ -6374,13 +6621,13 @@ var peopleProfileAnalystSubAgent = {
6374
6621
  "| `people:research` | 1. Research | Gather public sources. Write a bounded research-notes file. Create the draft issue. |",
6375
6622
  "| `people:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the followup issue if warranted. |",
6376
6623
  "| `people:followup` | 3. Followup | Read the profile. Update cross-references to existing companies, software, and meeting notes. Enqueue `company:research` and `software:research` issues for unprofiled, genuinely-relevant entities surfaced in the profile. |",
6624
+ "| `people:refresh` | 4. Refresh | Read an existing profile. Run 3\u20135 targeted web searches for role, employer, and primary public channel changes. Update the profile in place and add a revision-history entry. |",
6377
6625
  "",
6378
6626
  "All issues also carry `type:people-profile` and a `status:*` label.",
6379
6627
  "",
6380
6628
  "**Issue count per person cycle:** 1 research + 1 draft + 0\u20131 followup =",
6381
- "**2\u20133 sessions**. The followup phase is skipped when the profile did",
6382
- "not surface any cross-references worth linking and no companies or",
6383
- "software products warrant downstream research.",
6629
+ "**2\u20133 sessions** on the initial cycle. `people:refresh` is an",
6630
+ "independent downstream cycle that runs on its own cadence.",
6384
6631
  "",
6385
6632
  "**Shortened paths:**",
6386
6633
  "- Research phase determines the person is out of scope (not",
@@ -6388,14 +6635,17 @@ var peopleProfileAnalystSubAgent = {
6388
6635
  " with a justification and no downstream issues are created \u2192 **1 session**.",
6389
6636
  "- Short profile with no cross-references and no downstream",
6390
6637
  " candidates \u2192 **2 sessions**.",
6638
+ "- Refresh that finds no material change \u2192 **1 session** (revision-",
6639
+ " history entry only, profile body unchanged).",
6391
6640
  "",
6392
6641
  "---",
6393
6642
  "",
6394
6643
  "## Configurable Paths",
6395
6644
  "",
6396
6645
  "The pipeline uses these placeholders. Consuming projects override the",
6397
- "defaults by passing paths in the `/profile-person` skill invocation",
6398
- "or by extending this rule in their own `agentConfig.rules`.",
6646
+ "defaults by passing paths in the `/profile-person` or `/refresh-person`",
6647
+ "skill invocations, or by extending this rule in their own",
6648
+ "`agentConfig.rules`.",
6399
6649
  "",
6400
6650
  "| Placeholder | Meaning | Default |",
6401
6651
  "|-------------|---------|---------|",
@@ -6417,26 +6667,37 @@ var peopleProfileAnalystSubAgent = {
6417
6667
  "## Refresh Cadence",
6418
6668
  "",
6419
6669
  "Profiles go stale. A person changes jobs, publishes new work, or",
6420
- "shifts focus. The pipeline supports a configurable refresh cadence:",
6670
+ "shifts focus. The pipeline supports a configurable refresh cadence",
6671
+ "so `people:refresh` issues can be filed on a schedule without",
6672
+ "hardcoding the interval:",
6421
6673
  "",
6422
- "- **Default cadence:** 180 days from the profile's `date` frontmatter.",
6423
- "- **Override:** the invoking issue body may specify a `refresh_days: N`",
6424
- " field, or the consuming project may set a project-wide default in",
6425
- " `docs/src/content/docs/project-context.md`.",
6674
+ "- **Default staleness threshold:** 180 days from the profile's",
6675
+ " `date` frontmatter.",
6676
+ "- **Override precedence** (first match wins):",
6677
+ " 1. `refresh_days` in the issue body (per-run override)",
6678
+ " 2. `refresh_days` frontmatter on the profile itself",
6679
+ " 3. Project-wide default declared under a `## Refresh Cadence`",
6680
+ " section in `docs/src/content/docs/project-context.md`",
6681
+ " 4. Built-in default: **180 days**",
6426
6682
  "",
6427
- "When the `/profile-person` skill is invoked for a slug that already",
6428
- "has a profile:",
6683
+ "When the `/refresh-person` skill is invoked for an existing profile:",
6429
6684
  "",
6430
- "- If the profile is **younger** than the refresh cadence, the skill",
6431
- " exits with a message pointing to the existing profile. Pass",
6685
+ "- If the profile is **younger** than the staleness threshold, the",
6686
+ " skill exits with a message pointing to the existing profile. Pass",
6432
6687
  " `force: true` in the issue body to refresh anyway.",
6433
- "- If the profile is **older** than the refresh cadence, the pipeline",
6434
- " proceeds in update-in-place mode: Phase 2 edits the existing file,",
6435
- " preserves its slug, and bumps the `date` frontmatter.",
6688
+ "- If the profile is **older** than the staleness threshold, the",
6689
+ " pipeline files a `people:refresh` issue and Phase 4 updates the",
6690
+ " existing file in place, preserving its slug and bumping the",
6691
+ " `date` frontmatter.",
6692
+ "",
6693
+ "The same precedence and `force: true` semantics apply when",
6694
+ "`/profile-person` is invoked for a slug that already has a profile:",
6695
+ "a fresh profile short-circuits; a stale profile is updated in place",
6696
+ "by Phase 2 rather than forked under a new slug.",
6436
6697
  "",
6437
6698
  "Refresh mode never changes the profile's role without an explicit",
6438
- "override in the refresh request \u2014 role changes are material and",
6439
- "warrant a human review step.",
6699
+ "override in the refresh request (`retype: <role>`) \u2014 role changes",
6700
+ "are material and warrant a human review step.",
6440
6701
  "",
6441
6702
  "---",
6442
6703
  "",
@@ -6445,7 +6706,8 @@ var peopleProfileAnalystSubAgent = {
6445
6706
  "Run this loop exactly once per session. Never start a second issue.",
6446
6707
  "",
6447
6708
  "1. Claim one open `type:people-profile` issue using phase priority:",
6448
- " `people:research` > `people:draft` > `people:followup`.",
6709
+ " `people:research` > `people:draft` > `people:followup` >",
6710
+ " `people:refresh`.",
6449
6711
  "2. Transition `status:ready` \u2192 `status:in-progress` and create the",
6450
6712
  " branch per your project's branch-naming convention.",
6451
6713
  "3. Execute the phase handler that matches the issue's `people:*`",
@@ -6613,6 +6875,11 @@ var peopleProfileAnalystSubAgent = {
6613
6875
  " <what the profile could not answer; flag anything the followup",
6614
6876
  " phase should cross-reference>",
6615
6877
  "",
6878
+ " ## Revision History",
6879
+ " | Date | Changes |",
6880
+ " |------|---------|",
6881
+ " | YYYY-MM-DD | Initial profile |",
6882
+ "",
6616
6883
  " ## Sources",
6617
6884
  " - <source URL> \u2014 <date accessed>",
6618
6885
  " ```",
@@ -6758,12 +7025,87 @@ var peopleProfileAnalystSubAgent = {
6758
7025
  "",
6759
7026
  "---",
6760
7027
  "",
7028
+ "## Phase 4: Refresh (`people:refresh`)",
7029
+ "",
7030
+ "**Goal:** Re-verify an existing profile against a narrow set of facts",
7031
+ "that tend to drift \u2014 current role, current employer, primary public",
7032
+ "channel (email, handle, personal site) \u2014 with a small number of",
7033
+ "targeted web searches, then update the profile in place.",
7034
+ "",
7035
+ "**Budget:** 3\u20135 targeted web searches focused on the narrow delta",
7036
+ "set. Do not redo the full research-phase sweep, do not re-gather the",
7037
+ "full background, and do not rewrite the profile body for facts that",
7038
+ "have not changed.",
7039
+ "",
7040
+ "### Steps",
7041
+ "",
7042
+ "1. **Read the existing profile** at the path referenced in the issue",
7043
+ " body. If the profile file is missing, close the issue with",
7044
+ " `status:needs-attention` and stop.",
7045
+ "",
7046
+ "2. **Confirm the staleness threshold.** Compare the profile's `date`",
7047
+ " frontmatter against today's date and the `refresh_days`",
7048
+ " frontmatter (or the project default from the Refresh Cadence",
7049
+ " section above). If the profile is younger than the threshold and",
7050
+ " the issue body does not set `force: true`, close the issue with",
7051
+ " a short comment and stop \u2014 do not burn the search budget.",
7052
+ "",
7053
+ "3. **Run 3\u20135 targeted searches.** Focus on the narrow delta set:",
7054
+ " - Current role / title at the current employer",
7055
+ " - Current employer (has the person changed jobs?)",
7056
+ " - Primary public channel (personal site URL, primary social",
7057
+ " handle, speaker inquiry form, public email if listed)",
7058
+ " - Optional: one search for notable recent public work (a new",
7059
+ " talk, post, or project) if the profile's Expertise Signals",
7060
+ " section has no entry from the last 12 months",
7061
+ "",
7062
+ "4. **Update the profile in place.** Edit only the affected sections",
7063
+ " (typically `## Current Position`, `## Contact Preferences`, and",
7064
+ " occasionally `## Expertise Signals`). Cite every new claim.",
7065
+ " Preserve the slug and the original `parent_issue` field. Bump the",
7066
+ " `date` frontmatter to today's date. Leave untouched sections",
7067
+ " untouched \u2014 refresh is a narrow delta, not a rewrite.",
7068
+ "",
7069
+ "5. **Do not silently re-type the person.** If the refresh surfaces",
7070
+ " evidence that the person's primary role has changed (e.g., a",
7071
+ " customer-contact who now works at your own organization and",
7072
+ " should become a colleague), flag it in `## Risks / Open Questions`",
7073
+ " and stop \u2014 do **not** rewrite the `role` frontmatter without an",
7074
+ " explicit override in the refresh issue body (`retype: <role>`).",
7075
+ "",
7076
+ "6. **Append a revision-history row.** Summarize the delta in one",
7077
+ " line:",
7078
+ "",
7079
+ " ```markdown",
7080
+ " | YYYY-MM-DD | Refreshed: <one-line summary of what changed> |",
7081
+ " ```",
7082
+ "",
7083
+ " When the search budget finds no material change, the row still",
7084
+ " appears so the next scheduled refresh knows this profile was",
7085
+ " reviewed:",
7086
+ "",
7087
+ " ```markdown",
7088
+ " | YYYY-MM-DD | Refreshed: no material change |",
7089
+ " ```",
7090
+ "",
7091
+ "7. **Respect privacy.** The narrow delta set is bounded to public",
7092
+ " professional facts. Never expand the refresh into private contact",
7093
+ " details, family information, or other non-professional data \u2014",
7094
+ " even if a search surfaces them. Privacy guardrails from Phase 1",
7095
+ " apply to every refresh.",
7096
+ "",
7097
+ "8. **Commit and push.** Close the refresh issue with a short comment",
7098
+ " summarizing the delta (or `no material change`).",
7099
+ "",
7100
+ "---",
7101
+ "",
6761
7102
  "## Output Boundaries",
6762
7103
  "",
6763
7104
  "This agent writes **only** to:",
6764
7105
  "",
6765
7106
  "- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
6766
- "- `<PROFILES_DIR>/` \u2014 person profiles (Phase 2, updated in Phase 3)",
7107
+ "- `<PROFILES_DIR>/` \u2014 person profiles (Phase 2, updated in Phases",
7108
+ " 3 and 4)",
6767
7109
  "",
6768
7110
  "In Phase 3, this agent also **creates `company:research` and",
6769
7111
  "`software:research` issues** for companies and software products",
@@ -6774,6 +7116,13 @@ var peopleProfileAnalystSubAgent = {
6774
7116
  "which pick up the issues this pipeline creates. Meeting notes",
6775
7117
  "remain link-only across all phases.",
6776
7118
  "",
7119
+ "In Phase 4, this agent only updates an existing profile in place \u2014",
7120
+ "it never forks a new profile under a different slug and never",
7121
+ "enqueues downstream `company:research` or `software:research`",
7122
+ "issues. Cross-references surfaced during a refresh are flagged in",
7123
+ "`## Risks / Open Questions` for a follow-up `people:followup` pass",
7124
+ "to handle.",
7125
+ "",
6777
7126
  "The pipeline produces **person profiles and notes only**. Deeper",
6778
7127
  "research on companies and software products is delegated to",
6779
7128
  "downstream research pipelines via `company:research` and",
@@ -6818,6 +7167,15 @@ var peopleProfileAnalystSubAgent = {
6818
7167
  " not open `type:requirement` or formal evaluation issues from this",
6819
7168
  " pipeline. Follow-up research is scoped through `company:research`",
6820
7169
  " and `software:research` only.",
7170
+ "- **Refresh respects the cadence.** Phase 4 exits early when the",
7171
+ " profile is younger than the staleness threshold and `force: true`",
7172
+ " is not set. It always appends a revision-history row so the next",
7173
+ " scheduled run knows the profile was reviewed.",
7174
+ "- **Refresh is narrow, not a rewrite.** Phase 4 re-verifies role,",
7175
+ " employer, and primary public channel with 3\u20135 targeted searches",
7176
+ " and updates only the affected sections. It never re-runs the full",
7177
+ " research-phase sweep and never rewrites sections whose underlying",
7178
+ " facts have not changed.",
6821
7179
  "- **Refresh, don't fork.** When a profile exists and is past its",
6822
7180
  " cadence, update in place rather than creating a new slug."
6823
7181
  ].join("\n")
@@ -6896,23 +7254,110 @@ var profilePersonSkill = {
6896
7254
  " other downstream artifacts itself."
6897
7255
  ].join("\n")
6898
7256
  };
7257
+ var refreshPersonSkill = {
7258
+ name: "refresh-person",
7259
+ description: "Kick off a people-profile refresh cycle. Creates a people:refresh issue for an existing profile and dispatches Phase 4 (Refresh) in the people-profile-analyst agent. Refresh re-verifies the profile's narrow delta set (role, employer, primary public channel) with 3\u20135 targeted web searches and updates it in place. Respects a configurable staleness threshold so profiles younger than the threshold exit early.",
7260
+ disableModelInvocation: true,
7261
+ userInvocable: true,
7262
+ context: "fork",
7263
+ agent: "people-profile-analyst",
7264
+ platforms: { cursor: { exclude: true } },
7265
+ instructions: [
7266
+ "# Refresh Person",
7267
+ "",
7268
+ "Re-verify an existing person profile with a small number of",
7269
+ "targeted web searches and update the profile in place. Creates a",
7270
+ "`people:refresh` issue for the target profile and dispatches",
7271
+ "Phase 4 (Refresh) in the people-profile-analyst agent.",
7272
+ "",
7273
+ "Refresh respects a configurable **staleness threshold** so scheduled",
7274
+ "refreshes do not burn search budget on profiles that are still",
7275
+ "fresh.",
7276
+ "",
7277
+ "## Usage",
7278
+ "",
7279
+ "/refresh-person <path-to-profile>",
7280
+ "",
7281
+ "Optional extensions in the issue body:",
7282
+ "- `refresh_days: <N>` \u2014 override the default 180-day staleness",
7283
+ " threshold for this run",
7284
+ "- `force: true` \u2014 refresh even if the profile is younger than the",
7285
+ " threshold",
7286
+ "- `retype: <colleague | customer-contact | vendor-contact |",
7287
+ " partner-contact | industry-expert | connector>` \u2014 explicitly",
7288
+ " allow Phase 4 to change the profile's `role` when the refresh",
7289
+ " finds material evidence of a role-type change",
7290
+ "",
7291
+ "## Staleness Threshold",
7292
+ "",
7293
+ "Order of precedence (first match wins):",
7294
+ "",
7295
+ "1. `refresh_days` in the issue body (per-run override)",
7296
+ "2. `refresh_days` frontmatter on the profile itself",
7297
+ "3. Project-wide default declared under a `## Refresh Cadence`",
7298
+ " section in `docs/src/content/docs/project-context.md`",
7299
+ "4. Built-in default: **180 days**",
7300
+ "",
7301
+ "If the profile's `date` frontmatter plus the resolved threshold is",
7302
+ "in the future (i.e. the profile is still fresh) and `force: true`",
7303
+ "is not set, Phase 4 closes the refresh issue with a short comment",
7304
+ "and stops without running any searches.",
7305
+ "",
7306
+ "## Budget",
7307
+ "",
7308
+ "- **3\u20135 targeted web searches** focused on the narrow delta set:",
7309
+ " current role / title, current employer, primary public channel",
7310
+ " (personal site, handle, speaker inquiry form, public email).",
7311
+ "- Optional: one search for notable recent public work if the",
7312
+ " profile has no Expertise Signals entry from the last 12 months.",
7313
+ "",
7314
+ "## Privacy",
7315
+ "",
7316
+ "Privacy guardrails from Phase 1 apply to every refresh. Never",
7317
+ "record private contact details, family information, or other",
7318
+ "non-professional personal data \u2014 even if a search surfaces them.",
7319
+ "",
7320
+ "## Steps",
7321
+ "",
7322
+ "1. Create a `people:refresh` issue with `type:people-profile`,",
7323
+ " `priority:medium`, and `status:ready`. Body must include the",
7324
+ " profile path and any overrides.",
7325
+ "2. Execute Phase 4 (Refresh) of the people-profile-analyst agent.",
7326
+ "",
7327
+ "## Output",
7328
+ "",
7329
+ "- The profile is updated in place (affected sections edited,",
7330
+ " `date` bumped, slug preserved)",
7331
+ "- A revision-history row summarizing the delta \u2014 or",
7332
+ " `Refreshed: no material change` when the search budget found",
7333
+ " nothing material"
7334
+ ].join("\n")
7335
+ };
6899
7336
  var peopleProfileBundle = {
6900
7337
  name: "people-profile",
6901
- description: "People research and profiling pipeline: research, draft profile, followup. Enabled by default; domain-neutral; filesystem-durable between phases. Cross-references existing companies, software, and meeting notes, and Phase 3 (Followup) hands unprofiled, genuinely-relevant companies and software products off to the `company-profile` and `software-profile` bundles via `company:research` and `software:research` issues.",
7338
+ description: "People research and profiling pipeline: research, draft profile, followup, refresh. Enabled by default; domain-neutral; filesystem-durable between phases. Cross-references existing companies, software, and meeting notes, and Phase 3 (Followup) hands unprofiled, genuinely-relevant companies and software products off to the `company-profile` and `software-profile` bundles via `company:research` and `software:research` issues. Phase 4 (Refresh) re-verifies profiles on a configurable staleness cadence.",
6902
7339
  appliesWhen: () => true,
6903
7340
  rules: [
6904
7341
  {
6905
7342
  name: "people-profile-workflow",
6906
- description: "Describes the 3-phase people-profile pipeline, the people:* label taxonomy, the cross-reference model, and the boundary against downstream research agents.",
7343
+ description: "Describes the 4-phase people-profile pipeline, the people:* label taxonomy, the cross-reference model, the refresh cadence rules, and the boundary against downstream research agents.",
6907
7344
  scope: AGENT_RULE_SCOPE.ALWAYS,
6908
7345
  content: [
6909
7346
  "# People Profile Workflow",
6910
7347
  "",
6911
7348
  "Use `/profile-person <person-name>` to kick off a person",
6912
- "research and profiling pipeline. The pipeline runs in up to 3",
6913
- "phases \u2014 research, draft, followup \u2014 each tracked by its own",
6914
- "GitHub issue labeled `people:research`, `people:draft`, or",
6915
- "`people:followup`. All issues carry `type:people-profile`.",
7349
+ "research and profiling pipeline. The pipeline runs in up to 4",
7350
+ "phases \u2014 research, draft, followup, refresh \u2014 each tracked by",
7351
+ "its own GitHub issue labeled `people:research`, `people:draft`,",
7352
+ "`people:followup`, or `people:refresh`. All issues carry",
7353
+ "`type:people-profile`.",
7354
+ "",
7355
+ "One additional user-invocable skill drives the maintenance",
7356
+ "phase independently:",
7357
+ "",
7358
+ "- `/refresh-person <path-to-profile>` \u2014 re-verify an existing",
7359
+ " profile with 3\u20135 targeted web searches and update it in",
7360
+ " place (Phase 4, respects a configurable staleness threshold).",
6916
7361
  "",
6917
7362
  "The pipeline produces **person profiles only**. Deeper research",
6918
7363
  "on companies and software products surfaced while profiling is",
@@ -6931,7 +7376,7 @@ var peopleProfileBundle = {
6931
7376
  tags: ["workflow"]
6932
7377
  }
6933
7378
  ],
6934
- skills: [profilePersonSkill],
7379
+ skills: [profilePersonSkill, refreshPersonSkill],
6935
7380
  subAgents: [peopleProfileAnalystSubAgent],
6936
7381
  labels: [
6937
7382
  {
@@ -6953,6 +7398,11 @@ var peopleProfileBundle = {
6953
7398
  name: "people:followup",
6954
7399
  color: "D4C5F9",
6955
7400
  description: "Phase 3: cross-link the profile to existing companies, software, and meeting notes, and enqueue follow-up research issues for unprofiled companies and software products"
7401
+ },
7402
+ {
7403
+ name: "people:refresh",
7404
+ color: "F9D0C4",
7405
+ description: "Phase 4: re-verify an existing person profile with targeted web searches and update it in place"
6956
7406
  }
6957
7407
  ]
6958
7408
  };