Skip to content

Schedule: writ lifecycle management — the record, its lifetimes, and the four operations over it #916

Open

Description

@David-Noble-at-work

Deliverable. writ's four lifecycle operations do to the record what their names say, over lifetimes, on every
platform: deploy replaces the record, upgrade updates it, decommission removes it, reconcile
restores the system to it. Ruled 2026-09-22 (#913),
recorded in 10-command-line-interface.md §3.1 and 5.1-reconciliation.md.

Status: committed 2026-09-23. Drafted 2026-09-22 at the close of the session that closed #887; ruled lane by lane on 2026-09-23, every row now an issue. The lanes are fixed: no lane is split, and a gap found while working one stops the work for a ruling.

The problem

Found 2026-09-22 on danoble-ud24-1.local running lane 18's sequence. After a layer reorganization in the
personal checkout, writ reconcile reported 52 records as orphan (target present, source gone) and, once the
targets were removed, as missing. Both words treat the record as the desired state when the checkout is, and
nothing retires them: the inventory deploy's pre-flight and reconcile read is readback.Fold, a fold over
every receipt the machine has ever written, newest per target winning. A deploy adds to the record and replaces
nothing. Under the ruling each deploy is one lifetime -- its receipts stack and fold naturally through the upgrades
and reconciliations that follow, until a later deploy replaces it or a decommission removes it -- and the fold is
not wrong but unbounded: it folds every lifetime the machine has ever had into one record. A machine sees many
lifetimes; one will eventually want to prune them.

The same session found stop refusing writ's own links after a file moved between layers (#883):
the same unbounded fold, read from the other side.

Before → after

What You have today (2026-09-22) You will have when this schedule closes
The record A fold over every receipt ever written; a file that left the checkout stays in it forever The current lifetime: a deploy replaces it, upgrade updates it, decommission removes it
reconcile Classifies a record that holds every lifetime: orphan, missing; repairs nothing Compares the system to the record, the desired state: linked, copied, absent, changed; restores the system to it
A file that moved between layers Refused under stop as not writ's own Re-pointed: the old link was ours, the record says so
reconcile before any deploy Fails on a store never written (#756) Not-found, so the exit code says never-deployed
The vocabulary TargetName means a scope and Target means a path, four lines apart; --target is registered and read by nothing; WRIT_WRIT_VERBOSE works and WRIT_VERBOSE does not Scope*; --scope, multi-valued; one environment prefix
Bare writ deploy Refuses: "requires at least 1 arg(s)" (#843) Deploys common; the implicit projects are common and one per layer repository (#850)
Lifetimes Accumulate without limit Named, and pruning designed

Lanes

Leaves, sorted by lane number. A pull request closes exactly the lanes whose Next names it. No lane is split
once this schedule is committed; if delivering a row above needs something not in these lanes, the deliverable
has changed and we reconvene to replan.

Three buckets, 2026-10-12. The owner: "I want three buckets: lifecycle management, start-claude rewrite, and
everything else that is on your schedule." Lifecycle management: lanes 5 to 8, 11 to 13, 16 to 19, 22 to 34 and 37
to 45. The Start-Claude rewrite: NobleFactor/noblefactor-ops#301
(schedule), where its lanes moved. Everything else: lanes 21, 35, 36, 55 to 58, 67 to 92, 94 to 97 and 100, which the
2026-10-11 goal puts on a Process and Tools schedule once lifecycle management is done. The sorting is the agent's:
lane 19 with lifecycle management, for lane 17's kept snapshots; lane 97 with everything else; and the config lanes
of PR C and PR C′ with lifecycle management, since a pull request is not split.

Lane Item Next Waits on
1 devlore-cli#922 — deploy replaces the record: readback.Fold bounded to the current lifetime, one writ deploy invocation across scopes PR A —
2 devlore-cli#923 — reconcile's words name system-versus-record drift, the record as the reference: linked, copied, absent, changed, dangling, stale; orphan and missing retired PR A lane 1
3 devlore-cli#883 — a file that moved between layers is re-pointed under stop: an occupant is ours when it matches what the record wrote, the source never resolved PR A lane 1: the record it reads is the lifetime being replaced
4 devlore-cli#756 — reconcile on a never-written store is not-found; three exit codes: 66 never deployed, 0 clean, 1 drifted PR B —
5 devlore-cli#924 — reconcile repairs, against the ref: restores absent and dangling from it, retains every edit on retain/<host>/<date> cut from the pinned commit, restores the rest only by a flag, and narrates the choice: retain, toss, and optionally a pull request PR B′ lane 18
6 devlore-cli#925 — the word is scope, not target: the Target* → Scope* rename, writ.targets → writ.scopes; a target stays a path PR C, done on its branch —
7 devlore-cli#926 — --scope, multi-valued, replacing the inert --target; absent means every scope defined on this platform; Windows adds ProgramFiles and ProgramData PR C, done on its branch lane 6
8 devlore-cli#927 — the doubled environment prefix: WRIT_VERBOSE, the prefix plus the bare key, for every program PR C, in progress —
9 devlore-cli#843 — bare writ deploy deploys common: with lane 7, everything implicit, on every scope defined on this platform PR B (pulled ahead 2026-09-24) —
10 devlore-cli#850 — the implicit projects are common and one per layer repository PR B (pulled ahead 2026-09-24) lane 9
11 devlore-cli#928 — upgrade updates the record: pins its own ref (closes #844) and moves a layer's links to the new snapshot along with its copies; its receipt stacks on the current lifetime PR E lane 17
12 devlore-cli#929 — decommission removes the record: the lifetime ended, its receipts, snapshots and refs kept for pruning; reconcile not-found until the next deploy PR E lane 17
13 devlore-cli#930 — pruning lifetimes, design only: a subcommand of the store's surface with a retention policy, removing a pruned lifetime's receipts, refs and snapshots; never the current lifetime, never an unmerged retain/* branch PR F lanes 11, 12
14 devlore-cli#931 — writ adopt carries the platform (--platform <token>) and leaves a deployment record: the files annotation, the trace appended to the current lifetime PR A lane 1
15 devlore-cli#941 — the layer journey's step 3.4/3.5 asserts nothing under ~/local in the record, but w.ps1 links there by design on Windows; the assertion is bounded to the targets that moved PR A′ lane 3
16 devlore-cli#846 — snapshots are kept state: out of the cache into the state home, locked, never leaked PR D lane 7
17 devlore-cli#971 — deploy pins each layer by a private ref and links into a sparse snapshot of every scope directory; closes #473; absorbs #960, deploy's handling of the replaced lifetime's links PR D lane 16
18 devlore-cli#972 — reconcile reads each entry against the ref that produced it: linked, copied, stale, absent, dangling, edited, changed, unpinned; 0 exactly when the system matches the record PR B′ lane 17
19 NobleFactor/noblefactor-ops#250 — the development process allows machine-originated retain/* branches noblefactor-ops, at any time —
20 devlore-cli#987 — .gitignore ignores /AGENTS.md, the owner's change, committed now PR G, alone —
21 NobleFactor/noblefactor-ops#190 — star gh issues report returns rows with the right columns and --output formats them; --markdown and its document builders deleted (ruled 2026-09-13) noblefactor-ops, its own PR, after PR C —
22 devlore-cli#1009 — configuration is one file: self install stops writing config.d/<program>.yaml, which no program reads; separating configuration, if a real need appears, follows git's include model PR C′ —
23 devlore-cli#1011 — a flag maps to its setting and its environment name with - → _: --dry-run is dry_run, as the documentation says PR C, in lane 8 —
24 devlore-cli#1010 — the model settings are global: --model, --model-provider, --model-endpoint and --model-api-key override the environment, which overrides model.* in the file, for lore and writ alike; lore.model.* goes PR C, in lane 8 —
25 devlore-cli#1012 — lore's --registry overrides the registry setting over the environment and the file PR C′ lane 8
26 devlore-cli#1013 — settings no code reads are removed: lore.ai_provider, lore's preferences and sources, lore.quiet, devlore-test.receipt_format, secrets PR C′ lane 22
27 devlore-cli#1014 — writ.repo's single-source mode is ruled deleted or documented in its plan; the guide stops teaching writ.repos PR C′ —
28 devlore-cli#1015 — lore onboard and writ migrate stop naming lore config model, which does not exist; whether onboard prompts for a provider is decided in its plan PR C′ lane 8
29 devlore-cli#1016 — man pages keep their angle-bracket placeholders: help text reaches md2man as text, and installed and displayed pages come from one generator PR C′ —
30 devlore-cli#1017 — the workflow command becomes store: store list and store verify on every program, where store prune (#930) will land PR C′ lane 7
31 devlore-cli#1018 — writ adopt needs a registered repository and no deployment: it refuses a placeholder layer, naming writ repo set, and on a machine never deployed starts the record PR C′ lane 7
32 devlore-cli#761 — writ adopt takes each item's scope, and that scope's root, from the scope model: the deepest root that holds the item, recorded in lower case as deploy records it; lane 7's phase 4 closes it PR C, done on its branch lane 7
33 devlore-cli#597 — named roots, design only: a run holds a named set of roots, a target root and the source roots, and identity is (root-name, rel), so no run widens its confinement to a common ancestor PR C lane 7
34 devlore-cli#521 — elevation, design only: deep research first, then 6.1 reconciled with the settled config and broker models (#522-#525), so that writ's System scope, among others, can elevate the operations that need root PR C′ lane 33
35 devlore-cli#1020 — update CI every month, a recurring chore: the workflows' actions and the golangci-lint pin at their latest releases its own PR, after PR C, then monthly; golangci-lint's pin moved to v2.14.0 in #1039, so its next move is this chore's PR C
36 devlore-cli#1021 — update Go modules every month, a recurring chore: within each major version in one pull request, the toolchain with them, and a new major as an issue of its own its own PR, after PR C, then monthly PR C
37 devlore-cli#1022 — dry-run reaches the runtime's skip, and only the runtime reads it: lore deploy --dry-run runs every provider method today, and a provider method called outside a graph is never skipped PR C, in lane 8 —
38 devlore-cli#1023 — the variables family: --variable NAME=value, <PREFIX>_VARIABLE_<NAME> and <program>.variable, on lore, star, writ and devlore-test, read only by the variable resolver PR C′ lanes 8, 22, 24
39 devlore-cli#975 — writ's template variables come from the variables family: <program>.variable replaces writ.vars, the command line and the environment reach them, and names keep their case PR C′, in lane 38 —
40 devlore-cli#683 — a template's Env reads the variable space, not the process environment PR C′, in lane 38 —
41 devlore-cli#1024 — writ's scopes and segments take singular keys: writ.scopes becomes writ.scope and writ.segments becomes writ.segment, beside <program>.variable PR C′, in lane 38 —
42 devlore-cli#1025 — every value a program reads from the user comes from the config system: the rule written, a guard that fails on a hand-read devlore variable, and the hand-read values routed through it PR C′, first lane 8
43 devlore-cli#1026 — every DEVLORE_ setting is in the config system, and nothing reads a DEVLORE_ variable by hand: the global settings resolve through it, and the shared root binds its flags to them PR C, in lane 8 —
44 devlore-cli#571 — star's session-root anchor: lane 33's design answers it, a path binding to a named root when it is created PR C, in lane 33 —
45 devlore-cli#1027 — every plan's status is one of the process's five words, and CI keeps it so PR C —
46 David-Noble-at-work/personal#257 — Start-Claude and Start-Claude.ps1 put the issue's number in the session's name, so sessions in one repository are told apart personal, its own PR, now —
47 NobleFactor/noblefactor-ops#256 — development-process.md names Start-Claude's sessions with the issue's number moved to NobleFactor/noblefactor-ops#301, lane 8 —
48 David-Noble-at-work/personal#259 — Start-Claude documents CLAUDE_CONFIG_DIR, and takes the directory to start in, as git's -C does moved to NobleFactor/noblefactor-ops#301, lane 1 —
49 David-Noble-at-work/personal#260 — Start-Claude finds a conversation by its schedule and moves it to the directory it starts in moved to NobleFactor/noblefactor-ops#301, lane 2 —
50 NobleFactor/noblefactor-ops#257 — star-gh-assignment names the schedule a session works, and star-gh-progress, renamed from star-gh-report, reports that schedule's issues noblefactor-ops, with lane 52, merged as noblefactor-ops#259 —
51 David-Noble-at-work/personal#261 — a login over SSH or mosh uses the console's ssh-agent when its own does not answer moved to NobleFactor/noblefactor-ops#301, lane 3 —
52 NobleFactor/noblefactor-ops#258 — star gh issues report --schedule takes the schedule's issue number, never its title noblefactor-ops, with lane 50, merged as noblefactor-ops#259 —
53 David-Noble-at-work/personal#262 — Fixup-MusicLibrary.applescript is MacRoman, so the spelling gate warns on every run moved to NobleFactor/noblefactor-ops#301, lane 4 —
54 NobleFactor/noblefactor-ops#260 — a startup hook writes back the id claude started to Start-Claude's store, and star-gh-assignment reads the schedule from the session's environment moved to NobleFactor/noblefactor-ops#301, lane 5 —
55 NobleFactor/noblefactor-ops#261 — development-process.md: the owner's questions are answered, and the agent's are counted, grouped or one at a time noblefactor-ops, with the next noblefactor-ops PR (proposed) —
56 NobleFactor/noblefactor-ops#262 — the base layer ships a PowerShell counterpart to Declare-BashScript noblefactor-ops, its own PR; Start-Claude.ps1 keeps its own Require-Windows until then —
57 NobleFactor/noblefactor-ops#263 — a skill reports an agent's process violations: to Anthropic, on devlore-cli#65, and to the owner's representatives noblefactor-ops, its own PR (proposed) —
58 NobleFactor/noblefactor-ops#264 — the PowerShell gate allows Unicode's cased letters, modifiers, marks, numbers, symbols and punctuation, not ASCII alone noblefactor-ops, its own PR, at the end of the schedule —
59 NobleFactor/noblefactor-ops#265 — every repository carries the same CONTRIBUTING.md, as it carries its LICENSE: a sign-off and an AI disclosure on every pull request, not every commit moved to NobleFactor/noblefactor-ops#301, lane 6 —
60 NobleFactor/noblefactor-ops#268 — on_error_or_interrupt moves into Declare-BashScript: one handler, its defects fixed, each script stating its traps and cleanup noblefactor-ops, merged as noblefactor-ops#288 —
61 David-Noble-at-work/personal#266 — personal's thirteen scripts that set traps use Declare-BashScript's on_error_or_interrupt, and Install-NFBuildTools is removed personal, merged as David-Noble-at-work/personal#267 lane 60
62 NobleFactor/devlore-cli#1037 — install.sh and two repository tools carry copies of Declare-BashScript's functions and trap through its on_error_or_interrupt devlore-cli, merged as #1039 lane 60
63 NobleFactor/noblefactor-ops#289 — Set-Traps marks its cleanup optional and the helper's test marks the programs it quotes, so shellcheck flags neither noblefactor-ops, merged as noblefactor-ops#293 lane 61
64 devlore-cli#1038 — install.sh takes its options with or without =: --prefix ~/x as well as --prefix=~/x devlore-cli, in lane 62, merged as #1039 —
65 NobleFactor/noblefactor-ops#290 — Declare-BashScript stops when a tool it needs is missing: GNU getopt is checked as bash is, and require_command stops a script that lacks its own noblefactor-ops, with lane 63, merged as noblefactor-ops#293 —
66 NobleFactor/noblefactor-ops#291 — Set-Environment works without --whitelist and without arguments, and keeps its variables local noblefactor-ops, in lane 93, merged as noblefactor-ops#297 lane 63
67 David-Noble-at-work/personal#173 — the README and the repository-root packagers still describe the stow and tuckr era: retire what is dead and rewrite what remains personal, its own PR; its order not yet ruled —
68 David-Noble-at-work/personal#263 — remove all trace of Tuckr: from this layer, from the machines it deploys, and from the other repositories as ruled personal, its own PR; its order not yet ruled —
69 David-Noble-at-work/personal#268 — Windows git config does not set core.longpaths, so git cannot check out a path of 260 characters or more personal, its own PR; its order not yet ruled —
70 NobleFactor/noblefactor-ops#267 — A bash style guide states the pattern every script that sources Declare-BashScript follows noblefactor-ops, under feature #266; its order and pull request not yet ruled —
71 NobleFactor/noblefactor-ops#269 — The guard before Declare-BashScript is laid out two ways: base comments it and leaves a blank line after it, personal does neither noblefactor-ops, under feature #266; its order and pull request not yet ruled —
72 NobleFactor/noblefactor-ops#270 — One script continues its Declare-BashScript source line over three lines; the other 69 write it on one noblefactor-ops, under feature #266; its order and pull request not yet ruled —
73 NobleFactor/noblefactor-ops#271 — Script copyright lines take four forms where the header ruling of 2026-10-01 gives one: Copyright (c) 2025 Noble Factor noblefactor-ops, under feature #266; its order and pull request not yet ruled —
74 NobleFactor/noblefactor-ops#272 — git-new-workspace has no name-and-description line; the other 69 scripts do noblefactor-ops, under feature #266; its order and pull request not yet ruled —
75 NobleFactor/noblefactor-ops#273 — Only the three git-* commands say where their documentation is; the other 67 scripts do not noblefactor-ops, under feature #266; its order and pull request not yet ruled —
76 NobleFactor/noblefactor-ops#274 — Section banners are drawn five ways, and 13 scripts have none noblefactor-ops, under feature #266; its order and pull request not yet ruled —
77 NobleFactor/noblefactor-ops#275 — Scripts name and order their sections 14 ways, and statements stand outside any section in 20 of them noblefactor-ops, under feature #266; its order and pull request not yet ruled —
78 NobleFactor/noblefactor-ops#276 — Seven scripts divide a section with ## subheadings; no other script does noblefactor-ops, under feature #266; its order and pull request not yet ruled —
79 NobleFactor/noblefactor-ops#277 — require_* follows the source line in 52 scripts and stands further down in 5 noblefactor-ops, under feature #266; its order and pull request not yet ruled —
80 NobleFactor/noblefactor-ops#278 — 19 scripts declare no options to Declare-BashScript, so they have no --help, though the process says the helper gives every script one noblefactor-ops, under feature #266; its order and pull request not yet ruled —
81 NobleFactor/noblefactor-ops#279 — Nine scripts have no man page and no issue, so their --help prints only the synopsis noblefactor-ops, under feature #266; its order and pull request not yet ruled —
82 NobleFactor/noblefactor-ops#280 — The synopsis is declared with the name spelled out, with ${script_name}, or not at all in 24 scripts noblefactor-ops, under feature #266; its order and pull request not yet ruled —
83 NobleFactor/noblefactor-ops#281 — The help arm calls usage three ways noblefactor-ops, under feature #266; its order and pull request not yet ruled —
84 NobleFactor/noblefactor-ops#282 — The option loop is written three ways: its head, what it evals, and how it quotes the case noblefactor-ops, under feature #266; its order and pull request not yet ruled —
85 NobleFactor/noblefactor-ops#283 — The -- arm shifts with shift 1 in 42 scripts and a bare shift in Install-Rclone noblefactor-ops, under feature #266; its order and pull request not yet ruled —
86 NobleFactor/noblefactor-ops#284 — The default arm of the option loop is written four ways noblefactor-ops, under feature #266; its order and pull request not yet ruled —
87 NobleFactor/noblefactor-ops#285 — Two scripts define functions as name() { where 13 write function name { noblefactor-ops, under feature #266; its order and pull request not yet ruled —
88 NobleFactor/noblefactor-ops#286 — Declare-BashScript's man page leaves out the require_* functions, the EX_* statuses and four of its variables noblefactor-ops, under feature #266; its order and pull request not yet ruled —
89 NobleFactor/noblefactor-ops#287 — Every bash script sources Declare-BashScript, says the process; installers, repository tools, completions and shell fragments do not, and only git hooks are excepted in writing noblefactor-ops, under feature #266; its order and pull request not yet ruled —
90 NobleFactor/noblefactor-ops#292 — Every bash function in base, team and personal is documented in the form ruled on #267: 3 of 218 are noblefactor-ops, under feature #266; its order and pull request not yet ruled —
91 David-Noble-at-work/personal#264 — New-RcloneMountUnit hands Declare-BashScript no options, so getopt refuses its own --what, --where, --rclone-config and --help personal, under feature NobleFactor/noblefactor-ops#266; its order and pull request not yet ruled —
92 David-Noble-at-work/personal#265 — Backup-SparseBundle and BackupTo-SparseBundle call usage with no synopsis, which Declare-BashScript refuses with status 2 personal, under feature NobleFactor/noblefactor-ops#266; its order and pull request not yet ruled —
93 NobleFactor/noblefactor-ops#294 — Declare-BashScript's names follow the house's rules, and one Set-Environment serves scripts and prompts noblefactor-ops, merged as noblefactor-ops#297 —
94 NobleFactor/devlore-cli#1040 — star lint shell finds scripts by their first line and checks each with shfmt, its own shell's -n, then shellcheck; every repository's shell gate runs it devlore-cli, its own PR, after PR C; then personal's and noblefactor-ops' CI switch to it, each in its own PR, the last closing it lane 8
95 David-Noble-at-work/personal#269 — a prompt loads Set-Environment from the base layer's ~/.local/share/shell/functions, and personal's own copy goes personal, its own PR, after lane 93 merges lane 93
96 NobleFactor/noblefactor-ops#296 — The test harness makes noblefactor-test on each virtual machine where it is missing, a normal account, and checks what it assumes of it noblefactor-ops, its own PR, at the end of the schedule —
97 devlore-cli#1041 — self upgrade takes the release channel when nothing names one, instead of refusing, in lore, star and writ its own PR, after PR C PR C
98 David-Noble-at-work/personal#271 — Start-Claude --detach starts a session for Remote Control without attaching, and a launch with no terminal starts nothing moved to NobleFactor/noblefactor-ops#301, lane 7 —
99 NobleFactor/noblefactor-ops#300 — development-process.md § Where a script lives places a script only other programs run under .local/libexec/<program>/ moved to NobleFactor/noblefactor-ops#301, lane 9 —
100 NobleFactor/noblefactor-ops#299 — Declare-BashScript reports a failed parse with getopt's complaint alone noblefactor-ops, under feature #266; its order and pull request not yet ruled —

Rulings, 2026-09-23

Lane by lane, the owner ruled:

  1. lane 1 stands; a lifetime is the whole writ deploy invocation across scopes.
  2. lane 2 stands; the record is the desired state (the checkout is only deploy's input); the words are linked, copied, absent, changed, dangling (repair: deploy) and stale (repair: upgrade).
  3. lane 3 stands; an occupant is ours when it matches what the record wrote -- the literal link target or the content digest -- and the source is never resolved.
  4. lane 4 stands; three exit codes, gateable like git diff --exit-code: 66 never deployed, 0 clean, 1 drifted.
  5. lane 5 stands; repair is deploy's or upgrade's mechanism on the reported subset, in one run; --dry-run selects the report; dangling and stale are reported and left; no reverse sync into the source repositories.
  6. lane 6 stands, and lanes 6-8 each get a task issue: language matters.
  7. lane 7 stands; absent --scope means every scope defined on this platform; Windows makes it profound (ProgramFiles, ProgramData).
  8. lane 8 stands; the variable is the prefix plus the bare key, for every program.
  9. lane 9 stands; bare writ deploy is everything implicit, everywhere defined.
  10. lane 10 stands; the writ command surface: layers, segments, adoption #463 rule as recorded on The implicit projects are common and one per configured layer repository; a repository-named project in any layer deploys unnamed #850.
  11. lane 11 stands; upgrade refreshes the stale copies only.
  12. lane 12 stands; decommission ends the lifetime and keeps its receipts; pruning deletes.
  13. lane 13 stands; pruning is a subcommand of the store's surface with a retention policy, never a lifecycle verb.
  14. lane 14 inserted by the owner (adopt carries the platform and leaves a deployment record); adopt's trace appends to the current lifetime.
  15. lane 15 inserted by the owner, 2026-09-24: the Windows scenario regression PR A left behind (#941) is a lane, taken before lane 4; nothing off this schedule is worked.

Rulings the code lanes need first

  1. Does a file deployment depend on package installation? The open question on The writ lifecycle surface: reconcile, scopes, and the vocabulary settlement #762 from the Windows box,
    2026-09-05: one failed pkg.install stopped the whole scope.
  2. The selection surface for repair. The writ lifecycle surface: reconcile, scopes, and the vocabulary settlement #762 rules that reconcile takes no command flags, and --dry-run
    already sits on the mutation axis; how a repair is chosen is undesigned.

Left out on purpose

#894's install and repo lanes (#840, #780, #812) stay
with that schedule. #910, receipt timings, stays in the
eventing epic. The writ status → writ reconcile rename landed under #774.

Conventions

As #887: a plan per lane at docs/plans/<type>/<issue>-<name>.md, chartered before code; both VMs snapshotted and
run before every pull request; coverage, complexity and size in every report; one pull request script, CI's own
gate as its pre-flight; the schedule and the WritOrigin thread reported at the end of every pull request.

Amended 2026-09-23 by the owner: lane 14, #931, inserted into PR A beside lane 1. Found planning lane 1: adopt's trace carries no deployment record, so an adopted file is invisible to the fold and the next deploy refuses its link as foreign; and adopt cannot name a platform. Ruled its own task, taken where the lifetime is built.

Amended 2026-09-24 by the owner: lane 15, #941, inserted ahead of lane 4. PR A (#940) merged with quality-gate green and the Windows scenario jobs red: the layer journey's moved-file assertion swept all of ~/local and caught w.ps1, which links there by design. The fix is the assertion's scope, not the record's. Ruled a lane: no issue off this schedule is worked.

Amended 2026-09-24 by the owner: lane 9, #843, pulled ahead of lane 5 into PR B beside lane 4. Ruled while preparing this Mac's deploy: no writ deploy runs anywhere until the bare form works, so the bug that makes common an argument is the blocker for every deploy and goes first. Lane 5 moves to PR B′. Lane 4 is code-complete and proven on both VMs; it commits first on the same branch. Same day, second amendment: lane 10, #850, joins PR B with lane 9: the layer journey's probe treats the bare form and the repository-named implicit projects as one change, and the owner's need is a bare deploy that converges the machine, which is the implicit set and not common alone. PR B is lanes 4, 9 and 10; PR D is empty and retired.

Amended 2026-09-28 by the owner: kept snapshots, and the replan. On 2026-09-27 and 2026-09-28 the owner ruled a design change (#847; plan docs/plans/feature/847-kept-snapshots.md): reconcile runs against the git ref that produced each entry, and a lifetime keeps its layer snapshots as sparse, writable worktrees pinned by private refs, with every layer's links targeting them (live is retired). An edit is always retained on retain/<host>/<date>; restore is a flag; upgrade moves links with copies; writ writes only refs/devlore/, retain/ and locked worktree registrations into a clone. The invariant: the maintainer owns every merge. The replan, ruled (a): the scope lanes first, then kept snapshots, then the revised lanes. Lanes 16 to 19 are new; lanes 5, 11, 12 and 13 are revised to the ruled model; the order is C (6, 7, 8), D (16, 17), E (11, 12) and B′ (18, 5), F (13), with lane 19 in noblefactor-ops at any time. #972 revises the outcomes of lanes 2 and 4.

#960 folds into lane 17 (agreed 2026-09-28 with the session that held it as its schedule #949's lane 15). Deploy loses a removed source precisely because it replaces the lifetime, so its handling of the replaced lifetime's links is designed once, against snapshots. That session's lane 15, and personal#236 behind it, wait on lane 17: DANOBLE-UD24-1 keeps its 26 dangling links and reconcile keeps calling it clean until lanes 17 and 18 land. The dangling links themselves can be removed by hand meanwhile; only the false clean waits. One pull request at a time in cmd/writ/writ: that session's #959 first, then lane 6.

Amended 2026-09-30 by the owner: lane 20, #987, a chore: the owner's .gitignore line for /AGENTS.md, ruled committed "NOW. IMMEDIATELY", through the full process, ahead of every other lane.

Amended 2026-10-01 by the owner: lane 21, noblefactor-ops#190, taken onto this schedule from lane 6 of the process tooling schedule (noblefactor-ops#206), where no session is driving it. Its branch stopped at its plan on 2026-09-13, the day the ruling overtook that plan; the plan is rewritten to the ruling when the lane opens. It follows PR C.

Amended 2026-10-02 by the owner: lane 22, #1009, a bug under the configuration epic (#441), found planning lane 7: self install writes ~/.config/devlore/config.d/<program>.yaml and no program reads it, so an edit there changes nothing. The owner's direction the same day: configuration is centralized, and a real need to separate it follows git's include model. Ruled find it, fix it: filed, placed on this schedule, and fixed in PR C beside lanes 6 to 8.

Amended 2026-10-02 by the owner: lanes 23 to 28, six bugs under the configuration epic (#441), found checking whether every program holds its own defaults, for lane 22's ruling the same day: (d), no program writes the user's configuration, as git does not. The owner ruled them: the model flags are global and override the environment and the file, for lore and writ alike; --registry overrides likewise; settings no code reads are removed; a flag maps to its setting with - → _, the documentation being right; lore onboard fails until a provider is configured, and prompting for one is considered. writ.repo is the owner's to rule in its plan. Placed in PR C with lanes 8 and 22, which change the same configuration code. The order in PR C: lane 7's code first, then lane 8, then lanes 22 to 28 as their Waits on column says.

Amended 2026-10-02 by the owner: lane 29, #1016, a bug under the release epic (#453), found reading writ workflow verify's man page while planning lane 7: every <placeholder> in the help text vanishes from the pages, <document> and <config> among them, and self install writes its pages without the fixes the displayed page gets. Filed and placed in PR C on the owner's word: "file the rendering bug", "add it to your schedule".

Amended 2026-10-02 by the owner: lane 30, #1017, a task: the workflow group becomes store. The owner, the same day: "writ workflow is doing useful work ... it is reporting/verifying the record of lifecycle operations"; ruled "go with store": it names the execution store the commands read, and lane 13's ruling already puts pruning on the store's surface. Placed in PR C after lane 7, which settles how the command's --scope matches.

Amended 2026-10-02 by the owner: lifetimes are generations. Planning lane 7's phase 3 found that writ deploy --scope Home would mint a lifetime holding Home alone and drop every other scope from the record. The owner ruled the git and Nix model (5.1-reconciliation.md § Lifetimes are generations): every operation that changes the system writes a new lifetime that references the runs before it and replicates none; each run records its scope and, for each layer, the commit it deployed from; a scoped deploy replaces only its scopes; decommission with nothing named removes everything, and --scope or project names narrow it. Lane 7 builds deploy's part: runs record their scope, and a deploy carries forward the scopes it was not asked to run. Lanes 11 (upgrade), 12 (decommission), 13 (pruning by reference), 16 and 17 (a snapshot per layer and commit, the pin per run, #960's cleanup) take the rest when the schedule reaches them, each with a comment saying so. Adopt's part has no open lane: lane 14 (#931) closed with PR A, so where adopt's new-lifetime write goes is the owner's to place. Ruled the same day: adopt needs no deployment -- it writes a new lifetime, from none on a machine that has never deployed.

Amended 2026-10-02 by the owner: lane 31, #1018, a bug. Walking a first install showed writ adopt refusing for want of a deployment and, with that lifted, adopting into self install's placeholder layer, a plain directory no deploy can pin. Ruled: adopt needs no deployment, and requires a registered repository. The lane carries adopt's part of the lifetimes ruling, which lane 14's closing had left unplaced; it waits on lane 7, which builds the new lifetime it writes.

Amended 2026-10-02 by the owner: lane 32, #761, a bug, joins PR C. Lane 7's phase 2 fixed half of it (System is %SystemDrive%\ on Windows). Answering the owner's question on adopt found the other half, and two gaps between adopt and the scope model (lane 7's open question 6): adopt records its scope as Home or System where deploy records lower case, so --scope misses adopted entries; and it infers Home or System alone, rooting System at / rather than at the model's root, which #931's item 4 had handed to lane 7. Ruled (a): lane 7 takes both in a phase before its pages -- adopt infers the scope whose root is the deepest that holds the item, takes that root from the model, and records the scope in lower case -- and that phase closes #761.

Amended 2026-10-02 by the owner: lane 33, #597, a task, design only. Lane 7's phase 4 found that an adopt run, confined to its scope's root, cannot reach the layer it writes into when the scope is a custom one, a Windows one, or a relocated Home. Ruled for this lane: each adopt run is confined to the deepest directory that holds both the scope's root and the layer, #597's candidate 2, found by one fsroot function. That function replaces deploy's and migrate's copies of the computation, which answer wrongly at a Windows drive's root (C: for C:\) and across drives (\); a layer on another drive refuses the item. The owner: "we have been talking about named roots for a while now ... we will design that after we land this lane." Named roots is #597's candidate 1: a run holds a target root and the source roots, and nothing widens.

Amended 2026-10-02 by the owner: lane 34, #521, a feature of the elevation epic (#520), design only. Lane 7's VM run reached a System-scope adoption: a root-owned file under /etc cannot be adopted, since nothing in writ elevates and the elevator provider is a stub. Running writ under sudo is no answer today: root's writ resolves root's home, configuration and store, and forcing the user's directories onto it leaves root-owned, 0600 files in the user's store. The owner: "It's time to bite the bullet." The design begins with deep research, since 6.1 is a draft whose own banner calls its mechanism design history; it follows lane 33 (named roots) because the two meet at System's root. Until it lands, tests against System are skipped: "For now: skip tests against system."

Amended 2026-10-02 by the owner: PR C's close. PR C opens after lane 8 and lane 33. The owner, asked whether it was time for a PR: lane 8 first ("yes, write lane 8's plan"), then "let's also knock out lane 33", then "We'll then do PR C." PR C closes #925 (lane 6), #926 (lane 7), #761 (lane 32, by lane 7's phase 4), #927 (lane 8), and #597 (lane 33) with #571, which lane 33's design answers. Lanes 22 to 31 and 34 move to PR C′; lane 22's documents (#1009) already ride in PR C, and its code goes with the rest. CI has not yet run on PR C's branch, since it runs only on pull requests: its Windows jobs are the Windows proof, the Windows box being out of service.

Amended 2026-10-02 by the owner: lanes 35 and 36, two recurring chores under the new feature #1019 (epic Ops:Process): #1020 updates CI's actions and the golangci-lint pin, and #1021 the Go modules and toolchain. The owner: "log two chores and add them to your schedule: update ci and update go modules. make these recurring chores. my experience: update regularly or get stuck." And: "a one-month cadence sounds right." Each runs as its own pull request, the first after PR C and then every month; neither closes. The first runs start well behind: actions/checkout is three major versions back, and the Go modules hold 13 updates within their majors, three that need code changes, and one moved module.

Amended 2026-10-02 by the owner: lane 23 (#1011) joins lane 8 and returns to PR C. Both change how a setting's name maps to its variable, in the same function: "Lane 23 should join lane 8." Ruled the same day for lane 24 (#1010): "WRIT_MODEL_PROVIDER should go away. we have a DEVLORE_MODEL_PROVIDER. I don't see that as limiting. leave it in lane 24."

Amended 2026-10-02 by the owner: the shared root's flags are global settings. Asked whether WRIT_VERBOSE is writ's or should be global, the owner ruled "yes, global in lane 24": --verbose, --dry-run, --interactive, --unattended, --silent, --config and the --model-* flags bind to global settings read from DEVLORE_<KEY>, and lane 24 (#1010) builds that for all of them. Lane 23 (#1011), about those flags' hyphens, goes with lane 24 to PR C′ ("split confirmed"). Lane 8 (#927) keeps the settings only one program has, a test that no two settings share a variable ("keep _, add the collision test"), and a warning for a variable that names nothing ("keep _, add the warning").

Amended 2026-10-02 by the owner: lane 37, #1022, a bug under the configuration epic (#441), joins lane 8 and PR C. Found answering the owner's question on graph parameters: the runtime skips a provider method under dry-run when Application.DryRun() finds dry_run in the flag map, lore and devlore-test hand it dry-run, so lore deploy --dry-run runs every provider method, and a method called outside a graph is never skipped. The owner: "I agree that dry_run belongs to the runtime and will add that other settings do too. verbosity comes to mind." Then: "log the defect and include it in lane 8." PR C closes it with #927.

Amended 2026-10-02 by the owner: lanes 38 to 40. Lane 38 is #1023, a new feature under the configuration epic (#441): the variables family, --variable NAME=value, <PREFIX>_VARIABLE_<NAME> and <program>.variables, read only by the variable resolver, on lore, star, writ and devlore-test. Lanes 39 and 40 are #975 and #683, moved under it and done in lane 38. Planning lane 8, the owner ruled that settings and variables are orthogonal and that settings stay out of the runtime variable space, and proposed --variable NAME=value; then ruled the family's names "yes", no file form for a long value "(a)", and the split "(c)": lane 8 (PR C) moves the resolver's environment lookup to <PREFIX>_VARIABLE_<NAME> and drops its lookups of settings, and lane 38 adds the surfaces in PR C′, after lanes 22 and 24. "our shipping apps (lore, star, and writ) and devlore-test are the apps that should carry variables. none other." Asked to file it: "yes".

Amended 2026-10-02 by the owner: the name-keyed families take singular keys. Asked whether scopes, segments and variables should take singular or plural keys: "whatever we do, we should do it to scopes, segments, and variables", then "yes, singular for all three". Lanes 38 and 39 now say <program>.variable; #1024, a task under feature #456, renames writ.scopes and writ.segments to writ.scope and writ.segment. Its lane is not yet placed.

Amended 2026-10-03 by the owner: lane 41, #1024, a task under feature #456, is done inside lane 38 in PR C′, so all three name-keyed families take their singular keys in one pull request. Offered PR C′ in lane 38, PR C with lane 8, or a pull request of its own after PR C′, the owner chose the first: "a".

Amended 2026-10-03 by the owner: lane 42, #1025, a task under feature #455 (Priority:P1), placed high in the list, after lane 8, and first in PR C′. Planning lane 8's phase 3, the owner ruled that variables are a section read through the config system ("we are using the config system to read variables "section" ... we are redesigning config, but the pattern will always be the same"), found the rule to be a devlore-cli issue ("it applies to the config system and offers design/implementation instructions"), and directed: "yes, file it. add it to your schedule, and put it high in the list of issues to fix." It waits on lane 8, whose collision test it grows into a guard.

Amended 2026-10-03 by the owner: lane 43, #1026, a task under feature #456 (Priority:P1), is done in lane 8, PR C. Offered a lane 8 warning that skipped DEVLORE_ names because several are read outside the config system, the owner: "EVERY ONE of the DEVLORE_ settings must be in config. add that task to lane 8." Lanes 23 (#1011) and 24 (#1010) are that task's substance, a flag's global setting without its hyphen and the global model section, so they move with it into lane 8, PR C. Lanes 25 and 28, which wait on lane 24, stay in PR C′ and wait on lane 8. #1025 (lane 42) keeps the hand reads that are not DEVLORE_ variables.

Amended 2026-10-03 by the owner: the lanes are listed in the order they are worked, and a pull request closes exactly the lanes whose Next names it. Asked for PR C's and PR C′'s plan, the order of work had to be reconstructed from these amendments; the owner directed the schedule updated so that it need not be, and then: "you are saying that PRC's closures are ill defined. correct that." PR C's close (2026-10-02) has #571, star's session-root anchor, close with #597, whose design answers it, but #571 had no row: it is lane 44, done in lane 33. PR C closes lanes 6, 7, 32, 8, 43, 23, 24, 37, 33 and 44: #925, #926, #761, #927, #1026, #1011, #1010, #1022, #597 and #571. Lanes 6, 7 and 32 are done on its branch, and lane 8 is in progress. After PR C the order is the amendments': lanes 35, 36 and 21, whose rows put them after PR C; PR C′, lane 42 first; then D, E, B′ and F, as amended 2026-09-28; and lane 19 at any time. The closed lanes keep their numbers and come first, in the order their pull requests merged.

Amended 2026-10-04 by the owner: lane 45, #1027, a chore, joins PR C. Closing the attribution fix found 32 plans carrying the retired statuses in-progress and chartered. The owner: "update the 32 devlore-cli plans still using the retired in-progress or chartered statuses. DO THAT NOW." Then: "rigidly follow process to create an issue and in the PR i want you to say with 100% certainty that all plans are using our status vocabulary." The inventory found 133 of the 349 files under docs/plans outside the vocabulary or without frontmatter, so the lane brings every plan to the five words and adds the gate that keeps them there.

Amended 2026-10-04 by the owner: the lane table is sorted by lane number again. The amendment of 2026-10-03 listed the lanes "in the order they are worked"; that reordering was the agent's own, made without asking. The owner: "lanes are supposed to be sorted by number." A pull request still closes exactly the lanes whose Next names it.

Amended 2026-10-04 by the owner: lanes 46 and 47, David-Noble-at-work/personal#257 and NobleFactor/noblefactor-ops#256, two chores taken now, each as its own pull request, ahead of PR C's remaining work: Start-Claude and Start-Claude.ps1 put the issue's number in the session's name, and development-process.md's naming lines follow. The owner: "add them to your schedule. i need to make this change to avoid some headaches that i'm having running many sessions in the same repo. i need to distinguish them. we have two scripts to update: Start-Claude and Start-Claude.ps1."

Amended 2026-10-04 by the owner: lane 48, David-Noble-at-work/personal#259, a chore taken now, before lane 47: Start-Claude's man page and Start-Claude.ps1's help name CLAUDE_CONFIG_DIR, and Start-Claude takes -C/--directory as Start-Claude.ps1 takes -Directory. Lane 46 merged as David-Noble-at-work/personal#258. The owner: "Log a chore and we'll fix it now in Start-Claude and Start-Claude.ps1, if changes to both are required. Can we add the equivalent of git's -C option?"

Amended 2026-10-04 by the owner: lane 49, David-Noble-at-work/personal#260, a chore taken now: Start-Claude and Start-Claude.ps1 key a conversation to its schedule, written first in the session's name as <owner>/<repository>#<number>; find it by that key in every project folder on the host; move it to the directory they start in; and take --issue or --resume, one or the other. Lane 47, which documents the session's name, now waits on it too. Offered as a new chore worked beside lane 48 in its pull request, the owner: "it's a new chore. it's a significant behavior change. it should be added to your schedule of course. it targets Personal and then on a pair of PRs, personal and noblefactor-ops"; "the latter two prs cover the move from personal to noblefactor-ops"; "so it will take a total of 3 PRs to complete this work." The scripts move because they "belong to noblefactor-ops, not personal. it is very much a noblefactor tool."

Amended 2026-10-05 by the owner: lane 50, NobleFactor/noblefactor-ops#257, a chore under feature NobleFactor/noblefactor-ops#151, taken now, before lanes 48 and 49, which wait on it. Settling how Start-Claude learns a conversation's schedule on --resume and --continue, the owner ruled that it asks the conversation from the command line through a star skill: "if i ask to continue or to resume, we ask what the title should be from the command line using what I'll call a star skill". The owner named the pair, star-gh-assignment for "what are you working on?" and star-gh-progress, today's star-gh-report renamed, for "what's the status?": "It tracks your progress on an assignment. The expression of an assignment is a schedule issue. We track progress by looking at all issues linked to that schedule." Then: "Add a chore to update the star skills. When that's working, we'll move on to Start-Claude and Start-Claude.ps1", and "Add the chore to your schedule." Asked whether lanes 48 and 49's worktree closes while lane 50 runs, as agent-rules rule 8 has a blocked branch closed, the owner: "Commit the plan. Keep the work tree open."

Amended 2026-10-05 by the owner: lane 51, David-Noble-at-work/personal#261, a chore under feature NobleFactor/noblefactor-ops#151, in the pull request for lanes 48 and 49. Found pushing the plan for lanes 48 and 49 from a session started over SSH: the session had no ssh-agent, so the push failed with Permission denied (publickey), and the console's agent, found through launchctl, completed it. The owner: "No you cannot push over Https. Find a problem, fix a problem."; "I'm running in an ssh session and the ssh-agent is on the console. I need a general solution to that problem."; "File the issue and we'll address it as you suggested."; and "It's a chore on personal".

Amended 2026-10-05 by the owner: lane 52, NobleFactor/noblefactor-ops#258, a chore under feature NobleFactor/noblefactor-ops#140, in lane 50's pull request. Found working lane 50: star gh issues report --schedule takes the schedule's title, which star-gh-assignment's answer cannot feed. The owner: "--schedule should take an issue number. the schedule is represented by an issue number. I don't want to have to type a title that can change in a heartbeat through editing."; "log a chore. add it to your schedule."; and "this goes in with lane 50".

Amended 2026-10-05 by the owner: lane 53, David-Noble-at-work/personal#262, a chore under feature David-Noble-at-work/personal#229, in the pull request for lanes 48, 49 and 51. Found running the spelling gate for that pull request: Fixup-MusicLibrary.applescript is MacRoman, so codespell warns on every run, and a warning does not fail the gate. Offered the fix in this branch or later, the owner: "Sure fix the script."

Amended 2026-10-06 by the owner: lane 54, NobleFactor/noblefactor-ops#260, a chore under feature NobleFactor/noblefactor-ops#151, related to lanes 48 to 50. The owner: "add this related chore: i would like a claude startup hook to save custom metadata in each project's transcript .jsonl. it would include a link to the schedule. I want to be able to ask for a link to the schedule and for claude to know where to get it. Goal: save money on tokens where we can." It waits on lane 49, whose names carry the key it reads; its own pull request after lanes 48 and 49 is proposed.

Amended 2026-10-06 by the owner: lane 54 narrows to the startup hook, taken later, and Start-Claude saves the schedule's link in the pull request for lanes 48 and 49. The owner: "Start-Claude should ensure that the custom title and schedule link are both saved." and "We can add the schedule link now and write the startup hook later."

Amended 2026-10-06 by the owner: lane 54 takes the two noblefactor-ops follow-ons of Start-Claude's store (David-Noble-at-work/personal#260): the startup hook writes back the id claude started, and star-gh-assignment reads the schedule from the session's environment. Asked, as question 1 of 2, whether both ride in lane 54, the owner: "Yes". It is retitled to match.

Amended 2026-10-06, by the owner's standing rule: lane 55, NobleFactor/noblefactor-ops#261, a chore. A message carried two questions, and an answer was recorded against the one at the top. The owner: "You posed two questions, and I'd not group them, or pose them one at a time with a countdown on the number of questions to come." and "This is a process breach." Filed first for agent-rules.md, then redirected by the owner: "What you just wrote should be in the development process docs."

Amended 2026-10-06 by the owner: lane 56, NobleFactor/noblefactor-ops#262, a chore under feature NobleFactor/noblefactor-ops#158. The owner: "The house should have one. if it does not, we should add it." Start-Claude.ps1 keeps its own Require-Windows until then; lanes 48 and 49 do not wait for it. Asked, as question 2 of 2, the owner: "Yes".

Amended 2026-10-06 by the owner: lane 57, NobleFactor/noblefactor-ops#263, a chore under feature NobleFactor/noblefactor-ops#157. The owner: "Do we need a skill for reporting untrustworthy behavior with a goal to drive accountability legislation? I would like to start sending these to my representatives." and "Goal: drive accountability legislation. I want my representatives to know that I'm working on this, ready to contribute to their legislative agenda."

Amended 2026-10-08 by the owner: lanes 60 and 61, NobleFactor/noblefactor-ops#268 and David-Noble-at-work/personal#266, chores under feature NobleFactor/noblefactor-ops#266, the scripting standards. Writing lane 49's startup hook, the owner ruled that every bash script sources Declare-BashScript as the house scripts do: "USE IT." The survey that followed found that the handler five personal scripts copy fails three ways. Offered putting it in the helper before lane 49's phase 17, the owner: "We will commit your outstanding work and then take the time to update Declare-BashScript with trap logic. We will accept the trap logic when all bash scripts in base, team, and main that have trap logic using the Declarre-BashScript trap logic. We will then proceed with Start-Claude work." Asked whether it takes the next lane, and whether personal's thirteen scripts that trap get a chore of their own: "yes", "yes". Lane 49 waits on both. The other scripting-standards issues go to a schedule of their own: "When Start-Claude is working I will do two things: start a new schedule in a new session using Start-Claude. The new schedule will include all the bash script issues you've logged."

Amended 2026-10-08 by the owner: lane 62, NobleFactor/devlore-cli#1037, a chore under the same feature. Five bash files trap without sourcing the helper: devlore-cli's install.sh, packaging/macports/generate-portfile.sh and scripts/Test-InstallScript.sh, the base's scripts/setup-ground-zero.sh, and personal's Install-NFBuildTools. Of the first, the owner: "We have a DevLore-cli install.sh script that could embed Declare-BashScript but should not source it." Offered taking all five now, each the way its repository allows: "All five now". devlore-cli's three are lane 62; the base's goes with lane 60, and personal's with lane 61, which now holds fourteen. Lane 49 waits on lanes 60, 61 and 62.

Amended 2026-10-09 by the owner: lane 63, NobleFactor/noblefactor-ops#289, a chore under feature NobleFactor/noblefactor-ops#266, the scripting standards. Found converting lane 61's scripts: shellcheck, at every severity, flags SC2119 at each call of Set-Traps without a cleanup, five in personal and one in the helper's own test, all below the gates' warning level. Offered one directive on Set-Traps in the helper, with its own issue, lane and pull request after lane 61's; a directive above each of personal's five calls; or leaving it, the owner: "Fix it in the helper".

Amended 2026-10-09 by the owner: lane 63 also takes two SC2016 notes in the helper's own test, tests/Test-DeclareBashScript, where shellcheck flags the programs the test quotes for a child bash. Offered lane 63 (1), an issue of their own (2), or leaving them (3), the owner: "go with 1". NobleFactor/noblefactor-ops#289 is retitled to match.

Amended 2026-10-09 by the owner: lane 61 removes Install-NFBuildTools instead of converting it. Found preparing its conversion: it has nothing to install, since no release of David-Noble-at-work/personal has ever been published and .github/workflows/release.yaml, which would build one, packs from a directory David-Noble-at-work/personal#174 renamed. Offered retiring it with its man page, its two completions and the workflow in this lane, converting it and filing the workflow as its own issue, or converting it and repairing the workflow here, the owner: "nuke Install-NFBuildTools". David-Noble-at-work/personal#266 is retitled to match.

Amended 2026-10-09 by the owner: lane 64, #1038, a bug under feature #798 (epic #453), fixed in lane 62, which changes install.sh anyway. Found discussing lane 62: install.sh takes its four options only as --option=value. The owner: "it makes a natural move an error." Offered its loop learning the space form, a few lines and no general parser, or leaving it: "1".

Amended 2026-10-09 by the owner: lane 65, NobleFactor/noblefactor-ops#290, a chore under feature NobleFactor/noblefactor-ops#266, rides with lane 63. Found answering how install.sh could share the helper: macOS's getopt misparses the helper's call and exits 0. The owner: "we stop if we have the wrong version of bash. I'm either in or out based on the bash version number", "and if any other tool we require is missing. same deal", and "use hash. file the issue." Lane 62 narrows and grows: install.sh takes the helper's narration, both forms of each option (lane 64) and the helper's handler ("Add the helper's handler to the list of changes"). Offered the helper's pull request first or lane 62's, the owner: "1 followed by 2 as you recommended": lanes 63 and 65 in one noblefactor-ops pull request, then lanes 62 and 64 in one devlore-cli pull request.

Amended 2026-10-09 by the owner: lane 66, NobleFactor/noblefactor-ops#291, a chore under feature NobleFactor/noblefactor-ops#266. Found documenting the helper's functions in lane 63: Set-Environment stops without --whitelist or without arguments under the helper's own nounset, and writes into its caller's variables. The owner: "log and address the Set-Environment tweak in the next pr." It is a noblefactor-ops change, so its pull request is the next there after lane 63's.

Amended 2026-10-10 by the owner: lanes 67, 68 and 69, David-Noble-at-work/personal#173, a chore; David-Noble-at-work/personal#263, a chore under feature David-Noble-at-work/personal#234 (epic NobleFactor/noblefactor-ops#142); and David-Noble-at-work/personal#268, a bug (epic Ops:Process). Found on no schedule when the owner asked which issues this session had written to in the last 72 hours. The owner: "add personal#173, personal#263, and personal#268 to your schedule". Their order on the schedule is not yet ruled.

Amended 2026-10-10 by the owner: lanes 70 to 92, the open members of feature NobleFactor/noblefactor-ops#266, the scripting standards: NobleFactor/noblefactor-ops#267, #269 to #287 and #292, and David-Noble-at-work/personal#264 and #265. On 2026-10-08 the owner had set them aside for a schedule of their own, started once Start-Claude works; on 2026-10-10: "Add all of these to your schedule". The feature itself is put to the owner, since issue-standards.md § Schedules makes no epic or feature a lane. Their order is not yet ruled.

Amended 2026-10-10 by the owner: lane 93, NobleFactor/noblefactor-ops#294, a bug under feature NobleFactor/noblefactor-ops#266. Found linting Start-Claude: shellcheck reads lane 65's require_command local missing as any consumer's own, and personal's Install-JetBrainsToolbox fails the shell gate. Offered renaming the helper's array or each consumer's variable, the owner: "a, and use require_command in Start-Claude. we have require_command." Then: "require_command_missing is the logical name choice. i approve the rename." It merges before Start-Claude's pull request, whose CI would otherwise fail.

Amended 2026-10-10 by the owner: lane 93 renames all eight of the helper's locals, each to <function>_<name>, and shellcheck keeps the gate: "(i) rename all eight in #294. shellcheck keeps the gate (a)."

Amended 2026-10-10 by the owner: lane 66 rides in lane 93's pull request: Set-Environment's four leaked variables become locals named by #294's pattern, in the function #294 renames anyway. The owner: "yes, fold #291 into #294".

Amended 2026-10-10 by the owner: lane 93 renames only the helper's indexed array, to missing_list, under the house's new rule that a variable's name carries its kind (noblefactor-ops#267): "yes, adopt it and apply the three renames, dropping the _ prefix. we will live with the false negatives on SC2034 (appears unused)."

Amended 2026-10-10 by the owner: lane 94, NobleFactor/devlore-cli#1040, a chore under feature NobleFactor/noblefactor-ops#266, the scripting standards. Found answering the owner's question on bash -n: star lint shell finds scripts by extension alone, so it passes a directory of the house's scripts having checked none, and no gate parses a script with its own shell. The owner: "I suggest that it run in the context of star lint." Asked whether to open it now as lane 94, to be worked after the config rollup: "open the issue as lane 94." It waits on PR C.

Amended 2026-10-10 by the owner: lane 93 grows. Every name in Declare-BashScript follows the house's rules: "We should complete the full set of renames in Declare-BashScript. there is no reason to postpone that." And Set-Environment, which scripts get from the helper and a prompt from personal's ~/.functions, becomes one function in the base layer: "we should only have one Set-Environment function." Every ruling is in the lane's plan, docs/plans/fix/294-helper-locals-function-names.md, in the owner's words.

Amended 2026-10-10 by the owner: lane 95, David-Noble-at-work/personal#269, a chore under feature NobleFactor/noblefactor-ops#266, the scripting standards. Lane 93 makes Set-Environment one function in the base layer, at ~/.local/share/functions/; this lane has a prompt load it there and removes personal's own copy, which runs anything after a ; in a value. Asked whether to file it now, as lane 95 after lane 93: "file the issue now."

Amended 2026-10-11 by the owner: lane 93 grows. Declare-BashScript finds Set-Environment through ${XDG_DATA_HOME:-$HOME/.local/share}/shell/functions, where a prompt loads it too, and stops with 72 where it is not: "we use ${XDG_DATA_HOME:-~/.local/share}/functions to locate Set-Environment", and then "I want to move the functions directory from ~/.local/share/functions to ~/.local/share/shell/functions. This means updating bash/zsh rc files, and Declare-BashScript. Can we do that on the next PR?", answered for this lane's pull request with "go with 1. next question." Set-Environment splits each line in memory: "make the change to parameter expansion". And the pull request is checked on this Mac before and after it: "I want local testing before the pr and after the pr."

Amended 2026-10-11 by the owner: lane 95 has a prompt load functions from ~/.local/share/shell/functions, and moves personal's pushup and up there with git mv. Offered this lane's pull request or lane 93's for them: "go with 1. next question."

Amended 2026-10-11 by the owner: lane 96, NobleFactor/noblefactor-ops#296, a chore under feature NobleFactor/noblefactor-ops#295, test machines: a plan's virtual-machine run goes through a harness that makes noblefactor-test, a normal account, where it is missing, and checks what it assumes of it. Placed by the owner: "It goes to the end of your schedule." and "Well do this later".

Amended 2026-10-11 by the owner: the order of the work from here: "Goal: finish Start-Claude and Start-Claude.ps1, move on to lifecycle management, and when that work is complete, create a new schedule to work on Process and Tools issues, including all that remains on your current schedule". Lane 93 merges first, since Start-Claude's pull request waits on it.

Amended 2026-10-11 by the owner: lane 97, NobleFactor/devlore-cli#1041, a bug under feature #83 of the release epic (#453): with nothing naming a channel, self upgrade takes release. It follows the settings roll-up, lane 8 (#927, PR C): "ensure that the self upgrade bug follows the settings roll-up work."

Amended 2026-10-12 by the owner: lane 98, David-Noble-at-work/personal#271, a chore under feature NobleFactor/noblefactor-ops#151, in the pull request for lanes 48 and 49. Found testing what Start-Claude does with no terminal: it started everything and left the session running. The owner: "Put these changes into the next PR" and "Ensure that you follow process for this change by logging an issue, updating the plan, and updating all related design docs." Recorded late, after the lane was added without it.

Amended 2026-10-12 by the owner: lane 99, NobleFactor/noblefactor-ops#300, a chore under feature NobleFactor/noblefactor-ops#266: development-process.md § Where a script lives places a script only other programs run under .local/libexec/<program>/, where Start-Claude's startup hook moves. The owner: "put NobleFactor/noblefactor-ops#300 on your schedule and we'll triage and split your schedule into two parts: lifecycle management and other chores and bug fixes (like the one in Declare-BashScript)." Recorded late, after the lane was added without it.

Amended 2026-10-12 by the owner: Start-Claude's lanes move to a schedule of their own, NobleFactor/noblefactor-ops#301: lanes 48, 49, 51, 53, 54, 59, 98, 47 and 99 here are its lanes 1 to 9. The owner: "Let's put Start-Claude on its own schedule. On the basis of weight of the work, it deserves the special treatment. we've been iterating on this for many days." Each row stays here under its number, its Next naming its lane there, since a schedule's lanes are numbered 1..N with no gaps (issue-standards.md § Schedules).

Amended 2026-10-12 by the owner: the open lanes fall in three buckets, listed above the lane table: lifecycle management, the Start-Claude rewrite (moved to NobleFactor/noblefactor-ops#301), and everything else. The owner: "I want three buckets: lifecycle management, start-claude rewrite, and everything else that is on your schedule."

Amended 2026-10-12 by the owner: lane 100, NobleFactor/noblefactor-ops#299, a bug under feature NobleFactor/noblefactor-ops#266: Declare-BashScript reports a failed parse with getopt's complaint alone. It is in the everything-else bucket. The owner: "Put this on the bucket 3 shedule".

Activity

  1. added
    choreMaintenance work on the repo: build, CI, tooling, process
    on Sep 22, 2026
  2. David-Noble-at-work commented on Sep 27, 2026

    @David-Noble-at-work
    ContributorAuthor

    Noted 2026-09-27, before any replan: lane 5, #924, is stopped before any code on a design change the owner ruled: reconcile runs against the git ref that produced each entry, and a lifetime keeps its layer snapshots as worktrees pinned by private refs, with links targeting them (#847: four rulings made, five open). One of the open rulings is where this lands on this schedule; lane 5 waits on it. The lane table is unchanged until then.

    (Posted as a comment because GitHub refused two edits of this body on 2026-09-27 with HTTP 499 and 400; it belongs in the body at the replan.)

  3. 12 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

choreMaintenance work on the repo: build, CI, tooling, process

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions