Developer control loop
projects should reduce developer overhead, not create a second project-management job.
The operating loop is therefore:
sense remote facts
↓
project drift
↓
triage only material changes
↓
decide semantic/lifecycle changes
↓
execute in the owning repository
↓
verify there
↓
reproject the estate
What should run by itself
Mechanical observation is a good automation target:
- repository existence and GitHub numeric identity;
- current repository name after rename;
- visibility/archive/default-branch metadata;
- recent push/readiness evidence;
- whether a selected repository exposes
SYSTEM.yaml,AGENTS.md, Makefile, workflows and obvious public entrances; - whether committed generated projections still match canonical estate sources.
These facts may become stale quickly and do not require a portfolio decision merely to observe them.
What must remain reviewable
Automation must not infer or silently mutate:
- lifecycle (
active,maintenance,superseded, archive readiness); - authority ownership;
- scientific or accounting semantics;
- a canonical provider or crosswalk policy;
- repository archive/delete/visibility settings;
- system membership from name similarity;
- runtime compatibility merely because two repositories changed recently.
The machine should surface those as bounded drift, not manufacture an answer.
Two-layer estate
Observed layer
Fresh factual evidence from GitHub. GitHub numeric repository ID is the durable observed identity. Repository name is a mutable locator.
The current operator command is:
make estate-scan
It requires authenticated GitHub access and writes the observed inventory evidence. It is deliberately excluded from ordinary CI.
Semantic layer
The curated registry under estate/ describes domain, system, role, lifecycle and authority. It may lag the observed layer temporarily without making the observed facts false or forcing a rushed semantic decision.
make estate-observation-all
projects known drift into reviewable generated artifacts.
One human-facing sensing command
For an authenticated operator:
make sense
refreshes the account inventory, refreshes the selected-core readiness evidence, and projects estate observation drift. It does not change another repository.
The normal deterministic gate remains:
make check
make check never requires network credentials.
Automation decision
A scheduled GitHub Actions sensing job is useful only when it can observe the same estate that the human can. The repository-scoped GITHUB_TOKEN is not assumed to have account-wide private-repository visibility.
Therefore a cadence should be enabled only after a dedicated read-only account/installation credential is configured for sensing. If that credential is installed, the preferred behavior is:
- run one or two times per week, not continuously;
- update one consolidated observation branch/PR or one consolidated drift issue;
- remain silent when there is no material drift;
- never auto-merge semantic/lifecycle decisions;
- never use the sensing credential to write to participating repositories.
Until that credential exists, adding a scheduled workflow would create either false completeness or recurring red noise. make sense is the truthful intermediate operator path.
Grooming rule
Backlog is downstream of current evidence. Before executing an old queue item:
- check whether recent repository work already satisfied its acceptance condition;
- check whether the repository boundary changed enough to make the item obsolete;
- close/reclassify completed or superseded work instead of preserving it for historical continuity;
- create new work only for a current red state with an observable acceptance condition.
The desired steady state is a small exception queue, not an exhaustive list of everything that could be improved.