@attalabs/vinaya 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/aeg-root/enforcement.md +1 -1
- package/dist/checks/bin/check-branch-topology.js +11 -2
- package/dist/checks/bin/check-brief-shape.js +17 -3
- package/dist/checks/bin/check-closes-n.js +11 -2
- package/dist/checks/bin/check-coherence.js +11 -2
- package/dist/checks/bin/check-dead-branch-push.js +11 -2
- package/dist/checks/bin/check-dispatch-readiness.js +11 -2
- package/dist/checks/bin/check-doc-coverage-push.js +11 -2
- package/dist/checks/bin/check-doc-coverage.js +11 -2
- package/dist/checks/bin/check-first-push-dispatch.js +11 -2
- package/dist/checks/bin/check-issue-assignment.js +11 -2
- package/dist/checks/bin/check-no-disk-state.js +11 -2
- package/dist/checks/bin/check-reader-resolvable-prose.js +11 -2
- package/dist/checks/bin/check-registry-gates.js +11 -2
- package/dist/checks/bin/check-review-gate.js +11 -2
- package/dist/checks/bin/check-single-plan-pr.js +11 -2
- package/dist/checks/bin/check-test-plan.js +11 -2
- package/dist/index.js +26 -12
- package/package.json +1 -1
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/vinaya.config.json +36 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/vinaya.config.json +36 -0
- package/studio-standalone/_node_modules/@atta/vinaya-cli/aeg-root/enforcement.md +1 -1
- package/studio-standalone/_node_modules/@attalabs/vinaya/aeg-root/enforcement.md +1 -1
- package/studio-standalone/apps/vinaya/cli/aeg-root/enforcement.md +1 -1
- package/studio-standalone/apps/vinaya/web/.next/BUILD_ID +1 -1
- package/studio-standalone/apps/vinaya/web/.next/build-manifest.json +3 -3
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/cli/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/config/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/cli/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/harness/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/state-machine/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/[...slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/reference/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/install/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/roadmap/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/archive/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/brief/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/develop/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/overview/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/plan/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/quick/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/review/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/security/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/wrap-up/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/state-machine/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-harness/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-studio/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.html +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/api/coherence/route.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/backlog/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/[...slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/tranches/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/chunks/ssr/[root-of-the-server]__0kqmrho._.js +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/middleware-build-manifest.js +3 -3
- package/studio-standalone/apps/vinaya/web/.next/server/pages/500.html +1 -1
- /package/studio-standalone/apps/vinaya/web/.next/static/{mSHYKKSLd91iaLw52dYpD → LixrFgIixvAYndTclqOnR}/_buildManifest.js +0 -0
- /package/studio-standalone/apps/vinaya/web/.next/static/{mSHYKKSLd91iaLw52dYpD → LixrFgIixvAYndTclqOnR}/_clientMiddlewareManifest.js +0 -0
- /package/studio-standalone/apps/vinaya/web/.next/static/{mSHYKKSLd91iaLw52dYpD → LixrFgIixvAYndTclqOnR}/_ssgManifest.js +0 -0
package/dist/index.js
CHANGED
|
@@ -1247,6 +1247,9 @@ function printJson(data) {
|
|
|
1247
1247
|
function realDeps2() {
|
|
1248
1248
|
return { detectRepo: detectGitRepo };
|
|
1249
1249
|
}
|
|
1250
|
+
function defaultSleep(ms) {
|
|
1251
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1252
|
+
}
|
|
1250
1253
|
var COMMAND_TIMEOUT_MS = 20000;
|
|
1251
1254
|
var DEAD_BRANCH_LABEL = label("dead-branch-push");
|
|
1252
1255
|
var DEAD_BRANCH_MARKER = `<!-- ${DEAD_BRANCH_LABEL} -->`;
|
|
@@ -1392,6 +1395,18 @@ function fetchAssociatedMergedPrs(sha, repoFlag) {
|
|
|
1392
1395
|
const prs = JSON.parse(out);
|
|
1393
1396
|
return prs.filter((pr) => pr.merged_at !== null).map((pr) => pr.number);
|
|
1394
1397
|
}
|
|
1398
|
+
var DIRECT_PUSH_POLL_ATTEMPTS = 6;
|
|
1399
|
+
var DIRECT_PUSH_POLL_DELAY_MS = 20000;
|
|
1400
|
+
async function pollAssociatedMergedPrs(sha, repoFlag, fetch, attempts, delayMs, sleep) {
|
|
1401
|
+
for (let attempt = 1;attempt <= attempts; attempt++) {
|
|
1402
|
+
const prs = fetch(sha, repoFlag);
|
|
1403
|
+
if (prs.length > 0)
|
|
1404
|
+
return prs;
|
|
1405
|
+
if (attempt < attempts)
|
|
1406
|
+
await sleep(delayMs);
|
|
1407
|
+
}
|
|
1408
|
+
return [];
|
|
1409
|
+
}
|
|
1395
1410
|
function incidentAlreadyOpen(sha, repoFlag) {
|
|
1396
1411
|
const out = sh2([
|
|
1397
1412
|
"gh",
|
|
@@ -1440,11 +1455,11 @@ function openDirectPushIncident(sha, repoFlag) {
|
|
|
1440
1455
|
DIRECT_PUSH_LABEL
|
|
1441
1456
|
]);
|
|
1442
1457
|
}
|
|
1443
|
-
function runDirectMainPushCheck(sha, repoFlag) {
|
|
1444
|
-
const associatedMergedPrNumbers =
|
|
1458
|
+
async function runDirectMainPushCheck(sha, repoFlag, deps) {
|
|
1459
|
+
const associatedMergedPrNumbers = await pollAssociatedMergedPrs(sha, repoFlag, deps.fetchAssociatedMergedPrs ?? fetchAssociatedMergedPrs, deps.pollAttempts ?? DIRECT_PUSH_POLL_ATTEMPTS, deps.pollDelayMs ?? DIRECT_PUSH_POLL_DELAY_MS, deps.sleep ?? defaultSleep);
|
|
1445
1460
|
const result = checkDirectMainPush({ sha, associatedMergedPrNumbers });
|
|
1446
1461
|
if (result.verdict === "direct-push") {
|
|
1447
|
-
openDirectPushIncident(sha, repoFlag);
|
|
1462
|
+
(deps.openDirectPushIncident ?? openDirectPushIncident)(sha, repoFlag);
|
|
1448
1463
|
return { verdict: "direct-push" };
|
|
1449
1464
|
}
|
|
1450
1465
|
return { verdict: "legitimate", mergedPrNumber: result.mergedPrNumber };
|
|
@@ -1480,7 +1495,7 @@ async function runAudit(args, deps) {
|
|
|
1480
1495
|
const repoFlag = `${repo.owner}/${repo.repo}`;
|
|
1481
1496
|
const sha = parseSha(args) ?? sh2(["git", "rev-parse", "HEAD"]);
|
|
1482
1497
|
const deadBranch = only === "direct-push" ? { scanned: 0, findings: [] } : runDeadBranchAudit(repoFlag);
|
|
1483
|
-
const directPush = only === "dead-branches" ? null : runDirectMainPushCheck(sha, repoFlag);
|
|
1498
|
+
const directPush = only === "dead-branches" ? null : await runDirectMainPushCheck(sha, repoFlag, deps);
|
|
1484
1499
|
const failed = directPush?.verdict === "direct-push";
|
|
1485
1500
|
if (jsonOutput) {
|
|
1486
1501
|
printJson({
|
|
@@ -1559,7 +1574,10 @@ function coreCheckRegistry() {
|
|
|
1559
1574
|
run: bin("check-brief-shape"),
|
|
1560
1575
|
scope: "diff",
|
|
1561
1576
|
timeoutMs: 15000,
|
|
1562
|
-
env: {
|
|
1577
|
+
env: {
|
|
1578
|
+
PR_BODY: { optional: true },
|
|
1579
|
+
BRANCH: { optional: true }
|
|
1580
|
+
}
|
|
1563
1581
|
},
|
|
1564
1582
|
{
|
|
1565
1583
|
name: "doc-coverage",
|
|
@@ -2663,7 +2681,7 @@ name: Vinaya Checks
|
|
|
2663
2681
|
|
|
2664
2682
|
on:
|
|
2665
2683
|
pull_request:
|
|
2666
|
-
types: [opened, synchronize, reopened]
|
|
2684
|
+
types: [opened, synchronize, reopened, edited]
|
|
2667
2685
|
|
|
2668
2686
|
jobs:
|
|
2669
2687
|
vinaya-checks:
|
|
@@ -2735,12 +2753,8 @@ jobs:
|
|
|
2735
2753
|
# it the adapter reads "no PR yet — local dev" and exits 0, and
|
|
2736
2754
|
# the gate is green regardless of review state.
|
|
2737
2755
|
PR_NUMBER: \${{ github.event.pull_request.number }}
|
|
2738
|
-
# Same PR_BODY gap as vinaya-checks.yml — this job also runs
|
|
2739
|
-
# \`check --all\` (test-plan/closes-n included), so it needs the
|
|
2740
|
-
# same wiring or those two checks pass vacuously here too.
|
|
2741
|
-
PR_BODY: \${{ github.event.pull_request.body }}
|
|
2742
2756
|
BRANCH: \${{ github.head_ref }}
|
|
2743
|
-
run: npx --yes @attalabs/vinaya check
|
|
2757
|
+
run: npx --yes @attalabs/vinaya check review-gate
|
|
2744
2758
|
`;
|
|
2745
2759
|
}
|
|
2746
2760
|
function reviewVerdictWorkflow() {
|
|
@@ -5541,7 +5555,7 @@ var COMMANDS = [
|
|
|
5541
5555
|
{ flag: "--json", description: "Enveloped JSON output" }
|
|
5542
5556
|
],
|
|
5543
5557
|
details: [
|
|
5544
|
-
"Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it opens an incident Issue and exits 1 if a commit on `main` has no associated merged PR.",
|
|
5558
|
+
"Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it polls the merge-association API for up to ~100s before deciding, then opens an incident Issue and exits 1 if a commit on `main` genuinely has no associated merged PR.",
|
|
5545
5559
|
"The same logic the generated `vinaya-archivist.yml` workflow's `daily-drift` and `direct-main-push-detection` jobs run on schedule / on every push to `main` — callable directly for a one-off run or local verification."
|
|
5546
5560
|
],
|
|
5547
5561
|
status: "shipped"
|
package/package.json
CHANGED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_title: Projects
|
|
3
|
+
---
|
|
4
|
+
# Projects in this repo
|
|
5
|
+
|
|
6
|
+
**The project registry.** Declares the projects in this repo and where each one's specs and per-project state live. The `Project` field on a task (a forge Issue) resolves against this file: `Project: vada` → the Developer reads that project's specs, the Archivist updates its per-project state.
|
|
7
|
+
|
|
8
|
+
## What a project is (and isn't)
|
|
9
|
+
|
|
10
|
+
A project is **a `(name, folder)` pair the developer declared** — nothing more. Not derived from the folder tree, not required to match a `package.json` name, not required to be a single package. AEG does not define what a project "really" is; the developer does, by choosing a name and a home folder when registering it.
|
|
11
|
+
|
|
12
|
+
The folder is simply **the home for that project's specs and status** (`<path>/specs/`, `<path>/aeg-project/`). A project may be one package, an app, or a grouping built from several packages.
|
|
13
|
+
|
|
14
|
+
- **Identity = the registry row.** A project exists because it has a row here, not because a folder with some name exists somewhere. Nothing searches the tree; names are unique by this registry, paths are whatever the human gave.
|
|
15
|
+
- **Path = declared, never derived.** `--path` is a required argument to `aeg add-project`; the tool stores it.
|
|
16
|
+
|
|
17
|
+
**Presence of this file means this is a multi-project repo** — the `Project` field is required. A single-project repo has **no** `projects.md`; every task shares one project, so the field is omitted, and state lives in the root `aeg-project/`. The registry appears only when there is more than one project to disambiguate.
|
|
18
|
+
|
|
19
|
+
## Registry
|
|
20
|
+
|
|
21
|
+
| Project | Path | Specs | Per-project state |
|
|
22
|
+
|----------|-----------------------|-----------------------------|--------------------------------------|
|
|
23
|
+
| admin | `tools/admin` | `tools/admin/specs/` | (state tracked globally for now) |
|
|
24
|
+
| vada | `apps/vada-ai` | `apps/vada-ai/specs/` | `apps/vada-ai/aeg-project/` |
|
|
25
|
+
| herald | `apps/herald-ai` | `apps/herald-ai/specs/` | `apps/herald-ai/aeg-project/` |
|
|
26
|
+
| aeg-core | `packages/aeg-core` | `packages/aeg-core/specs/` | (state tracked globally for now) |
|
|
27
|
+
| aeg-forge-state | `packages/aeg-forge-state` | `packages/aeg-forge-state/specs/` | (state tracked globally for now) |
|
|
28
|
+
| attalabs | `apps/attalabs` | `apps/attalabs/specs/` | (state tracked globally for now) |
|
|
29
|
+
| vinaya | `apps/vinaya` | `apps/vinaya/specs/` | Issue #768 (pinned) |
|
|
30
|
+
|
|
31
|
+
> **admin** — `tools/admin`: the internal Sanity-backed admin tool for managing per-product theme/library config across every AttaLabs product (not a product itself, no `.attalabs.dev` domain). Had real code and a task PR (#557, the Library-picker feature) before ever getting a registry row — added retroactively once that gap was noticed. `tools/*` carries no `-ai` suffix (internal-tooling convention, like `apps/desktop`, `apps/attalabs`).
|
|
32
|
+
|
|
33
|
+
> **vinaya** — Vinaya: the npm-distributed reference implementation of AEG, installed into any GitHub repository. One app folder, three workspaces: `apps/vinaya/cli` (the `vinaya` command — init/check/pr/issue/doctor/upgrade/eject/demo/waiver), `apps/vinaya/web` (**Vinaya Studio**, ported from the old AEG Studio app), and `apps/vinaya/sources` (the StateSource adapters — forge-backed primary, file-backed transitional). Imports `@atta/aeg-core` unchanged; the vinaya-namespace migration of shared code rides the later npm extraction, never a standalone rename. The registry row deliberately precedes the code. "Vinaya is the reference implementation of AEG": AEG stays the model's name (`aeg-root/` is untouched); Vinaya is the tool. Pāli name by elective aesthetic. `apps/vinaya` carries no `-ai` suffix (meta/infra convention).
|
|
34
|
+
|
|
35
|
+
> **attalabs** — The AttaLabs ecosystem hub app (`@atta/attalabs-web`/`-mobile`/`-mcp-server`, serving `attalabs.dev`), distinct from **Atta** (the deep-thinking AI product — Vāda+Vitakka+Sati; its dedicated app scaffold, `apps/atta-ai`, was retired — Atta remains a real, code-less concept, not a registered project). Registered here because it has real code and its own `apps/attalabs/specs/`, but had no registry row until it was added retroactively (found while sizing an unrelated task's `Project(s)` field). `apps/attalabs` carries no `-ai` suffix (meta/infra-app convention, like `apps/desktop`).
|
|
36
|
+
|
|
37
|
+
> **aeg-core** — `@atta/aeg-core` (`packages/aeg-core`): the pure, no-I/O package the AEG product runs on. Two capabilities: parse a repo's AEG artifacts (registry, tranche files) into a typed model, and `deriveTranche(tranche, forgeFacts)` → per-task derived status + the dependency/conflict graph + dispatch eligibility, mirroring `tranche-model.md` §3 exactly. Both **AEG Studio** (local, the first consumer) and the future **Portal** (hosted) read through this same substrate; they differ only in how they fetch the inputs. Registered as a project because a task declares `Project: aeg-core` — a package may be a project, per this file's framing above.
|
|
38
|
+
|
|
39
|
+
> **aeg-forge-state** — `@atta/aeg-forge-state` (`packages/aeg-forge-state`): the one sanctioned adapter that reads live GitHub forge state (Milestone + labeled Issues) and derives the typed `Tranche`/`Task` shapes `aeg-core`'s pure evaluators consume — `gh`-CLI-only, read-only, zero topology file. Listed in `.aeg/packages` as its own collision domain (distinct from `aeg-core`) since before this row, but had no registry row of its own — any task editing its `src/**` had no `Project:` whose declared path actually covered it, forcing every prior task to fall back on a `blast-radius-ack:` line instead of a real ownership match. Registered retroactively (found while planning follow-on forge-adapter test-coverage and label-vocabulary work) for the same reason `attalabs` and `admin` were: real code, its own collision domain, no row.
|
|
40
|
+
|
|
41
|
+
## How `Project` is validated
|
|
42
|
+
|
|
43
|
+
This registry is the **authority for valid project names.** A `Project:` value is valid iff every name in it is a row above. The Planner and Developer resolve `Project:` against this file; an unmatched name (a typo like `vda`, or unregistered) makes the task malformed and the agent refuses rather than guessing — *"Project 'vda' isn't registered; did you mean 'vada', or run `aeg add-project` first?"* Can also run mechanically in `verify-docs`.
|
|
44
|
+
|
|
45
|
+
## A task can span multiple projects — and that is normal
|
|
46
|
+
|
|
47
|
+
`Project` is **multi-valued.** A task carries as many projects as it genuinely touches: usually one (`Project: vada`), sometimes several (`Project: engine, herald`, or more). Not an exception — cross-project PRs are an expected shape. The Planner decides split-vs-combine by **verification coupling** (see `tranche-model.md` §6): provable independently → separate tasks with a `depends-on` edge; provable only as a unit → one task / branch / PR / multiple projects. The same `Ticket:` rides on all resulting tasks, so work stays atomic in Jira however it's shaped in AEG.
|
|
48
|
+
|
|
49
|
+
When a task lists multiple projects, every mechanism fans out: the Developer reads every listed project's specs; the PR is reviewed through each project's lens (more projects = more review lenses = proportionally more rigor, matching the wider blast radius); the Archivist updates every listed project's `state.md` (non-derivable operational facts; `now.md` is retired).
|
|
50
|
+
|
|
51
|
+
## Routing vs. conflicts — two different granularities
|
|
52
|
+
|
|
53
|
+
`Project` is the **coarse routing/ownership label** — "whose specs, whose state." It is **not** the conflict unit. Conflicts happen at the **package / collision-domain level**:
|
|
54
|
+
|
|
55
|
+
- **Collision domains are packages**, listed in a rarely-changed static file, `.aeg/packages`. Known cross-cutting paths that couple tasks across package boundaries — **lockfiles, `migrations/`, codegen outputs (protobuf/GraphQL/OpenAPI), monorepo config (tsconfig/eslint/turbo)** — are declared as their own collision domains.
|
|
56
|
+
- Two tasks conflict if they touch the same collision domain. The canonical case: a task generalizing `@atta/engine` (a package Vāda shares) conflicts with any in-flight Vāda task touching the engine — different projects, same package, real collision. So conflict detection keys on **packages, not projects**.
|
|
57
|
+
- Conflicts are **declared by the Planner** (`conflicts-with` edges) and **static**. The gate is forge-answerable with zero stored state: "is a `conflicts-with` sibling's PR open?" There is **no dynamic path-overlap scanner** — that would need a live task→changed-files map, the mutable state AEG eliminates (forbidden; see `tranche-model.md` §9). When unsure two tasks collide, declare the conflict and serialize.
|
|
58
|
+
|
|
59
|
+
Don't conflate them: `Project` = whose specs/state; `conflicts-with` (via collision domains) = whose files.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
Project backlogs (held / future items, out of the AEG flow) live alongside each project's specs as `<path>/specs/<project>-backlog.md`. Cross-cutting / ecosystem items are cut as backlog Issues on the forge (the old `specs/ecosystem-backlog.md` was deleted).
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_title: Manual Flow
|
|
3
|
+
---
|
|
4
|
+
# AEG — Running the Flow by Hand
|
|
5
|
+
|
|
6
|
+
**Agentic Execution Governance (AEG)**, manual mode. The playbook for running the flow with nothing but a coding agent, a Git forge, and this repo — no orchestration tool required.
|
|
7
|
+
|
|
8
|
+
Companion to `process.md` (the eleven-phase walkthrough), `state-machine.md` (the constitution), `tranche-model.md` (the tranche + task model), and the `roles/` docs. This file is the operator's guide: what a human does, in what order, calling which agent, with what in hand.
|
|
9
|
+
|
|
10
|
+
> **AEG is forge-native, orchestrator-independent.** It depends on a Git forge (GitHub/GitLab) the way it depends on git — the forge is its source of truth for execution state. It does **not** depend on any orchestration tool; a human or a thin dispatch script invokes roles. Knowledge flows one way: a tool may know AEG; AEG does not know the tool.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 0. Starting and maintaining an AEG repo (`aeg.sh`)
|
|
15
|
+
|
|
16
|
+
AEG "init" is not software — it is a **state the repo is in**. A repo is running AEG when **everything the flow references is present**:
|
|
17
|
+
|
|
18
|
+
1. **The model layer** — `aeg-root/` scaffold (exists ONCE, at the repo root only): `state-machine.md`, `coordination.md`, `process.md`, `aeg-manual-flow.md`, `tranche-model.md`, `roles/`, `skills/` (the AEG skills — canonical home); plus `projects.md` only once multi-project.
|
|
19
|
+
2. **The living-state layer** — forge-native. State only, never the model: active/blocked/next is derived from Issue/branch/PR state, and completed-work history, lessons, per-project operational state, and ratification items live in `git log`/PR history, pinned Issues, and the `needs:principal-input` label respectively.
|
|
20
|
+
3. **The enforcement layer (referenced by the model, so it must travel with it):**
|
|
21
|
+
- `.aeg/packages` — the static collision-domain list (conflicts are package-level, `tranche-model.md` §5).
|
|
22
|
+
- the `verify-docs` script (`packages/aeg-core/bin/verify-docs.ts`), run as a step of the `aeg-gate-suite` job in `.github/workflows/forge-lifecycle.yml` — the doc-tier CI gate. The standalone `verify-docs.yml` workflow it once had was consolidated into that job and deleted.
|
|
23
|
+
- the Issue template restricting Issues to deps / conflicts / project label / ticket link, and the CI check rejecting forbidden planning fields (`tranche-model.md` §9.3).
|
|
24
|
+
- the generated agent-surface skill view (e.g. `.claude/skills/`) — derived from `aeg-root/skills/`.
|
|
25
|
+
4. At least one tranche file exists, and the role docs are reachable.
|
|
26
|
+
|
|
27
|
+
You can create that by hand, or use **`aeg.sh`** — one self-contained, downloadable shell script (from the AEG site). It is a **dumb scaffolder**: it writes files, nothing else. It does not dispatch agents, query the forge, or reason — that's a tool's or a human's job. Self-contained (scaffold embedded, no network) so you can read every byte first. It lays down **all four layers above** — not just `aeg-root/` + `aeg-project/` — so the unit it produces is complete: nothing the model references is missing. Subcommands:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
aeg init [folder] # scaffold the repo (once): model + state + enforcement + skills
|
|
31
|
+
aeg add-project <name> --path <folder> # register a project (creates/appends projects.md + stubs)
|
|
32
|
+
aeg new-tranche <name> # create a thin tranche topology file
|
|
33
|
+
aeg generate-skills # regenerate the agent-surface skill view from aeg-root/skills/
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`init` scaffolds the enforcement layer (`.aeg/packages`, the verify-docs workflow + script, the Issue template/CI check) and the skills alongside `aeg-root/` + `aeg-project/`, because the model docs reference all of them — a unit missing any of them references a gate that isn't there. `add-project` stores the `--path` verbatim (never derives it), refuses to overwrite an existing folder or re-register a name, and on first use promotes a single-project repo to multi-project. `generate-skills` writes the agent-specific skill view (Claude Code's `.claude/skills/`, or another agent's equivalent) from the canonical skills in `aeg-root/skills/` — so the canonical skills travel with the unit and the loadable view is rebuilt, never authored by hand. See `projects.md`. Tasks themselves are **forge Issues**, created by the Planner on the forge — not by `aeg.sh`.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 1. The flow is the product; a tool is optional
|
|
41
|
+
|
|
42
|
+
AEG is the flow. A tool may *automate the orchestration slice* — collapsing the hand-offs between roles into commands — but it is not the flow, and the flow does not depend on it. Everything below runs by hand: you open your coding agent, name the role, the agent reads its role doc, checks whether it should act now (against forge state), and does the work.
|
|
43
|
+
|
|
44
|
+
**Manual mode is the teaching mode.** Companies fear AI because work happens invisibly. AEG's hand-offs make the invisible visible: each is a checkpoint where a human sees a risk automation hides — why review is separate from authorship, why the brief is frozen into the PR, why nothing merges without a human, why the reasoning is frozen with the change. Running it by hand once teaches the *why* of every gate.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 2. The task model — Issues + forge-derived status
|
|
49
|
+
|
|
50
|
+
A **task is a forge Issue.** Its status is never written anywhere — it is **derived by querying the forge**:
|
|
51
|
+
|
|
52
|
+
| Status | Forge fact |
|
|
53
|
+
|--------|-----------|
|
|
54
|
+
| `todo` | Issue open (assigned or unassigned), no branch — all open tranche tasks are minimum `todo`; `backlog` is project-level only |
|
|
55
|
+
| `in-flight` | branch `task/<tranche>/<n>` exists, no PR |
|
|
56
|
+
| `in-review` | PR open |
|
|
57
|
+
| `changes-requested` | PR open, `reviewDecision: CHANGES_REQUESTED` |
|
|
58
|
+
| `merged` | PR merged (Issue auto-closes) |
|
|
59
|
+
| `blocked` | `vinaya/blocked` label present — wins over every other conclusion |
|
|
60
|
+
| `dropped` | Issue closed `NOT_PLANNED` — decided against, not done |
|
|
61
|
+
| `incoherent` | Issue closed `COMPLETED` with no merged PR — done-but-unprovable, surfaced for a human |
|
|
62
|
+
|
|
63
|
+
This table is a **reader's summary, not the source.** The authoritative list is `DERIVED_STATUSES` + the ordered `DERIVATION_RULES` in `packages/aeg-core/src/state-machine-model.ts`, rendered live at `/docs/state-machine`; order is load-bearing there in ways a flat table cannot show.
|
|
64
|
+
|
|
65
|
+
So **no role ever writes status.** Opening the PR *is* the in-review signal; merging *is* the done signal. To see the board you query the forge (`gh pr list`, the Issues view, a project board) — you never read status from a file. The thin tranche file holds only topology (task→issue, dependency/conflict edges); see `tranche-model.md`.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 3. The brief is the unit of context
|
|
70
|
+
|
|
71
|
+
1. **Context lives in the brief.** If it isn't in the brief, it doesn't exist. An agent never needs to read elsewhere to understand its task.
|
|
72
|
+
2. **The brief is pasted, not committed — and lands in the PR body.** You hand it to the Developer directly (all sections per the `brief-authoring` skill). When the Developer opens the PR, the brief goes into the PR description — its permanent home, attached to the work it governed, read by Reviewer and Archivist. **Never in the Issue** (it would age and attract edits). Retry reuses the same PR body.
|
|
73
|
+
3. **`Ticket:` and `Project:` are reference-only.** `Ticket:` is N↔M provenance (Jira/Linear) — no agent reads it, it's never a substitute for brief context. `Project:` (multi-valued) resolves against `projects.md` to route the agent to the right specs (and is what the Reviewer spec-checks against, and what the Archivist records in the provenance block); omit it in a single-project repo.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 4. Every agent is self-locating
|
|
78
|
+
|
|
79
|
+
When invoked, an agent does not trust that you called it correctly. It checks two things first: **is this my phase?** (given forge state) and **is my input well-formed?** If either fails, it **refuses or redirects.** Every role has an entry gate.
|
|
80
|
+
|
|
81
|
+
**Shared state = the forge** (Issue / branch / PR / review / merge) **+ the thin tranche file** (topology). The gates read state that exists whether or not any tool runs. **The PR is the state machine:** no PR yet = not ready to review; open PR = ready to review; merged PR = ready to close out. That's what makes the gates work identically with or without a tool — and why no agent needs to write status.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 4.5. The conversational protocol — how every role talks to the Principal
|
|
86
|
+
|
|
87
|
+
Self-location (§4) is *what* an agent verifies before acting. The **conversational protocol** is *how* it speaks while it works. It applies to **every conversational role** (the Principal-facing Planner and Brief Author, and the Developer, Reviewer, Security passes), so that across the whole flow the human always knows **who is speaking, what stage they're in, what just happened, and what comes next.** A governed flow that runs silently is illegible; legibility is itself a governance property (it is the same "make the invisible visible" that §1 calls the point of manual mode).
|
|
88
|
+
|
|
89
|
+
This is a **shared, model-level protocol**. Each role specializes it in its own role doc (the Planner's specialization is in `roles/planner.md` — the first written; Brief Author, Developer, and Reviewer specializations follow as each is modeled). The shared spine, which no role overrides:
|
|
90
|
+
|
|
91
|
+
1. **Announce the role on entry.** Open by naming who you are and what you're about to do. The Principal should never be unsure which role/mode they're talking to. *"I'm the Planner. I'll turn this intent into a tranche — readiness gate first, then sizing, then the topology and the Issues."*
|
|
92
|
+
|
|
93
|
+
2. **Name the stages, and always say which one you're in.** State the stages up front; at each transition, say where you are. The Principal should be able to point at any moment and know the stage. *"Readiness — running it now."* … *"Readiness passed. Moving to sizing."*
|
|
94
|
+
|
|
95
|
+
3. **Narrate the load-bearing reads and the conclusions they produce — briefly.** Say what you're reading and what it told you, when it matters to a decision. Not a transcript; the reads that change the outcome. This is what turns a black box into a visible chain of reasoning, and lets the Principal catch a wrong turn early. *"Reading `llm.ts` — structured output only exists on the Anthropic path; that changes the sizing."*
|
|
96
|
+
|
|
97
|
+
4. **Move little by little; confirm before proceeding.** Don't dump everything at once. Work in small, confirmable steps — especially during clarification. Surface one cluster, get answers, reflect them back, **then** ask to proceed. The Principal sets the pace; you check in at each seam. *"That's the scope for the read path — lock it and move on, or refine more first?"*
|
|
98
|
+
|
|
99
|
+
5. **Reflect back before you commit anything durable.** Before writing a decision, a spec change, the topology, or the Issues, play back your understanding in your own words and get a yes. This catches misunderstanding before it becomes a commit.
|
|
100
|
+
|
|
101
|
+
6. **Signal stage completion clearly — every time, and especially at the end.** When a stage finishes, say so and say what's next. At the end, close out explicitly so the Principal is never left wondering whether it's done: *"Planning complete — topology written, N Issues cut (#…), dispatch order is […]. Nothing else is needed to plan this; the next stage is dispatch, which is yours to trigger."* The single most important line in the protocol is the one that says **"this stage is finished, here is what's next, and here is whose move it is."**
|
|
102
|
+
|
|
103
|
+
7. **Be clear about durability — never let the Principal think a conclusion lives only in the chat.** Everything you commit is on the forge/repo, permanent, not in conversation memory; if the laptop or the chat vanished, the committed work remains. When you record something, say plainly that it's written and where, so "decided but revisable" is never mistaken for "unsaved."
|
|
104
|
+
|
|
105
|
+
8. **Proactive coherence status report — before any phase that touches a prior task's archival state.** Before beginning any brief-authoring or execution phase, the chat-surface role MUST proactively report the coherence status of relevant prior tasks to the Principal — not just silently gate-fail on a mismatch. The pattern is **detect-and-INFORM**, not only detect-and-refuse. Do not wait for the Principal to ask. State the status of each predicate for each in-scope prior task, then declare whether the gate passes or fails and what is owed if it fails. Example: *"Before beginning brief for task X, I must report: prior task Y — Issue #N is closed ✓, PR #M is merged to main ✓, provenance block is absent ✗. Gate fails — the Archivist must post the provenance block on PR #M before I can author this brief. Here is what is owed: [list]."* Or, when all predicates pass: *"Prior task Y gate: Issue #N closed ✓, PR #M merged ✓, provenance block present ✓ — gate passes."* This report is mandatory even when the gate passes (one line suffices) — silence is not an acceptable "all good" signal.
|
|
106
|
+
|
|
107
|
+
Keep all of this **light** — a sentence at each seam, not paragraphs. The goal is a Principal who always feels oriented, never managed. Terse remains the house style (`coordination.md`); this protocol adds **signposting, not verbosity.** A role that runs the whole flow in silence and dumps a result at the end is violating the protocol even if the result is correct — because the Principal could not see, and therefore could not govern, the steps that produced it.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 5. The manual run order
|
|
112
|
+
|
|
113
|
+
| Step | Role | You hand it | It produces | Entry gate (refuses if…) |
|
|
114
|
+
|------|------|-------------|-------------|--------------------------|
|
|
115
|
+
| 0 | **Planner** (Brief Author mode) | intent + a ticket slice | a tranche: Issues + thin topology file | asked to write one brief / to implement |
|
|
116
|
+
| 1 | **Principal** (you) | an intent / goal | a decision to proceed, a tier | — |
|
|
117
|
+
| 2 | **Brief Author** (Brief Author mode) | the intent + the task's Issue | a brief, all sections | asked to write code instead of a brief |
|
|
118
|
+
| 3 | **Developer** | the brief | a worktree, the work, an open PR (brief in body) | input isn't a well-formed brief; a `depends-on` isn't merged; a `conflicts-with` sibling's PR is open |
|
|
119
|
+
| 4 | **Reviewer (code)** | "review the PR for task N" | VERDICT (APPROVE / REQUEST CHANGES) | no open PR, no brief in the PR body, or it authored the code |
|
|
120
|
+
| 5 | **Security** | "security-review the PR for task N" | VERDICT (PASS / FAIL) | no open PR, or no brief in the PR body |
|
|
121
|
+
| 6 | **Principal + Brief Author** (you) | the verdicts | merge decision (review side) | review passes not done |
|
|
122
|
+
| 7a | **Verification — agent half** (the Developer-agent re-runs) | the brief's §9 Test Plan | every `[agent]` item executed with the actual output posted to the PR | no open PR; no brief in the PR body; no Test Plan; or all items are `[principal]`-only |
|
|
123
|
+
| 7b | **Verification — Principal half** (you, in a browser) | the brief's §9 Test Plan | every `[principal]` checkbox ticked on the PR | no open PR; no brief in the PR body; no `[principal]` items in the Test Plan |
|
|
124
|
+
| 8 | **Principal** (you) | a PR with all Test Plan checkboxes ticked AND review verdicts clean | the merge | any Test Plan checkbox unticked, or review/security verdict unresolved |
|
|
125
|
+
| 9 | **Archivist** | "close out the PR for task N" | a close-out report + provenance block | **PR is not merged** |
|
|
126
|
+
|
|
127
|
+
Each agent finds the task's PR via the branch convention `task/<tranche>/<n>` and self-locates from forge state. Nobody writes status — the forge already reflects every transition. Every conversational role in this table follows the conversational protocol (§4.5): it announces itself, signposts its stage, and closes out clearly.
|
|
128
|
+
|
|
129
|
+
> **Verification is a phase, not a new actor.** Steps 7a and 7b are different halves of the **Verification phase** (`roles/developer.md` § Verification), split by who can structurally execute each test-plan item: the Developer-agent runs `[agent]` items because they don't require auth/keys/eyes-on-render; the Principal runs `[principal]` items because they do. Mirror of the chat-vs-terminal token-capture asymmetry. **Doctrine: CI green ≠ app boots ≠ feature works** — a passed review is not a green light to merge; a ticked-checkbox Test Plan is. A brief whose §4 surface is pure-logic declares `Test Plan: unit-tests-only` (a first-class allowed value) and Phase 11 is satisfied by the CI unit-test gate alone — no runtime execution needed.
|
|
130
|
+
|
|
131
|
+
### Tranche-close trigger
|
|
132
|
+
|
|
133
|
+
**When the last open task branch for a tranche is merged, the tranche enters Tranche Close** (Phase 13 in `process.md`). Detect this by querying the forge: `gh pr list --state open --json number,headRefName` filtered to branches matching `task/<tranche>/*` — if nothing returns, the tranche's last task has merged.
|
|
134
|
+
|
|
135
|
+
The Principal **initiates** tranche close explicitly (declares "we're closing this tranche" and hands off to the Planner / Brief Author). The Archivist **may detect** it automatically in future versions — when all task PRs merged and no open branches remain for the tranche. Until then, the Principal's explicit call is the gate.
|
|
136
|
+
|
|
137
|
+
See `process.md` Phase 13 for the full close-out steps: verify all tasks merged, run a brief retrospective, archive the tranche file, update state docs, ratify pending Type 1 decisions, declare what's next.
|
|
138
|
+
|
|
139
|
+
### Pre-merge gate (Step 8 prerequisite)
|
|
140
|
+
|
|
141
|
+
Before the Principal merges (Step 8), any Developer helping merge or pushing a "fix CI" commit after review must run this gate — it is the mechanical check that Verification (Steps 7a + 7b) is actually complete. If any item fails, post a comment on the PR listing exactly what's missing, and **block and report** — do not proceed with merge.
|
|
142
|
+
|
|
143
|
+
**Tool:** `gh pr view <n> --json reviews,statusCheckRollup,body`
|
|
144
|
+
|
|
145
|
+
**Check items (all three must pass):**
|
|
146
|
+
|
|
147
|
+
1. **Reviewer approved?** The JSON `reviews` array contains at least one entry with `state: APPROVED`.
|
|
148
|
+
2. **Test Plan `[agent]` items ticked?** The PR body's Test Plan section contains no unchecked `- [ ] **[agent]**` lines (Step 7a complete).
|
|
149
|
+
3. **Test Plan `[principal]` items ticked?** The PR body's Test Plan section contains no unchecked `- [ ] **[principal]**` lines (Step 7b complete).
|
|
150
|
+
|
|
151
|
+
If any fails: post a comment listing the exact items missing. The Principal decides whether to proceed.
|
|
152
|
+
|
|
153
|
+
> **At the end of every role's turn: report your tokens — you do not append your own row** to the tranche's token/cost ledger (`aeg-root/tranches/<name>.tokens.md`). No role writes its own row on a task branch: terminal roles (Developer; Archivist when automated) report exact figures from `/cost` in the PR body; chat roles (Planner, Brief Author, Reviewer, Security) report in their verdict comment or planning report, numeric cells `—` if unknown. The per-task **Archivist** collects every report and appends the rows — Phase, Role, Agent/Model, Tokens in, Tokens out, Cost, Date — post-merge at close-out; never edits a row; re-entry appends. See `tranche-model.md` §12 for the canonical format and the rationale; the file is a §13 append-only artifact.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 6. Per-role entry gates (refusal language)
|
|
158
|
+
|
|
159
|
+
**Planner** — see `roles/planner.md` (split-vs-combine by verification coupling; plan-integrity gates; the conversational protocol specialization). Refuses single-brief / implement requests; refuses execution metadata in the file or Issue; refuses planning metadata on Issues; refuses to build a conflict scanner; validates every `Project:` against the registry.
|
|
160
|
+
|
|
161
|
+
**Brief Author** — requires an intent (ideally an Issue). Refuses to implement: *"I author the brief, I don't implement."* Produces a brief per the skill (tier, type, scope, stop conditions, deliverable, optional `Ticket:`/`Project:`).
|
|
162
|
+
|
|
163
|
+
**Developer**
|
|
164
|
+
- Requires a well-formed brief. If handed a loose prompt → *"This isn't a brief — missing tier / scope / stop-conditions. Get one from the Brief Author."*
|
|
165
|
+
- Checks the gates against the forge before starting: dependency's PR merged? conflicting sibling's PR closed? If not → *"Task N serializes behind <dep/sibling>; not starting."*
|
|
166
|
+
- If `Project:` doesn't resolve against the registry → *"Project 'x' isn't registered."*
|
|
167
|
+
- Worktree Step 0: `git worktree add .worktrees/task/<it>/<n> -b task/<it>/<n> origin/main && cd .worktrees/task/<it>/<n>`, do the work, open the PR.
|
|
168
|
+
- Done-checklist: **the brief (and `Ticket:`/`Project:` lines) is pasted into the PR body.** That's it for state — opening the PR *is* the status transition. The Developer writes no status anywhere.
|
|
169
|
+
|
|
170
|
+
**Reviewer (code)** — requires an open PR with the brief in its body. Refuses: no PR → *"Nothing to review."* No brief → *"This PR has no brief; I can't judge scope against intent."* Authored it → *"I can't review my own work."* Checks brief-conformance **and** spec-conformance (the `Project:` spec in the unit's `specs/`). Produces APPROVE | REQUEST CHANGES (per `roles/reviewer.md`).
|
|
171
|
+
|
|
172
|
+
**Security** — same gate as Reviewer; produces PASS | FAIL (per `roles/security.md`).
|
|
173
|
+
|
|
174
|
+
**Verification** (the phase, two halves, `roles/developer.md` § Verification)
|
|
175
|
+
- Requires an open PR with the brief in its body AND a §9 Test Plan in that brief. Refuses if either is missing — *"This PR has no Test Plan; without one I cannot judge what 'verified' means. Flag the brief malformed (`needs:brief-correction`)."*
|
|
176
|
+
- **Agent half:** the Developer-agent boots the relevant dev server(s) from the PR's branch, runs each `[agent]` item in the Test Plan, and posts the actual command output as evidence on the PR (paraphrase is not evidence). Re-runs after a fix append a new comment; they do not edit the previous one.
|
|
177
|
+
- **Principal half:** the Principal runs each `[principal]` item in a real signed-in browser and ticks the checkbox on the PR. The agent does not tick `[principal]` boxes; the Principal does not tick `[agent]` boxes — the asymmetry is the gate's whole shape.
|
|
178
|
+
- `Test Plan: unit-tests-only` (a first-class allowed value, for pure-logic briefs with no runtime surface in §4) satisfies the phase by the CI unit-test gate alone.
|
|
179
|
+
- Produces ticked checkboxes on the PR and the evidence comments alongside them; writes no status anywhere.
|
|
180
|
+
|
|
181
|
+
**Archivist** (close-out)
|
|
182
|
+
- Requires a **merged** PR. Refuses: not merged → *"Nothing to close out; merge first."*
|
|
183
|
+
- Confirms: Issue closed (the merge auto-closes it if linked), docs updated, per-project pinned state Issue updated for every project the task listed. Sets the tranche's `Lifecycle: complete` marker and moves the file to `tranches/completed/` when every task is merged (`tranche-model.md` §11). (`now.md` no longer exists.)
|
|
184
|
+
- Assembles the **provenance block** from frozen facts (brief, PR reviews, merge metadata) and posts it to the merged PR (append-only, never a status field) — see `roles/archivist.md`.
|
|
185
|
+
- Flags — does not perform — orphaned branches (branch with no/stale PR) and local worktree removal as cleanup candidates for the human. Writes no status (the merge already is the status).
|
|
186
|
+
- Produces a close-out report listing anything dangling.
|
|
187
|
+
|
|
188
|
+
*(The Archivist is non-conversational automation; the conversational protocol §4.5 binds the human-facing roles. When the Archivist is run by hand as a conversational pass, it signposts like the rest.)*
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 7. What an automation layer adds (and doesn't change)
|
|
193
|
+
|
|
194
|
+
A tool can automate the steps 2→6 hand-offs: spawn the Developer in a fresh worktree from a brief, stream its work, unblock escalations, and enforce the dependency/conflict gates in code at dispatch. It does **not** change the gates, roles, brief rules, tranche model, task-as-Issue model, or order. If the tool is unavailable, you run the same flow by hand against the forge. The flow is primary; the tool is convenience — and AEG never names it.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 8. Observe mode — the read-only adoption tier
|
|
199
|
+
|
|
200
|
+
A team will not bet a production repo on a new governance model on day one. So AEG has a lowest-commitment entry: **observe mode** — run the whole flow read-only over a team's *existing* process, enforcing nothing, changing nothing.
|
|
201
|
+
|
|
202
|
+
In observe mode:
|
|
203
|
+
- The team keeps its existing workflow untouched — its Jira/Linear, its branching, its PR habits. AEG sits *beside* it, not in front of it.
|
|
204
|
+
- The roles run in **advisory** posture: the Reviewer and Security passes produce their verdicts, the Planner can map existing work into a tranche's topology, the Archivist can assemble provenance — but **none of it blocks a merge.** A finding is a comment, not a gate.
|
|
205
|
+
- **Status is still derived** from the forge (read-only) — the board (`gh pr list`, the future AEG UI) renders what's already happening. AEG writes nothing.
|
|
206
|
+
- `verify-docs` and the dispatch gates run in **report-only** mode (surfacing what *would* fail), not blocking.
|
|
207
|
+
|
|
208
|
+
The value in observe mode is exactly the thing companies are afraid of losing: **visibility without disruption.** The team sees what AEG *would* say — which PRs lack a brief, which changes drift from the spec, which tasks would collide — while nothing is taken away from them. This is the "start with monitoring, not restriction" on-ramp.
|
|
209
|
+
|
|
210
|
+
From there, adoption **tightens one gate at a time**, along the advisory → enforced gradient already in `state-machine.md` §12: turn on `verify-docs` as blocking, then require the brief-in-PR, then enforce the dispatch gates. Each step is a deliberate decision, not a big-bang switch. Observe mode is the floor; full AEG is the ceiling; a team climbs at its own pace.
|
|
211
|
+
|
|
212
|
+
A team can sit in observe mode indefinitely and still get the audit-by-construction provenance — which, for a regulated team, may itself be the whole reason to adopt.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
For the tranche / task / conflict model, see `tranche-model.md`. For the Planner's gates and conversational protocol, see `roles/planner.md`. For authority, tiers, and the advisory→enforced gradient, see `state-machine.md`. For the registry, see `projects.md`. For provenance, see `roles/archivist.md`.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_title: Archivist → Tranche Archivist
|
|
3
|
+
title: Archivist → Tranche Archivist
|
|
4
|
+
order: 5
|
|
5
|
+
contract_id: archivist-tranche-archivist
|
|
6
|
+
description: Carries each task’s close-out record up to the tranche close-out, so a phase can only be called finished once its parts genuinely are.
|
|
7
|
+
status: active
|
|
8
|
+
producer: archivist
|
|
9
|
+
consumer: tranche-archivist
|
|
10
|
+
carrier: pr-provenance-comments, tranche-file
|
|
11
|
+
summary: Ever closed out a big project only to find smaller pieces were never really finished?
|
|
12
|
+
---
|
|
13
|
+
# Contract: per-task Archivist → Tranche Archivist
|
|
14
|
+
|
|
15
|
+
## The short version
|
|
16
|
+
|
|
17
|
+
This seam sits between closing out one task and closing out the tranche that contained it. It exists because a tranche's history is only honest if each task's history was completed first.
|
|
18
|
+
|
|
19
|
+
**What crosses** — the set of merged pull requests, each carrying its own provenance record. That record is what proves a task was genuinely closed out rather than merely merged. Alongside it: a note on the standing lessons thread for any serious finding that was raised in review and merged anyway, so a consciously accepted deviation is available as a pattern later; and a follow-up issue for every finding that the product's specification has gone stale, so the gap outlives the task that found it.
|
|
20
|
+
|
|
21
|
+
**The hand-off is malformed when** — a merged pull request carries no provenance record. That means the task's close-out never ran, and the tranche's retrospective would then be assembled from a gap rather than a fact. It is malformed in the same way when an accepted deviation left no note, or when a stale-specification finding left no follow-up: in each case something real happened and nothing durable records it.
|
|
22
|
+
|
|
23
|
+
**What it does not carry** — permission to proceed on partial evidence. A partial close-out is worse than none, because it produces a record that looks complete and is not. It also carries no new judgement: nothing here re-opens, re-reviews or re-decides a merged task; both roles assemble from facts, and neither authors one.
|
|
24
|
+
|
|
25
|
+
**How it physically runs** — the carrier is the merged pull requests themselves, each with its provenance comment, plus the standing lessons thread and any follow-up issues. Tranche close-out reads them and stops if one is missing, flagging exactly which task's record is incomplete rather than working around it. The retrospective it then writes is a structured projection of those facts — assembled from merged work, recorded lessons and the decisions of the period, never generated from memory.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Reference
|
|
31
|
+
|
|
32
|
+
**Status:** active
|
|
33
|
+
**Seam:** the hand-off from the per-task Archivist (producer) to the Tranche Archivist (consumer).
|
|
34
|
+
**Single source of truth for this seam.** The two role docs do **not** redefine what crosses this boundary — they point here. `aeg-root/roles/archivist.md` (producer side) and `aeg-root/roles/tranche-archivist.md` (consumer side) each reference this file; this file is where the field-by-field hand-off lives, once.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Why this file exists
|
|
39
|
+
|
|
40
|
+
The per-task Archivist closes out individual tasks; the Tranche Archivist closes out the whole tranche. The Tranche Archivist's close-out is only honest if every per-task Archivist ran correctly — a missing provenance block means a task's history is incomplete, and an incomplete history means the retrospective is assembled from gaps rather than facts. This contract specifies exactly what the per-task Archivist must produce before the Tranche Archivist is authorized to begin, and exactly what the Tranche Archivist reads from those outputs.
|
|
41
|
+
|
|
42
|
+
The failure mode this prevents: a Tranche Archivist who begins close-out before verifying that every task's per-task Archivist ran, and then assembles a retrospective and tranche provenance block that silently omits a task's history or fabricates fields whose source facts were never produced.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## The hand-off carrier
|
|
47
|
+
|
|
48
|
+
The **set of merged PRs**, each bearing a per-task provenance block comment, plus the **tranche file** at `aeg-root/tranches/<name>.md` which provides the task topology the Tranche Archivist checks against. Every task in the topology must have a merged PR with a provenance block; the absence of either is a gap the Tranche Archivist must flag before proceeding.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## The contract — field-by-field mapping
|
|
53
|
+
|
|
54
|
+
Every output the per-task Archivist produces (left) has exactly one obligation for the Tranche Archivist (right). A task missing any left-column output is a close-out gap — the Tranche Archivist does not proceed with partial evidence.
|
|
55
|
+
|
|
56
|
+
| per-task Archivist produces (per task) | Tranche Archivist consumes at | What the consumption means |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| **Provenance block comment** on each merged PR | Entry gate verification | The Tranche Archivist verifies every task PR has a provenance block comment before starting close-out. A missing provenance block means that task's per-task Archivist close-out was incomplete — stop and flag: *"Task N's PR has no provenance block — per-task Archivist did not run for this task. Flag for Principal before proceeding."* |
|
|
59
|
+
| **Lessons Issue comments** for any `BLOCKER`/`MAJOR` findings that merged | Retrospective assembly | The Tranche Archivist reads the pinned lessons Issue's comments since the tranche started and includes the patterns they identify in the retrospective's "What stalled or caused rework" and "Carry-forward lessons" sections. |
|
|
60
|
+
| **Follow-up Issues** opened for `STALE-SPEC` findings | State doc update | The Tranche Archivist notes open follow-up Issues in the relevant pinned state Issue under "Pending manual operations" (or in the output report as DANGLING items). A `STALE-SPEC` finding with no follow-up Issue is a DANGLING item — flag it for the Principal. (`now.md` is retired.) |
|
|
61
|
+
|
|
62
|
+
**Reading the table:** left is the producer obligation (per-task Archivist role doc and this contract enforce it), right is the consumer obligation (Tranche Archivist role doc and this contract enforce it). The two role docs must not contradict this table.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Producer obligations (the per-task Archivist)
|
|
67
|
+
|
|
68
|
+
- Post a provenance block comment on every merged task PR — no exceptions. This is the single most critical output: without it, the Tranche Archivist's entry gate fails and close-out cannot proceed.
|
|
69
|
+
- Post a new comment on the pinned lessons Issue for every `BLOCKER` or `MAJOR` finding that was present in the Reviewer's verdict and merged anyway (a deviation). A deviation without a lessons entry is a missed learning.
|
|
70
|
+
- Open a follow-up Issue for every `STALE-SPEC` finding identified by the Reviewer. If the Developer already opened one, confirm it exists; do not open a duplicate.
|
|
71
|
+
- Append one row to the tranche's token ledger at close-out.
|
|
72
|
+
|
|
73
|
+
## Consumer obligations (the Tranche Archivist)
|
|
74
|
+
|
|
75
|
+
- Verify every task PR has a provenance block comment before starting. If any is missing, stop and flag — do not proceed with partial close-out. Partial close-out is worse than no close-out: it creates a plausible-looking but incomplete record.
|
|
76
|
+
- Read the pinned lessons Issue's comments since the tranche start date before assembling the retrospective. Carry-forward lessons that appear there but are not reflected in the retrospective are a gap.
|
|
77
|
+
- Note open follow-up Issues in the relevant pinned state Issue (under "Pending manual operations") or in the close-out report as DANGLING items. If a `STALE-SPEC` finding has no follow-up Issue (the per-task Archivist missed it), flag it as DANGLING and open the Issue on behalf of the Principal. (`now.md` is retired.)
|
|
78
|
+
- Do not assemble the tranche retrospective from memory or inference — assemble it from merged PR summaries, the pinned lessons Issue's comments, and the tranche topology file. The retrospective is a structured projection of facts.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Changing this contract
|
|
83
|
+
|
|
84
|
+
A contract changes **as a unit**. You may not change what the per-task Archivist produces without, in the same change, updating what the Tranche Archivist consumes — because the property that makes the seam sound is that the producer's output side is *identical* to the consumer's input side. Concretely:
|
|
85
|
+
|
|
86
|
+
- A change to this file is a **Tier 3** change: it alters a cross-role contract, so the reasoning belongs in the pull request that makes it, where the reviewer and the close-out both read it.
|
|
87
|
+
- The same PR that edits this contract must verify both `aeg-root/roles/archivist.md` and `aeg-root/roles/tranche-archivist.md` still point here and still match the table.
|
|
88
|
+
- Never edit one side's role doc to add/drop a hand-off field directly. Add/drop it **here**; the role docs inherit it by reference.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
*This contract is the seam. The per-task Archivist fills the left column; the Tranche Archivist drains the right. One source of truth, changed as a unit.*
|