Repository navigation
fdev: board-tend user units, post-merge trigger, empty enable file and 7-day observation (Refs #5136) - #5205
Merged
Merged
Conversation
…d 7-day observation (Refs #5136) Phase 2 PR 8 of the board reconciler design (section 8, section 12 PR 8). Plan-only by default; nothing is installed or enabled by this change. - deployment/fdev-board-tend: service and timer templates for `board-v2 tend` (hourly at :07) and a daily observation record; a wrapper that pins FSGG_KIT_ROOT and the fixed WorkingDirectory, scrubs the engine's environment, keeps output in a private directory and honours the pending-post-merge marker (never swallowed, cleared only by a run that started after it); an installer with units, kit-root and enable-file subcommands, each dry-runnable, user paths only; the empty enable file. - tools/routine-delivery.py: after a confirmed merge in enforce mode, write the marker and start the unit with --no-block. Best effort, stderr only, result schema unchanged. - tests: tests/fdev-board-tend (34) and the selftest workflow; BoardTendTriggerTests (9) in tests/skill-quality/routine-delivery.py, 8 new mutants in routine-delivery-board-mutate.py. - docs: board-tend-fdev-units.md (pins, marker rules, enable-file schema, install, 7-day observation and the per-rule enable criteria); the currency-gate design names the trigger; the writer census rebinds the helper. Refs #5136 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…; fixture isolates XDG_CONFIG_HOME (Refs #5136) CI on e8afa0f: gates failed check-engine-flag-narrative (the retired --engine flag name, 16 findings in the new files) and the fdev-board-tend fixture failed on a runner that sets XDG_CONFIG_HOME outside the fake HOME. The option is now --engine-path (and --timeout-seconds), and the fixture pins XDG_CONFIG_HOME inside its fake HOME. Refs #5136 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Contributor
Author
|
Root/fdev: independent review APPROVED
Triage: F1–F10 are non-blocking hardenings, follow-up #5206, due before any rule is enabled for apply. F11 and F12 are recorded; the real systemd behaviour is checked in Root's first-install readback. The merge waits for Root's release-window hold (0.114.3). The install will use the 0.114.3 engine and kit root once published. Refs #5136 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #5136
Phase 2 PR 8 of the board reconciler design (
docs/coordination/2026-10-31-board-reconciler-design.md§8 and §12 PR 8): the fdev user units, the post-merge trigger and the empty enable file, then 7 days plan-only. This PR installs nothing, enables nothing and writes nothing to the board. The install, the first run and the enable edits are separate Root admissions; the operating notedocs/coordination/board-tend-fdev-units.mdhas the commands, the readback and the observation plan.What is in it
deployment/fdev-board-tend/*.in, rendered by the installer):fsgg-board-tend.serviceand.timer(hourly at :07,Persistent=true, 120 s random delay), and a local read-onlyfsgg-board-tend-daily.serviceand.timer(00:30 UTC) that writes the daily observation record.Environment=FSGG_KIT_ROOT=<installed kit root>and a fixed, non-checkoutWorkingDirectory(the coord: board-v2 tend reads the board-tend contract marker from the installed contract (Refs #5174) #5188 F1 scope note); the wrapper refuses to start in any other directory or with an unset, relative or kit-less root.RuntimeMaxSec=900withType=exec(the cap is ignored on a oneshot service);XDG_RUNTIME_DIR=%tpinned andRuntimeDirectory=fsggkept, so the engine's flock lock…/fsgg/board-writer-PVT_kwDOEYAWY84Bldpa.lockis always satisfiable; deliberately noPrivateTmp, because the writers also take the legacy lock at the literal/tmppath.--applyis never on the command line. Apply is a laterinstall.py units --mode apply --force, which refuses unless the enable file already names a rule.fsgg-board-tend-run.py): scrubbed child environment (noGITHUB_TOKEN, noTMPDIR;GH_TOKENfrom the 0600 credentials file), output in a 0700 directory with 0600 files, thepending-post-mergemarker rules (a marker bypasses the 5-minute minimum interval, is cleared only by a run that started after it was written and exited 0, and is re-run when rewritten mid-run), and thesummarizesubcommand for the daily record.install.py):units,kit-rootandenable-file, each with--dry-run, refusing root and any path outside$HOME.kit-rootwrites the two released contract mirrors read-only after checking the released sha256 and exactly onefsgg:board-tend-contract/v1marker;unitspins the engine to its versioned path and refuses a kit root of another release.board-tend.jsonwith"apply": [],"propose": false,"maxItemsPerRun": 100. No gated rule. The schema table is in the operating note.tools/routine-delivery.py): after a confirmed merge, only under--board-gate enforce(so only from the FS-GG/.github checkout), write the marker and runsystemctl --user start --no-block fsgg-board-tend.service. Best effort, reported on stderr, absent from the result schema; no failure can change the merge outcome.Fixtures: clock, source and sandbox
tests/fdev-board-tend: a fake$HOMEin a temp directory, a fake engine script that records its argv and environment, the real wall clock for run-directory stamps, no network, no credentials, no systemd.systemd-analyze --user verifyruns on the rendered units only where it exists.BoardTendTriggerTests: an injectedruncallable and a temp state directory; no subprocess.env -i, plan-only, into a scratch directory:board-v2 tend: plan-only; cards=279 apply=0 wouldApply=8 close=0 wouldClose=0 deferred=8 propose=19 refuse=1; written=0 noop=0 refused=0 uncertain=0; requests=12 graphqlPoints=12 rest=0; seconds=21.8, exit 0.--mode applywith the empty enable file printedthe enable file lists no rules; plan-only.Tests
bash tests/fdev-board-tend/run.sh:Ran 34 tests … OK.python3 -I tests/skill-quality/routine-delivery.py:Ran 268 tests … OK(9 new inBoardTendTriggerTests).python3 -I tests/skill-quality/routine-delivery-board-mutate.py:73/73 mutants killed(8 new).check-v1-writer-census --structural: PASS (74 source identities, 339 tracked executables).check-prose-citations: ok.🤖 Generated with Claude Code