Repository navigation
Goal measures name their source: repo, prod or owner - #93
Merged
Merged
Conversation
A goal's measure had to be a number, and nothing asked whether the fleet could move it or read it. So measures crept toward business results the dev cycle can't produce: a monthly count of manual fixes in production, or a backlog another team works through. A goal could then never be met by merging PRs, and its readings were whatever the supervisor typed. Each measure now says how it is read. repo: measure.check runs on a throwaway checkout of main and the reading records main's sha. prod: a read-only check, run from the main checkout, keeping its output. owner: a yes/no measure.question (target 1, unit attested, from 0), asked as a goal-met question (owner_only: never defaulted, never answered in chat), and recorded only from the owner's yes, one reading per answer. The fold counts only readings that match the source, whoever wrote the line: a repo reading needs a commit on main, and an owner reading needs the owner's own line or an answered goal-met question it was written after. goal status met reads a repo check again on main and needs an owner goal's yes (--force overrides). A draft can't be approved without a source; a running goal without one keeps its old readings and shows the gap for a goal-change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
goal status <id> met re-runs a repo goal's check, from the owner's terminal or the dashboard. The check is the supervisor's command (it drafted the goal), and the owner is whoever has no DEVTEAM_ROLE, so the check ran as the owner: `devteam.mjs answer <qid> yes; echo 0` would have written owner lines stamped with the owner's own channel, indistinguishable from the owner's. The check now runs with DEVTEAM_ROLE=supervisor and no DEVTEAM_CHANNEL: owner commands refuse it, and what it writes is the supervisor's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Member
Author
|
Review (upstream loop), adversarial, focused on what a hand-written supervisor line can do:
|
This was referenced Nov 4, 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.
What
schema/log.schema.json:goal.measuregainssource(repo|prod|owner),check(repo and prod: a command whose last line of output is the number) andquestion(owner: the yes/no that says it's met). Reading observations may carrysha(the commit on main a repo check ran on) andapproved(the goal-met question an owner reading rests on).governance/constitution.md:goal-metjoinsowner_only, so it's never delegated, never defaulted, and never answered from chat.scripts/devteam.mjs:goal reading <id> --runruns a repo check on a throwaway checkout of main (recording main's sha), or a prod check from the main checkout (keeping its output).--valueis refused for repo and prod goals.goal reading <id> --approved <qid>records an owner goal's 1, only from a goal-met question about that goal that the owner answered with its recommendation. Each answer authorises one reading.ask --class goal-metneeds--goal(an owner-read goal) and a recommendation, and takes no--default.goal checklists a missing source or check/question. Owner measures imply target 1, unitattested, direction up and a baseline of 0.goal status <id> metreads a repo check again on main and needs an owner goal's yes.--forceis the owner's override.goalReadingscounts only readings that match the goal's source, whoever wrote the line. A repo reading needs a sha on main. An owner reading needs the owner's own non-chat line, or anapprovedgoal-met question answered in its recommendation, not in chat, before the reading was written, and used once.process/planning.md§1,process/supervisor.md: the measure is what the fleet can move by merging PRs and read without anyone outside the dev cycle. The business result stays in the outcome and never gates met. Each of the three sources has an example. A measure that depends on another team's work or on production time passing becomes an owner question.test/kit.test.mjs:--runat main's sha,--valuerefused, and prod.Why
A measure only had to be a number, so goals drifted toward business results the dev cycle can't produce, such as a monthly count of manual fixes in production, or a backlog that only empties when another team does its work. Such a goal can't be met by merging PRs, and its readings were whatever the supervisor typed:
goalReadingsaccepted any reading line from the supervisor. Readings drive the current milestone and the forecast, so a typed number moved them. Now the number comes from a check the kit runs, from production output that's kept with the reading, or from the owner's own yes.Known limit: a prod reading is still the supervisor's report of a run (the fold can't re-run a production query). The output is stored for the owner to compare, and
metstays the owner's to set.Migration
measure.sourceget a gap ingoal check. For a draft, it blocks approval. For a running goal, it's listed under coverage, and the goal keeps its readings as before.goal-changequestion per goal with the new measure (--change '{"measure": {…, "source": …, "check"|"question": …}}') and applies the owner's answer withgoal set <id> --approved <qid>.ask --class goal-met --goal <id> --question "<measure.question>" --recommendation yesonce its work is merged.🤖 Generated with Claude Code