Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20e6f4899c | ||
|
|
2f68e60cec |
No files matched your search
@@ -12,14 +12,14 @@
|
|||||||
{"id":"uat","type":"backend","label":"UAT","sublabel":"06","pos":[100,1540],"size":[240,100]},
|
{"id":"uat","type":"backend","label":"UAT","sublabel":"06","pos":[100,1540],"size":[240,100]},
|
||||||
{"id":"security","type":"backend","label":"Security","sublabel":"07","pos":[100,1760],"size":[240,100]},
|
{"id":"security","type":"backend","label":"Security","sublabel":"07","pos":[100,1760],"size":[240,100]},
|
||||||
{"id":"releases","type":"backend","label":"Releases","sublabel":"08","pos":[100,1980],"size":[240,100]},
|
{"id":"releases","type":"backend","label":"Releases","sublabel":"08","pos":[100,1980],"size":[240,100]},
|
||||||
{"id":"code-scope","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,440],"size":[240,100]},
|
{"id":"code-scope","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,440],"size":[240,100]},
|
||||||
{"id":"code-architecture","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,660],"size":[240,100]},
|
{"id":"code-architecture","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,660],"size":[240,100]},
|
||||||
{"id":"code-ui-ux","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,880],"size":[240,100]},
|
{"id":"code-ui-ux","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,880],"size":[240,100]},
|
||||||
{"id":"code-planning","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1100],"size":[240,100]},
|
{"id":"code-planning","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,1100],"size":[240,100]},
|
||||||
{"id":"code-delivery","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1320],"size":[240,100]},
|
{"id":"code-delivery","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,1320],"size":[240,100]},
|
||||||
{"id":"code-uat","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1540],"size":[240,100]},
|
{"id":"code-uat","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,1540],"size":[240,100]},
|
||||||
{"id":"code-security","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1760],"size":[240,100]},
|
{"id":"code-security","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,1760],"size":[240,100]},
|
||||||
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[400,1980],"size":[240,100]}
|
{"id":"code-releases","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[400,1980],"size":[240,100]}
|
||||||
],
|
],
|
||||||
"connections": [
|
"connections": [
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,14 @@
|
|||||||
{"id":"uat","type":"backend","label":"UAT","sublabel":"06","pos":[240,727.5],"size":[180,75]},
|
{"id":"uat","type":"backend","label":"UAT","sublabel":"06","pos":[240,727.5],"size":[180,75]},
|
||||||
{"id":"security","type":"backend","label":"Security","sublabel":"07","pos":[240,457.5],"size":[180,75]},
|
{"id":"security","type":"backend","label":"Security","sublabel":"07","pos":[240,457.5],"size":[180,75]},
|
||||||
{"id":"releases","type":"backend","label":"Releases","sublabel":"08","pos":[240,187.5],"size":[180,75]},
|
{"id":"releases","type":"backend","label":"Releases","sublabel":"08","pos":[240,187.5],"size":[180,75]},
|
||||||
{"id":"code-scope","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[510,37.5],"size":[180,75]},
|
{"id":"code-scope","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[510,37.5],"size":[180,75]},
|
||||||
{"id":"code-architecture","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[780,37.5],"size":[180,75]},
|
{"id":"code-architecture","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[780,37.5],"size":[180,75]},
|
||||||
{"id":"code-ui-ux","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[1005,457.5],"size":[180,75]},
|
{"id":"code-ui-ux","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[1005,457.5],"size":[180,75]},
|
||||||
{"id":"code-planning","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[780,877.5],"size":[180,75]},
|
{"id":"code-planning","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[780,877.5],"size":[180,75]},
|
||||||
{"id":"code-delivery","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[510,877.5],"size":[180,75]},
|
{"id":"code-delivery","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[510,877.5],"size":[180,75]},
|
||||||
{"id":"code-uat","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[240,877.5],"size":[180,75]},
|
{"id":"code-uat","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[240,877.5],"size":[180,75]},
|
||||||
{"id":"code-security","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[15,457.5],"size":[180,75]},
|
{"id":"code-security","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[15,457.5],"size":[180,75]},
|
||||||
{"id":"code-releases","type":"frontend","label":"Code agent","sublabel":"Human-controlled","pos":[240,37.5],"size":[180,75]}
|
{"id":"code-releases","type":"frontend","label":"AI Agent","sublabel":"Human-controlled","pos":[240,37.5],"size":[180,75]}
|
||||||
],
|
],
|
||||||
"connections": [
|
"connections": [
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import ArchifyDiagram from '@site/src/components/ArchifyDiagram';
|
|||||||
|
|
||||||
<ArchifyDiagram name="strategy-target" title="Autonomous agent executes and governs the SDLC; humans direct, guide and review" story />
|
<ArchifyDiagram name="strategy-target" title="Autonomous agent executes and governs the SDLC; humans direct, guide and review" story />
|
||||||
|
|
||||||
An autonomous agent executes and governs every phase. Humans direct, guide and review it; a separate human-controlled code agent contributes to each phase from outside the cycle.
|
An autonomous agent executes and governs every phase. Humans direct, guide and review it; a separate human-controlled AI Agent contributes to each phase from outside the cycle.
|
||||||
|
|
||||||
**Solid arrows:** lifecycle · **Dotted spokes:** execution and governance · **Dashed arrows:** contributions.
|
**Solid arrows:** lifecycle · **Dotted spokes:** execution and governance · **Dashed arrows:** contributions.
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ const fs = require('node:fs');
|
|||||||
assert.deepEqual(metrics.edges.map(e=>e.slice(0,2)), ids.map((id,i)=>[id,ids[(i+1)%ids.length]]));
|
assert.deepEqual(metrics.edges.map(e=>e.slice(0,2)), ids.map((id,i)=>[id,ids[(i+1)%ids.length]]));
|
||||||
assert(metrics.edges.every(e=>e[2]?.startsWith('url(')), 'all stages must have arrowheads');
|
assert(metrics.edges.every(e=>e[2]?.startsWith('url(')), 'all stages must have arrowheads');
|
||||||
assert.equal(metrics.nodes.length, 17);
|
assert.equal(metrics.nodes.length, 17);
|
||||||
|
assert.equal(metrics.labels.filter(n => n.text === 'AI Agent').length, 8);
|
||||||
|
assert(!metrics.labels.some(n => /code[ -]agent/i.test(n.text)));
|
||||||
|
assert((await page.locator('.strategy-content').innerText()).includes('human-controlled AI Agent'));
|
||||||
assert(!metrics.nodes.some(n=>n.id==='humans'));
|
assert(!metrics.nodes.some(n=>n.id==='humans'));
|
||||||
assert.equal(await frame.locator('[data-node-id="agent"] text').allTextContents().then(texts=>texts.includes('Human Controlled')), true);
|
assert.equal(await frame.locator('[data-node-id="agent"] text').allTextContents().then(texts=>texts.includes('Human Controlled')), true);
|
||||||
assert.equal(metrics.relationships.length, 24);
|
assert.equal(metrics.relationships.length, 24);
|
||||||
@@ -74,6 +77,15 @@ const fs = require('node:fs');
|
|||||||
}
|
}
|
||||||
assert(metrics.labels.every(n=>n.px>=14), JSON.stringify(metrics.labels));
|
assert(metrics.labels.every(n=>n.px>=14), JSON.stringify(metrics.labels));
|
||||||
assert.deepEqual(metrics.overflow, []);
|
assert.deepEqual(metrics.overflow, []);
|
||||||
|
await frame.locator('#btn-export').click();
|
||||||
|
const [download] = await Promise.all([page.waitForEvent('download'), frame.locator('[data-format="svg"]').click()]);
|
||||||
|
assert.equal(await download.failure(), null);
|
||||||
|
const exportPath = `${output}/${width}-${route ? 'target' : 'landing'}.svg`;
|
||||||
|
await download.saveAs(exportPath);
|
||||||
|
const exported = fs.readFileSync(exportPath, 'utf8');
|
||||||
|
assert.equal((exported.match(/>AI Agent<\/text>/g) || []).length, 8);
|
||||||
|
assert(!/code[ -]agent/i.test(exported));
|
||||||
|
assert(exported.includes('Autonomous agent') && exported.includes('Human Controlled'));
|
||||||
assert(!await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth));
|
assert(!await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth));
|
||||||
await page.evaluate(()=>scrollTo({top:0,behavior:'instant'}));
|
await page.evaluate(()=>scrollTo({top:0,behavior:'instant'}));
|
||||||
await page.waitForFunction(()=>scrollY===0);
|
await page.waitForFunction(()=>scrollY===0);
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ test('Strategy opens at the canonical autonomous lifecycle', () => {
|
|||||||
assert(primary.includes('autonomous agent'));
|
assert(primary.includes('autonomous agent'));
|
||||||
assert(primary.includes('direct, guide and review'));
|
assert(primary.includes('direct, guide and review'));
|
||||||
assert(primary.includes('Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope'));
|
assert(primary.includes('Scope → Architecture → UI/UX → Planning → Delivery → UAT → Security → Releases → Scope'));
|
||||||
assert(primary.includes('human-controlled code agent'));
|
assert(primary.includes('human-controlled AI Agent'));
|
||||||
|
assert(!/code[ -]agent/i.test(page));
|
||||||
assert(primary.includes('TO-BE'));
|
assert(primary.includes('TO-BE'));
|
||||||
assert(!/only routes|People authorize|independent gates protect release/.test(primary));
|
assert(!/only routes|People authorize|independent gates protect release/.test(primary));
|
||||||
}
|
}
|
||||||
@@ -37,7 +38,7 @@ test('both target diagrams have eight stages, eight governed phases and eight hu
|
|||||||
assert.deepEqual(d.connections.filter(e => e.from === 'agent').map(e => e.to), ids);
|
assert.deepEqual(d.connections.filter(e => e.from === 'agent').map(e => e.to), ids);
|
||||||
const contributors = d.components.filter(n => n.id.startsWith('code-'));
|
const contributors = d.components.filter(n => n.id.startsWith('code-'));
|
||||||
assert.equal(contributors.length, 8);
|
assert.equal(contributors.length, 8);
|
||||||
assert(contributors.every(n => n.label === 'Code agent' && n.sublabel === 'Human-controlled'));
|
assert(contributors.every(n => n.label === 'AI Agent' && n.sublabel === 'Human-controlled'));
|
||||||
for (const id of ids) {
|
for (const id of ids) {
|
||||||
assert(d.connections.some(e => e.from === `code-${id}` && e.to === id && e.variant === 'dashed'));
|
assert(d.connections.some(e => e.from === `code-${id}` && e.to === id && e.variant === 'dashed'));
|
||||||
assert(d.connections.some(e => e.from === 'agent' && e.to === id && e.variant === 'security'));
|
assert(d.connections.some(e => e.from === 'agent' && e.to === id && e.variant === 'security'));
|
||||||
|
|||||||
Reference in new issue
Block a user