---
tags: help, pipeline
order: 50
description: the list of work, by role
---
# Help: the pipeline

[The pipeline](/pipeline) (on your Home, and in the Toolbox) is the project's list of work waiting to be done: ideas you parked, questions for you, and work passed between you, the other members and your AI agents, with a clear separation of roles and permissions: each one does its own part, and you decide where a person has to step in. Tap a box to see what can be done there.

## For creator and pro projects: you and your maker {#creator}

You and your AI, the **Maker (chat)**: tell it what you want and it builds it; when there's no time now, say "park it" and it goes on the list. The list is the **pipeline**: each idea or thing to do is an item, new until your AI (or you) takes it, then done. Your AI asks you when it needs a decision, and you can drop anything you don't want. That's all there is to it.

```embedhtml
<style>
#d2pipe-creator .pw{max-width:620px;margin:0 auto;background:#16181d;color:#eceae4;border-radius:14px;padding:14px;color-scheme:dark}
#d2pipe-creator svg{width:100%;height:auto;display:block;font-family:var(--body,system-ui,sans-serif)}
#d2pipe-creator .bx{cursor:pointer}#d2pipe-creator .bx rect{stroke-width:1.5}#d2pipe-creator .bx:hover rect,#d2pipe-creator .bx.on rect{stroke-width:3}
#d2pipe-creator .pp rect{fill:#3a2a0e;stroke:#f2b84b}#d2pipe-creator .ag rect{fill:#23265a;stroke:#9296f5}#d2pipe-creator .st rect{fill:#1f2229;stroke:#454b57}#d2pipe-creator .gd rect{fill:#10291f;stroke:#46c48e;stroke-dasharray:4 3}
#d2pipe-creator .t{fill:#eceae4;font-size:13px;font-weight:700}#d2pipe-creator .s{fill:#a8abb2;font-size:10.5px}#d2pipe-creator .a{fill:#a8abb2;font-size:10px}
#d2pipe-creator .ln{stroke:#8a8f99;stroke-width:1.3;fill:none;marker-end:url(#d2pipe-creator-h)}#d2pipe-creator .fr{fill:none;stroke:#6b707a;stroke-dasharray:5 4}
#d2pipe-creator .panel{margin-top:10px;padding:10px 14px;border:1px solid #3a3f4a;border-radius:12px;background:#1f2229;color:#eceae4;font-size:14px;line-height:1.45}
#d2pipe-creator .panel b{display:block;margin-bottom:4px}#d2pipe-creator .panel ul{margin:4px 0 0;padding-left:18px}#d2pipe-creator .panel li{margin:2px 0}#d2pipe-creator .hint{color:#a8abb2}
#d2pipe-creator .foot{margin-top:6px;font-size:12.5px;color:#a8abb2;text-align:center}
</style>
<div id="d2pipe-creator"><div class="pw">
<svg viewBox="0 0 565 290" role="img" aria-label="You and the other members on the left, the pipeline in the middle, your maker (a chat with your AI) on the right"><defs><marker id="d2pipe-creator-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0 0L10 5L0 10z" fill="#8a8f99"/></marker></defs><g class="bx pp" data-k="you"><rect x="10" y="40" width="110" height="70" rx="12"/><text class="t" x="65" y="79" text-anchor="middle">You</text></g><g class="bx pp" data-k="others"><rect x="10" y="180" width="110" height="70" rx="12"/><text class="t" x="65" y="219" text-anchor="middle">Members</text></g><rect class="fr" x="225" y="14" width="130" height="262" rx="14"/><text class="t" x="290" y="34" text-anchor="middle">Pipeline</text><g class="bx st" data-k="pipe"><rect x="237" y="48" width="106" height="54" rx="12"/><text class="t" x="290" y="79" text-anchor="middle">New</text></g><g class="bx st" data-k="pipe"><rect x="237" y="126" width="106" height="54" rx="12"/><text class="t" x="290" y="157" text-anchor="middle">Taken</text></g><g class="bx st" data-k="pipe"><rect x="237" y="204" width="106" height="54" rx="12"/><text class="t" x="290" y="235" text-anchor="middle">Done</text></g><path class="ln" d="M290 102V124"/><path class="ln" d="M290 180V202"/><g class="bx ag" data-k="maker"><rect x="455" y="100" width="100" height="90" rx="12"/><text class="t" x="505" y="133" text-anchor="middle">Maker</text><text class="t" x="505" y="149" text-anchor="middle">(chat)</text><text class="s" x="505" y="165" text-anchor="middle">your AI</text></g><path class="ln" d="M120 64H223"/><text class="a" x="172" y="58" text-anchor="middle">park an idea</text><path class="ln" d="M225 92H122"/><text class="a" x="172" y="106" text-anchor="middle">asks, tells you</text><path class="ln" d="M225 224H122"/><text class="a" x="172" y="238" text-anchor="middle">sees items</text><path class="ln" d="M355 128H453"/><text class="a" x="405" y="122" text-anchor="middle">takes it</text><path class="ln" d="M455 164H357"/><text class="a" x="405" y="178" text-anchor="middle">builds it, done</text></svg>
<div class="panel"><span class="hint">Tap any box.</span></div>
</div></div>
<script>
(function(){const root=document.getElementById("d2pipe-creator");if(!root)return;
const P={you:["You",["Tell your AI what you want: it builds it now, or parks it in the pipeline for later","Answer when it asks: Approve or Refuse","Mark things done","Drop what you don't want"]],others:["Members",["Everyone else on your project sees the same list","They pick up work only when you pass it to them"]],pipe:["The pipeline",["Your ideas and things to do in one list: new, being worked on, done"]],maker:["Maker (chat)",["Your AI, in a chat with you: one role that does everything: the data model, pages, data, fixes","Asks you before anything risky","Keeps a short record of what it built"]]};
const pn=root.querySelector(".panel"),bs=[...root.querySelectorAll(".bx")];
const esc=s=>s.replace(/[&<>]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;"})[c]);
bs.forEach(b=>{b.setAttribute("tabindex","0");const go=()=>{bs.forEach(x=>x.classList.toggle("on",x.dataset.k===b.dataset.k));const [t,l]=P[b.dataset.k];pn.innerHTML="<b>"+esc(t)+"</b><ul>"+l.map(x=>"<li>"+esc(x)+"</li>").join("")+"</ul>"};b.addEventListener("click",go);b.addEventListener("keydown",e=>{if(e.key==="Enter"||e.key===" "){e.preventDefault();go()}})});
})();
</script>
```

**The map at the top of your Pipeline page** (creator and pro projects; sample data here): you on the left with what's waiting for you, the pipeline in the middle with its items by status (a pill each: new, in progress, waiting, review), your AI on the right, coloured by what it's doing (as on the Agents page). Tap a part to see its items; *How it works* comes back here.

```embedhtml
<!--
  d2 pipeline page header map (designer-built, Razie approved 2026-09-28; roll-up, look and dark you-initial 2026-09-28 evening). Also the Agents page's diagram (2026-09-28): pass waits.
  Drop in as is. Markup: wrap the page's lede paragraph and an empty <div class="pm-map"></div>
  in <div class="pm-row">, then call d2PipeMap(el, data) with:
    view   'simple' (creator, pro) | 'complex' (master); in simple the AI circle is named maker (Razie 2026-09-28)
    help   link to Help:Pipeline at the level's section
    you    number of items for the viewer (^pipe-26)
    items  simple: {new, 'in-progress', review, waiting} over the whole list
           complex: {designer:{...}, coder:{...}, tester:{...}, guardian:{...}} per role, person + agent roles
    agents board states per role: {maker, designer, coder, tester, guardian}; each a state string, or an array of
           states when several agents report under the role (null = none). Agents with other roles are not drawn:
           the map shows the known roles only (Razie 2026-09-28); the Agents page list shows every agent.
           Several live agents on a role roll up into one circle: the count inside, a pie of their state colours,
           the plain role name under it. done and gone agents are left out of the roll-up while any other is live.
    look   optional: number of items to look at (^pipe-45): "N to look at" under the you node, to ?look=1
    ctx    optional: {<role>: <context % the agent last reported>} draws a ring around its node
           (orange from 70) and adds " · N%" to its state line; for a rolled-up role, the fullest agent's
    waits  optional (Agents page): [{from:'coder', to:'you'|'designer'|…}] from each agent's waitingOn;
           drawn as a dashed amber arc under the row, from the waiting agent back to whom it waits on
  Agents page (Razie 2026-09-28): mode 'agents' with
    roles  every role that reports (known ones first, in pipeline order), instead of the known roles only;
           roles outside the pipeline (e.g. dispatcher) come after a dotted divider, with no arrow or item pills
    list   {<role>: [{agent, state, ctx?, item?, text?}]} every agent on the board, by role
    loadLog(f)  f = {role} or {agent}; returns a Promise of [{at, agent, state, text, item?}], newest first
           (Log:AgentHistory plus the current statuses; the page's one data call)
  Tapping a role with several agents opens a second row under the map: an "All (n)" chip (the role's merged log,
  selected first) and one chip per agent; tapping a chip shows that log. A role with one agent goes straight
  to its log. Tapping the same role again closes the panel.
  The one wiring point: STATE below must be the Agents page's own state-colour map; change it there, not here.
-->
<style>
.pm-row{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
.pm-row>.lede{flex:1 1 220px;margin:0}
.pm-map{flex:1 1 280px;max-width:380px}
.pm-map svg{width:100%;height:auto;display:block}
.pm-map a{cursor:pointer}
.pm-map .pm-n:hover circle,.pm-map .pm-n:focus circle{stroke:var(--ink,#1d1d1b);stroke-width:2}
.pm-map text{font-family:inherit}
.pm-map .pm-you{fill:#633806}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .pm-map .pm-you{fill:#fbe3b0}}
:root[data-theme="dark"] .pm-map .pm-you{fill:#fbe3b0}
.pm-det{margin-top:8px;border-top:1px solid var(--line,#2c3039);padding-top:8px;font-size:13px}
.pm-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.pm-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line,#2c3039);border-radius:14px;padding:3px 10px 3px 6px;background:none;color:var(--ink,#1d1d1b);font:inherit;font-size:12px;cursor:pointer}
.pm-chip[aria-pressed=true]{border-color:var(--ink,#1d1d1b);font-weight:600}
.pm-dot{width:10px;height:10px;border-radius:50%;display:inline-block;flex:none}
.pm-log{list-style:none;margin:0;padding:0;max-height:260px;overflow:auto}
.pm-log li{display:flex;gap:8px;align-items:baseline;padding:3px 0;border-bottom:1px solid var(--line,#2c3039)}
.pm-log .t{color:var(--soft,#6b6a66);font-variant-numeric:tabular-nums;flex:none;font-size:12px}
.pm-log .s{flex:none;font-size:11px;border-radius:8px;padding:0 6px;color:#fff}
.pm-log .a{flex:none;font-size:12px;color:var(--soft,#6b6a66)}
.pm-log .x{flex:1;min-width:0;overflow-wrap:anywhere}
.pm-log a{color:inherit;text-decoration:underline}
.pm-help{display:block;text-align:center;font-size:12px;color:var(--soft,#6b6a66);margin-top:2px}
</style>
<script>
(function(){
var STATE={up:'#5a8fc7',idle:'#5a8fc7',working:'#2f9a6f',waiting:'#d9a520','handing-over':'#8a6fc7',done:'#9c9a93',stuck:'#c9483b',gone:'#9c9a93',warning:'#e07a2e',stopped:'#c9483b'};
var DARKTEXT={waiting:1};
var ITEM=[['new','var(--soft,#9c9a93)'],['in-progress','#2f9a6f'],['waiting','#d9a520'],['review','#7a7fc9']];
var NS='http://www.w3.org/2000/svg';
function el(n,a,t){var e=document.createElementNS(NS,n);for(var k in a)e.setAttribute(k,a[k]);if(t!=null)e.textContent=t;return e}
function pills(g,cx,y,c){var list=ITEM.filter(function(s){return (c&&c[s[0]])>0});var w=24,gap=4,x=cx-(list.length*w+(list.length-1)*gap)/2;
 list.forEach(function(s){var p=el('g',{});p.appendChild(el('rect',{x:x,y:y,width:w,height:15,rx:7,fill:s[1]}));
  p.appendChild(el('text',{x:x+w/2,y:y+11,'text-anchor':'middle','font-size':11,fill:'#fff'},String(c[s[0]])));
  p.appendChild(el('title',{},c[s[0]]+' '+s[0]));g.appendChild(p);x+=w+gap});}
var RANK=['stuck','stopped','warning','waiting','handing-over','working','up','idle','done','gone'];
function roll(v){if(v==null)return null;var a=Array.isArray(v)?v.slice():[v];if(!a.length)return null;
 var live=a.filter(function(s){return s!=='done'&&s!=='gone'});if(live.length)a=live;else a=[a.sort(function(p,q){return RANK.indexOf(p)-RANK.indexOf(q)})[0]];
 var c={};a.forEach(function(s){c[s]=(c[s]||0)+1});var ks=Object.keys(c).sort(function(p,q){return RANK.indexOf(p)-RANK.indexOf(q)});
 return {n:a.length,top:ks[0],counts:c,keys:ks,sub:a.length===1?ks[0]:c[ks[0]]+' '+ks[0]+(a.length>c[ks[0]]?' +'+(a.length-c[ks[0]]):'')}}
function pie(a,x,y,r,R){var ang=-Math.PI/2;R.keys.forEach(function(k){var f=R.counts[k]/R.n,e=ang+f*2*Math.PI;
  if(f>=1){a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:STATE[k]||'#9c9a93'}));return}
  var x1=x+r*Math.cos(ang),y1=y+r*Math.sin(ang),x2=x+r*Math.cos(e),y2=y+r*Math.sin(e);
  var p=el('path',{d:'M'+x+' '+y+'L'+x1.toFixed(2)+' '+y1.toFixed(2)+'A'+r+' '+r+' 0 '+(f>0.5?1:0)+' 1 '+x2.toFixed(2)+' '+y2.toFixed(2)+'Z',fill:STATE[k]||'#9c9a93',stroke:'var(--bg,#fff)','stroke-width':1});
  p.appendChild(el('title',{},R.counts[k]+' '+k));a.appendChild(p);ang=e});}
function node(svg,x,y,r,label,sub,state,href,isYou,initial,R){
 var a=el('a',{href:href,class:'pm-n'});a.appendChild(el('title',{},label+(state?': '+state:'')));
 if(isYou)a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:'var(--sun-bg,#fbf1dc)',stroke:'var(--sun,#d99a2b)','stroke-width':1.5}));
 else if(R&&R.n>1)pie(a,x,y,r,R);
 else if(state)a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:STATE[state]||'#9c9a93'}));
 else a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:'none',stroke:'var(--soft,#9c9a93)','stroke-width':1.5,'stroke-dasharray':'3 3'}));
 var multi=R&&R.n>1,ink=multi?'#fff':(state?(DARKTEXT[state]?'#412402':'#fff'):'var(--soft,#6b6a66)');
 var it=el('text',isYou?{x:x,y:y+4,'text-anchor':'middle','font-size':12,class:'pm-you'}:{x:x,y:y+(multi?5:4),'text-anchor':'middle','font-size':multi?14:12,'font-weight':multi?600:400,fill:ink,stroke:multi?'rgba(0,0,0,.35)':'none','stroke-width':multi?2:0,'paint-order':'stroke'},multi?String(R.n):initial);a.appendChild(it);
 a.appendChild(el('text',{x:x,y:y+r+20,'text-anchor':'middle','font-size':12,fill:'var(--ink,#1d1d1b)'},label));
 a.appendChild(el('text',{x:x,y:y+r+36,'text-anchor':'middle','font-size':11,fill:isYou?'var(--sun,#d99a2b)':(state?(STATE[state]):'var(--soft,#6b6a66)')},sub));
 svg.appendChild(a);}
function arrow(svg,x1,x2,y){svg.appendChild(el('path',{d:'M'+x1+' '+y+'H'+(x2-2),stroke:'var(--soft,#9c9a93)','stroke-width':1.5,fill:'none','marker-end':'url(#pm-a)'}));}
function hm(t){var x=new Date(t);return isNaN(x)?'':('0'+x.getHours()).slice(-2)+':'+('0'+x.getMinutes()).slice(-2)}
function details(host,svg,d,list){var det=document.createElement('div');det.className='pm-det';det.hidden=true;host.appendChild(det);var open=null;
 function showLog(f,box){box.innerHTML='<div style="color:var(--soft,#6b6a66)">Loading…</div>';
  Promise.resolve(d.loadLog?d.loadLog(f):[]).then(function(rows){var ul=document.createElement('ul');ul.className='pm-log';
   if(!rows||!rows.length){box.innerHTML='<div style="color:var(--soft,#6b6a66)">Nothing logged yet.</div>';return}
   rows.forEach(function(r){var li=document.createElement('li');
    var t=document.createElement('span');t.className='t';t.textContent=hm(r.at);li.appendChild(t);
    var s=document.createElement('span');s.className='s';s.textContent=r.state||'';s.style.background=STATE[r.state]||'#9c9a93';if(DARKTEXT[r.state])s.style.color='#412402';li.appendChild(s);
    if(f.role){var a=document.createElement('span');a.className='a';a.textContent=r.agent;li.appendChild(a)}
    var x=document.createElement('span');x.className='x';x.textContent=(r.text||'')+(r.item?' ':'');if(r.item){var il=document.createElement('a');il.href='/pipeline/'+r.item;il.textContent=r.item;x.appendChild(il)}li.appendChild(x);ul.appendChild(li)});
   box.innerHTML='';box.appendChild(ul)},function(){box.textContent='Could not load the log.'})}
 function chip(label,state,pressed,onclick){var b=document.createElement('button');b.type='button';b.className='pm-chip';b.setAttribute('aria-pressed',pressed?'true':'false');
  var dot=document.createElement('span');dot.className='pm-dot';dot.style.background=state?(STATE[state]||'#9c9a93'):'var(--soft,#9c9a93)';b.appendChild(dot);b.appendChild(document.createTextNode(label));b.onclick=onclick;return b}
 svg.querySelectorAll('a.pm-n').forEach(function(a){var h=a.getAttribute('href')||'';if(h.indexOf('#r=')!==0)return;var role=decodeURIComponent(h.slice(3));
  a.addEventListener('click',function(e){e.preventDefault();if(open===role){det.hidden=true;open=null;return}open=role;det.hidden=false;det.innerHTML='';
   var ags=list[role]||[],box=document.createElement('div');
   if(ags.length>1){var row=document.createElement('div');row.className='pm-chips';var R=roll(ags.map(function(x){return x.state}));
    var press=function(b){row.querySelectorAll('.pm-chip').forEach(function(x){x.setAttribute('aria-pressed',x===b?'true':'false')})};
    var all=chip('All '+role+' ('+ags.length+')',R&&R.top,true,function(){press(all);showLog({role:role},box)});row.appendChild(all);
    ags.forEach(function(g){var c=chip(g.agent+' · '+g.state+(g.ctx!=null?' · '+Math.round(g.ctx)+'%':''),g.state,false,function(){press(c);showLog({agent:g.agent},box)});c.title=(g.text||'')+(g.item?' ('+g.item+')':'');row.appendChild(c)});
    det.appendChild(row);det.appendChild(box);showLog({role:role},box)}
   else{var g=ags[0];if(g){var hd=document.createElement('div');hd.className='pm-chips';hd.appendChild(chip(g.agent+' · '+g.state+(g.ctx!=null?' · '+Math.round(g.ctx)+'%':''),g.state,true,function(){}));det.appendChild(hd)}
    det.appendChild(box);if(g)showLog({agent:g.agent},box);else box.textContent='No agent on this role yet.'}
  })})}
window.d2PipeMap=function(host,d){
 host.innerHTML='';var complex=d.view==='complex',ag=d.agents||{},you=d.you||0;
 var agentsMode=d.mode==='agents',list=d.list||{};
 if(agentsMode){ag={};Object.keys(list).forEach(function(k){ag[k]=list[k].map(function(x){return x.state})});d.ctx=d.ctx||{};Object.keys(list).forEach(function(k){var c=list[k].map(function(x){return x.ctx}).filter(function(v){return v!=null});if(c.length)d.ctx[k]=c})}
 var roles=agentsMode&&d.roles?d.roles.slice():complex?['designer','coder'].concat([].concat(ag.tester||[]).indexOf('working')>=0?['tester']:[]).concat(['guardian']):[];
 var W=complex?90+roles.length*95:300,Y=52,r=complex?21:24,look=function(svg,x,y){if(!d.look)return;var a=el('a',{href:'?look=1'});
  a.appendChild(el('text',{x:x,y:y,'text-anchor':'middle','font-size':11,fill:'var(--attn,#7a7fc9)'},d.look+' to look at'));svg.appendChild(a)};
 var svg=el('svg',{viewBox:'0 0 '+W+' '+(d.look?130:120),role:'img'});
 svg.appendChild(el('title',{},'How work flows: you, '+(complex?roles.join(', '):'the pipeline, your AI')));
 var defs=el('defs',{}),m=el('marker',{id:'pm-a',viewBox:'0 0 10 10',refX:8,refY:5,markerWidth:6,markerHeight:6,orient:'auto'});
 m.appendChild(el('path',{d:'M0 0L10 5L0 10z',fill:'var(--soft,#9c9a93)'}));defs.appendChild(m);svg.appendChild(defs);
 var youSub=you?you+' for you':'nothing for you';
 if(!complex){
  node(svg,38,Y,r,'you',youSub,null,'?who=mine',true,'you');look(svg,38,Y+r+50);
  arrow(svg,64,100,Y);
  var box=el('g',{});box.appendChild(el('rect',{x:102,y:Y-22,width:96,height:44,rx:10,fill:'none',stroke:'var(--soft,#9c9a93)','stroke-dasharray':'4 3'}));
  box.appendChild(el('text',{x:150,y:Y-6,'text-anchor':'middle','font-size':11,fill:'var(--soft,#6b6a66)'},'pipeline'));
  pills(box,150,Y+1,d.items||{});svg.appendChild(box);
  arrow(svg,200,236,Y);
  var RM=roll(ag.maker),st=RM?RM.top:null;node(svg,262,Y,r,'maker',RM?RM.sub:'not started',st,'?role=maker',false,'AI',RM);
 } else {
  node(svg,32,Y,r,'you',youSub,null,'?who=mine',true,'you');look(svg,32,Y+r+50);
  var KNOWN=['designer','coder','tester','guardian'],sep=false;
  var x=32;roles.forEach(function(role){var nx=x+95,cxs=d.ctx||{},known=KNOWN.indexOf(role)>=0;
   if(!known&&!sep){sep=true;svg.appendChild(el('path',{d:'M'+(x+47)+' '+(Y-26)+'V'+(Y+26),stroke:'var(--line,#2c3039)','stroke-width':1.5,'stroke-dasharray':'2 3'}))}
   if(known)arrow(svg,x+r+2+(cxs[x===32?'':roles[roles.indexOf(role)-1]]!=null?7:0),nx-r-(cxs[role]!=null?8:0),Y);
   if(known)pills(svg,(x+nx)/2,Y-38,(d.items||{})[role]||{});
   var R=roll(ag[role]),s=R?R.top:null,cx=(d.ctx||{})[role];if(Array.isArray(cx))cx=cx.length?Math.max.apply(null,cx):null;
   if(s&&cx!=null){var RR=r+6,C=2*Math.PI*RR,pct=Math.max(0,Math.min(100,cx));
    svg.appendChild(el('circle',{cx:nx,cy:Y,r:RR,fill:'none',stroke:'var(--line,#2c3039)','stroke-width':4}));
    var ring=el('circle',{cx:nx,cy:Y,r:RR,fill:'none',stroke:pct>=70?'#e07a2e':'#5a8fc7','stroke-width':4,'stroke-linecap':'round','stroke-dasharray':(C*pct/100).toFixed(1)+' '+C.toFixed(1),transform:'rotate(-90 '+nx+' '+Y+')'});
    ring.appendChild(el('title',{},role+': context ~'+Math.round(pct)+'%'));svg.appendChild(ring);}
   node(svg,nx,Y,r,role,(R?R.sub:'not started')+(s&&cx!=null&&R.n===1?' · '+Math.round(cx)+'%':''),s,(agentsMode?'#r='+encodeURIComponent(role):'?role='+encodeURIComponent(role)),false,role.charAt(0).toUpperCase(),R);x=nx;});
 }
 if(complex&&d.waits&&d.waits.length){var X={you:32};var xx=32;roles.forEach(function(ro){xx+=95;X[ro]=xx});
  var dm=el('marker',{id:'pm-w',viewBox:'0 0 10 10',refX:8,refY:5,markerWidth:6,markerHeight:6,orient:'auto'});dm.appendChild(el('path',{d:'M0 0L10 5L0 10z',fill:'#d9a520'}));defs.appendChild(dm);
  d.waits.forEach(function(w,i){var a=X[w.from],b=X[w.to];if(a==null||b==null||a===b)return;var o=d.look?10:0,yb=Y+r+44+o+i*10,dip=yb+14;
   var p=el('path',{d:'M'+a+' '+(Y+r+40+o)+' C'+a+' '+dip+' '+b+' '+dip+' '+b+' '+(Y+r+40+o),stroke:'#d9a520','stroke-width':1.5,'stroke-dasharray':'4 3',fill:'none','marker-end':'url(#pm-w)'});
   p.appendChild(el('title',{},w.from+' is waiting on '+w.to));svg.appendChild(p);});
  svg.setAttribute('viewBox','0 0 '+W+' '+(140+d.waits.length*10+(d.look?10:0)));}
 host.appendChild(svg);
 if(agentsMode)details(host,svg,d,list);
 if(d.help){var h=document.createElement('a');h.className='pm-help';h.href=d.help;h.textContent='How it works ›';host.appendChild(h);}
};
})();
</script>
<div class="pm-map" style="max-width:380px;margin:0 auto"></div>
<script>
d2PipeMap(document.querySelector(".pm-map"), {view:"simple",you:2,items:{"new":3,"in-progress":1,waiting:1},agents:{maker:"working"}});
document.querySelector(".pm-map").addEventListener("click", function (e) { if (e.target.closest("a")) e.preventDefault() });   // a sample: links are inert here
</script>
```

## For master projects: roles and agents {#master}

Master projects add specialist roles (designer, coder, tester, guardian) and their agents, the Agents page, handovers and the MCP server; see [[Help:Agents]].

```embedhtml
<style>
#d2pipe-master .pw{max-width:820px;margin:0 auto;background:#16181d;color:#eceae4;border-radius:14px;padding:14px;color-scheme:dark}
#d2pipe-master svg{width:100%;height:auto;display:block;font-family:var(--body,system-ui,sans-serif)}
#d2pipe-master .bx{cursor:pointer}#d2pipe-master .bx rect{stroke-width:1.5}#d2pipe-master .bx:hover rect,#d2pipe-master .bx.on rect{stroke-width:3}
#d2pipe-master .pp rect{fill:#3a2a0e;stroke:#f2b84b}#d2pipe-master .ag rect{fill:#23265a;stroke:#9296f5}#d2pipe-master .st rect{fill:#1f2229;stroke:#454b57}#d2pipe-master .gd rect{fill:#10291f;stroke:#46c48e;stroke-dasharray:4 3}
#d2pipe-master .t{fill:#eceae4;font-size:13px;font-weight:700}#d2pipe-master .s{fill:#a8abb2;font-size:10.5px}#d2pipe-master .a{fill:#a8abb2;font-size:10px}
#d2pipe-master .ln{stroke:#8a8f99;stroke-width:1.3;fill:none;marker-end:url(#d2pipe-master-h)}#d2pipe-master .fr{fill:none;stroke:#6b707a;stroke-dasharray:5 4}
#d2pipe-master .panel{margin-top:10px;padding:10px 14px;border:1px solid #3a3f4a;border-radius:12px;background:#1f2229;color:#eceae4;font-size:14px;line-height:1.45}
#d2pipe-master .panel b{display:block;margin-bottom:4px}#d2pipe-master .panel ul{margin:4px 0 0;padding-left:18px}#d2pipe-master .panel li{margin:2px 0}#d2pipe-master .hint{color:#a8abb2}
#d2pipe-master .foot{margin-top:6px;font-size:12.5px;color:#a8abb2;text-align:center}
</style>
<div id="d2pipe-master"><div class="pw">
<svg viewBox="0 0 700 340" role="img" aria-label="You and the members on the left, the pipeline in the middle, AI agents on the right, a guardian apart on the far right"><defs><marker id="d2pipe-master-h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0 0L10 5L0 10z" fill="#8a8f99"/></marker></defs><g class="bx pp" data-k="you"><rect x="10" y="50" width="110" height="70" rx="12"/><text class="t" x="65" y="81" text-anchor="middle">You</text><text class="s" x="65" y="97" text-anchor="middle">any person role</text></g><g class="bx pp" data-k="others"><rect x="10" y="200" width="110" height="70" rx="12"/><text class="t" x="65" y="231" text-anchor="middle">Members</text><text class="s" x="65" y="249" text-anchor="middle">on the project</text></g><rect class="fr" x="225" y="28" width="130" height="262" rx="14"/><text class="t" x="290" y="48" text-anchor="middle">Pipeline</text><g class="bx st" data-k="new"><rect x="237" y="62" width="106" height="54" rx="12"/><text class="t" x="290" y="93" text-anchor="middle">New</text></g><g class="bx st" data-k="taken"><rect x="237" y="140" width="106" height="54" rx="12"/><text class="t" x="290" y="163" text-anchor="middle">Taken,</text><text class="t" x="290" y="179" text-anchor="middle">locked</text></g><g class="bx st" data-k="done"><rect x="237" y="218" width="106" height="54" rx="12"/><text class="t" x="290" y="241" text-anchor="middle">Done,</text><text class="t" x="290" y="257" text-anchor="middle">handed on</text></g><path class="ln" d="M290 116V138"/><path class="ln" d="M290 194V216"/><g class="bx ag" data-k="designer"><rect x="455" y="46" width="100" height="62" rx="12"/><text class="t" x="505" y="73" text-anchor="middle">Designer</text><text class="s" x="505" y="89" text-anchor="middle">spec, design</text></g><g class="bx ag" data-k="coder"><rect x="455" y="130" width="100" height="62" rx="12"/><text class="t" x="505" y="157" text-anchor="middle">Coder</text><text class="s" x="505" y="173" text-anchor="middle">builds, code tests</text></g><g class="bx ag" data-k="tester"><rect x="455" y="214" width="100" height="62" rx="12"/><text class="t" x="505" y="241" text-anchor="middle">Tester</text><text class="s" x="505" y="257" text-anchor="middle">runs design tests</text></g><g class="bx gd" data-k="guardian"><rect x="590" y="130" width="100" height="62" rx="12"/><text class="t" x="640" y="157" text-anchor="middle">Guardian</text><text class="s" x="640" y="173" text-anchor="middle">watches, reports</text></g><path class="ln" d="M120 74H223"/><text class="a" x="172" y="68" text-anchor="middle">park, assign</text><path class="ln" d="M225 102H122"/><text class="a" x="172" y="116" text-anchor="middle">notices</text><path class="ln" d="M120 224H223"/><text class="a" x="172" y="218" text-anchor="middle">their items</text><path class="ln" d="M225 252H122"/><text class="a" x="172" y="266" text-anchor="middle">notices</text><path class="ln" d="M355 77H453"/><text class="a" x="405" y="71" text-anchor="middle">take by role</text><path class="ln" d="M455 161H357"/><text class="a" x="405" y="175" text-anchor="middle">hand on, ask</text><path class="ln" d="M290 28V14H640V128"/><text class="a" x="465" y="10" text-anchor="middle">changes to check</text><path class="ln" d="M640 192V318H290V292"/><text class="a" x="465" y="332" text-anchor="middle">reviews</text></svg>
<div class="foot">Only people pass work to other members or projects; agents work for their own person.</div>
<div class="panel"><span class="hint">Tap any box.</span></div>
</div></div>
<script>
(function(){const root=document.getElementById("d2pipe-master");if(!root)return;
const P={
you:["You",["Park an idea: tell your AI \"park it\" and it makes the item, with your words, and parks it","Take an item and work on it; set its status; mark it done","Reassign it to another person or to one of your agent roles","Hand it on to the next role (spec → design → code → test)","Answer an item waiting on you: Approve or Refuse","Make a follow-up when someone else took it","Drop it, saying why; move it to another of your projects","Your own items stand out and come first"]],
others:["Members",["Everyone on the project sees every item","They take and finish what's for them","Work reaches them when a person passes it on","They get a notice when something is theirs or waits on them"]],
new:["New",["A title, from → for, and a document that starts with the original words","Can wait on other items; it unlocks when they're done","Anyone can still edit, reassign or drop it"]],
taken:["Taken, locked",["Only whoever took it changes it","Anyone else makes a follow-up, and the taker is told","The list shows who took it and when"]],
done:["Done, handed on",["Handing on makes the next item for the next role, linked both ways","Items waiting on it go back to new, and their person is told","Done stays done: a later change is a new, linked item"]],
designer:["Designer agent",["Takes design items","Writes the Spec, the Design and the design tests","Hands a finished design to the coder","Suggests moving to-dos, never moves them"]],
coder:["Coder agent",["Takes code and doc items","Builds, runs the design tests with every build, writes code tests","Hands on to the tester, or back to the designer when the design looks wrong"]],
guardian:["Guardian agent (being designed, P-41)",["Watches its areas: spec and design, implementation, testing, deployment; one guardian can cover several","Checks every change skeptically: consistent with the rest, lined up end to end, concise, no drift beyond what was asked","Each finding is an item for whoever made the change, so it's visible","Reports; never fixes another role's work"]],
tester:["Tester agent",["Takes test items","Runs the design tests: its run is the one that counts","Failures go back as new items for the coder"]]};
const pn=root.querySelector(".panel"),bs=[...root.querySelectorAll(".bx")];
const esc=s=>s.replace(/[&<>]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;"})[c]);
bs.forEach(b=>{b.setAttribute("tabindex","0");const go=()=>{bs.forEach(x=>x.classList.toggle("on",x.dataset.k===b.dataset.k));const [t,l]=P[b.dataset.k];pn.innerHTML="<b>"+esc(t)+"</b><ul>"+l.map(x=>"<li>"+esc(x)+"</li>").join("")+"</ul>"};b.addEventListener("click",go);b.addEventListener("keydown",e=>{if(e.key==="Enter"||e.key===" "){e.preventDefault();go()}})});
})();
</script>
```

A **guardian** agent watches the changes in its areas and reports what it finds, as items for whoever made the change; it never fixes another role's work (being designed). How to run agents, guardians included: [[Help:Agents]].

**The map at the top of your Pipeline page** (master projects; sample data here): you, then each role in turn (designer, coder, the tester while it's testing, the guardian), each coloured by what its agent is doing and topped with its items by status; when several agents work in one role, they share its circle: the count inside, a slice of colour for each one's state. On master projects the Agents page lists every agent, whatever its role. Tap a role to see its items (and its agent's).

```embedhtml
<!--
  d2 pipeline page header map (designer-built, Razie approved 2026-09-28; roll-up, look and dark you-initial 2026-09-28 evening). Also the Agents page's diagram (2026-09-28): pass waits.
  Drop in as is. Markup: wrap the page's lede paragraph and an empty <div class="pm-map"></div>
  in <div class="pm-row">, then call d2PipeMap(el, data) with:
    view   'simple' (creator, pro) | 'complex' (master); in simple the AI circle is named maker (Razie 2026-09-28)
    help   link to Help:Pipeline at the level's section
    you    number of items for the viewer (^pipe-26)
    items  simple: {new, 'in-progress', review, waiting} over the whole list
           complex: {designer:{...}, coder:{...}, tester:{...}, guardian:{...}} per role, person + agent roles
    agents board states per role: {maker, designer, coder, tester, guardian}; each a state string, or an array of
           states when several agents report under the role (null = none). Agents with other roles are not drawn:
           the map shows the known roles only (Razie 2026-09-28); the Agents page list shows every agent.
           Several live agents on a role roll up into one circle: the count inside, a pie of their state colours,
           the plain role name under it. done and gone agents are left out of the roll-up while any other is live.
    look   optional: number of items to look at (^pipe-45): "N to look at" under the you node, to ?look=1
    ctx    optional: {<role>: <context % the agent last reported>} draws a ring around its node
           (orange from 70) and adds " · N%" to its state line; for a rolled-up role, the fullest agent's
    waits  optional (Agents page): [{from:'coder', to:'you'|'designer'|…}] from each agent's waitingOn;
           drawn as a dashed amber arc under the row, from the waiting agent back to whom it waits on
  Agents page (Razie 2026-09-28): mode 'agents' with
    roles  every role that reports (known ones first, in pipeline order), instead of the known roles only;
           roles outside the pipeline (e.g. dispatcher) come after a dotted divider, with no arrow or item pills
    list   {<role>: [{agent, state, ctx?, item?, text?}]} every agent on the board, by role
    loadLog(f)  f = {role} or {agent}; returns a Promise of [{at, agent, state, text, item?}], newest first
           (Log:AgentHistory plus the current statuses; the page's one data call)
  Tapping a role with several agents opens a second row under the map: an "All (n)" chip (the role's merged log,
  selected first) and one chip per agent; tapping a chip shows that log. A role with one agent goes straight
  to its log. Tapping the same role again closes the panel.
  The one wiring point: STATE below must be the Agents page's own state-colour map; change it there, not here.
-->
<style>
.pm-row{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
.pm-row>.lede{flex:1 1 220px;margin:0}
.pm-map{flex:1 1 280px;max-width:380px}
.pm-map svg{width:100%;height:auto;display:block}
.pm-map a{cursor:pointer}
.pm-map .pm-n:hover circle,.pm-map .pm-n:focus circle{stroke:var(--ink,#1d1d1b);stroke-width:2}
.pm-map text{font-family:inherit}
.pm-map .pm-you{fill:#633806}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .pm-map .pm-you{fill:#fbe3b0}}
:root[data-theme="dark"] .pm-map .pm-you{fill:#fbe3b0}
.pm-det{margin-top:8px;border-top:1px solid var(--line,#2c3039);padding-top:8px;font-size:13px}
.pm-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.pm-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line,#2c3039);border-radius:14px;padding:3px 10px 3px 6px;background:none;color:var(--ink,#1d1d1b);font:inherit;font-size:12px;cursor:pointer}
.pm-chip[aria-pressed=true]{border-color:var(--ink,#1d1d1b);font-weight:600}
.pm-dot{width:10px;height:10px;border-radius:50%;display:inline-block;flex:none}
.pm-log{list-style:none;margin:0;padding:0;max-height:260px;overflow:auto}
.pm-log li{display:flex;gap:8px;align-items:baseline;padding:3px 0;border-bottom:1px solid var(--line,#2c3039)}
.pm-log .t{color:var(--soft,#6b6a66);font-variant-numeric:tabular-nums;flex:none;font-size:12px}
.pm-log .s{flex:none;font-size:11px;border-radius:8px;padding:0 6px;color:#fff}
.pm-log .a{flex:none;font-size:12px;color:var(--soft,#6b6a66)}
.pm-log .x{flex:1;min-width:0;overflow-wrap:anywhere}
.pm-log a{color:inherit;text-decoration:underline}
.pm-help{display:block;text-align:center;font-size:12px;color:var(--soft,#6b6a66);margin-top:2px}
</style>
<script>
(function(){
var STATE={up:'#5a8fc7',idle:'#5a8fc7',working:'#2f9a6f',waiting:'#d9a520','handing-over':'#8a6fc7',done:'#9c9a93',stuck:'#c9483b',gone:'#9c9a93',warning:'#e07a2e',stopped:'#c9483b'};
var DARKTEXT={waiting:1};
var ITEM=[['new','var(--soft,#9c9a93)'],['in-progress','#2f9a6f'],['waiting','#d9a520'],['review','#7a7fc9']];
var NS='http://www.w3.org/2000/svg';
function el(n,a,t){var e=document.createElementNS(NS,n);for(var k in a)e.setAttribute(k,a[k]);if(t!=null)e.textContent=t;return e}
function pills(g,cx,y,c){var list=ITEM.filter(function(s){return (c&&c[s[0]])>0});var w=24,gap=4,x=cx-(list.length*w+(list.length-1)*gap)/2;
 list.forEach(function(s){var p=el('g',{});p.appendChild(el('rect',{x:x,y:y,width:w,height:15,rx:7,fill:s[1]}));
  p.appendChild(el('text',{x:x+w/2,y:y+11,'text-anchor':'middle','font-size':11,fill:'#fff'},String(c[s[0]])));
  p.appendChild(el('title',{},c[s[0]]+' '+s[0]));g.appendChild(p);x+=w+gap});}
var RANK=['stuck','stopped','warning','waiting','handing-over','working','up','idle','done','gone'];
function roll(v){if(v==null)return null;var a=Array.isArray(v)?v.slice():[v];if(!a.length)return null;
 var live=a.filter(function(s){return s!=='done'&&s!=='gone'});if(live.length)a=live;else a=[a.sort(function(p,q){return RANK.indexOf(p)-RANK.indexOf(q)})[0]];
 var c={};a.forEach(function(s){c[s]=(c[s]||0)+1});var ks=Object.keys(c).sort(function(p,q){return RANK.indexOf(p)-RANK.indexOf(q)});
 return {n:a.length,top:ks[0],counts:c,keys:ks,sub:a.length===1?ks[0]:c[ks[0]]+' '+ks[0]+(a.length>c[ks[0]]?' +'+(a.length-c[ks[0]]):'')}}
function pie(a,x,y,r,R){var ang=-Math.PI/2;R.keys.forEach(function(k){var f=R.counts[k]/R.n,e=ang+f*2*Math.PI;
  if(f>=1){a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:STATE[k]||'#9c9a93'}));return}
  var x1=x+r*Math.cos(ang),y1=y+r*Math.sin(ang),x2=x+r*Math.cos(e),y2=y+r*Math.sin(e);
  var p=el('path',{d:'M'+x+' '+y+'L'+x1.toFixed(2)+' '+y1.toFixed(2)+'A'+r+' '+r+' 0 '+(f>0.5?1:0)+' 1 '+x2.toFixed(2)+' '+y2.toFixed(2)+'Z',fill:STATE[k]||'#9c9a93',stroke:'var(--bg,#fff)','stroke-width':1});
  p.appendChild(el('title',{},R.counts[k]+' '+k));a.appendChild(p);ang=e});}
function node(svg,x,y,r,label,sub,state,href,isYou,initial,R){
 var a=el('a',{href:href,class:'pm-n'});a.appendChild(el('title',{},label+(state?': '+state:'')));
 if(isYou)a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:'var(--sun-bg,#fbf1dc)',stroke:'var(--sun,#d99a2b)','stroke-width':1.5}));
 else if(R&&R.n>1)pie(a,x,y,r,R);
 else if(state)a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:STATE[state]||'#9c9a93'}));
 else a.appendChild(el('circle',{cx:x,cy:y,r:r,fill:'none',stroke:'var(--soft,#9c9a93)','stroke-width':1.5,'stroke-dasharray':'3 3'}));
 var multi=R&&R.n>1,ink=multi?'#fff':(state?(DARKTEXT[state]?'#412402':'#fff'):'var(--soft,#6b6a66)');
 var it=el('text',isYou?{x:x,y:y+4,'text-anchor':'middle','font-size':12,class:'pm-you'}:{x:x,y:y+(multi?5:4),'text-anchor':'middle','font-size':multi?14:12,'font-weight':multi?600:400,fill:ink,stroke:multi?'rgba(0,0,0,.35)':'none','stroke-width':multi?2:0,'paint-order':'stroke'},multi?String(R.n):initial);a.appendChild(it);
 a.appendChild(el('text',{x:x,y:y+r+20,'text-anchor':'middle','font-size':12,fill:'var(--ink,#1d1d1b)'},label));
 a.appendChild(el('text',{x:x,y:y+r+36,'text-anchor':'middle','font-size':11,fill:isYou?'var(--sun,#d99a2b)':(state?(STATE[state]):'var(--soft,#6b6a66)')},sub));
 svg.appendChild(a);}
function arrow(svg,x1,x2,y){svg.appendChild(el('path',{d:'M'+x1+' '+y+'H'+(x2-2),stroke:'var(--soft,#9c9a93)','stroke-width':1.5,fill:'none','marker-end':'url(#pm-a)'}));}
function hm(t){var x=new Date(t);return isNaN(x)?'':('0'+x.getHours()).slice(-2)+':'+('0'+x.getMinutes()).slice(-2)}
function details(host,svg,d,list){var det=document.createElement('div');det.className='pm-det';det.hidden=true;host.appendChild(det);var open=null;
 function showLog(f,box){box.innerHTML='<div style="color:var(--soft,#6b6a66)">Loading…</div>';
  Promise.resolve(d.loadLog?d.loadLog(f):[]).then(function(rows){var ul=document.createElement('ul');ul.className='pm-log';
   if(!rows||!rows.length){box.innerHTML='<div style="color:var(--soft,#6b6a66)">Nothing logged yet.</div>';return}
   rows.forEach(function(r){var li=document.createElement('li');
    var t=document.createElement('span');t.className='t';t.textContent=hm(r.at);li.appendChild(t);
    var s=document.createElement('span');s.className='s';s.textContent=r.state||'';s.style.background=STATE[r.state]||'#9c9a93';if(DARKTEXT[r.state])s.style.color='#412402';li.appendChild(s);
    if(f.role){var a=document.createElement('span');a.className='a';a.textContent=r.agent;li.appendChild(a)}
    var x=document.createElement('span');x.className='x';x.textContent=(r.text||'')+(r.item?' ':'');if(r.item){var il=document.createElement('a');il.href='/pipeline/'+r.item;il.textContent=r.item;x.appendChild(il)}li.appendChild(x);ul.appendChild(li)});
   box.innerHTML='';box.appendChild(ul)},function(){box.textContent='Could not load the log.'})}
 function chip(label,state,pressed,onclick){var b=document.createElement('button');b.type='button';b.className='pm-chip';b.setAttribute('aria-pressed',pressed?'true':'false');
  var dot=document.createElement('span');dot.className='pm-dot';dot.style.background=state?(STATE[state]||'#9c9a93'):'var(--soft,#9c9a93)';b.appendChild(dot);b.appendChild(document.createTextNode(label));b.onclick=onclick;return b}
 svg.querySelectorAll('a.pm-n').forEach(function(a){var h=a.getAttribute('href')||'';if(h.indexOf('#r=')!==0)return;var role=decodeURIComponent(h.slice(3));
  a.addEventListener('click',function(e){e.preventDefault();if(open===role){det.hidden=true;open=null;return}open=role;det.hidden=false;det.innerHTML='';
   var ags=list[role]||[],box=document.createElement('div');
   if(ags.length>1){var row=document.createElement('div');row.className='pm-chips';var R=roll(ags.map(function(x){return x.state}));
    var press=function(b){row.querySelectorAll('.pm-chip').forEach(function(x){x.setAttribute('aria-pressed',x===b?'true':'false')})};
    var all=chip('All '+role+' ('+ags.length+')',R&&R.top,true,function(){press(all);showLog({role:role},box)});row.appendChild(all);
    ags.forEach(function(g){var c=chip(g.agent+' · '+g.state+(g.ctx!=null?' · '+Math.round(g.ctx)+'%':''),g.state,false,function(){press(c);showLog({agent:g.agent},box)});c.title=(g.text||'')+(g.item?' ('+g.item+')':'');row.appendChild(c)});
    det.appendChild(row);det.appendChild(box);showLog({role:role},box)}
   else{var g=ags[0];if(g){var hd=document.createElement('div');hd.className='pm-chips';hd.appendChild(chip(g.agent+' · '+g.state+(g.ctx!=null?' · '+Math.round(g.ctx)+'%':''),g.state,true,function(){}));det.appendChild(hd)}
    det.appendChild(box);if(g)showLog({agent:g.agent},box);else box.textContent='No agent on this role yet.'}
  })})}
window.d2PipeMap=function(host,d){
 host.innerHTML='';var complex=d.view==='complex',ag=d.agents||{},you=d.you||0;
 var agentsMode=d.mode==='agents',list=d.list||{};
 if(agentsMode){ag={};Object.keys(list).forEach(function(k){ag[k]=list[k].map(function(x){return x.state})});d.ctx=d.ctx||{};Object.keys(list).forEach(function(k){var c=list[k].map(function(x){return x.ctx}).filter(function(v){return v!=null});if(c.length)d.ctx[k]=c})}
 var roles=agentsMode&&d.roles?d.roles.slice():complex?['designer','coder'].concat([].concat(ag.tester||[]).indexOf('working')>=0?['tester']:[]).concat(['guardian']):[];
 var W=complex?90+roles.length*95:300,Y=52,r=complex?21:24,look=function(svg,x,y){if(!d.look)return;var a=el('a',{href:'?look=1'});
  a.appendChild(el('text',{x:x,y:y,'text-anchor':'middle','font-size':11,fill:'var(--attn,#7a7fc9)'},d.look+' to look at'));svg.appendChild(a)};
 var svg=el('svg',{viewBox:'0 0 '+W+' '+(d.look?130:120),role:'img'});
 svg.appendChild(el('title',{},'How work flows: you, '+(complex?roles.join(', '):'the pipeline, your AI')));
 var defs=el('defs',{}),m=el('marker',{id:'pm-a',viewBox:'0 0 10 10',refX:8,refY:5,markerWidth:6,markerHeight:6,orient:'auto'});
 m.appendChild(el('path',{d:'M0 0L10 5L0 10z',fill:'var(--soft,#9c9a93)'}));defs.appendChild(m);svg.appendChild(defs);
 var youSub=you?you+' for you':'nothing for you';
 if(!complex){
  node(svg,38,Y,r,'you',youSub,null,'?who=mine',true,'you');look(svg,38,Y+r+50);
  arrow(svg,64,100,Y);
  var box=el('g',{});box.appendChild(el('rect',{x:102,y:Y-22,width:96,height:44,rx:10,fill:'none',stroke:'var(--soft,#9c9a93)','stroke-dasharray':'4 3'}));
  box.appendChild(el('text',{x:150,y:Y-6,'text-anchor':'middle','font-size':11,fill:'var(--soft,#6b6a66)'},'pipeline'));
  pills(box,150,Y+1,d.items||{});svg.appendChild(box);
  arrow(svg,200,236,Y);
  var RM=roll(ag.maker),st=RM?RM.top:null;node(svg,262,Y,r,'maker',RM?RM.sub:'not started',st,'?role=maker',false,'AI',RM);
 } else {
  node(svg,32,Y,r,'you',youSub,null,'?who=mine',true,'you');look(svg,32,Y+r+50);
  var KNOWN=['designer','coder','tester','guardian'],sep=false;
  var x=32;roles.forEach(function(role){var nx=x+95,cxs=d.ctx||{},known=KNOWN.indexOf(role)>=0;
   if(!known&&!sep){sep=true;svg.appendChild(el('path',{d:'M'+(x+47)+' '+(Y-26)+'V'+(Y+26),stroke:'var(--line,#2c3039)','stroke-width':1.5,'stroke-dasharray':'2 3'}))}
   if(known)arrow(svg,x+r+2+(cxs[x===32?'':roles[roles.indexOf(role)-1]]!=null?7:0),nx-r-(cxs[role]!=null?8:0),Y);
   if(known)pills(svg,(x+nx)/2,Y-38,(d.items||{})[role]||{});
   var R=roll(ag[role]),s=R?R.top:null,cx=(d.ctx||{})[role];if(Array.isArray(cx))cx=cx.length?Math.max.apply(null,cx):null;
   if(s&&cx!=null){var RR=r+6,C=2*Math.PI*RR,pct=Math.max(0,Math.min(100,cx));
    svg.appendChild(el('circle',{cx:nx,cy:Y,r:RR,fill:'none',stroke:'var(--line,#2c3039)','stroke-width':4}));
    var ring=el('circle',{cx:nx,cy:Y,r:RR,fill:'none',stroke:pct>=70?'#e07a2e':'#5a8fc7','stroke-width':4,'stroke-linecap':'round','stroke-dasharray':(C*pct/100).toFixed(1)+' '+C.toFixed(1),transform:'rotate(-90 '+nx+' '+Y+')'});
    ring.appendChild(el('title',{},role+': context ~'+Math.round(pct)+'%'));svg.appendChild(ring);}
   node(svg,nx,Y,r,role,(R?R.sub:'not started')+(s&&cx!=null&&R.n===1?' · '+Math.round(cx)+'%':''),s,(agentsMode?'#r='+encodeURIComponent(role):'?role='+encodeURIComponent(role)),false,role.charAt(0).toUpperCase(),R);x=nx;});
 }
 if(complex&&d.waits&&d.waits.length){var X={you:32};var xx=32;roles.forEach(function(ro){xx+=95;X[ro]=xx});
  var dm=el('marker',{id:'pm-w',viewBox:'0 0 10 10',refX:8,refY:5,markerWidth:6,markerHeight:6,orient:'auto'});dm.appendChild(el('path',{d:'M0 0L10 5L0 10z',fill:'#d9a520'}));defs.appendChild(dm);
  d.waits.forEach(function(w,i){var a=X[w.from],b=X[w.to];if(a==null||b==null||a===b)return;var o=d.look?10:0,yb=Y+r+44+o+i*10,dip=yb+14;
   var p=el('path',{d:'M'+a+' '+(Y+r+40+o)+' C'+a+' '+dip+' '+b+' '+dip+' '+b+' '+(Y+r+40+o),stroke:'#d9a520','stroke-width':1.5,'stroke-dasharray':'4 3',fill:'none','marker-end':'url(#pm-w)'});
   p.appendChild(el('title',{},w.from+' is waiting on '+w.to));svg.appendChild(p);});
  svg.setAttribute('viewBox','0 0 '+W+' '+(140+d.waits.length*10+(d.look?10:0)));}
 host.appendChild(svg);
 if(agentsMode)details(host,svg,d,list);
 if(d.help){var h=document.createElement('a');h.className='pm-help';h.href=d.help;h.textContent='How it works ›';host.appendChild(h);}
};
})();
</script>
<div class="pm-map" style="max-width:380px;margin:0 auto"></div>
<script>
d2PipeMap(document.querySelector(".pm-map"), {view:"complex",you:1,items:{designer:{"new":2,"in-progress":1},coder:{"new":3,"in-progress":1,waiting:1},tester:{},guardian:{"new":1}},agents:{designer:"working",coder:["working","waiting"],tester:null,guardian:"idle"}});
document.querySelector(".pm-map").addEventListener("click", function (e) { if (e.target.closest("a")) e.preventDefault() });   // a sample: links are inert here
</script>
```

## Every step is on the record {#record}

Nothing an agent or a person does in the pipeline is lost.

- **Every item keeps its history:** who made it and for whom, who took it and when, every status change, every note and answer, who asked for a change (*asked by you*), and links to what changed. Open any item in [the pipeline](/pipeline): its full history is at the bottom of its page. Done and archived items keep their page, so an old item number still opens.
- **Every step leaves its mark in the documents:** a step changes the Spec, the Design, the implementation notes or the tests, and each change gets a changelog line naming the item behind it. Every topic keeps all its versions, with what changed between them: open a topic's **History** (for example [the Spec's](/topics/Spec?view=history), in a project that has one).
- **So you can always trace a change back:** from a line in the spec to the version that brought it in, to the item, to who asked and why. Your agents can do the same, so when something odd creeps in they find where it came from instead of guessing.
- **Agents can watch the flow for you:** background agents such as guardians read what changed every day and report drift or gaps as pipeline items ([[Help:Agents#guardians]]), the [Agents](/agents) page shows what each agent is doing right now, and [Agent history](/topics/Log:AgentHistory) shows what agents did.

### What each role records {#records}

Each role writes down what it did, in the project's documents, not just in a chat, so the next person or agent can pick it up.

- **Coder:**
  - *Implementation notes:* where each feature lives in the code, any test-only switches, and changes to how things run or are deployed.
  - *Design:* an **As built** note on the feature's section whenever the build settled or changed a detail.
  - *Tests and routes:* design tests marked as passing, what a test really checks where it differs from the text, and routes moved from planned to built.
  - *Project log:* one line per batch of work.
  - *Pipeline:* a closing note on each item, and an item for the designer for every design call the build raised.
- **Designer:**
  - *Spec:* one line per behaviour, each with its code, and a dated line for every decision you made.
  - *Design:* how each feature works, ending with its routes and codes; "Accepted" notes when a build's details are agreed.
  - *Design tests:* written before the code exists, linked to the behaviours they check.
  - *Help and marketing:* the feature's help text and a blurb when it's approved.
  - *Pipeline:* your decisions recorded on each item, items for the coder once you've approved, and approved visual pieces handed over as finished files.
- **Tester:**
  - *Tests:* each design test's status (tested, gap, not built), plus its own acceptance and regression tests.
  - *Pipeline:* an item for every failure, with how to reproduce it, for the role that owns it.
- **Guardian:**
  - *Pipeline:* one review item per topic it checked, with what drifted or is missing and where, even when it found nothing worth fixing.
- **Maker** (your AI on Hero, Creator, Pro):
  - *Specification:* the project's `Spec`: each app and feature it builds, in your words, and a dated Log of what it built.
  - *Your project:* the pages, flows and sample runs it made, each named after its feature.
  - *Pipeline:* what it parked for later, and a short record of what it built.
- **Everyone:** every change keeps its version in the topic's history, every item keeps its full history, and every agent's work shows in [Agent history](/topics/Log:AgentHistory).

## Who does what {#roles}

Each role has one job, and they pass work to each other through the pipeline, never around it.

- **You** (and any other member): say what you want, answer questions and approvals, review what's done, decide what ships. You're the only one who moves work to other members or projects; your AI marks things important, drops, promotes or moves them to the to-do list only when you ask.
- **Maker** (your AI, on Hero, Creator and Pro): the do-everything role. Builds what you ask (model, pages, data, fixes), parks what's for later, asks you before risky steps, keeps a short record of what it built.
- **Designer** (Master): turns what you ask into the Spec (what it does), the Design (how it works) and the design tests, and builds approved visual pieces itself. Brings you the calls to make; sends work to the coder once you've approved it; decides the details the coder brings back, asking you when it's yours to decide.
- **Coder** (Master): builds what the designer hands on, runs the design tests with every build, deploys a preview and keeps the implementation notes current. Never changes what a design test checks; sends details the build settled back to the designer as one item.
- **Tester** (Master): owns and runs the design tests, adds its own, and sends failures back as items. Its run is the one that says a feature is done.
- **Guardian** (Master): reads what changed each day in its areas (spec, design, implementation, tests, deployments) and reports drift or gaps as one item per topic, for the role that owns it. It reports; it doesn't fix.
- **Administrator** (a person): looks after the project and the box: levels, members, tokens, permissions, deploys.

**How they talk.** Work always goes through pipeline items: a role hands an item on, or makes a new one for the next role, with links to what changed. Agents can also leave each other short messages on the Agents page, for information, never orders; they only work with agents of the same person. What waits for you shows first on your Work page (Pro and up) or at the top of the pipeline, and how far agents may go without you is set on the [Permissions](/ai/permissions) page.

## Sample prompts {#prompts}

How people drive the pipeline by talking. Put your project's name where it says `<project>`; more in [[ExampleAiPrompts]].

**1. Start a designer**
> You are the designer on <project>. Work the pipeline.

*Answer, roughly:* "I took the handover P-63 and closed it. Next for the designer is P-66, design calls from the last build: I'd accept 1–7 as built and write them in; item 8 is a gap, the build lacks something the spec keeps, so I'd make a coder item for it. OK to write these in and send that one on?"

**2. Start a coder**
> You are the coder on <project>. Work the pipeline.

*Answer, roughly:* "I took the handover and closed it. Building P-72 (important), then P-73 and P-74. Each one: build, run the tests, deploy a preview, update the documents, then the next. Details the build settled go back to the designer as one item."

**3. Ask what's open about something**
> Any other items from the landing page in the pipeline?

*Answer, roughly:* "No, nothing open: the ladder (P-52), the Master door (P-54) and the shop example (P-75) are all done, and their design calls are closed. The only thing left is a to-do, not an item: the landing as an app you edit as content. Want me to promote it?"

**4. What's waiting on me**
> What's waiting on me? Most important first, with links.

*Answer, roughly:* "Three things: P-81 needs your call on two details from the last build; P-9, run the memory guards on the box, is yours as administrator; and P-47, the maker role, waits for you to decide what the maker skill holds. The rest is moving without you."

**5. Park an idea, and set its priority**
> Park it for the coder: the Work page should remember my filters. Mark it important.

*Answer, roughly:* "Parked as P-84 for the coder, marked important (asked by you), so it's taken next. Nothing else changed."

**6. Answering a design call**
*The designer asks:* "P-81 has two small calls from the build. 1. Drop's check is looser than the other three: an AI has to send `askedBy`, but d2 doesn't check that it names its own person, as the rule says and the other three do. I'd make drop match, a small fix for the coder. 2. MCP's promote takes the line number as text and d2 turns it into a number; fine, I'll accept it as built. Should I send #1 to the coder?"
> Yes, good, do it.

*Answer, roughly:* "Sent as P-91 for the coder; #2 accepted into the design; P-81 closed."

**Tips.**
- Start a chat by naming its role and "work the pipeline".
- "Park it" makes an item and parks it, instead of doing the work now.
- Ask for links, so you can open each item.
- Say "mark it important" (or "drop it", "demote it to a to-do") and your AI does it for you, recorded as asked by you ([[Spec#^pipe-37]]).
- New work for the coder waits for your review unless your Permissions say otherwise.

## Parking an idea

Say *"park it"* to your AI about an idea and it becomes an item for you, parked (never picked until you unpark it), with your words at the top of its document. You can also make one from the Pipeline page (**New item**). An item has a title, who it's from and who it's for (a role, and a person), a kind (question, design, code, test, handover…) and a document that grows as people and agents work on it.

## From → for, and who took it

Each row shows **who → whom**: the role that made it and the role it's for, with a name when it's for someone else. Opening an item shows its document, where it came from, who took it and when, and its history. The items you have to act on yourself (for you, waiting on your answer, or an approval) **stand out** in the list and come first; your agents' items don't.

## Taking, statuses and Done

**Take it** makes an item yours and puts it in progress. Set its status as the work goes (pending, waiting, waiting on someone's input, done) or press **Done**. Your own items have a **✓** on their row in the list: one tap closes it, and **Undo** puts it back for a few seconds. Only the person an item is for, or their AI for one of their agent roles, takes and finishes it. Taken something you can't finish now? **Put down** (beside the status on the item's page, or `POST /api/v2/pipeline/<id>/putdown {note?}`) releases it: it's new again with no taker, so it can be picked up or parked. Its taker or its person may put it down; anyone else makes a follow-up.

## Important items

Tick an item's **Important** box (on the list or the item's page) and it goes to the top of the list, and your agents take it before anything else for their role. You mark items important, or your AI does when you ask it to; agents see the ★.

## List, table or board {#views}

Switch at the right of the line above the filters. **List** (the default): a card per item; on your own items a bar with **✓ Close** and **↩ Return**; an item in review for you shows **✓ Accept** and **↩ Send back** instead (in every view, whoever worked on it), and an approval **✓ Approve** and **✕ Refuse**, never a plain Close; and **⤒ ↑ ↓ ⤓** on items an agent could take next. **Table**: the compact rows. **Board**: a column per stage (New, In progress, Waiting, Review, Done for the last week), each with its count; on a phone, one column per screen, swiped. Your last choice is remembered in this browser; a link with `?view=` wins. **Mine | All** narrows any of them to your items.

**The row menu:** the **⋯** at the right end of a row opens what else you may do with that item: **Pause ⏸** it or **Resume** it, **Park Ⓟ** it (on hold, out of the pick order) or **Unpark** it, and **Demote to a to-do** (pro and master; type the topic, `ToDo:PROJECT` if you leave it empty). On a phone the **⤒ ↑ ↓ ⤓** live in this menu too, and the ✓ stays on the row. An item in progress can't be parked from here: its taker puts it down first.

## What collides with what {#collisions}

When agents work in parallel, each item can say what it **touches** — the files and topics it changes — and every open row carries one quiet chip after its size, so you can see at a glance what is safe to start beside what:

- **conflicts(3-7)** — it changes the same files as 3 items already in progress, 7 files between them. Hover it (or tap it on a phone) for the items and the files.
- **may collide(2)** — 2 items in progress might overlap it, but nobody can tell: one side or both say nothing about what they touch.
- **no collisions** — nothing in progress touches its files.

A line above the list adds them up: *5 items with conflicts · 11 files*. **Only files count**: two items that both write `Design` are not a conflict, because a topic is saved as a draft that d2 versions and merges, while a file is merged in git by whoever gets there second. A conflict is never a refusal — it is a fact for whoever decides what to run next, and two items that touch the same files are often better given to one agent than held apart.

## Editing an item {#edit-item}

**Edit** on an item's page opens it in the same editor as a topic: a small front matter of its fields — title, kind, who it's for, size, important, rank, feature, touches, waitsOn, links — over its document. Save checks every field the way the API does, and a bad line is refused **with the line named and nothing saved**, so a mistyped size never leaves half a save behind.

What a save can't touch is shown greyed above the editor and changes only through its own buttons: its **id**, its **status** (the buttons and Pause/Park move that), who it's **from**, its **taker** and its **dates**. An item someone has taken is edited by its taker or by the person it's for; anyone else gets **New follow-up** as usual. Each save adds one history line naming the fields that changed.

Your AI can do the same over the API: `GET /api/v2/pipeline/P-12?format=topic` gives that text and `PUT /api/v2/pipeline/P-12` with `Content-Type: text/markdown` writes it back.

## Pausing: not now, without losing it {#pausing}

Going away, or want your agents to stop taking new work for a while? **Pause** a new or pending item from its row's menu or its page, or press **Pause all** at the top of the list to hold every new and pending item the list is showing — so a list narrowed to one role (`?role=coder`) holds just that role's queue.

A paused item keeps its row, its rank and its place in the order, sits at the bottom of the live list with a yellow **⏸ Paused** chip, and your agents skip it: it's off Next up and out of the pipe map's counts, so a dispatcher whose whole queue is paused goes idle instead of looking for work. **Resume** (on the row, on the page, or **Resume all** where Pause all was) puts each item back to exactly the status it had — pending stays pending — in its old order.

**Paused is not parked.** Parking says *not this*; pausing says *not now*. So a parked item has no Pause (it's already out of the way), and Resume all never unparks anything you parked on purpose. Because ⏸ now means pause everywhere, **Park's icon is Ⓟ**. Items in progress, waiting, or in review are never paused — put an item down first if you want to pause it. Pausing and resuming are yours to do; your AI does it when you ask it to.

## The list's order

Important items first, then what's in progress, then what's yours to act on (it stands out), then the rest, newest change first; then paused items, then the collapsed **Parked** group; done items last. A follow-up or an item waiting on another sits indented right under it.

## Next up: rank, size and batches

Open a role (tap it on the map, or **Next up** on its view) to see what its agent will take, in that order, numbered. Move an item with **↑ ↓**, or send it to either end with **⤒** and **⤓**; a handover and important items always come first, so ⤒ is the top of the ranked ones. Each item has a size (S, M, L; change it on its page): an agent that takes a small item also takes the small ones right after it, up to five, marked *taken together*.

## Review, to look at, and return {#review}

When an agent finishes an item, your project's **Finish an item** setting (on the Permissions page, by the item's size) decides what happens. **Asks**: it waits in **review** for you: **Accept** it (what waits on it starts now) or **Send back** with a note (it reopens for the same agent). **Tells**: it's done at once and goes on your **to look at** list (the *N to look at ›* line above the list): mark it **✓ Seen**, or **↩ Send back** with a note, whenever you have a moment; nothing there holds anything up. Pro's default: small items go straight through, bigger ones wait.

**Review with a comment:** at the bottom of an item in review, after its document, **Accept with a comment** and **Send back with a comment** open an editor right there. *Accept with a comment* means "done, if…": the item goes back to the agent that finished it, which resolves your comment and closes it (saying how), or brings it back to your review with its questions. *Send back with a comment* means it isn't right yet: whatever the Finish setting says, the agent's next finish comes back to your review (the item says *comes back to you*). The row's **↩ Send back** takes you there with the editor open. An agent with questions may also **ask up its chain** instead of you: a coder, tester or guardian asks the designer, the designer asks you; the item waits on the question until it's answered, and you see every hop in its history.

**Return** (on an item's page, ↩): sends an item back to whoever sent it, with a note saying why; it lands first in their Next up (their agent's, if an agent sent it).

## Many proposals, one item: review batches {#batches}

When your designer has a dozen small proposals for you, it doesn't file a dozen items — it files **one review batch** (`kind: batch`), and its page shows each proposal as its own card: what it recommends first, the rest folded under *Details*, and a line linking the items it's about.

Answer each card where it stands: **Accept**, or **Comment** to say what should change. Your answer is written into that card and your agent hears it, so you can go down the page in one sitting. **Accept the rest** at the top takes every card you haven't answered (and every one your agent has revised); the line beside it says *n of m answered*. At the end of the page there's **one big comment box** for a free-form answer to the whole batch, the way you'd say it in chat — *1 x. 2 y, rest go* — and your agent writes each card's answer from it.

An answered card shows what you said and folds away. A card your agent has **revised** after your comment reopens, marked, for another look. **The batch is done when every card is accepted.**

Two things worth knowing. Your answers reach your agent in **one message a minute**, so answering six cards quickly doesn't wake it six times; **Send**, at the end of the page, passes on what you've answered right away, and *Accept the rest* and the big comment box send at once by themselves. And **an answer counts only for the text you saw**: if your agent has revised a card since the page was drawn, your answer is refused, the card shows you the new text, and your comment stays in the box so you can send it against what's actually there.

## Taken means locked: follow-ups

Once someone has taken an item, only they change it. Anyone else who wants something changed makes a **follow-up** (the button on the item's page); it links to the item, and whoever took it is told.

## Waiting on other items

An item can **wait on** other items. When the last of them is done it becomes new again and its person is told, so an agent working the pipeline picks it up.

## Handovers between chats and agents

When an AI's conversation gets full, it writes a **handover** item for its own role: where things are, what's next, and the new chat's name and start prompt. Start the new chat with that prompt (*"You are the coder. Work the pipeline."*); it takes the handover first.

**Released to the role.** When an agent hands over, or goes quiet long enough to be marked gone, the items it was working on stay **in progress** but are released to its role: they read *in progress · coder (released from coder-1)*, and nobody else can change them. The next agent in that role takes them up first, where they were; you can take one up yourself from its page (**Take it**). When an agent goes gone you get a notice listing what was released.

## To-dos and items side by side: Work (pro and master)

The **Work** page (`/work`, first tile of the Toolbox) shows the to-dos written in your topics on the left and the pipeline's items on the right, in one band per feature (a to-do's feature is the `{#id}` of the section it's under; an item's is its feature), with whatever has no feature in **Unsorted**, last. **Flat** shows one list per column instead.

- **Promote** a to-do (also **To pipeline** in the Backlog): it becomes an item with its text and feature; the to-do stays, ticked, with a link to the item, as your draft of that topic.
- Parked items stay off the Work page: a quiet *N parked ›* under the item column opens them on the Pipeline page.
- **Demote to a to-do** an item that should wait: it becomes a to-do in a topic you pick (by default `ToDo:PROJECT`, under *From the pipeline*, made if missing; *Parked: needs more thinking* is for to-dos you park by hand), as your draft, and the item is closed as a to-do, linked to it. (*Parking* keeps an item in the pipeline, on hold, until you unpark it.)
- Promoting and demoting are your calls. Your AI does them **when you ask it to** (it names you as the one who asked, and the item's history says so); otherwise it **suggests**: an item for you, kind `suggestion`, listing what to promote, demote or drop, each linked, and you decide on the Work page.

## Only people move work between people

Your agents work for you: they take items for their own roles and hand them on to your other agents. Passing an item to **another person**, or **moving it to another project**, is always a person's decision.

See also: [[Help]], the [[Help:SystemView|system view]].

## Where a person steps in: permissions {#permissions}

You decide, step by step, where a person has to step in. Each thing an agent can do in the pipeline (make an item, take one, drop it, mark it important, give the coder new work, publish, deploy…) has one of four settings: **person** (only a person does it, themself; the AI can suggest it), **asks** (you decide: the AI asks first and waits for your approval, or you tell it to and it goes ahead), **tells** (the AI does it and lets you know) and **free** (the AI just does it). A few are locked for everyone, whatever you choose: moving work to other members or projects, who can see a topic, tokens and vault grants, and memories only on your word. You start from a preset that follows your project's level (Cautious, Pro, Master speed), and can customize any step on the project's [Permissions](/ai/permissions) page. How that screen works: [[Help:Permissions]].

