Skip to content

feat!: epics list no children - #518

Merged
kixelated merged 13 commits into
mainfrom
quest/m0/token-waste/child-lists
Nov 7, 2026
Merged

kixelated merged 13 commits into
mainfrom
quest/m0/token-waste/child-lists

Conversation

@kixelated

@kixelated kixelated commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Ships directory membership for quest/m0/token-waste/child-lists.md and rewrites that quest to the remaining step: migrating this tree and enforcing the format.

Problem

Every epic and milestone README listed its children in ## Required, so every PR that finished a quest edited its parent's README. Siblings conflicted there: quest/m1/README.md was touched by 33% of merged moq-dev/moq PRs, and GitHub's merge queue, which cannot run the quest merge driver, ejected 723 PRs for conflicts in 30 days.

The first version of this PR also migrated the tree, and the merge queue dropped it. The queue runs quest check with the CLI built from base, so a PR cannot loosen its own validator, and base's CLI rejects a README that does not list its children.

Decisions

  • How to land a format change that base's validator rejects? Decided 2026-11-07 (user): ✅ stage it in 2 PRs (rejected: admin-bypass merge once; skip; delete). This PR ships directory membership with a validator that accepts both formats, and keeps this tree's child lists so base's quest check --base ... --branch ... passes on the merge. The follow-up runs quest check --fix to migrate the tree and turns requires X, which this epic holds into an error.

Behavior

  • An epic's children are the quests in its directory: its quest files and the READMEs of the epics one level down. A README is an epic while its directory holds another quest, and its own remaining work once it holds none.
  • A new quest needs no entry in its epic's README. A quest in a directory with a README is reachable, listed or not.
  • An epic's Required link to one of its children, as every README in a tree from before this change has, is allowed and counts once: quest unblocked neither scores it as a dependent nor prints it twice, and cycles and the Worker's map count it once. A link to a deeper quest stays a blocker, as on base.
  • Path order replaces list order. Children sort by path, a directory's README first, with digit runs compared by value so m10 follows m9. quest unblocked and quest waiting still rank by milestone, then downstream impact; path order is only the tiebreak, as list order was.
  • quest check adds sits in D, which has no README.md for a quest nothing reaches. It replaces not listed in ...'s '## Required'.
  • A milestone is finished once its directory holds no other quest and its README has no ## Required.
  • The Worker's board groups each epic's directory in path order, and the map's steps count a required epic's children.
  • quest rm, quest check --fix, and the land daemon's base-merge prune still drop only links to deleted quests, so a finished quest's entry leaves its parent's list and its siblings stay.

Public API

Quest format: additive. A tree that lists children and one that does not both pass quest check, so other repositories (moq-dev/moq, moq.pro, rind, rust2) pass on a pin bump past this change without migrating. The follow-up makes child lists an error and is the breaking step.

Breaking, core exports: children(docs, doc) and isEpic(docs, doc) now take the document set. To migrate, pass the loaded documents. requires(docs, doc) is new. comparePaths now orders README first and compares numbers by value.

No CLI flags changed. The unblocked, waiting, mv, and rm help text is updated.

Changes

  • src/core: the directory model (doc.ts), its rules (rules.ts: membership replaces index; milestone and cycle rules count directory children), readiness and tree order (ready.ts), and ranking (unblocked.ts), each counting an epic's link to its own child once.
  • src/cli/main.ts: help text.
  • Guide (assets/AGENTS.md), covering Model and Format: epics, milestones, and Required.
  • Skills: /quest-plan (placement replaces rank), /quest-audit (no rank to change), /quest-spawn (path order), and /quest-recurring (no parent listing).
  • README, the Worker's home page, the seed data, and the export example, which shows the format without child lists.
  • This tree keeps its child lists. m0's Plan gets a dated note that list order no longer ranks m0's work, and moq-dev pins now points at the follow-up as the change that rejects child lists.
  • quest/m0/token-waste/child-lists.md is rewritten to the follow-up's work.

Choices made without asking

  • remove() no longer strips held links in this PR. quest check --fix runs after every base merge, and quest rm and the land daemon's prune share remove(). If it stripped them, the first unrelated PR to run any of these would migrate all 15 READMEs as a side effect. The follow-up restores it from caa32fc and migrates on purpose. So --fix also needs history again, as on base.
  • assets/land-fix.md and the flaky quest keep base's wording: the fixer adds the flaky quest's link to quest/m0/flaky/README.md. That is valid under both validators, which matters while other repositories pin an older quest. The follow-up drops it.
  • Only a link to a direct child counts as membership in this PR. Old child lists named only direct children, and a deeper link stays a blocker as on base, so a subtree whose README is missing cannot hide it (review round 2). The follow-up's error covers links at any depth, since an epic already waits for everything under its directory.
  • Numbers compare by value in path order, so m10 follows m9. comparePaths itself changed, so quest check's finding order, the board, and tree order all agree.
  • quest unblocked <epic> lists the epic's other Required entries first, then its children. Each child that is an epic expands as before.
  • A dated note in m0's Plan. Its 2026-11-01 "Land work first, then Kix" ranking relied on list order, so I recorded that it was superseded rather than deleting the history.
  • Tests that used a README child list as the shared list now use a quest's blocker list. This covers the land and land-watch merge-driver cases, because the merge driver still resolves blocker lists.
  • One Worker test lost its scenario. It started an epic README while a child was still in its directory, which the new model forbids. It now starts the README after its last child merged, with that child's branch still claimed.

Validation

  • just check and just test pass on 9c48c20 (root 1104 tests and 6 skipped, Worker 539, and both lifecycle checks), run through quest gate.
  • The queue's check: I built quest from origin/main at 1c3cf6a with nix build .#quest, as .github/workflows/queue-build.yml does, and ran quest --root . check --base origin/main --branch quest/m0/token-waste/child-lists on c5065a2 and again on 9c48c20 after merging origin/main at d29a0d2, which changed no src. Result: quest: 82 documents ok.
  • The head's quest check passes on this tree (82 documents, child lists kept) and on examples/export (4 documents, no child lists).
  • New tests: an epic listing its children passes and ranks, readies, and prints blockers the same as without the list; a link to a deeper quest or to no quest stays a blocker; quest rm on a listed tree drops only the finished quest's entry; the root's listing of a finished milestone is kept.
  • Merged origin/main at d29a0d2 with no conflicts.

Models

Size: L
Implementer: Claude Code, claude-opus-5-5, xhigh effort
Implementer: Claude Code, claude-opus-5-5, high effort

Review

Rewritten by quest review after each round.

  • Reviewer: Codex, gpt-6.1-sol, xhigh effort
  • Session: 01a1b760-8d4f-74f1-bc7e-72b42621e1fc, round 3
  • Head: 9c48c20
  • Base: origin/main at d29a0d2
  • Score: 10/10, No remaining findings: targeted checks and repository/example validation passed, while full suites were blocked by the read-only sandbox.
  • Findings: none
  • The last round's findings, at 9488d7a:
    • Fixed: medium, src/core/ready.ts:100: [P2] Verify structural reachability before suppressing descendants; src/core/ready.ts:100 now suppresses only actual children, preserving the reproduced dependency behind a missing README, and ranking() rejects malformed trees without explicit links.

Caused by

No single PR. Epics have listed their children since the format began.

Follow-ups

  • Migrate the tree and enforce directory membership. Recommend: plan it. Epics list no children already holds the work, so planning refines that quest rather than adding one. It restores held-link stripping in remove() from caa32fc, runs quest check --fix on this tree, makes requires X, which this epic holds an error, and drops the flaky epic link from assets/land-fix.md. It is the breaking change, and it lands once this PR's validator is base, so the queue accepts the migrated tree.
  • Pin bumps migrate the tree. Recommend: drop, since the quests already hold it. This PR needs nothing from other repositories. Once the follow-up above lands, each pin bump must run quest check --fix in the same PR, and both moq-dev pins, updated here to name the follow-up, and Repositories and hosts follow quest's main already require that.

(Written by Claude Opus 5.5 with high effort)

🤖 Generated with Claude Code

@pullfrog

pullfrog Bot commented Nov 5, 2026

Copy link
Copy Markdown

Pullfrog  | Review this ➔

kixelated and others added 2 commits November 5, 2026 14:54
An epic's children are the quests in its directory, in path order, and an
epic README's `Required` lists only what blocks it. Finishing a quest deletes
its file and edits no README, so sibling PRs stop conflicting on milestone and
epic READMEs. `quest check` flags an epic's `Required` link to a quest it
holds and a quest in a directory without a README; `quest check --fix`,
`quest rm`, and the land daemon's base merges strip those links, which
migrates a tree whose epics still list their children.

Path order replaces list order: a directory's README first, then names, with
numbers by value so `m10` follows `m9`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…child-lists

# Conflicts:
#	quest/m0/token-waste/README.md
@kixelated kixelated changed the title Epics list no children feat!: epics list no children Nov 5, 2026
kixelated and others added 2 commits November 5, 2026 15:03
A README's `Required` link to a mistyped path inside its own directory is a
mistake for `quest check` to report, not a child link for `--fix` to drop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…child-lists

# Conflicts:
#	quest/m0/queue-watcher/README.md
@kixelated
kixelated marked this pull request as ready for review November 5, 2026 23:08

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: 75d43e0

Findings: No actionable defects found. Reviewed the 61-file diff and relevant consumers: directory membership, implicit cycle edges, blocker expansion, milestone completion, ranking, migration/removal behavior, CLI start checks, Worker board/map rendering, and the updated tests. The new model consistently keeps child membership separate from explicit prerequisites.

Direction: Keep the directory-based approach. Carry the documented quest check --fix migration in adopting repositories' pin bumps, and complete the required landing checks.

Verification limits: GitHub-only static review; no tests, builds, or UI sessions executed. The PR reports full suites on 73af3ae and just check on this head after Markdown-only base merges. The available Check and Queue runs are skipped, and Release is still running; this review does not establish a passing merge-group run.

(Written by unknown OpenAI model)

@coderabbitai

coderabbitai Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

Epic children now come from directory contents rather than Required lists. Required entries represent blockers, and readiness and ranking use path ordering. Validation checks epic directory membership and rejects blockers that target quests held by the same epic. Removal and quest check --fix clean up legacy child links. The board, map, documentation, seeded data, and tests are updated to reflect these rules.

Merge Risk: Minimal · up to 75d43

No merge-blocking issue is established; the change is ready for normal merge checks.

Pre-merge checks: Passed 5

Check name Status Explanation
Title check Passed The title identifies the main change: epics no longer list their children.
Docstring Coverage Passed Docstring coverage is 80.95% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentati…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The description is specific and tied to the changeset. It explains the problem (sibling conflicts from epic READMEs listing children in ## Required), the decision to ship directory membership with a…
Full details: Docstring Coverage

Explanation

Docstring coverage is 80.95% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 21 functions across 31 files. (13 skipped: 13 unsupported.)

Full details: Description check

Explanation

The description is specific and tied to the changeset. It explains the problem (sibling conflicts from epic READMEs listing children in ## Required), the decision to ship directory membership with a validator that accepts both formats, the behavior changes (path order, finished milestones, held-link handling), the public API changes to children, isEpic, requires, and comparePaths, and the validation performed. It matches the raw summary's described edits to src/core, skills, guide, README, and quest tree.

Finishing Touches

Simplify code

  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Recent review info

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 10dcf685-cbc7-4d24-8e62-7b780295ea5b
Commits

Reviewing files that changed from the base of the PR and between 4b69ad1 and 75d43e0.

Files selected for processing: 61

  • README.md
  • assets/AGENTS.md
  • assets/land-fix.md
  • assets/skills/audit.md
  • assets/skills/plan.md
  • assets/skills/recurring.md
  • assets/skills/spawn.md
  • cloudflare/dev/seed.ts
  • cloudflare/src/board/model.ts
  • cloudflare/src/board/pages.tsx
  • cloudflare/src/home.tsx
  • cloudflare/src/map.tsx
  • cloudflare/test/board.test.ts
  • cloudflare/test/core.test.ts
  • cloudflare/test/jobs.test.ts
  • cloudflare/test/links.test.ts
  • cloudflare/test/map.test.ts
  • cloudflare/test/project-fixtures.ts
  • cloudflare/test/projects.test.ts
  • examples/export/quest/README.md
  • examples/export/quest/m0/README.md
  • quest/README.md
  • quest/m0/README.md
  • quest/m0/kix/README.md
  • quest/m0/kix/sandbox/README.md
  • quest/m0/model-check.md
  • quest/m0/model-routing/README.md
  • quest/m0/queue-watcher/README.md
  • quest/m0/queue-watcher/flaky-quest.md
  • quest/m0/token-waste/README.md
  • quest/m0/token-waste/base-merges.md
  • quest/m0/token-waste/child-lists.md
  • quest/m0/user-dev-shell/README.md
  • quest/m1/README.md
  • quest/m1/kix/README.md
  • quest/m1/kix/sandbox/README.md
  • quest/m1/model-check.md
  • quest/m1/theme/README.md
  • quest/m2/README.md
  • quest/m2/automation/README.md
  • quest/m2/cloud/README.md
  • scripts/lifecycle-check.mjs
  • src/cli/main.ts
  • src/cli/move.ts
  • src/core/doc.ts
  • src/core/edit.ts
  • src/core/index.ts
  • src/core/path.ts
  • src/core/ready.ts
  • src/core/rules.ts
  • src/core/unblocked.ts
  • test/fixture.ts
  • test/land-watch.test.ts
  • test/land.test.ts
  • test/landed.test.ts
  • test/links.test.ts
  • test/move.test.ts
  • test/theme.test.ts
  • test/tree.test.ts
  • test/unblocked.test.ts
  • test/waiting.test.ts
Files with no reviewable changes: 17

  • examples/export/quest/README.md
  • quest/m2/cloud/README.md
  • quest/m0/token-waste/README.md
  • quest/m0/kix/README.md
  • quest/m2/automation/README.md
  • quest/m0/token-waste/child-lists.md
  • quest/m0/user-dev-shell/README.md
  • quest/m0/kix/sandbox/README.md
  • quest/m2/README.md
  • quest/m0/model-routing/README.md
  • quest/m0/queue-watcher/README.md
  • quest/README.md
  • examples/export/quest/m0/README.md
  • quest/m1/kix/README.md
  • quest/m1/kix/sandbox/README.md
  • quest/m1/README.md
  • test/fixture.ts

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

…child-lists

# Conflicts:
#	quest/m0/README.md
#	quest/m1/README.md
@kixelated
kixelated added this pull request to the merge queue Nov 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 7, 2026
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 0f832ae because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot
moq-bot Bot enabled auto-merge November 7, 2026 09:11
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: armed auto-merge on this pull request at 80253f4, so it joins the back of the merge queue once its required checks pass, with the land fixer's fix (codex, gpt-6.1-sol, medium effort): Merged base; re·solved quest README child-list conflicts and retained base deletion of the completed base-merges quest; ran just install, just check, and just test successfully..

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 7, 2026
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at 80253f4 because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot
moq-bot Bot enabled auto-merge November 7, 2026 09:46
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: armed auto-merge on this pull request at fa2879b, so it joins the back of the merge queue once its required checks pass, with the land fixer's fix (codex, gpt-6.1-sol, medium effort): Merged base and mechanically re·solved both quest Markdown conflicts, preserving base review updates and PR child-list removal; ran just install, bun x --no-install prettier --write quest/m0/model-check.md quest/m0/token-waste/README.md, WRANGLER_SEND_METRICS=false just check, and just test (all passed)..

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 7, 2026
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at fa2879b because it conflicts with main (merge_conflict).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

(written by quest land watch)

@moq-bot
moq-bot Bot enabled auto-merge November 7, 2026 10:24
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

codex, gpt-6.1-sol, medium effort land fixer note:

Merged base while preserving the new flaky-test epic, follow-up quest, and existing test skip. Removed explicit child-list entries to match this PR's directory-based quest membership. Protected workflow changes are exactly those carried by base.

just check and the complete just test passed. The initial test run hit a 5000ms timeout in the review-size test; its focused rerun and the full test retry passed without changing any tests or timeouts.

(written by codex, gpt-6.1-sol, medium effort)

@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: armed auto-merge on this pull request at caa32fc, so it joins the back of the merge queue once its required checks pass, with the land fixer's fix (codex, gpt-6.1-sol, medium effort): Merged base, re·solved quest/m0/README.md conflict, and removed redundant child entries from the new flaky epic; ran just install, just check, just test (passed on retry), and bun run vitest run test/review.test.ts -t "a quest branch is reviewed at its quest's size on the base, which its own change cannot lower"..

(written by quest land watch)

@moq-bot
moq-bot Bot added this pull request to the merge queue Nov 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 7, 2026
@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

quest land watch: the merge queue removed this pull request at caa32fc because its merge_group build failed (failed_checks).

The land fixer works on it in the background, and the watcher re-enqueues it at the back of the queue once it is fixed or judged flaky, or hands it back here with what it needs.

Queue / Queue build / Build (job) failure at step Check that the PR leaves its quest accurate:

…t listed in quest/m2/automation/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/automation/checks.md: not listed in quest/m2/automation/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/automation/review.md: not listed in quest/m2/automation/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/chatgpt-hosted.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/chatgpt-waitlist.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/cloud/README.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/cloud/README.md: quest title must be '# [XS|S|M|L|XL] Title'
quest: quest/m2/cloud/billing.md: not listed in quest/m2/cloud/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/cloud/donors.md: not listed in quest/m2/cloud/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/cloud/funding.md: not listed in quest/m2/cloud/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/cloud/runners.md: not listed in quest/m2/cloud/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/council.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/donor-isolation.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/donor-runner.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/hook-path-error.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/legacy-labels.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/mobile-app.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m2/review-harnesses.md: not listed in quest/m2/README.md's '## Required'; an unlisted quest is unreachable
##[error]Process completed with exit code 1.
Post job cleanup.
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git version
git version 2.55.0
Temporarily overriding HOME='/var/cache/github-runner-work/_temp/e3728256-4859-4c5f-829e-9e301f13e060' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --global --add safe.directory /var/cache/github-runner-work/quest/quest
Removing SSH command configuration
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
Removing HTTP extra header
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
Removing includeIf entries pointing to credentials config files
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
Post job cleanup.
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git version
git version 2.55.0
Temporarily overriding HOME='/var/cache/github-runner-work/_temp/a92b245d-b2cc-426c-93f3-d8d829dce2ba' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --global --add safe.directory /var/cache/github-runner-work/quest/quest
Removing SSH command configuration
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
Removing HTTP extra header
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
Removing includeIf entries pointing to credentials config files
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
[command]/nix/store/lg46w7hrjx7kylsh6645c9l975i8h43b-git-2.55.0/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
A job completed hook has been configured by the self-hosted runner administrator
##[group]Run '/nix/store/gx2v6q84b0w43bafm0whkdx93qyxbpps-ci-cache-gc.sh/bin/ci-cache-gc.sh'
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash --noprofile --norc -e -o pipefail {0}
##[endgroup]
evicted 0 objects and 0 action results (0 B logical); 35.5 GiB logical remain
Cleaning up orphan processes

Queue / Queue (job) failure at step Require the build to pass:

Current runner version: '2.338.2'
##[group]Runner Image Provisioner
Hosted Compute Agent
Version: 20261028.624
Commit: 54898b74c23fde5556c9b3c3a2290865feef0dfe
Build Date: 2026-10-28T21:51:42Z
Worker ID: {be45e5c4-3f51-4a22-9aff-29c4fafe000c}
Region: centralus
Cloud: Azure
##[endgroup]
##[group]Operating System
Ubuntu
24.04.5
LTS
##[endgroup]
##[group]Runner Image
Image: ubuntu-24.04
Version: 20261101.360.1
Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20261101.360/images/ubuntu/Ubuntu2404-Readme.md
Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20261101.360
##[endgroup]
##[group]GITHUB_TOKEN Permissions
Contents: read
Metadata: read
PullRequests: read
##[endgroup]
Secret source: Actions
Cache mode: write
Prepare workflow directory
Prepare all required actions
Complete job name: Queue
##[group]Run [[ "$RESULT" == success ]] || { echo "::error::the queue build ended $RESULT" >&2; exit 1; }
�[36;1m[[ "$RESULT" == success ]] || { echo "::error::the queue build ended $RESULT" >&2; exit 1; }�[0m
shell: /usr/bin/bash -e {0}
env:
  RESULT: failure
##[endgroup]
##[error]the queue build ended failure
##[error]Process completed with exit code 1.
Cleaning up orphan processes

(written by quest land watch)

@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

codex, gpt-6.1-sol, medium effort land fixer note:

The queue deliberately validates the merge with the CLI built from base. The failure log shows:

Line 264:

./quest-base/bin/quest --root "$GITHUB_WORKSPACE" check --base "$BASE" --branch "$head_ref"

Line 272:

quest: quest/m0/README.md: not listed in quest/README.md's '## Required'; an unlisted quest is unreachable

Line 278:

quest: quest/m0/flaky/README.md: quest title must be '# [XS|S|M|L|XL] Title'

The diff removes child lists throughout the quest tree and changes src/core/rules.ts to reject an epic's Required entries for quests it holds. Restoring the lists would conflict with that intended behavior. This needs a reviewed, staged transition so the base validator accepts the new format before the repository tree adopts it. No branches or tracked files were changed; repository checks were not run because the logged failure and opposing validation rules establish a migration decision outside mechanical repair.

(written by codex, gpt-6.1-sol, medium effort)

@moq-bot

moq-bot Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

codex, gpt-6.1-sol, medium effort land fixer: The queue's base-built quest check rejects PR &#35;518's intentional removal of child lists: quest: quest/m0/README.md: not listed in quest/README.md's '&#35;&#35; Required'; an unlisted quest is unreachable. The. Recommendation: Split the migration: land a reviewed validator transition that accepts both tree formats while retaining the existing lists, then migrate the tree after the queue builds that validator from base; enfo

##[group]Run # Build concurrency and group size are both one in main's ruleset.
�[36;1m# Build concurrency and group size are both one in main's ruleset.�[0m
�[36;1m[[ "$QUEUE_REF" =~ ^refs/heads/gh-readonly-queue/main/pr-([0-9]+)- ]] || { echo "::error::unexpected merge group ref" >&2; exit 1; }�[0m
�[36;1mhead_ref=$(gh api "repos/$REPO/pulls/${BASH_REMATCH[1]}" --jq .head.ref)�[0m
�[36;1m./quest-base/bin/quest --root "$GITHUB_WORKSPACE" check --base "$BASE" --branch "$head_ref"�[0m
shell: /nix/store/1mv3qz005gkbalxfghk4y3s8ayv4d2dl-bash-interactive-5.3p15/bin/bash -e {0}
env:
  BASE: 1c3cf6a719c8ac8e98181475e27e25d25a5ebbc2
  GH_TOKEN: ***
  REPO: moq-dev/quest
  QUEUE_REF: refs/heads/gh-readonly-queue/main/pr-518-1c3cf6a719c8ac8e98181475e27e25d25a5ebbc2
##[endgroup]
quest: quest/m0/README.md: not listed in quest/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/claude-rm-upstream.md: not listed in quest/m0/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/codex-cloud-off.md: not listed in quest/m0/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/codex-project-config.md: not listed in quest/m0/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/context-rules.md: not listed in quest/m0/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/flaky/README.md: not listed in quest/m0/README.md's '## Required'; an unlisted quest is unreachable
quest: quest/m0/flaky/README.md: quest title must be '# [XS|S|M|L|XL] Title'

(written by codex, gpt-6.1-sol, medium effort)

The merge queue checks a PR with the CLI built from its base, which rejects
a tree whose epics no longer list their children. Stage the change: this PR
ships directory membership with a validator that accepts an epic's
Required link to a quest it holds, counting it once as a child, and keeps
this tree's child lists. Removing held links and enforcing their absence
move to the follow-up that migrates the tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Design change: staged in 2 PRs (user decision, 2026-11-07; rejected: admin-bypass merge once, skip, delete).

The merge queue checks this PR with the CLI built from base, and base's CLI rejected the migrated tree. This PR now ships directory membership with a validator that accepts both tree formats. An epic's Required link to a quest it holds is allowed and counts once, as a child. This tree keeps its child lists. remove() no longer strips held links, so routine quest check --fix, quest rm, and base-merge prunes do not migrate the tree inside unrelated PRs.

The follow-up, quest/m0/token-waste/child-lists.md (rewritten here), restores the stripping, migrates the tree with quest check --fix, and makes held links an error.

Verified: quest built from origin/main at 1c3cf6a passes check --base origin/main --branch quest/m0/token-waste/child-lists on c5065a2 (82 documents ok).

(Written by Claude Opus 5.5 with high effort)

kixelated and others added 3 commits November 7, 2026 11:05
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A link to a deeper quest stays a blocker, as on a tree that listed
children, so an invalid subtree cannot hide it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head 9c48c20 against base d29a0d2, comparing branch-specific changes with previously reviewed head 75d43e0.

No new actionable findings in the staged-rollout changes. Existing direct-child links now count once as membership in requires(), blocker expansion and impact ranking. Deeper or missing targets remain explicit blockers, and ranking validates structural membership before using the graph. The updated tests cover listed/unlisted equivalence, the deeper-target case, and preservation of remaining child links when removing one quest.

The repository retains its child lists, while automatic stripping and strict rejection move to the follow-up quest. This addresses the base-built validator rollout constraint without migrating unrelated trees as a side effect of check --fix or removal.

Direction: proceed through the normal base-validator and merge-group checks. This updates my earlier migration recommendation: pin bumps to this compatibility stage need no child-list migration; migration belongs with the later strict-format change documented in the follow-up.

Verification limits: GitHub-only static diff and source/test inspection. I did not execute tests, build either CLI, or independently reproduce the reported base-validator run.

(Written by review (OpenAI))

@kixelated
kixelated added this pull request to the merge queue Nov 7, 2026
Merged via the queue into main with commit 7f17c66 Nov 7, 2026
17 checks passed
@kixelated
kixelated deleted the quest/m0/token-waste/child-lists branch November 7, 2026 20:41
kixelated added a commit that referenced this pull request Nov 7, 2026
Restore the stripping #518 staged out: remove() drops every epic's Required
link to a quest it holds, so quest check --fix, quest rm, and the land
daemon's base-merge prune migrate an old tree, and --fix runs with no
history. quest check now errors on "requires X, which this epic holds".
Migrate this tree with quest check --fix, and the land fixer no longer
adds the flaky quest's link to quest/m0/flaky/README.md.

BREAKING CHANGE: repositories migrate with quest check --fix on their pin
bump past this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant