Command: git diff --word-diff=porcelain d0a6a87cd -- packages/bus/tests/citation-runtime.test.mjs
diff --git a/packages/bus/tests/citation-runtime.test.mjs b/packages/bus/tests/citation-runtime.test.mjs
index fdcfdadfc..b1a2de155 100644
--- a/packages/bus/tests/citation-runtime.test.mjs
+++ b/packages/bus/tests/citation-runtime.test.mjs
@@ -12,7 +12,7 @@ import { mappingEntry } from '../../library/tests/helpers.mjs';
 test('C2-06 runtime reads changed and unreadable reply limits without restarting', async t => {
~
   const root = mkdtempSync(join(tmpdir(), 'citation-runtime-')); t.after(() => rmSync(root, { recursive: true, force: true }));
~
   const doc = businessDoc(root), rolesDir = rolesCopy(root), dir = join(root, 'config'), dataRoot = join(root, 'data');
~
   doc.projects.books = mappingEntry(); 
+doc.roles.chief.credentials = { gitea: { ...doc.roles.coder.credentials.gitea } };
  doc.replyLimits = { requireCitation: false, citationsPerReply: 3 };
~
   const file = writeJson(join(dir, 'businesses/acme.json'), doc);
~
   const checked = validateBusinessDocument(doc, file, { rolesDir }); mkdirSync(dataRoot, { mode: 0o700 });
~
   // Runtime takes the host's broker projection, not the business validator's unresolved role entries.
~
Command: git diff --word-diff=porcelain d0a6a87cd -- packages/cli/tests/launcher.test.mjs
diff --git a/packages/cli/tests/launcher.test.mjs b/packages/cli/tests/launcher.test.mjs
index baabd843e..766bbb35a 100644
--- a/packages/cli/tests/launcher.test.mjs
+++ b/packages/cli/tests/launcher.test.mjs
@@ -1,4 +1,4 @@
 import { 
+FAR_DATE,
  launchDoc } from "../../business/tests/helpers.mjs";
~
 // The S6 launcher inside a real bus host: real broker child, real runners
~
 // in the bwrap sandbox, the fake adapter from packages/harness standing in for the
~
 // harness. The chief of staff launches a coder through its `launch` tool (row 119: the
~
@@ -32,7 +32,7 @@ const skip = sandboxProblem() ?? false;
 
~
 test('C2-04: launcher workspace clones code but never the library', { skip, timeout: 30000 }, async t => {
~
   const { mappingEntry } = await import('../../library/tests/helpers.mjs');
~
   const f = await setup(t, doc => { 
+doc.roles.chief.credentials = { gitea: { ...doc.roles.coder.credentials.gitea } };
  doc.projects = { books: mappingEntry(), ...doc.projects }; return doc; });
~
   await f.launcher.launchPm();
~
   const workspace = workspaceDir(f.f.dataRoot, 'acme', 'chief');
~
   assert.equal(existsSync(join(workspace, 'stack', '.git')), true);
~
@@ -766,7 +766,7 @@ test("row 64 a role skill that isn't enabled refuses skill-not-enabled, and one
 test("row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason", { timeout: 30000 }, async (t) => {
~
   const text = "Warm. PERSONA-MARKER-d2\n";
~
   const given = prepare(t, (doc) => {
~
     doc.roles.bean = { definition: "companion", 
+credentials: { gitea: { ...doc.roles.coder.credentials.gitea } },
  vars: { harness: "pi", model: "claude-sonnet-5-5", thinking: "high", "persona.name": "Bean", "persona.sha256": createHash("sha256").update(text).digest("hex") } };
~
     doc.launch.instances.push("bean");
~
     return doc;
~
   });
~
Command: git diff --word-diff=porcelain d0a6a87cd -- packages/harness/tests/creative.test.mjs
diff --git a/packages/harness/tests/creative.test.mjs b/packages/harness/tests/creative.test.mjs
index 80f4516ee..c3191f99e 100644
--- a/packages/harness/tests/creative.test.mjs
+++ b/packages/harness/tests/creative.test.mjs
@@ -24,6 +24,7 @@ function bean(t, definition, { harness = "pi", persona = false, vars = {} } = {}
   return resolvedFor(t, "bean", (d) => {
~
     d.roles.bean = { definition, vars: { harness, model: "claude-sonnet-5-5", thinking: "high",
~
       ...(persona ? { "persona.name": "Bean", "persona.sha256": sha(TEXT) } : {}), ...vars } };
~
     
+d.roles.bean.credentials = { gitea: { ...d.roles.coder.credentials.gitea } };
~
   });
~
 }
~
 
~
