The direction graph reads back, and the reading repairs nothing (#417 part c) - #457
Merged
Merged
Conversation
tonite31
force-pushed
the
feat/417-objective-check
branch
3 times, most recently
from
September 5, 2026 16:17
c5b72ca to
4ace65a
Compare
`self objective check [--project <slug>] [--json]` states seven kinds of finding over a project's direction graph and changes nothing. Part (c) of issue #417's approved design v2.1, on top of the link model (#452) and the carry, guards and judgment provenance (#456). Structural: work whose every current contribution is to an outcome that is over; a successor checkpoint with no live work beside a predecessor that still has some; a checkpoint dated past its objective; work that states no disposition at all. To review: a coverage judgment made under a former parent, or an assumption on a decision that was replaced; an objective whose whole live checkpoint workload is runbook occurrences. Information only: done work that could be cited as evidence for an uncovered criterion. Every line the check prints is a supported command; for the route a reader chooses, the printed steps clear the finding they were printed under. Nothing is inferred from prose — maintenance is read off the `runbook link` edge — nothing is paired to a criterion, and a contribution whose owning project this machine cannot read is reported as `target state not checked` rather than passed over as all clear. The projection reads no machine: no clock, no filesystem, no `process`. It reads only log-determined fields, so `missed` and `at-risk` never reach it, and its order is total and locale-free. `self status` and `self context` carry the count. Reviewed independently at 594eedb by the `review-457` agent, which wrote no production code or copy: `docs/content-reviews/direction-check.en.md` carries that review, verdict `revise` on one finding — a live unit whose current contributions are several closed outcomes was not answered in one pass, because the obsolete-contributions finding printed a single `work unlink`, for the first closed target only, while two entry pages promised every printed command clears the finding it was printed under. This commit applies the review's preferred bounded correction: `obsoleteFinding` now prints one `self work unlink` per closed target, in the same stable order as the finding's own summary, and cell 53 exercises the multi-target route end to end — every printed unlink, then standalone, reaches a reconciled state with no unit retired. The two entry-page sentences are narrowed to match what is actually printed: the steps for the chosen route clear the finding, not each command alone. The receipt is finalized in this commit by the independent follow-up reviewer `review-457-f1`, which wrote no production code or copy: it records F1 as resolved, cell 53 passing against the shipped build and failing against a build with only the fixed line reverted, and a fresh digest over the seven content files. Verdict `ready`. Closes #417 Signed-off-by: rayim <rayim@inflike.com>
tonite31
force-pushed
the
feat/417-objective-check
branch
from
September 5, 2026 16:25
4ace65a to
a7a0431
Compare
tonite31
marked this pull request as ready for review
September 5, 2026 16:26
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.
Accepted issue
Closes #417
status:acceptedto the issue<type>/<issue-number>-<short-description>Signed-off-bytrailerPart (c) of the three-part delivery in the approved #417 design v2.1. Part (a)
shipped the link model as #452 and part (b) the carry, guards, retarget, dates
and judgment provenance as #456; both are on
mainand this branch is based onthem. Sequencing dependency (a) → (b) → (c) is satisfied.
Problem
Issue #417 recorded four graph inconsistencies in a real project: work left on
a superseded milestone while its successor had none; recurring maintenance
turned into a product checkpoint dated past its objective; a checkpoint keeping
an assumption after the decision changed; completed work never reconciled with
a successor's criteria.
Parts (a) and (b) refuse the creation of three of those. They reconcile none
of the stores that already hold them, and the design forbids automatic cleanup.
Until this branch, no command answered any of the four: a session read
self context, saw a tidy list of open outcomes, and treated a drifted graphas current truth.
Result
self objective check [--project <slug>] [--json]— one read verb that statesseven kinds of finding and changes nothing.
Structural (commands repair the relationship, a person chooses which):
Review-needed (a person rejudges the meaning):
decision that was replaced;
Information only:
criterion — listed with the
milestone mettemplate carrying a literalcN, because the tool pairs nothing.Every command a finding prints is one this branch dispatches and one that acts
on the condition the finding states; a run of the printed command is a test
cell for each. A prose decision is never offered as clearing a structural
condition it does not change. Where a lineage ends closed, no relink is
offered — only the standalone declaration and the retire — so no printed
command leads to a second refusal. A unit whose current contributions are
several closed outcomes gets one
self work unlinkper closed target, inthe same stable order as the finding's own summary, so withdrawing every
obsolete edge and declaring standalone reaches a reconciled state in one pass
(see F1 below — the independent review found this printed one unlink only;
the fix is on this branch and the independent follow-up review has verified
it).
Nothing is inferred from prose. Maintenance is read off the
relatesedgeself runbook linkwrites, never out of a record's wording or its dates. Wherea unit contributes to another project's objective and this machine cannot read
that project, the answer states
target state not checkedand the headercounts it apart from the findings, so an unreadable log is never reported as
all clear.
self statusandself contexteach carry one direction line — the count, andthe scoped command — so a session knows whether to run the check without
running it first.
Guidance for all of it lands on the three entry routes: the CLI pages
(
self objective --help,self help goals,self help work), the managedblock
connect.tswrites, and the plugin's tool description and README.Design rules
commands.tsargs.tsparseCommandmain, no assumed git config, no macOS-only tools{name, sha256, bytes},namenotpathThree notes for the reviewer, each a deliberate structural choice:
apps/cli/src/check.tsjoins the render layer, and ARCHITECTURE.md'slayering table is updated in the same PR. It is a projection of a folded
model rather than a render, which is what
reachability.tsalready is. Itcannot live in
@superself/fold: finding 4 reads which records answer as arunbook run, and that derivation is this tree's
runbooks.ts, which thepackage deliberately does not hold. What the package would have given for
free — the purity guarantee — is asserted instead by a cell that reads the
module's own source against the same five rules
apps/fold/test/purity.test.mjsholds the package to.milestoneClosureandexitStandingare extracted out ofobjectives.ts's own derivation, whichnow calls them, and
carriedJudgmentsis exported rather than recomputed. Sothe check and the milestone page cannot disagree about what is closed, what is
open, or which judgment stands.
Verification
pnpm typecheckpnpm buildpnpm structure— dead exports 0 (base 0)pnpm smokepnpm test— CI'sverifyjob is green on the F1 fix head4ace65a, alongsidedcoandcontribution-policy, and was green on594eedb(5m39s) before it. This session is not alone on its machine, soper CONTRIBUTING it ran the other four gates locally plus the suites it
touched, listed below, and left the full tier to CI. The current head
a7a0431differs from4ace65aby exactly one blob — the finalizedreview receipt — with no production, test or workflow file changed, so
verify's green on4ace65ais the result for all executable content onthis branch. CI is re-running on
a7a0431; the coordinator owns thatgate.
Suites run locally, one
node --testprocess each:apps/cli/test/objective-check.test.mjs(52 cells, cell 53 added for F1)guards-carry.test.mjs,contract.test.mjs,guide.test.mjsdocs.test.mjscontext.test.mjsrender-gate-documents.test.mjs,render-gate-tty.test.mjs,golden.test.mjstokens.test.mjs,waiting-render.test.mjs,instruction-context.test.mjs,skill-context.test.mjs,workspace-direction.test.mjsintegrity.test.mjsapps/fold/test/determinism.test.mjs,purity.test.mjsThe case table is
docs/maintainers/case-tables/417-check.md,written before the code; every test names its cell number.
Four existing test surfaces changed, each because a printed contract changed
and not to loosen an assertion:
guards-carry.test.mjscell 54 — "no entry route advertises the check part(c) has not shipped" — is retired, because part (c) has shipped it. Cell
53 beside it still resolves every command every route names against the typed
contract, so the rule that cell enforced is unchanged and still proved.
render-gate-documents.test.mjsstage 4 cell 6 pins the order of the pipedself statuslines;direction:is added to the pinned order, beside theobjective roll-up it is a reading of.
self status,self context, the rootusage page and
self help workeach print one more thing, which is theintended outcome of this branch.
integrity.test.mjs's pre-cutover captures:context.txtandstatus.txtgain exactly the one direction line each, and every other capture is
byte-identical. The direction line reaches every store, so a pre-cutover one
is not exempt from it; what E1 claims is that an old binary's log still
folds the same, and G5 asserts that about records rather than about a
page's furniture. Both rebaselined captures read
ok, which is thesubstantive evidence in the diff — the check states no finding at all
against a legacy log, so it invents no drift out of history it cannot have
caused. (This was CI's one failure on the first push; the fix is the
rebaseline plus the reason, recorded in the test file and as cell 57.)
Risk review
store file, no migration. The branch adds no writer:
objective checkreturnsa
payloadblock and appends nothing, and a cell asserts the store isbyte-identical after a plain run and a
--jsonrun.check.tsimports nocredential, no rail and no transport, reaches no network, and reads no
machine at all.
macOS; the new suite is checkout-agnostic and uses node plus git only.
self statusgains aDIRECTIONheading,
self contextgains one head line, andself objective checkis anew page; the golden fixture diff in this PR is the record of the piped bytes.
Content quality gate
The English command guidance on all three entry routes is a content unit under
.agents/skills/content-quality-gate.docs/content-plans/direction-check.en.md,status
approved— the approved [Feature]: Enforce one objective, milestone, and work-management contract across Agents #417 design v2.1 is the operator's approvedbrief, and the plan cites it rather than approving itself.
docs/content-reviews/direction-check.en.md,verdict
ready, reviewers the independentreview-457agent (firstround, at
594eedb) and the independentreview-457-f1agent (F1follow-up, at
4ace65a). Content digest8be714dbf31bddaafeca9aa5f97b7b3cc27145a44ee94304f14eb6ff31d8d72dover theseven files, reproducing at the current head; the gate's verifier accepts the
receipt at
ready.The independent review has happened, and the one finding it blocked on is
fixed and independently verified. In the first round a reviewer distinct from
the author read all seven content files, ran
self objective checkand thecommands it prints against scratch workspaces, re-ran the touched suites, and
ruled both length questions the author left open, returning
reviseon F1alone. In the second round a follow-up reviewer distinct from both the
implementing author and the fix author read the correction, reproduced the
failure and the pass, and resolved F1. Neither reviewer wrote any production
code or copy.
F1 — resolved and independently verified. Was the one blocker; low
severity, bounded correction.
obsoleteFindingprinted oneself work unlink, for the first closed target only, while the finding'ssummary named every closed target.
self help goalsand the plugin READMEboth stated that "each one clears the finding it was printed under", which a
reachable state falsified: a live unit contributing to two dropped
checkpoints, with every printed line run verbatim, still carried the finding
afterwards — naming the second checkpoint. The reproduction transcript is in
the receipt.
This head applies the review's preferred correction:
obsoleteFindingnowmaps over every closed target and prints one
self work unlinkeach, in thesame stable order as the summary; a new cell (53 in the case table and test
file) builds a unit with two closed contributions — a dropped objective and a
dropped milestone — runs every printed unlink and then the standalone
declaration, and asserts the obsolete-contributions and no-disposition
findings are both gone and the unit was never retired. The two entry-page
sentences (
self help goals, pluginREADME.md) are narrowed to say theprinted steps for the chosen route clear the finding, not that each command
alone does, since a multi-target route needs every unlink plus the standalone
before the finding clears.
docs/reference/cli.mdmade no per-commandclaim and needed no change. Diff against the reviewed head
c5b72cabis fivefiles:
check.ts,guide.ts,README.md, the test file (one new cell), andthe case table (one new row) — no other content or production file moved.
Locally:
apps/clibuilt clean (tsc) andnode --test apps/cli/test/objective-check.test.mjspassed 52/52, includingthe new cell. The whole-suite/
pnpm testgate was left to CI per the branchrule against repeating full local runs, and CI's
verifyjob is green on4ace65a.What the independent follow-up reviewer checked, and did not take on
report. It read the delta
c5b72cab..4ace65aitself and confirmed that thecheck.tschange is one line for one; that the summary and the new unlink listare built from the same singly-sorted array, so their order cannot diverge;
that
firststill supplies only the finding'sobjectiveanddetail, asbefore; and that no other finding, grouping or successor behaviour is touched.
It established that no pre-existing case changes answer — for a unit with one
closed target the new
closed.mapemits exactly the line the oldfirst.labelemitted, and every pre-existing
obsolete-contributionscell asserts commandmembership rather than an exact list — so the first round's 51/51 carries over
without a rerun.
It then ran cell 53 by name against the shipped build (
# pass 1 # fail 0),and again against a build with only the fixed line reverted to its
first.labelform, where it failed on exactly the assertion naming both closed targets. The
regression is load-bearing rather than merely green. The scratch reversion
touched only untracked
dist/, was restored byte-exactly (SHA-256 verified),and left the tree clean.
readyis now certified, and not by the author. The receipt records the F1resolution, both runs, a fresh digest over the seven content files, and the
first round's evidence and author/reviewer identities unchanged. Four of the
seven files are byte-identical to the state the first round certified, so that
evidence carries over; the three that changed are the three F1 named, and each
was re-read in full. One non-blocking follow-up is recorded rather than fixed:
the rewrap of the corrected
guide.tsparagraph leaves one short line mid-paragraph, which changes no meaning, order or action, and the gate forbids
blocking on surface polish. It is worth rewrapping the next time
guide.tsisedited.
The two open length questions are ruled, both Keep. The managed block
measures 136 lines, 32 bullets, 9,609 characters at this commit; the added
bullet earns its ~12 lines because it is read at the one moment the reader has
not yet run anything. The
superself_workdescription measures 1,559characters against 179–243 for its four siblings; it is kept, with the
recorded reservation that its six-item finding enumeration is the half a future
revision should cut first once the listing budget is measured. Neither is a
blocker: no factual error, no unsupported claim, every command in them
dispatchable.
One receipt correction. The author's draft recorded that the tool
description omits findings 3 and 7; it omits finding 7 only. The receipt now
states the omission as it is.
Two things the review confirmed rather than assumed. The part (b) review's
carriedJudgmentsflag — newest coverage claim by physical log position — doesnot reach this branch's answer:
recordCoverageis the only coverage writerand emits
entity.coveredalone, and those claims are sorted by(ts, event id)inentities.tsbefore they reach the projection, which cell36 demonstrates over a carried-and-rechecked fixture. And the health summary's
availableset is the same listobjective checkitself folds, so the counton
self statuscannot disagree with the command it points at.Draft, and what is left to the coordinator
Opened as a draft. The coordinator controls the merge. The independent content
review is now on the record — see the gate section above — and the reviewer
wrote no production code or copy: the only blob it changed is the receipt.
F1's mechanical fix and the independent follow-up review are both on this
branch, which remains one squashed commit (head
a7a0431) against the sameb863977base. The follow-up reviewer's only blob is the receipt; every otherfile at
a7a0431is byte-identical to4ace65a, the head CI'sverifyjobpassed. The review's own stop condition — the F1 row, a cell reference and a
fresh digest — is met, and it called for no further reviewer round beyond that.
Left to the coordinator: the
verifyre-run ona7a0431, and the merge. Notdone here and not to be read as done: no merge, no release, no tag, and issue
#417 is not manually closed — the closing keyword in this body is the only
mechanism, and it fires on merge.