@smartmemory/compose 0.3.7 → 0.4.0
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/.claude/skills/compose/SKILL.md +12 -3
- package/.compose-deps.json +51 -25
- package/README.md +79 -7
- package/bin/compose.js +495 -360
- package/bin/judgment-migrate.js +387 -0
- package/contracts/comp-obs-contract.schema.json +9 -3
- package/contracts/fluid-record.schema.json +209 -0
- package/contracts/lifecycle-backfill.schema.json +322 -0
- package/dist/assets/App-Z4MU-H_F.js +916 -0
- package/dist/assets/{_baseUniq-Bo837sRJ.js → _baseUniq-ClWoCPFl.js} +1 -1
- package/dist/assets/{arc-BafGpyqE.js → arc-DY26UIVo.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-BOBfUsqL.js → architectureDiagram-Q4EWVU46-6Ggq4DqJ.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-Dwodev1a.js → blockDiagram-DXYQGD6D-CH3Ked0l.js} +1 -1
- package/dist/assets/{browser-1ntj1-x_.js → browser-BWkrenen.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-CU_bhYag.js → c4Diagram-AHTNJAMY-Bk8dYilu.js} +1 -1
- package/dist/assets/channel-SnZzzh7k.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-p8WsDwnO.js → chunk-4BX2VUAB-BMR0XaAQ.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-B8h7-eR0.js → chunk-4TB4RGXK-JytR14a9.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DxeEr98s.js → chunk-55IACEB6-B4Q97BCP.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-BYt8F151.js → chunk-EDXVE4YY-R_qarkSf.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-DGSOVeie.js → chunk-FMBD7UC4-C9s7KR9m.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-B-QdgYR2.js → chunk-OYMX7WX6-BySQzVxc.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Du5UAZLs.js → chunk-QZHKN3VN-DdpSYZsW.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-C8JbNBSk.js → chunk-YZCP3GAM-iE_tzriw.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-CBu92dSH.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-CBu92dSH.js +1 -0
- package/dist/assets/clone-DgklGjHm.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-O1ESaqge.js → cose-bilkent-S5V4N54A-BdlU6ZX_.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-CPTmFPHw.js → dagre-KV5264BT-Cp3F5KTn.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-B3PNrWs5.js → diagram-5BDNPKRD-DiR6_2q_.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-Cscfr6vc.js → diagram-G4DWMVQ6-w0i-p5HX.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-CSfqZ-TM.js → diagram-MMDJMWI5-tIHhwUv3.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-Cg4aYS7W.js → diagram-TYMM5635-BAeY3B19.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-_ZqwG5pl.js → erDiagram-SMLLAGMA-Ckx_Knko.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-C83boxFT.js → flowDiagram-DWJPFMVM-DeoNka6J.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-CWnIjuEi.js → ganttDiagram-T4ZO3ILL-BmGnFbEg.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-DrMdxZfH.js → gitGraphDiagram-UUTBAWPF-Dk48IHsx.js} +1 -1
- package/dist/assets/{graph-RE4I7Ty7.js → graph-BNzKGvoy.js} +1 -1
- package/dist/assets/{graph-Bi99_6Yf.js → graph-CI_1htl0.js} +1 -1
- package/dist/assets/{index-Rm2RE-c0.js → index-BEfrNBp8.js} +3 -3
- package/dist/assets/index-yyrA5OZd.css +1 -0
- package/dist/assets/{infoDiagram-42DDH7IO-BLmP4Epr.js → infoDiagram-42DDH7IO-BRf827i0.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-yuWWshKN.js → ishikawaDiagram-UXIWVN3A-0kCZaeCM.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-BOfhaJov.js → journeyDiagram-VCZTEJTY-rvU7ayRt.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-Bbolde15.js → kanban-definition-6JOO6SKY-DpQwX1C5.js} +1 -1
- package/dist/assets/{layout-BSf33zm8.js → layout-BI8cXFPI.js} +1 -1
- package/dist/assets/{linear-AvSTWMqx.js → linear-a0glcDiw.js} +1 -1
- package/dist/assets/{min-QBM8H4xN.js → min-vPHfnXcC.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-BuvgtqIc.js → mindmap-definition-QFDTVHPH-D14eF-7C.js} +1 -1
- package/dist/assets/mobile-B7m9EO9D.js +17 -0
- package/dist/assets/{pieDiagram-DEJITSTG-DIzF16vh.js → pieDiagram-DEJITSTG-Cno-gETh.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-D-mbUIjS.js → quadrantDiagram-34T5L4WZ-BUQM1Hfm.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-CEs4kCLd.js → requirementDiagram-MS252O5E-pOXlN2-q.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-DFsnCr9n.js → sankeyDiagram-XADWPNL6-Crynd3_b.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-BEJYdTjQ.js → sequenceDiagram-FGHM5R23-D9fZdCM8.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-BBXs57uY.js → stateDiagram-FHFEXIEX-CW9qVec8.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DkVLzHbY.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-BGvLoVAY.js → timeline-definition-GMOUNBTQ-BcHzhm_8.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-9LaBTMe0.js → vennDiagram-DHZGUBPP-BfytJcWk.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-P4MEqMTP.js → wardley-RL74JXVD-DLj-IjyB.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-o-tmxnlC.js → wardleyDiagram-NUSXRM2D-Ds0Ue68c.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-Dpn7V6qk.js → xychartDiagram-5P7HB3ND-vjWDXFL6.js} +1 -1
- package/dist/index.html +3 -3
- package/lib/agent-string.js +7 -5
- package/lib/append-integrity.js +81 -0
- package/lib/backfill-evidence.js +109 -0
- package/lib/bug-escalation.js +9 -0
- package/lib/build-stream-schema.js +3 -1
- package/lib/build-stream-writer.js +25 -0
- package/lib/build.js +874 -170
- package/lib/canon-guard.js +28 -6
- package/lib/canon-override.js +196 -0
- package/lib/canon-registry.js +104 -0
- package/lib/cli-commands.js +144 -0
- package/lib/codex-preflight.js +26 -13
- package/lib/colleague/context.js +215 -0
- package/lib/colleague/writeback.js +95 -0
- package/lib/completion-gate.js +1421 -0
- package/lib/completion-writer.js +47 -47
- package/lib/consumer-fanout.js +105 -11
- package/lib/coverage-gate.js +200 -0
- package/lib/deps.js +164 -7
- package/lib/dir-lock.js +170 -0
- package/lib/dispatch-ledger.js +3 -3
- package/lib/feature-json.js +1 -1
- package/lib/feature-reconciler.js +8 -0
- package/lib/feature-validator.js +64 -1
- package/lib/feature-writer.js +57 -2
- package/lib/fluid/factory.js +167 -0
- package/lib/fluid/ideabox-dates.js +73 -0
- package/lib/fluid/ideabox-migrate.js +154 -0
- package/lib/fluid/ideabox-ops.js +585 -0
- package/lib/fluid/ideabox-view.js +146 -0
- package/lib/fluid/import-ideabox.js +186 -0
- package/lib/fluid/local-provider.js +606 -0
- package/lib/fluid/provider.js +684 -0
- package/lib/fluid/record-shape.js +214 -0
- package/lib/fluid/record-store.js +328 -0
- package/lib/fluid/render-ideabox.js +261 -0
- package/lib/fluid/schema.js +40 -0
- package/lib/fluid/smartmemory-provider.js +1695 -0
- package/lib/gsd.js +63 -23
- package/lib/guard-cli.js +175 -0
- package/lib/guard-custody.js +141 -0
- package/lib/guard-descriptors.js +530 -0
- package/lib/guard-enrol.js +254 -0
- package/lib/health-score.js +1 -1
- package/lib/ideabox-cli.js +315 -0
- package/lib/ideabox.js +121 -21
- package/lib/judgment/store/index.js +9 -1
- package/lib/judgment/store/records.js +1 -1
- package/lib/judgment/trace.js +380 -0
- package/lib/judgment-decision-write.js +277 -0
- package/lib/judgment-decisions.js +466 -0
- package/lib/judgment-gen.js +5 -1
- package/lib/judgment-writer.js +56 -2
- package/lib/lifecycle-modes.js +4 -4
- package/lib/lineage.js +400 -0
- package/lib/local-claude-connector.js +52 -1
- package/lib/maya-client.js +302 -0
- package/lib/maya-config.js +53 -0
- package/lib/maya-identity.js +283 -0
- package/lib/migrate-anon.js +5 -0
- package/lib/migrate-roadmap.js +15 -0
- package/lib/new.js +13 -1
- package/lib/pipeline-compat.js +104 -0
- package/lib/policy-catalog.js +295 -0
- package/lib/policy-check.js +0 -0
- package/lib/process-termination.js +98 -0
- package/lib/resolve-workspace.js +5 -1
- package/lib/result-normalizer.js +396 -199
- package/lib/roadmap-errors.js +65 -0
- package/lib/roadmap-preservers.js +24 -4
- package/lib/roadmap-residue.js +299 -0
- package/lib/smartmemory-client.js +614 -78
- package/lib/smartmemory-config.js +54 -0
- package/lib/smartmemory-ingest.js +19 -2
- package/lib/step-prompt.js +7 -6
- package/lib/stratum-engine.js +53 -4
- package/lib/stratum-mcp-client.js +271 -36
- package/lib/test-bootstrap.js +31 -0
- package/lib/tool-inventory.js +122 -0
- package/lib/version-check.js +91 -19
- package/lib/vision-writer.js +88 -1
- package/package.json +7 -6
- package/pipelines/bug-fix.stratum.yaml +205 -211
- package/pipelines/build-quick.profiles.json +12 -0
- package/pipelines/build-quick.stratum.yaml +263 -350
- package/pipelines/content.stratum.yaml +81 -77
- package/pipelines/coverage-sweep.stratum.yaml +49 -30
- package/pipelines/plan.stratum.yaml +76 -86
- package/pipelines/refactor.stratum.yaml +125 -125
- package/pipelines/research.stratum.yaml +56 -58
- package/pipelines/review-fix.profiles.json +6 -0
- package/pipelines/review-fix.stratum.yaml +110 -83
- package/presets/team-feature.profiles.json +6 -0
- package/presets/team-feature.stratum.yaml +93 -66
- package/presets/team-research.profiles.json +6 -0
- package/presets/team-research.stratum.yaml +89 -80
- package/presets/team-review.profiles.json +8 -0
- package/presets/team-review.stratum.yaml +98 -80
- package/scripts/cost-census.mjs +70 -0
- package/scripts/guard-sign/compose-guard-sign.sh +62 -0
- package/server/agent-health.js +22 -0
- package/server/agent-hooks.js +14 -1
- package/server/agent-server.js +5 -248
- package/server/agent-spawn.js +3 -4
- package/server/agent-workspace.js +294 -0
- package/server/build-routes.js +6 -5
- package/server/build-stream-bridge.js +53 -0
- package/server/cc-session-watcher.js +4 -1
- package/server/coalescing-buffer.js +7 -1
- package/server/completion-projection.js +228 -0
- package/server/compose-mcp-tools.js +109 -23
- package/server/compose-mcp.js +88 -882
- package/server/decision-event-emit.js +41 -2
- package/server/decision-event-id.js +17 -0
- package/server/decision-events-snapshot.js +3 -0
- package/server/design-routes.js +14 -8
- package/server/feature-scan.js +76 -2
- package/server/file-watcher.js +170 -21
- package/server/ideabox-routes.js +166 -224
- package/server/index.js +70 -100
- package/server/lifecycle-guard.js +240 -10
- package/server/lifecycle-phase-history.js +276 -0
- package/server/maya-routes.js +507 -0
- package/server/mcp-tool-defs.js +940 -0
- package/server/mcp-tool-policy.js +34 -2
- package/server/model-tiers.js +22 -5
- package/server/pipeline-routes.js +21 -11
- package/server/project-root.js +58 -19
- package/server/remote-utils.js +3 -1
- package/server/schema-validator.js +7 -1
- package/server/session-manager.js +5 -6
- package/server/session-routes.js +3 -1
- package/server/stratum-client.js +57 -10
- package/server/stratum-sync.js +6 -3
- package/server/summarizer.js +3 -4
- package/server/supervisor.js +0 -1
- package/server/vision-routes.js +208 -98
- package/server/vision-server.js +86 -23
- package/server/vision-store.js +60 -6
- package/server/vision-utils.js +3 -4
- package/server/workspace-activity.js +18 -0
- package/server/workspace-middleware.js +2 -2
- package/server/workspace-runtime.js +243 -0
- package/server/worktree-gc.js +1 -0
- package/dist/assets/App-PkZzHeMj.js +0 -894
- package/dist/assets/channel-qVK_qn4E.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-B8UcfC1q.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-B8UcfC1q.js +0 -1
- package/dist/assets/clone-Pu3RyLUh.js +0 -1
- package/dist/assets/index-LIwREYgH.css +0 -1
- package/dist/assets/mobile-BnXEOE3U.js +0 -17
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-BqKuX4rj.js +0 -1
- package/lib/staleness.js +0 -87
- package/server/ideabox-cache.js +0 -77
package/dist/assets/{xychartDiagram-5P7HB3ND-Dpn7V6qk.js → xychartDiagram-5P7HB3ND-vjWDXFL6.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,_ as a,l as Yt,I as mi,e as yi,z as bi,D as _t,i as Ai,F as Nt,G as wi,K as Ci,aF as Si,R as Wt}from"./App-
|
|
1
|
+
import{s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,_ as a,l as Yt,I as mi,e as yi,z as bi,D as _t,i as Ai,F as Nt,G as wi,K as Ci,aF as Si,R as Wt}from"./App-Z4MU-H_F.js";import{i as _i}from"./init-Gi6I4Gst.js";import{o as ki}from"./ordinal-Cboi1Yqb.js";import{l as zt}from"./linear-a0glcDiw.js";import"./mobile-B7m9EO9D.js";import"./index-BEfrNBp8.js";import"./graph-CI_1htl0.js";import"./defaultLocale-DX6XiGOO.js";function Ri(e,t,i){e=+e,t=+t,i=(n=arguments.length)<2?(t=e,e=0,1):n<3?1:+i;for(var s=-1,n=Math.max(0,Math.ceil((t-e)/i))|0,o=new Array(n);++s<n;)o[s]=e+s*i;return o}function bt(){var e=ki().unknown(void 0),t=e.domain,i=e.range,s=0,n=1,o,u,p=!1,f=0,T=0,P=.5;delete e.unknown;function _(){var y=t().length,E=n<s,v=E?n:s,L=E?s:n;o=(L-v)/Math.max(1,y-f+T*2),p&&(o=Math.floor(o)),v+=(L-v-o*(y-f))*P,u=o*(1-f),p&&(v=Math.round(v),u=Math.round(u));var I=Ri(y).map(function(m){return v+o*m});return i(E?I.reverse():I)}return e.domain=function(y){return arguments.length?(t(y),_()):t()},e.range=function(y){return arguments.length?([s,n]=y,s=+s,n=+n,_()):[s,n]},e.rangeRound=function(y){return[s,n]=y,s=+s,n=+n,p=!0,_()},e.bandwidth=function(){return u},e.step=function(){return o},e.round=function(y){return arguments.length?(p=!!y,_()):p},e.padding=function(y){return arguments.length?(f=Math.min(1,T=+y),_()):f},e.paddingInner=function(y){return arguments.length?(f=Math.min(1,y),_()):f},e.paddingOuter=function(y){return arguments.length?(T=+y,_()):T},e.align=function(y){return arguments.length?(P=Math.max(0,Math.min(1,y)),_()):P},e.copy=function(){return bt(t(),[s,n]).round(p).paddingInner(f).paddingOuter(T).align(P)},_i.apply(_(),arguments)}var At=(function(){var e=a(function(F,h,c,g){for(c=c||{},g=F.length;g--;c[F[g]]=h);return c},"o"),t=[1,10,12,14,16,18,19,21,23],i=[2,6],s=[1,3],n=[1,5],o=[1,6],u=[1,7],p=[1,5,10,12,14,16,18,19,21,23,34,35,36],f=[1,25],T=[1,26],P=[1,28],_=[1,29],y=[1,30],E=[1,31],v=[1,32],L=[1,33],I=[1,34],m=[1,35],R=[1,36],l=[1,37],W=[1,43],O=[1,42],X=[1,47],Y=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],U=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],b=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],w=[1,64],V={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(h,c,g,x,C,r,rt){var d=r.length-1;switch(C){case 5:x.setOrientation(r[d]);break;case 9:x.setDiagramTitle(r[d].text.trim());break;case 12:x.setLineData({text:"",type:"text"},r[d]);break;case 13:x.setLineData(r[d-1],r[d]);break;case 14:x.setBarData({text:"",type:"text"},r[d]);break;case 15:x.setBarData(r[d-1],r[d]);break;case 16:this.$=r[d].trim(),x.setAccTitle(this.$);break;case 17:case 18:this.$=r[d].trim(),x.setAccDescription(this.$);break;case 19:this.$=r[d-1];break;case 20:this.$=[Number(r[d-2]),...r[d]];break;case 21:this.$=[Number(r[d])];break;case 22:x.setXAxisTitle(r[d]);break;case 23:x.setXAxisTitle(r[d-1]);break;case 24:x.setXAxisTitle({type:"text",text:""});break;case 25:x.setXAxisBand(r[d]);break;case 26:x.setXAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 27:this.$=r[d-1];break;case 28:this.$=[r[d-2],...r[d]];break;case 29:this.$=[r[d]];break;case 30:x.setYAxisTitle(r[d]);break;case 31:x.setYAxisTitle(r[d-1]);break;case 32:x.setYAxisTitle({type:"text",text:""});break;case 33:x.setYAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 37:this.$={text:r[d],type:"text"};break;case 38:this.$={text:r[d],type:"text"};break;case 39:this.$={text:r[d],type:"markdown"};break;case 40:this.$=r[d];break;case 41:this.$=r[d-1]+""+r[d];break}},"anonymous"),table:[e(t,i,{3:1,4:2,7:4,5:s,34:n,35:o,36:u}),{1:[3]},e(t,i,{4:2,7:4,3:8,5:s,34:n,35:o,36:u}),e(t,i,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:o,36:u}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},e(p,[2,34]),e(p,[2,35]),e(p,[2,36]),{1:[2,1]},e(t,i,{4:2,7:4,3:21,5:s,34:n,35:o,36:u}),{1:[2,3]},e(p,[2,5]),e(t,[2,7],{4:22,34:n,35:o,36:u}),{11:23,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:39,13:38,24:W,27:O,29:40,30:41,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:45,15:44,27:X,33:46,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:49,17:48,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:52,17:51,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{20:[1,53]},{22:[1,54]},e(S,[2,18]),{1:[2,2]},e(S,[2,8]),e(S,[2,9]),e(U,[2,37],{40:55,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l}),e(U,[2,38]),e(U,[2,39]),e(b,[2,40]),e(b,[2,42]),e(b,[2,43]),e(b,[2,44]),e(b,[2,45]),e(b,[2,46]),e(b,[2,47]),e(b,[2,48]),e(b,[2,49]),e(b,[2,50]),e(b,[2,51]),e(S,[2,10]),e(S,[2,22],{30:41,29:56,24:W,27:O}),e(S,[2,24]),e(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,11]),e(S,[2,30],{33:60,27:X}),e(S,[2,32]),{31:[1,61]},e(S,[2,12]),{17:62,24:Y},{25:63,27:w},e(S,[2,14]),{17:65,24:Y},e(S,[2,16]),e(S,[2,17]),e(b,[2,41]),e(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},e(S,[2,31]),{27:[1,69]},e(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},e(S,[2,15]),e(S,[2,26]),e(S,[2,27]),{11:59,32:72,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,33]),e(S,[2,19]),{25:73,27:w},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(h,c){if(c.recoverable)this.trace(h);else{var g=new Error(h);throw g.hash=c,g}},"parseError"),parse:a(function(h){var c=this,g=[0],x=[],C=[null],r=[],rt=this.table,d="",ct=0,It=0,hi=2,Mt=1,li=r.slice.call(arguments,1),D=Object.create(this.lexer),$={yy:{}};for(var ft in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ft)&&($.yy[ft]=this.yy[ft]);D.setInput(h,$.yy),$.yy.lexer=D,$.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var pt=D.yylloc;r.push(pt);var ci=D.options&&D.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ui(B){g.length=g.length-2*B,C.length=C.length-B,r.length=r.length-B}a(ui,"popStack");function Vt(){var B;return B=x.pop()||D.lex()||Mt,typeof B!="number"&&(B instanceof Array&&(x=B,B=x.pop()),B=c.symbols_[B]||B),B}a(Vt,"lex");for(var M,q,z,mt,G={},ut,N,Bt,gt;;){if(q=g[g.length-1],this.defaultActions[q]?z=this.defaultActions[q]:((M===null||typeof M>"u")&&(M=Vt()),z=rt[q]&&rt[q][M]),typeof z>"u"||!z.length||!z[0]){var yt="";gt=[];for(ut in rt[q])this.terminals_[ut]&&ut>hi&>.push("'"+this.terminals_[ut]+"'");D.showPosition?yt="Parse error on line "+(ct+1)+`:
|
|
2
2
|
`+D.showPosition()+`
|
|
3
3
|
Expecting `+gt.join(", ")+", got '"+(this.terminals_[M]||M)+"'":yt="Parse error on line "+(ct+1)+": Unexpected "+(M==Mt?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(yt,{text:D.match,token:this.terminals_[M]||M,line:D.yylineno,loc:pt,expected:gt})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+M);switch(z[0]){case 1:g.push(M),C.push(D.yytext),r.push(D.yylloc),g.push(z[1]),M=null,It=D.yyleng,d=D.yytext,ct=D.yylineno,pt=D.yylloc;break;case 2:if(N=this.productions_[z[1]][1],G.$=C[C.length-N],G._$={first_line:r[r.length-(N||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(N||1)].first_column,last_column:r[r.length-1].last_column},ci&&(G._$.range=[r[r.length-(N||1)].range[0],r[r.length-1].range[1]]),mt=this.performAction.apply(G,[d,It,ct,$.yy,z[1],C,r].concat(li)),typeof mt<"u")return mt;N&&(g=g.slice(0,-1*N*2),C=C.slice(0,-1*N),r=r.slice(0,-1*N)),g.push(this.productions_[z[1]][0]),C.push(G.$),r.push(G._$),Bt=rt[g[g.length-2]][g[g.length-1]],g.push(Bt);break;case 3:return!0}}return!0},"parse")},k=(function(){var F={EOF:1,parseError:a(function(c,g){if(this.yy.parser)this.yy.parser.parseError(c,g);else throw new Error(c)},"parseError"),setInput:a(function(h,c){return this.yy=c||this.yy||{},this._input=h,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var h=this._input[0];this.yytext+=h,this.yyleng++,this.offset++,this.match+=h,this.matched+=h;var c=h.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),h},"input"),unput:a(function(h){var c=h.length,g=h.split(/(?:\r\n?|\n)/g);this._input=h+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var x=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===x.length?this.yylloc.first_column:0)+x[x.length-g.length].length-g[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(h){this.unput(this.match.slice(h))},"less"),pastInput:a(function(){var h=this.matched.substr(0,this.matched.length-this.match.length);return(h.length>20?"...":"")+h.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var h=this.match;return h.length<20&&(h+=this._input.substr(0,20-h.length)),(h.substr(0,20)+(h.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var h=this.pastInput(),c=new Array(h.length+1).join("-");return h+this.upcomingInput()+`
|
package/dist/index.html
CHANGED
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
}
|
|
20
20
|
})();
|
|
21
21
|
</script>
|
|
22
|
-
<script type="module" crossorigin src="/assets/index-
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/mobile-
|
|
22
|
+
<script type="module" crossorigin src="/assets/index-BEfrNBp8.js"></script>
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/mobile-B7m9EO9D.js">
|
|
24
24
|
<link rel="stylesheet" crossorigin href="/assets/mobile-1gVCT0OK.css">
|
|
25
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
25
|
+
<link rel="stylesheet" crossorigin href="/assets/index-yyrA5OZd.css">
|
|
26
26
|
</head>
|
|
27
27
|
<body>
|
|
28
28
|
<div id="root"></div>
|
package/lib/agent-string.js
CHANGED
|
@@ -94,16 +94,18 @@ export function validateAgentString(raw) {
|
|
|
94
94
|
export function resolveAgentConfig(raw) {
|
|
95
95
|
const { provider, template, tier } = parseAgentString(raw);
|
|
96
96
|
const resolved = resolveTemplate(template);
|
|
97
|
-
const modelID = resolveTierModel(tier);
|
|
98
|
-
const tierThinking = resolveTierThinking(tier);
|
|
97
|
+
const modelID = resolveTierModel(tier, provider);
|
|
98
|
+
const tierThinking = resolveTierThinking(tier, provider);
|
|
99
99
|
|
|
100
100
|
// Map tier thinking config to SDK shape.
|
|
101
101
|
let thinking = null;
|
|
102
102
|
let effort = null;
|
|
103
103
|
if (tierThinking) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
if (provider === 'claude') {
|
|
105
|
+
thinking = tierThinking.mode === 'adaptive'
|
|
106
|
+
? { type: 'adaptive' }
|
|
107
|
+
: { type: 'disabled' };
|
|
108
|
+
}
|
|
107
109
|
effort = tierThinking.effort;
|
|
108
110
|
}
|
|
109
111
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* append-integrity.js — integrity for append-only canon files.
|
|
3
|
+
*
|
|
4
|
+
* COMP-CANON-OVERRIDE S1. Shared with COMP-CANON-ATTEST, which needs the same
|
|
5
|
+
* primitive for `docs/judgment/records/ledger.jsonl`.
|
|
6
|
+
*
|
|
7
|
+
* A whole-file hash over an append-only file churns on every append and so
|
|
8
|
+
* carries no signal about history. The useful question is narrower: **is the
|
|
9
|
+
* prefix we previously attested still byte-identical?** That is what
|
|
10
|
+
* `{length, prefix_hash}` answers — `prefix_hash` is sha256 over
|
|
11
|
+
* `bytes[0, length)`, so a legitimate append (which only extends) verifies
|
|
12
|
+
* clean while any rewrite of earlier content does not.
|
|
13
|
+
*
|
|
14
|
+
* A `{length, tail_hash}` variant was tried first and rejected: hashing the
|
|
15
|
+
* trailing bytes says nothing about the prefix, so an in-place edit of an
|
|
16
|
+
* early row that preserves total byte length — the shape a careless
|
|
17
|
+
* `sed -i 's/park/ship/'` takes — produced a byte-identical attestation.
|
|
18
|
+
*
|
|
19
|
+
* SCOPE: this is drift detection, not enforcement. It catches careless and
|
|
20
|
+
* accidental corruption. A deliberate actor who rewrites the file AND
|
|
21
|
+
* recomputes the baseline passes, because both live in the workspace the
|
|
22
|
+
* actor can write. See design.md, "The in-workspace ceiling".
|
|
23
|
+
*
|
|
24
|
+
* Pure — no I/O. Callers own reading the file and storing the baseline.
|
|
25
|
+
*/
|
|
26
|
+
import { createHash } from 'node:crypto';
|
|
27
|
+
|
|
28
|
+
/** @typedef {{ length: number, prefix_hash: string }} AppendBaseline */
|
|
29
|
+
/** @typedef {{ ok: boolean, kind: 'clean'|'shrunk'|'prefix_changed'|'malformed_baseline' }} AppendVerdict */
|
|
30
|
+
|
|
31
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
32
|
+
|
|
33
|
+
function toBuffer(bytes) {
|
|
34
|
+
return Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes ?? '');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function sha256(buf) {
|
|
38
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Capture the attestable state of an append-only file.
|
|
43
|
+
*
|
|
44
|
+
* @param {Buffer|string} bytes current file contents
|
|
45
|
+
* @returns {AppendBaseline}
|
|
46
|
+
*/
|
|
47
|
+
export function baselineFor(bytes) {
|
|
48
|
+
const buf = toBuffer(bytes);
|
|
49
|
+
return { length: buf.length, prefix_hash: sha256(buf) };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Verify that `bytes` is `baseline` plus zero or more appended bytes.
|
|
54
|
+
*
|
|
55
|
+
* Fails closed on a malformed baseline: a missing or nonsensical baseline is
|
|
56
|
+
* never treated as "nothing to check". That mirrors the malformed-record rule
|
|
57
|
+
* the judgment attestation already follows (S5 R4).
|
|
58
|
+
*
|
|
59
|
+
* @param {Buffer|string} bytes current file contents
|
|
60
|
+
* @param {AppendBaseline} baseline previously attested state
|
|
61
|
+
* @returns {AppendVerdict}
|
|
62
|
+
*/
|
|
63
|
+
export function verifyAppend(bytes, baseline) {
|
|
64
|
+
if (
|
|
65
|
+
!baseline
|
|
66
|
+
|| typeof baseline !== 'object'
|
|
67
|
+
|| !Number.isInteger(baseline.length)
|
|
68
|
+
|| baseline.length < 0
|
|
69
|
+
|| typeof baseline.prefix_hash !== 'string'
|
|
70
|
+
|| !HEX64.test(baseline.prefix_hash)
|
|
71
|
+
) {
|
|
72
|
+
return { ok: false, kind: 'malformed_baseline' };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const buf = toBuffer(bytes);
|
|
76
|
+
if (buf.length < baseline.length) return { ok: false, kind: 'shrunk' };
|
|
77
|
+
if (sha256(buf.subarray(0, baseline.length)) !== baseline.prefix_hash) {
|
|
78
|
+
return { ok: false, kind: 'prefix_changed' };
|
|
79
|
+
}
|
|
80
|
+
return { ok: true, kind: 'clean' };
|
|
81
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/backfill-evidence.js — COMP-LIFECYCLE-BACKFILL blueprint §4.3.
|
|
3
|
+
*
|
|
4
|
+
* Resolve a caller's `EvidenceRef` into the `ResolvedEvidence` the merge orders
|
|
5
|
+
* on. Two kinds, two confidences, and one place both are written down.
|
|
6
|
+
*
|
|
7
|
+
* - `commit` — the AUTHOR date (Decision 3). `git show -s --format=%aI` carries
|
|
8
|
+
* the committer's UTC OFFSET, so the epoch form is computed ONCE here and
|
|
9
|
+
* every downstream comparison uses it (BP-8). A string comparison of two
|
|
10
|
+
* author dates from different timezones is silently wrong.
|
|
11
|
+
* - `path` — `validateRepoPath`'s eight steps (lib/feature-writer.js:610-641),
|
|
12
|
+
* with `realpathCanonicalize` substituted for the bare `realpathSync` calls
|
|
13
|
+
* (C19). That substitution is the macOS firmlink landmine: /System/Volumes/Data
|
|
14
|
+
* mirrors /, realpath does NOT collapse it, so the cwd and the resolved path
|
|
15
|
+
* can carry different roots and the containment check compares mismatched
|
|
16
|
+
* prefixes — refusing a path that is plainly inside the repo.
|
|
17
|
+
*
|
|
18
|
+
* `confidence` is derived HERE and nowhere else. The request schema has no
|
|
19
|
+
* `confidence` field, so a caller-supplied value is rejected by
|
|
20
|
+
* `additionalProperties:false` before any of this runs.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { execFileSync } from 'node:child_process';
|
|
24
|
+
import { existsSync, statSync } from 'node:fs';
|
|
25
|
+
import { normalize, resolve, sep } from 'node:path';
|
|
26
|
+
|
|
27
|
+
import { realpathCanonicalize } from './canon-guard.js';
|
|
28
|
+
|
|
29
|
+
/** A commit's author date is exact; a file's mtime is only an upper bound. */
|
|
30
|
+
export const CONFIDENCE_BY_KIND = Object.freeze({ commit: 0.9, path: 0.6 });
|
|
31
|
+
|
|
32
|
+
export function deriveConfidence(kind) {
|
|
33
|
+
const c = CONFIDENCE_BY_KIND[kind];
|
|
34
|
+
if (c === undefined) throw new Error(`backfill-evidence: unknown evidence kind "${kind}"`);
|
|
35
|
+
return c;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function git(cwd, args) {
|
|
39
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8' }).trim();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** validateRepoPath's eight steps, canonicalising instead of bare-realpathing. */
|
|
43
|
+
function resolveRepoPath(cwd, p) {
|
|
44
|
+
if (typeof p !== 'string' || p.length === 0) {
|
|
45
|
+
throw new Error('backfill-evidence: path must be a non-empty string');
|
|
46
|
+
}
|
|
47
|
+
if (p.startsWith('/') || p.startsWith('~')) {
|
|
48
|
+
throw new Error(`backfill-evidence: path must be repo-relative, got "${p}"`);
|
|
49
|
+
}
|
|
50
|
+
const normalized = normalize(p);
|
|
51
|
+
if (normalized.split(sep).includes('..')) {
|
|
52
|
+
throw new Error(`backfill-evidence: path must not contain ".." after normalization, got "${p}"`);
|
|
53
|
+
}
|
|
54
|
+
const realCwd = realpathCanonicalize(cwd);
|
|
55
|
+
const resolved = resolve(realCwd, normalized);
|
|
56
|
+
if (!resolved.startsWith(realCwd + sep) && resolved !== realCwd) {
|
|
57
|
+
throw new Error(`backfill-evidence: path "${p}" resolves outside cwd`);
|
|
58
|
+
}
|
|
59
|
+
if (!existsSync(resolved)) {
|
|
60
|
+
throw new Error(`backfill-evidence: path "${p}" does not exist`);
|
|
61
|
+
}
|
|
62
|
+
// Resolve symlinks AFTER the existence check: this is what blocks a
|
|
63
|
+
// repo-internal symlink whose target escapes.
|
|
64
|
+
const realResolved = realpathCanonicalize(resolved);
|
|
65
|
+
if (!realResolved.startsWith(realCwd + sep) && realResolved !== realCwd) {
|
|
66
|
+
throw new Error(`backfill-evidence: path "${p}" symlinks outside cwd`);
|
|
67
|
+
}
|
|
68
|
+
if (!statSync(realResolved).isFile()) {
|
|
69
|
+
throw new Error(`backfill-evidence: path "${p}" must point at a file (got directory or other)`);
|
|
70
|
+
}
|
|
71
|
+
return realResolved;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @param {string} cwd the EVIDENCE root (a real git repo for `commit`)
|
|
76
|
+
* @param {{kind:'commit'|'path', ref:string}} evidence
|
|
77
|
+
* @returns {{kind:string, ref:string, verifiedAt:string, observedTime:string, observedEpochMs:number}}
|
|
78
|
+
*/
|
|
79
|
+
export function resolveEvidenceRef(cwd, evidence) {
|
|
80
|
+
const kind = evidence?.kind;
|
|
81
|
+
const ref = evidence?.ref;
|
|
82
|
+
if (typeof ref !== 'string' || ref.length === 0) {
|
|
83
|
+
throw new Error('backfill-evidence: evidence.ref must be a non-empty string');
|
|
84
|
+
}
|
|
85
|
+
deriveConfidence(kind); // throws on an unknown kind, before any I/O
|
|
86
|
+
|
|
87
|
+
const verifiedAt = new Date().toISOString();
|
|
88
|
+
let observedTime;
|
|
89
|
+
|
|
90
|
+
if (kind === 'commit') {
|
|
91
|
+
const sha = ref.trim();
|
|
92
|
+
try {
|
|
93
|
+
git(cwd, ['rev-parse', '--verify', '--quiet', `${sha}^{commit}`]);
|
|
94
|
+
} catch {
|
|
95
|
+
throw new Error(`backfill-evidence: commit ${sha} not found in repository (server-read git verification)`);
|
|
96
|
+
}
|
|
97
|
+
// The AUTHOR date, %aI — it carries an offset, which is exactly why the
|
|
98
|
+
// epoch form below is computed once and used for every comparison.
|
|
99
|
+
observedTime = git(cwd, ['show', '-s', '--format=%aI', sha]);
|
|
100
|
+
} else {
|
|
101
|
+
observedTime = statSync(resolveRepoPath(cwd, ref)).mtime.toISOString();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const observedEpochMs = Date.parse(observedTime);
|
|
105
|
+
if (!Number.isFinite(observedEpochMs)) {
|
|
106
|
+
throw new Error(`backfill-evidence: "${observedTime}" is not a parseable instant`);
|
|
107
|
+
}
|
|
108
|
+
return { kind, ref, verifiedAt, observedTime, observedEpochMs };
|
|
109
|
+
}
|
package/lib/bug-escalation.js
CHANGED
|
@@ -118,9 +118,14 @@ function buildCodexPrompt(bugDescription, reproTest, currentDiff, hypotheses) {
|
|
|
118
118
|
*/
|
|
119
119
|
export async function tier1CodexReview(stratum, context, bugDescription, reproTest, currentDiff, hypotheses) {
|
|
120
120
|
const codexPrompt = buildCodexPrompt(bugDescription, reproTest, currentDiff, hypotheses ?? []);
|
|
121
|
+
const onUsage = (usages) => context.onUsage?.(usages, {
|
|
122
|
+
stepId: context.step_id,
|
|
123
|
+
source: 'escalation',
|
|
124
|
+
});
|
|
121
125
|
const rawText = await stratum.runAgentText('codex', codexPrompt, {
|
|
122
126
|
cwd: context.cwd,
|
|
123
127
|
telemetry: escalationTelemetry(context),
|
|
128
|
+
onUsage,
|
|
124
129
|
});
|
|
125
130
|
|
|
126
131
|
const review = await normalizeReviewResult(rawText, {
|
|
@@ -316,6 +321,10 @@ export async function tier2FreshAgent(stratum, context, codexReview, hypotheses,
|
|
|
316
321
|
const agent_reasoning = await stratum.runAgentText('claude', prompt, {
|
|
317
322
|
cwd: wtPath,
|
|
318
323
|
telemetry: escalationTelemetry(context),
|
|
324
|
+
onUsage: (usages) => context.onUsage?.(usages, {
|
|
325
|
+
stepId: context.step_id,
|
|
326
|
+
source: 'escalation',
|
|
327
|
+
}),
|
|
319
328
|
});
|
|
320
329
|
return { patch_path: patchPath, agent_reasoning: agent_reasoning ?? '' };
|
|
321
330
|
} finally {
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
import Ajv2020 from 'ajv/dist/2020.js';
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
// v0.2.8: `_agent_run` envelopes may OMIT flow_id (call-local; the consumer stamps
|
|
21
|
+
// its correlation id before validation — stratum-mcp-client.js#makeProgressHandler).
|
|
22
|
+
export const KNOWN_VERSIONS = new Set(['0.2.5', '0.2.6', '0.2.7', '0.2.8']);
|
|
21
23
|
|
|
22
24
|
// ---------------------------------------------------------------------------
|
|
23
25
|
// Envelope schema (top-level fields only; metadata shape is kind-specific)
|
|
@@ -107,6 +107,31 @@ export class BuildStreamWriter {
|
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Emit a policy_violation event for a pattern match on a step's response
|
|
112
|
+
* (COMP-POLICY-CHECK-5). Suppressed matches are emitted too — the trace
|
|
113
|
+
* measures both arms. Never blocking.
|
|
114
|
+
*
|
|
115
|
+
* @param {string} stepId Step whose response matched
|
|
116
|
+
* @param {object} record Scan record from lib/policy-check.js#scanResponse
|
|
117
|
+
* @param {string} userMode 'AUTONOMOUS' | 'PACED' | 'SKILL_GATED'
|
|
118
|
+
* @param {string|null} [featureCode] Feature this build is for
|
|
119
|
+
* @param {string|null} [buildId] Build correlation id
|
|
120
|
+
*/
|
|
121
|
+
writePolicyViolation(stepId, record, userMode, featureCode = null, buildId = null) {
|
|
122
|
+
this.write({
|
|
123
|
+
type: 'policy_violation',
|
|
124
|
+
stepId,
|
|
125
|
+
rule: record.rule,
|
|
126
|
+
matched: record.matched,
|
|
127
|
+
suppressed: Boolean(record.suppressed),
|
|
128
|
+
detail: record.reason,
|
|
129
|
+
userMode,
|
|
130
|
+
featureCode: featureCode ?? this.#featureCode ?? null,
|
|
131
|
+
buildId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
110
135
|
/**
|
|
111
136
|
* Emit a per-step usage event with token and cost data (COMP-OBS-COST).
|
|
112
137
|
*
|