Repository navigation
Import people onto the lifecycle sheet through gates (#65) - #69
Merged
Merged
Conversation
A repo skill, .claude/skills/import-people, wraps lifecycle-sheet.md §4 in four gates: a named version and a dry-run baseline; a table approved in chat before anything is written; the operator pastes one block per tab, with new people Inactive; then hawk-mod's dry runs are checked at Inactive and again at Active. The agent reads the sheet through Drive and never writes to it. mapping.md records the five known intake formats, structure only, corrected where the first manual conversion broke a sheet rule (a "yes" became an invented expiry date). parseSheet now lists two Person IDs sharing a School or RHR Email as a sheet problem, by Person ID and row, never by value: the likeliest import mistake, and the backstop for a Drive read that comes back incomplete. Personal Email is not compared, since siblings can share a family address. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Some people were first entered with only enough to get them into Slack, and their missing details now need filling in. The skill assumed every import added people, and forbade editing an existing cell, so it could only set a backfill aside. It now names three writes: add (a new person), append (a new row for an existing one) and fill (a blank cell on an existing row). An append or fill is live when its column is in SHEET_TABS and quiet otherwise. Passes go adds (staged Inactive), then quiet, then live (just after :20, checked before the next run). A fill writes only blank cells, one span at a time, after the operator confirms the row's Person ID in column A. Afterwards every other cell in the row must equal the gate 1 read. Co-Authored-By: Claude Opus 5.5 <[email protected]>
willtoth
approved these changes
Oct 15, 2026
This was referenced Oct 15, 2026
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.
Closes #65 once it has been used for one real import (see "Not done yet").
What this adds
A Claude skill,
.claude/skills/import-people/. It's the procedure for putting people onto the lifecycle sheet from intake forms, CSVs, exports or lists. It loads by itself whenever someone asks for that. It wrapslifecycle-sheet.md§4 in four gates, each ending on a pass-or-fail check:/hawkmod lifecycle planbaseline, and the headers checked againstSHEET_TABS. The operator confirms the highest Person ID, which tells us whether the Drive read came back complete. They also give the live row 1 and the first empty row of each tab.Reference_Lists, expected sheet problems and derived values. Nothing is written until the operator approves it in chat.Backfilling existing people. Some people were first entered with only enough to get them into Slack, so the skill also covers filling in their missing details. It names three kinds of write:
An append or fill is live when its column is in
SHEET_TABS, because hawk-mod reads it, and quiet otherwise. The passes go in order: adds (staged as Inactive), then quiet, then live. The live pass is pasted just after a :20 run and checked before the next one. A fill only ever writes into blank cells, one span at a time. Before each span, the operator confirms that column A of the row shows the expected Person ID. Afterwards, every other cell in the row must equal what was read in gate 1.mapping.mdrecords the five intake formats seen so far, structure only. It came from the first manual conversion and was corrected where that conversion broke a sheet rule. Most importantly, a "yes" or TRUE now becomes a blank cell plus a "date to get", never an invented expiry date. A Slack export's member ID is not typed in either, becauseslack-ids applyfills it.A duplicate check in
parseSheet. Two Person IDs that share a School Email or RHR Email (compared byaddressKey) are listed as a sheet problem, by Person ID and row, never by the address. It's the likeliest import mistake, and it backs up a Drive read that comes back incomplete. Personal Email isn't compared, because siblings can share a family address. Once this deploys, any duplicates already on the sheet will show up in/hawkmod lifecycle plan. That only changes what the plan reports.docs/lifecycle-sheet.md§2 documents the check, and §4 points to the skill.Decisions (on #65, 2026-10-15)
Not done yet
#65 is done once the skill has been used for one real import, with the dry runs checked against the plan, and anything it got wrong fixed in the procedure.
Verification
npm run typecheck && npm test && npm run format:checkpass (855 tests, 5 of them new, for the duplicate check).🤖 Generated with Claude Code