@midhunxavier/code-flow 0.0.0-stage → 0.1.0-preview.1
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/LICENSE +21 -0
- package/README.md +122 -2
- package/bin/codeflow.mjs +8 -0
- package/bin/launcher.mjs +127 -0
- package/dist/remote-host.json +1 -0
- package/licenses/inter.txt +92 -0
- package/licenses/preact.txt +21 -0
- package/licenses/signals-core.txt +21 -0
- package/licenses/signals.txt +21 -0
- package/licenses/typescript-notices.txt +193 -0
- package/licenses/typescript.txt +55 -0
- package/licenses/uqr.txt +22 -0
- package/licenses/xterm-fit.txt +19 -0
- package/licenses/xterm.txt +21 -0
- package/package.json +34 -4
- package/public/assets/browser-7XI52A6V.js +8 -0
- package/public/assets/changes-EYFPASEI.js +1 -0
- package/public/assets/chunk-7H3ZLTKA.js +2 -0
- package/public/assets/chunk-L7TUCIYF.js +1 -0
- package/public/assets/chunk-LLMQG23J.js +163 -0
- package/public/assets/main-KIRM2OEK.js +1 -0
- package/public/assets/settings-QJZVW22Y.js +9 -0
- package/public/assets/styles-615EBB20.css +32 -0
- package/public/assets/terminal-A2FI2NAX.js +62 -0
- package/public/assets.json +1 -0
- package/public/bundle-meta.json +1 -0
- package/public/docs/.nojekyll +0 -0
- package/public/docs/accessibility.html +19 -0
- package/public/docs/acp-agents.html +117 -0
- package/public/docs/agent-containers.html +79 -0
- package/public/docs/api.html +1130 -0
- package/public/docs/app.js +342 -0
- package/public/docs/application-improvements.html +275 -0
- package/public/docs/architecture-explorer.html +19 -0
- package/public/docs/architecture.html +149 -0
- package/public/docs/auto-team.html +142 -0
- package/public/docs/automations.html +109 -0
- package/public/docs/checkpoint-review.html +37 -0
- package/public/docs/code-hosts.html +35 -0
- package/public/docs/code-intelligence.html +35 -0
- package/public/docs/configuration.html +346 -0
- package/public/docs/context-inspection.html +23 -0
- package/public/docs/coordinated-changes.html +28 -0
- package/public/docs/deferred-runs.html +25 -0
- package/public/docs/dependency-discovery.html +19 -0
- package/public/docs/documentation.html +84 -0
- package/public/docs/dynamic-teams-evaluation.html +174 -0
- package/public/docs/dynamic-teams-implementation-plan.html +882 -0
- package/public/docs/dynamic-teams-implementation-review-1.html +141 -0
- package/public/docs/dynamic-teams-plan-review-0.html +204 -0
- package/public/docs/extensions.html +42 -0
- package/public/docs/external-sources.html +96 -0
- package/public/docs/filesystem-policy.html +26 -0
- package/public/docs/filtered-tasks.html +44 -0
- package/public/docs/font-license.txt +92 -0
- package/public/docs/getting-started.html +118 -0
- package/public/docs/github-review-threads.html +26 -0
- package/public/docs/github.html +157 -0
- package/public/docs/help.html +69 -0
- package/public/docs/index.html +77 -0
- package/public/docs/installation.html +74 -0
- package/public/docs/launch-profiles.html +48 -0
- package/public/docs/maintenance.html +60 -0
- package/public/docs/memory-claims.html +31 -0
- package/public/docs/memory-storage.html +58 -0
- package/public/docs/notifications.html +39 -0
- package/public/docs/patterns.html +195 -0
- package/public/docs/performance-results.html +210 -0
- package/public/docs/performance.html +166 -0
- package/public/docs/project-conventions.html +22 -0
- package/public/docs/project-first-navigation-plan.html +587 -0
- package/public/docs/project-teams-implementation-plan.html +772 -0
- package/public/docs/project-teams.html +99 -0
- package/public/docs/provider-compatibility.html +20 -0
- package/public/docs/releasing.html +61 -0
- package/public/docs/remote-workers.html +64 -0
- package/public/docs/review-inbox.html +26 -0
- package/public/docs/run-storage.html +23 -0
- package/public/docs/runs.html +141 -0
- package/public/docs/search.json +1 -0
- package/public/docs/security.html +133 -0
- package/public/docs/shared-projects.html +31 -0
- package/public/docs/ssh-projects.html +60 -0
- package/public/docs/style.css +768 -0
- package/public/docs/task-reruns.html +30 -0
- package/public/docs/team-collaboration.html +379 -0
- package/public/docs/verification.html +22 -0
- package/public/docs/vscode.html +53 -0
- package/public/docs/worker-permission-verification.html +122 -0
- package/public/index.html +17 -0
- package/scripts/check-node.mjs +7 -0
- package/scripts/codeflow.mjs +55 -0
- package/scripts/pty.py +273 -0
- package/src/acp-connections.js +110 -0
- package/src/adapters/acp-presets.js +37 -0
- package/src/adapters/acp-types.js +0 -0
- package/src/adapters/acp.js +328 -0
- package/src/adapters/agy-auth.js +67 -0
- package/src/adapters/agy-isolation.js +223 -0
- package/src/adapters/agy.js +297 -0
- package/src/adapters/claude.js +220 -0
- package/src/adapters/codex-app-server.js +518 -0
- package/src/adapters/codex.js +299 -0
- package/src/adapters/errors.js +57 -0
- package/src/adapters/index.js +91 -0
- package/src/adapters/managed-permissions.js +37 -0
- package/src/adapters/model-discovery.js +100 -0
- package/src/adapters/process.js +418 -0
- package/src/adapters/team-tools.js +102 -0
- package/src/adapters/types.js +0 -0
- package/src/agent-container.js +155 -0
- package/src/approvals.js +121 -0
- package/src/architecture.js +456 -0
- package/src/assets.js +44 -0
- package/src/automation.js +901 -0
- package/src/certificate-renewal.js +75 -0
- package/src/chat-handoff.js +55 -0
- package/src/checkpoint-review.js +72 -0
- package/src/checks.js +303 -0
- package/src/code-host-git.js +102 -0
- package/src/code-hosts-api.js +99 -0
- package/src/code-hosts.js +482 -0
- package/src/code-intelligence-worker.mjs +452 -0
- package/src/code-intelligence.js +141 -0
- package/src/collab/api.js +365 -0
- package/src/collab/checkpoints.js +198 -0
- package/src/collab/connections.js +139 -0
- package/src/collab/host-execution.js +347 -0
- package/src/collab/hub-client.js +210 -0
- package/src/collab/link-api.js +229 -0
- package/src/collab/link.js +595 -0
- package/src/collab/model.js +496 -0
- package/src/collab/runner.js +1014 -0
- package/src/collab/store.js +1452 -0
- package/src/collab/terminals.js +361 -0
- package/src/collaboration-reviews.js +116 -0
- package/src/config.js +48 -0
- package/src/context-budget.js +14 -0
- package/src/context-inspection.js +204 -0
- package/src/context.js +154 -0
- package/src/conventions.js +283 -0
- package/src/coordinated-api.js +247 -0
- package/src/deferred-launch.js +82 -0
- package/src/deferred-runs.js +515 -0
- package/src/dependency-health.js +35 -0
- package/src/diff.js +43 -0
- package/src/docs-help.js +316 -0
- package/src/doctor.js +232 -0
- package/src/engine.js +4366 -0
- package/src/env.js +44 -0
- package/src/experience.js +50 -0
- package/src/extensions.js +144 -0
- package/src/filesystem-access.js +107 -0
- package/src/filesystem-policy.js +238 -0
- package/src/filtered-task-limits.js +93 -0
- package/src/filtered-tasks-api.js +53 -0
- package/src/filtered-tasks.js +576 -0
- package/src/fs.js +57 -0
- package/src/git.js +626 -0
- package/src/github-review-threads.js +181 -0
- package/src/github.js +538 -0
- package/src/http.js +69 -0
- package/src/improve-settings.js +38 -0
- package/src/improve.js +187 -0
- package/src/integrations.js +373 -0
- package/src/integrity.js +259 -0
- package/src/journey-api.js +77 -0
- package/src/journey-replay.js +65 -0
- package/src/journey-store.js +97 -0
- package/src/journeys.js +60 -0
- package/src/json.js +81 -0
- package/src/launch-profiles.js +292 -0
- package/src/learnings.js +80 -0
- package/src/log.js +39 -0
- package/src/maintenance.js +335 -0
- package/src/memory-analysis.js +182 -0
- package/src/memory-claims.js +153 -0
- package/src/memory-sqlite.js +236 -0
- package/src/memory.js +552 -0
- package/src/merge-validation.js +58 -0
- package/src/model-catalog.js +238 -0
- package/src/model-research.js +91 -0
- package/src/notes.js +176 -0
- package/src/notifications.js +413 -0
- package/src/patterns/auto-team-model.js +212 -0
- package/src/patterns/auto-team.js +659 -0
- package/src/patterns/council.js +199 -0
- package/src/patterns/debate.js +188 -0
- package/src/patterns/findings.js +141 -0
- package/src/patterns/index.js +19 -0
- package/src/patterns/loop.js +158 -0
- package/src/patterns/pipeline.js +125 -0
- package/src/patterns/prompts.js +181 -0
- package/src/patterns/race.js +147 -0
- package/src/patterns/schemas.js +40 -0
- package/src/patterns/solo.js +49 -0
- package/src/patterns/supervisor.js +235 -0
- package/src/patterns/task-draft.js +29 -0
- package/src/patterns/tdd.js +231 -0
- package/src/patterns/team-strategies.js +67 -0
- package/src/performance.js +43 -0
- package/src/persistence-status.js +35 -0
- package/src/phone-sessions.js +96 -0
- package/src/preview-overlay.js +383 -0
- package/src/preview.js +219 -0
- package/src/privacy.js +23 -0
- package/src/project-report.js +22 -0
- package/src/project-team-model.js +178 -0
- package/src/project-team-policy.js +42 -0
- package/src/project-team-store.js +213 -0
- package/src/project-teams-api.js +36 -0
- package/src/project-teams.js +551 -0
- package/src/projects.js +286 -0
- package/src/provider-eligibility.js +9 -0
- package/src/readiness.js +98 -0
- package/src/remote-tls.js +66 -0
- package/src/remote-workers/bundles.js +198 -0
- package/src/remote-workers/client.js +332 -0
- package/src/remote-workers/durability.js +37 -0
- package/src/remote-workers/protocol.js +68 -0
- package/src/remote-workers/stdio.js +138 -0
- package/src/remote-workers/worker.js +304 -0
- package/src/remote.js +204 -0
- package/src/repo-config.js +201 -0
- package/src/repo-coordination.js +732 -0
- package/src/repo-tree.js +106 -0
- package/src/retention-policy.js +466 -0
- package/src/review-inbox.js +38 -0
- package/src/routing.js +49 -0
- package/src/run-analysis.js +111 -0
- package/src/run-cold-store.js +231 -0
- package/src/run-environment.js +15 -0
- package/src/run-history.js +91 -0
- package/src/run-log.js +160 -0
- package/src/run-permissions.js +110 -0
- package/src/run-projection.js +75 -0
- package/src/run-recovery.js +53 -0
- package/src/run-status.js +54 -0
- package/src/serve.js +138 -0
- package/src/server.js +2738 -0
- package/src/shared-access.js +103 -0
- package/src/shared-accounts.js +301 -0
- package/src/shared-api.js +239 -0
- package/src/shell.js +346 -0
- package/src/ship.js +344 -0
- package/src/slots.js +74 -0
- package/src/snapshot.js +388 -0
- package/src/source-context.js +17 -0
- package/src/sse-writer.js +70 -0
- package/src/ssh-projects/bootstrap.mjs +95 -0
- package/src/ssh-projects/config.js +45 -0
- package/src/ssh-projects/gateway.js +143 -0
- package/src/ssh-projects/manager.js +320 -0
- package/src/ssh-projects/team-autostart.mjs +93 -0
- package/src/ssh-projects/team-remove.mjs +69 -0
- package/src/ssh-projects/team-status.mjs +39 -0
- package/src/ssh-projects/transport.js +116 -0
- package/src/stats.js +139 -0
- package/src/store.js +544 -0
- package/src/stream.js +91 -0
- package/src/sweeps.js +241 -0
- package/src/tailscale.js +101 -0
- package/src/task-draft.js +23 -0
- package/src/team-evaluation.js +242 -0
- package/src/team-mailbox.js +160 -0
- package/src/team-memory.js +84 -0
- package/src/team-rerun-graph.js +15 -0
- package/src/team-reruns.js +130 -0
- package/src/team-scheduler.js +121 -0
- package/src/team-template-store.js +98 -0
- package/src/team-templates.js +117 -0
- package/src/team-tool-client.mjs +79 -0
- package/src/team-tools.js +176 -0
- package/src/teams.js +0 -0
- package/src/templates.js +62 -0
- package/src/transcript.js +134 -0
- package/src/verification-integrity.js +27 -0
- package/src/verification.js +183 -0
- package/src/watch.js +195 -0
- package/src/work-queue.js +47 -0
- package/src/workflow-control.js +83 -0
- package/src/workspace-api.js +207 -0
- package/src/workspace-changes.js +61 -0
- package/src/workspace.js +146 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Measured performance: 19 October 2026 — code-flow guides and reference"><title>Measured performance: 19 October 2026 · code-flow</title><link rel="icon" href="data:image/png;base64,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"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
|
|
3
|
+
<body data-page="performance-results"><a class="skip-link" href="#content">Skip to content</a>
|
|
4
|
+
<header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,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" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
|
|
5
|
+
<div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" >Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" >Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" >Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" >Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" >Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" aria-current="page">Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
|
|
6
|
+
<main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Engineering records</div><article><h1 id="measured-performance-19-october-2026">Measured performance: 19 October 2026</h1>
|
|
7
|
+
<blockquote>
|
|
8
|
+
<p>Engineering record. Status, measurements and decisions below describe the recorded implementation or review. For current usage, start with the <a href="index.html">documentation library</a>.</p>
|
|
9
|
+
</blockquote>
|
|
10
|
+
<p>The architecture changes improved latest-transcript opening by <strong>1.9×</strong> with
|
|
11
|
+
1,000 events and <strong>27.6×</strong> with 5,000 events on this machine.
|
|
12
|
+
The experimental Rust reader showed no consistent end-to-end benefit and increased
|
|
13
|
+
transcript API latency, so production retains TypeScript. These numbers describe
|
|
14
|
+
synthetic history/transcript operations, not provider inference or total coding-task
|
|
15
|
+
duration.</p>
|
|
16
|
+
<h2 id="comparison">Comparison</h2>
|
|
17
|
+
<p>Medians of seven fresh-context Chrome trials after one unmeasured warmup per variant.
|
|
18
|
+
The endpoint is Playwright’s DOM visibility check for the latest event after opening
|
|
19
|
+
Show work; timings include automation polling and are not precise paint timings.</p>
|
|
20
|
+
<div class="table-scroll" tabindex="0"><table>
|
|
21
|
+
<thead>
|
|
22
|
+
<tr>
|
|
23
|
+
<th>Workload</th>
|
|
24
|
+
<th align="right">Before</th>
|
|
25
|
+
<th align="right">Optimized TypeScript</th>
|
|
26
|
+
<th align="right">Optimized + Rust experiment</th>
|
|
27
|
+
</tr>
|
|
28
|
+
</thead>
|
|
29
|
+
<tbody><tr>
|
|
30
|
+
<td>20 runs, 1,000 events: latest transcript visible</td>
|
|
31
|
+
<td align="right">444.45 ms</td>
|
|
32
|
+
<td align="right">232.94 ms</td>
|
|
33
|
+
<td align="right">234.59 ms</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td>200 runs, 5,000 events: latest transcript visible</td>
|
|
37
|
+
<td align="right">7,124.48 ms</td>
|
|
38
|
+
<td align="right">257.77 ms</td>
|
|
39
|
+
<td align="right">320.41 ms</td>
|
|
40
|
+
</tr>
|
|
41
|
+
<tr>
|
|
42
|
+
<td>200 runs, 100,000 events: latest transcript visible</td>
|
|
43
|
+
<td align="right">Timed out (30 s heading wait)</td>
|
|
44
|
+
<td align="right">270.34 ms</td>
|
|
45
|
+
<td align="right">340.54 ms</td>
|
|
46
|
+
</tr>
|
|
47
|
+
<tr>
|
|
48
|
+
<td>1,000 events: transcript API</td>
|
|
49
|
+
<td align="right">129.52 ms</td>
|
|
50
|
+
<td align="right">5.53 ms</td>
|
|
51
|
+
<td align="right">9.56 ms</td>
|
|
52
|
+
</tr>
|
|
53
|
+
<tr>
|
|
54
|
+
<td>5,000 events: transcript API</td>
|
|
55
|
+
<td align="right">6,314.58 ms</td>
|
|
56
|
+
<td align="right">6.58 ms</td>
|
|
57
|
+
<td align="right">10.46 ms</td>
|
|
58
|
+
</tr>
|
|
59
|
+
<tr>
|
|
60
|
+
<td>100,000 events: transcript API</td>
|
|
61
|
+
<td align="right">Not measured after UI failure</td>
|
|
62
|
+
<td align="right">7.62 ms</td>
|
|
63
|
+
<td align="right">11.85 ms</td>
|
|
64
|
+
</tr>
|
|
65
|
+
<tr>
|
|
66
|
+
<td>20 runs: history search API</td>
|
|
67
|
+
<td align="right">2.50 ms</td>
|
|
68
|
+
<td align="right">1.99 ms</td>
|
|
69
|
+
<td align="right">1.97 ms</td>
|
|
70
|
+
</tr>
|
|
71
|
+
<tr>
|
|
72
|
+
<td>200 runs: history search API (5,000-event fixture)</td>
|
|
73
|
+
<td align="right">5.50 ms</td>
|
|
74
|
+
<td align="right">3.99 ms</td>
|
|
75
|
+
<td align="right">3.33 ms</td>
|
|
76
|
+
</tr>
|
|
77
|
+
</tbody></table>
|
|
78
|
+
</div><p>API medians contain seven requests per successful variant/workload (one per browser
|
|
79
|
+
trial). The old transcript endpoint replays the entire history over SSE; the new
|
|
80
|
+
endpoint returns a recent page of at most 500 events. These are deliberately the
|
|
81
|
+
paths used to reach the same user-visible latest output, <strong>not equal-size response
|
|
82
|
+
benchmarks</strong>. Earlier events remain accessible through pagination. Reduced work,
|
|
83
|
+
indexed repository membership and smaller responses explain the gain; it is not a
|
|
84
|
+
language-only comparison.</p>
|
|
85
|
+
<p>The baseline stress attempt failed before the run heading became visible, with no
|
|
86
|
+
browser JavaScript exception. It was stopped before timing the other variants to
|
|
87
|
+
avoid background CPU interference. A timeout is not a precise timing or speedup
|
|
88
|
+
ratio. No baseline stress API or heap result is inferred.</p>
|
|
89
|
+
<h2 id="resource-tradeoffs-and-variance">Resource tradeoffs and variance</h2>
|
|
90
|
+
<div class="table-scroll" tabindex="0"><table>
|
|
91
|
+
<thead>
|
|
92
|
+
<tr>
|
|
93
|
+
<th>Browser metric</th>
|
|
94
|
+
<th align="right">Before</th>
|
|
95
|
+
<th align="right">Optimized TypeScript</th>
|
|
96
|
+
<th align="right">Rust experiment</th>
|
|
97
|
+
</tr>
|
|
98
|
+
</thead>
|
|
99
|
+
<tbody><tr>
|
|
100
|
+
<td>1,000 events: decoded bytes through latest output</td>
|
|
101
|
+
<td align="right">2.02 MiB</td>
|
|
102
|
+
<td align="right">1.66 MiB</td>
|
|
103
|
+
<td align="right">1.66 MiB</td>
|
|
104
|
+
</tr>
|
|
105
|
+
<tr>
|
|
106
|
+
<td>5,000 events: decoded bytes through latest output</td>
|
|
107
|
+
<td align="right">3.56 MiB</td>
|
|
108
|
+
<td align="right">2.02 MiB</td>
|
|
109
|
+
<td align="right">1.85 MiB</td>
|
|
110
|
+
</tr>
|
|
111
|
+
<tr>
|
|
112
|
+
<td>1,000 events: JS heap after GC</td>
|
|
113
|
+
<td align="right">4.35 MiB</td>
|
|
114
|
+
<td align="right">4.60 MiB</td>
|
|
115
|
+
<td align="right">4.61 MiB</td>
|
|
116
|
+
</tr>
|
|
117
|
+
<tr>
|
|
118
|
+
<td>5,000 events: JS heap after GC</td>
|
|
119
|
+
<td align="right">5.74 MiB</td>
|
|
120
|
+
<td align="right">4.73 MiB</td>
|
|
121
|
+
<td align="right">4.75 MiB</td>
|
|
122
|
+
</tr>
|
|
123
|
+
<tr>
|
|
124
|
+
<td>100,000 events: JS heap after GC</td>
|
|
125
|
+
<td align="right">Unavailable</td>
|
|
126
|
+
<td align="right">4.76 MiB</td>
|
|
127
|
+
<td align="right">4.76 MiB</td>
|
|
128
|
+
</tr>
|
|
129
|
+
</tbody></table>
|
|
130
|
+
</div><p>Small-history heap increased <strong>5.7%</strong>; at 5,000 events it decreased
|
|
131
|
+
<strong>17.6%</strong>. The cache and paging state have a fixed cost. All successful
|
|
132
|
+
variants rendered 200 transcript rows in this fixture; the improvement is not
|
|
133
|
+
explained by comparing different visible row counts. Received bytes include decoded
|
|
134
|
+
assets and stream traffic, not compressed wire bytes. Heap is the Chrome JavaScript
|
|
135
|
+
heap after forced GC, not RSS or total system memory. Startup was sampled only once
|
|
136
|
+
per server and is retained in the raw data, not used for a speedup claim.</p>
|
|
137
|
+
<p>Browser latest-output ranges (min–max):</p>
|
|
138
|
+
<div class="table-scroll" tabindex="0"><table>
|
|
139
|
+
<thead>
|
|
140
|
+
<tr>
|
|
141
|
+
<th>Events</th>
|
|
142
|
+
<th align="right">Before</th>
|
|
143
|
+
<th align="right">TypeScript</th>
|
|
144
|
+
<th align="right">Rust</th>
|
|
145
|
+
</tr>
|
|
146
|
+
</thead>
|
|
147
|
+
<tbody><tr>
|
|
148
|
+
<td>1,000</td>
|
|
149
|
+
<td align="right">413.63–457.03 ms</td>
|
|
150
|
+
<td align="right">213.88–247.74 ms</td>
|
|
151
|
+
<td align="right">225.48–247.21 ms</td>
|
|
152
|
+
</tr>
|
|
153
|
+
<tr>
|
|
154
|
+
<td>5,000</td>
|
|
155
|
+
<td align="right">6,456.07–8,098.10 ms</td>
|
|
156
|
+
<td align="right">227.98–263.78 ms</td>
|
|
157
|
+
<td align="right">242.07–342.26 ms</td>
|
|
158
|
+
</tr>
|
|
159
|
+
<tr>
|
|
160
|
+
<td>100,000</td>
|
|
161
|
+
<td align="right">Timeout</td>
|
|
162
|
+
<td align="right">260.06–351.29 ms</td>
|
|
163
|
+
<td align="right">262.73–344.04 ms</td>
|
|
164
|
+
</tr>
|
|
165
|
+
</tbody></table>
|
|
166
|
+
</div><p>This is a developer laptop, not an isolated benchmark host. Other applications and
|
|
167
|
+
OS activity contribute noise; initial system load averages were
|
|
168
|
+
5.62, 5.59, 6.68. Variant order rotates each round and filesystem caches are not
|
|
169
|
+
flushed. Small sub-millisecond differences in history API timings should not be
|
|
170
|
+
interpreted as reliable Rust benefits. Raw samples are provided rather than a
|
|
171
|
+
statistical-significance claim.</p>
|
|
172
|
+
<h2 id="rust-decision">Rust decision</h2>
|
|
173
|
+
<p>The dependency-free release-mode Rust helper reads the same file backwards and
|
|
174
|
+
returns original records and byte offsets over a pipe. The same TypeScript code
|
|
175
|
+
then validates and constructs the page. Tests verify parity for Unicode, malformed
|
|
176
|
+
records, large previews, step filters, reconnects and pagination. Benchmark timing
|
|
177
|
+
includes actual process creation, IPC and termination.</p>
|
|
178
|
+
<p>Against optimized TypeScript, Rust transcript API medians were <strong>73% slower</strong>
|
|
179
|
+
for 1,000 events, <strong>59% slower</strong> for 5,000, and <strong>56% slower</strong> for 100,000.
|
|
180
|
+
Browser samples vary; a small median advantage in an individual workload does not
|
|
181
|
+
establish a consistent user-visible improvement across workloads.
|
|
182
|
+
The optimized bounded scan is already only a few milliseconds; this process boundary
|
|
183
|
+
adds more cost than it removes. This does not establish that Rust itself is slower,
|
|
184
|
+
or predict the performance of a persistent native worker, an in-process extension,
|
|
185
|
+
or a full rewrite. The experiment remains reproducible but is not enabled in the
|
|
186
|
+
production app and adds no Rust installation requirement for users.</p>
|
|
187
|
+
<h2 id="reproduction-and-scope">Reproduction and scope</h2>
|
|
188
|
+
<ul>
|
|
189
|
+
<li>Baseline: <code>c300a90ea9c71f940ac9b504ad8b3513b270f257</code> (main at measurement time, including SQLite memory, result previews and browser scenarios).</li>
|
|
190
|
+
<li>Measured optimized implementation: <code>0081bb76c33c86c2db16ca04b862ab490cf1920e</code>.</li>
|
|
191
|
+
<li>Host: Apple M4, 10 cores, 16 GiB, macOS arm64; Node v22.14.0; Chrome 155.0.8059.80; rustc 1.90.0 (1159e78c4 2025-09-14).</li>
|
|
192
|
+
<li>Same synthetic fixtures, provider stubs and dependency installation for all variants.</li>
|
|
193
|
+
<li>No real user history, provider requests or external service latency.</li>
|
|
194
|
+
<li>The measured code includes the live-page race fix and the integration with the
|
|
195
|
+
SQLite memory and result-preview updates from main, plus the archived-compaction
|
|
196
|
+
and shutdown fix found by CI. Earlier pilot results are superseded by this run.</li>
|
|
197
|
+
</ul>
|
|
198
|
+
<pre><code class="language-sh">npm run benchmark:compare -- --baseline c300a90ea9c71f940ac9b504ad8b3513b270f257 --trials 7 --api-repeats 1
|
|
199
|
+
npm run test:rust
|
|
200
|
+
</code></pre>
|
|
201
|
+
<p>The harness requires Chrome and Cargo for the experimental third variant. See
|
|
202
|
+
<a href="https://github.com/midhunxavier/code-flow/blob/main/docs/benchmarks/2026-10-19-performance.json">raw samples and environment metadata</a>,
|
|
203
|
+
<a href="performance.html">resource limits and architecture</a>, and the
|
|
204
|
+
<a href="https://github.com/midhunxavier/code-flow/blob/main/experiments/rust-transcript/README.md">Rust experiment</a>.</p>
|
|
205
|
+
<p><a href="index.html">Documentation library</a> · <a href="architecture.html">Development guide</a></p>
|
|
206
|
+
</article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/performance-results.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="project-teams-implementation-plan.html"><small>← Previous</small>Standing project teams implementation plan</a><a href="vscode.html"><small>Next →</small>Code Flow for VS Code</a></nav></main>
|
|
207
|
+
<aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#comparison">Comparison</a><a class="depth-2" href="#resource-tradeoffs-and-variance">Resource tradeoffs and variance</a><a class="depth-2" href="#rust-decision">Rust decision</a><a class="depth-2" href="#reproduction-and-scope">Reproduction and scope</a></aside>
|
|
208
|
+
<aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
|
|
209
|
+
<dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
|
|
210
|
+
</body></html>
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Performance — code-flow guides and reference"><title>Performance · code-flow</title><link rel="icon" href="data:image/png;base64,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"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
|
|
3
|
+
<body data-page="performance"><a class="skip-link" href="#content">Skip to content</a>
|
|
4
|
+
<header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAbSElEQVR42u19a7Ak53nW87xfz5zbrtYSNnbwRU4UGywZE2E5GKfCerETxUlRIVRWVUBcXBJLOKU4wchA7IKzBxzsXCCxQ1JEIT9SCUXYjQMEKiQorpWILSmJpJjgtZEdZGQby7Zuez17zkx/78OP7+ue7p6eOXPO7kryiedU15mZ7pnufi/Pe/8G+OrjWX3wyp9ChBrnOvFMnPMyPo5COAbgGARSXxkXvS6DFHBcYV+J67oMJ1VAsuemBhxXwFEIpE8UQLZ27/nn0w78iTLieTAMxxHEGIk5gqKgEDAlXbEEiur9EsBSel4Q3AJQlJdBPyOIAoDDMAALh5UOg0phqRhH4NzSeOuJ7atPP45v+JoLjfsiTsBwC+Ozz4AkEbWKLn9081rZ8IgUDrv7jXR7MYRDCBi4Ae7pzE2Fri5E1XMB6hwDAMwHOtI+dT4L5c9OXWN+j5OTsPO9ZPt4AFAJUH6BtC+BeLhk/Ag8/Bb+Mh9sQCxbQveMMUAiAAOTFKw+oJu9xNtY4s1cxSEYoHGSXs/S6oI8E4kdojZvnNX7mRHW4E5FaFfnY5nIUoMZuyACK6YQotLpSZAGIAAYAG6AX4A84B4P5c/gmwa/Wmv/HrSBl4SHG4nry/fqm8ywEQLexAESPkTETBBGRzpQ6X9U58bVf2Hsea0usWtZmM0YNr5Dc26+eVzFDAIyAEaIgCBIROGrQDRgXOIuL/GPcZgPQTIQ6r+j/oftGes36Dj+8eHaffFfDMzvGS7jTYMRFDYRrYQoBDmCHAaBcFAC5GlD878mGxr73CfHe+e1Kur79MaKBAKs85pqv0bj/ebrxnVSDirCFBEgFOZQcR5xeBa+EvAtheEjuLt8B0jH+jFmZLhCGpBVbfmjunZQ4JeKFXwzz0MQHECQJwn0TNAKGD1LabWP3QuYoQVNqOpKdA356nneOJCYhripHT3XxGyD2JDWpBlqfJRRBcL4ADA6X/6s3jS4Heviom5rsRfir35E31AU/mvFkn0tz6EEENwRmoQX2nhcS7imbGM/A9TznG0D2/zfhKXuZ2dSoYe5Td6o88EK2ibwJJghcEwNTyPi6uL7R781Nt3Mt+MGBQDx8mmAZCB97V792WC4qwh4IbZRCigqqZ8ifPM9z1pQSfEiBMfOaNq0AXOUaUdta7pS7LFD3efpv8Mm3pRAi6OrUIzOxTvwbcW/XMQwczcGd+X+Cy8ZaPV/FAW+FluIAoLHTPzkkNX4LPVrQFNaey9A85lQMa+JstqJ8nv0TDiDIZPXmmwECAqF+fYQPo7jw/iW4X2V4O6dAVXA8XUP2sGLN941PGiH/RxKCEWM/VLvHY+kBUH5rOqqvxr+f4foTX9fPd6M5km1dkd1qvO8wYguEyo3mUieBgwwMPoBC9tb/nvxnH0zTqHExmzPaGcvKEd7axdufE9x0A77WZRyFJXku9pwU7+uvBa1PZfqdY+30fu8hreGF9TyhmK/JwTPCOwLbjFt8unr9Yb9anpkHvN7YrIPSSCDnUMslu0bsRa/O3mLs+nMRXB/cK/+/LJwfwGYxjA5GDXtj3vjgtEDQ7NwftqaLmCY5xmEKxCSTqQdtTEzNiLoyt8mYYboK2bbI3zUfx+H53lEi3hBDKP4vnAgDHQeUQ62JGIO/PR6P5qD99ph/yyi8wozgW0jzwa8Wp3CMDgcJkCScROwAn/RXzd6Dbj0sVm2oJjrcpIx3D8+Urh9q87B4QjuE99eHenv84TQ3bAAM9QD9pqD65rDlN3YgO55Oc0YNY5jvm9axRSmUJkk5WVYs8Ivhu9w4GO4G4YJ6RZgwNF06Uvj4h1hCdBFuBzmmiZ+RWz3jlvYJbx38wk7aIFmEHcRKNoLA2ZpHvuPk0+YkNxRQlJKIlLkGIDCGwAAb+yPCYp52D+8b+sVNsbNuADIETRDcis/v4aePmlGMyRekPiLYLwukz3QDprRhCM0UheVsFmj/iSHCGIbgPsrcVLLILf68rv9DMjqYuPiu2wZKzqDKE0Y0Ap6vA03wgzY8TlE340hxoJ24VJsQJ8GdfflPJR6YpG0W8QYgPR8nME1AL4wZa9mMiCriyHczHFKH6sj2U2vp2V8+xigGYRdlAm7lf7dHscd0h+zckhdLWBDYQRw7CB0EBolBhybtmDWG/WSWrtPL7QSN2oblMP6DGori9nNTs5jQt8x3vk/61if8/lZW995Fv1s33d5Oy6A1MjOEnJCLio6IARsXlwBABxbxAbckPlblq9hUVytzRyketu4TuXiZ0m4z7AH8yBnlpfU9Yq4g2ZwQc3hgm5tJxSfBJScLmAIyRyX7rCwvTgDXpC/RsWrGQAXooCiie+t4ke2AwsRdRHY0RzXchE3doEE35S/Pw/uOFsI2HU4GlUjSTArAOk8lg88vXhB5vFM2zGua6rZVEKtMjZxjoovoMozYaEPghaFIy0AQ4vA1axzzrNrE61IySHyKbwCT2YN0M4acCof5HixUr6HLePrO/jlmiH1e/GCFomKL8U4L5q84wxY6yniKEODSdIQYAyfxk3cxPp6byQ8rQGZS2XEquJ0bh+NoMt9B0ldRAK1gHbMO35R4z7rc/M0bIfvaJZFJwm8uhSYWxbsdzJhbXe5IM9MrTKUnGBeyyX1BTBdl2iEL1X6fQFJ36laP2O/OtLPLLJyBt+K0a4K/3XGVcxngNgRCO+JCAU4Z3gos3BykRTDohB0qdHyIvFAH/x0EnN1iZIJo+lyLA1N7veOvxsfw/p63UGycD0gYoaf39dFsBuiawG/HAscs+jmC3hl2sFbm4pVBEQHPbV6mHLBXlULRWrO4MD+FUjhhmPcfVFeAD1vnYtqlhU5L/2gXULRbiBokYwodgEz6km6qaeA3yhs1K4/J1Jq0aMvLweN44f9/4Zfx7rmti/O1ACLM1BLC0rUosS/HJtfhu/AbEehEsSqNMdMOKuYkMt85u6wgjH6uWIt3I4NOj5xgntqS2HV+pI1oS5KqMftmuVmLnqzi6ajF3l+OQv0nWp/XXxvWd7EfcpFQeVKESB8/+hv8n9j/WSBjSPlnhiQawvtbOY8yccupHtRo6tLNMCa4c1wjqGdQqlJIMQpp98TU9ydIssDw+Cj8bv9tuEvY10FNnbuFZ1rAxbKaPoOzNiNG7oTg7CHegF2WeJstaCki2ibhsroOSiXCRHFUlEGuBz/wG8b/mSSfMZFzjQvDmhlPedh/5QA7RZzF80JLZqm7jOq2EVdue9C2MzByOkuYxF8tSjKEp9WwO34Xv53HD5ZYONIXBQEd2YA5msAewik3Ro+7BGisIsE3E7FdzUkPG+CqwqsCAmkKAQOlkzLQFn62SjciRW8H3+LT2bMj7uxQDsyoNmcKk33U7aHKpTqpJrU7rST97SbbOnlMrharCZMGgkDA9MUDdPARiT+yIEPYcV+AX+Xn051lJ0N7iU353JGKp6uhJTG9I25SQllFFyCMyW1xUYue5bEZ51Sp9151jGLULfqyanaxmtjasp+PatCr7LYEIg0boHlpjw8Brc/EvGHHOJ+x9MP4bZrztSEx92eJR+XjwHuRJ5Fq+IMdtMNMbUDaJjyFrqwNdLZ7W1cGG9ja1xirIgylSbgIpjmBPKXctLnUROHk+c9rdDUpPdePZ1TUn83VX2SVgduOgfJ1n5WKTVuO/UUiM/K8RDK8Hs4vfkAfuVVX6i//9afG+ATjztObOxpPKkfDSWCFI/rrqUVvBkXU0G+RYicoItDQOPS9dSF8/rSxfM4W47gdAiGpLuA3NLNVhBbjTVlAlSEF6uBlDxzpcSsuuFG7d7YWppZzWhVhGYjWdVmNlralM7V0olmlxPSYBQNCEUKu3y0TbNPgvwvivgP+NlrTwEAjirgxN6G9WYywI7rrqVlvFmbqQu6PjAKMiIS8C+fOavPX3gKm4gKAyLAkr1CKo56Nc7JiQYo/0+tZEwSWM88TAitNBGUPlOXuyfSKmai11NEzaaRDtx0NKD67hZz0NAWqYqECAqWrRoZEJbAMIS2L2yT4Vdj0PvxwZd9HACxvk5s7E4bZjKgOK67BkttBtAhL8A4Go/1f558XE+U5zFcNgUExDQ+BY+s52g9d07WIztkQyMsE3ZC/JrYlcSrTfy03zLcVARuawXFqdvS9Bv1JyftcOz3BtjqhibgJB1QoeFB+Hhz02g/Wn7xpT+CE4zN2TlcyoxYNqmNxJygIRjPb23xf335c3zKz3FlEIBIlKVD0eFeGUdNZkJbI3Z1cJn2G9rEl0FuSaJlEA0kE5wx4UGaWUwQl5iYta6Cn8m4RL21b4z5Oxu9hta4RutkeqbcNJO8gCRsn4mUr2qwtmF/6rHfWL3jMy/CBh1Hj4dLH9Jr5H4oQAPCz2xt8dTjn8M4jDgMQOkRcoekXAkivOoEpiZhY2tOqCKUZU2ZSLpqzcjgSwMZIAQgb1ImegU9DduQhwHhFYOnhbjhSWF6ULZvLrPd/eG54O5yAgiUi1tPl7TBt26NBh9e+qEvfh1O3JI04ZIYUN2EHAiAXxyN9ckn/p80GCNQ8iz1Qkzg1AjBXEpNkg44JxxwVM307JmkridCAQaIAVCAK0DKhK8I7m2mzZL0JtH7G84rI94dvZjSiMlpGkkC5UYgouD26ZI2uH4cR7+Jd37+pdigL8KE2RBEz6JlkFz61JOPacwtBgc9xjwV6YR7Ijg8e0DKQeSMgd7qPpq5DiQjnQx41oBM8InRZgvTNYuwE3Sf2+2vJhR23drpabA2nyenT4of0woK22dLFiuvsFF5HH//syto+dm7ZIA8k7hA0GPnT+v0+LQNTYwoXXA4HEq8gWJzHqZp0NXo2mWjpVpwqNVOPZWLbRnZJrPYGzGz8bfXUYzezmvO3Gr+ZVgCUXDrTInhVa8P0d+b7MEJ2xsDBEcAMIojfuHs4zYIQowl5FGKLkUXFCV3CUkLIE82ofpr9jGmMDMXTlMVg83As6cXvEX8jsROChesI9mpGipmrAah+TmN2hvt519TEyYedL5lKtjW6QiEH1y5/bPfiBO3xHlGua8thTm9cBEDAGe2zmjLz9MQIURIDleqEbkmxE6vK8LXVwOn6inturmoM67TSk+of9JcPZLLvp7AKUjpEH43s+nEDKNde8+trXJEEAEbhLGP/gkA4PqjWpwBVW+o8TEB4FNbZwFFyBPeyzWZnGMiNl3teSXvwIMmJaWa+KxshVpGMwmqWqPvMzOf1A5TG5yZIu3N0HKBrg22oL0dytR6EDg6J7fiLYN3PPraeQbZejrjUngS7BGNAF0oL5ICPEqClKFeSVItq2p2/SrvJlTC1gANqoYHZnjSItUgTOP+FIm5QFFJszs2WtMmfYExO7xki3x18F4H89nnG6yFUnorAOAT/RfZpwHJrhj+p58XMN5OJqYymmAywWpMhGnOXdV+W6xI6e2kmfWv/KAFRt2ZDXv/wdx9fnpubbIHhiamRWzX0CSQcRsQ3nLt+meWc66Ii2iAACCu4iHfGn0RcoO8BDzDUO4VkDITKs3zbAsEyDOh6+vxLPXKYyUNHMgdSE3DrQ4VOGuFiJ1aNhbtVSEWGz6b5xmhETdk/z1ui+R1j54bvCrPXizAgCqU/nY+LsdJBAxMvk15MsL1mDQqrZjcNXM8ML3ATLYVmdA1M/J7VQuwqq7TJsPqKpCmZ0VnMYScX+HfiVFzpJ/tjEeTiSI7CCbXYDWAeA0A4O67bTE39PoXEADiKPyiI6QuReXJWEmpjCFP3o6ake9EUr3nRps9LMwpiyqCVk4iAIlxyi0H7WHYOS3X6lnniXvrT+kKdnfdm6bdYZMpbHhIVdBpYIyvyqNfC8YBG0cisG54oviwynCvg2tGjQA4PApwpyAyU7mCn0q6cyw7qRAzE5fNpEHaZ3SQuacPk83yQgPkpDXB2HC/1Uw2tBNsO1vb+YTvwstU2qgakbf2MWiMzlfXKAcirk2G+HEtGogJR28gNlgq6qcdwSFGg8fU415HpQKzXVBMBI0xLXeoGlIElMkI06vqmFI5zYW06ERiosfMzGpluawJFYRNWtay8e1I/BQ0a7ZRncq7cVrauwzp5uxaxO7RiMrzBg7Migdmh8k5ghv/9Ev+wGP4ZRefR2AMVjkFdxBOwKmYcb1aVqPWFOUReqUALqZFKl2NLccVysZbMR0rJaaqVO1x1Wal8r6aK3zM8MY4a9EhThFrStrnaYD1MZLTjJndmb7AaiknbhGOHg/lky+7s9TwpDw8z+TbIKIBkYjJDjCnKJmTczUTqtREJcFMGSZW6YpshJurTwjKy45UTZE+sTdopLgbjKiZ0e3lQXtlQM6JG9iFF7aPZ2drQRSnl70hEkSZgcHOJgg6wd0uV+M4cUo4wRiXX7oxjoPfkRdXmTQCVCZyuaA8nCl3gE7PUTMqTFesit21oaVXRjfnl6vXqtZXbDj5uS/HpBasEOydne3WIGpp7KyJ2YIPdt7fxYbJd1XmCLRU2DaDrHik6dzsctXEDQfWDT/Ji/Hpl707+tKveAzLFEJaFVQRiA5FT6LrEVRafYfukGLtmiqlNJJmVHZAnss5XjdbqjIwakRnNeE129j2LH9YE9zQXF+s9T5z/a96vqsNve+lp0xyE/ipFOS+UXvsC9rwPOUxKoGfwt959OMhlN8nlF+flmTVGAbQSxMtlRDFQMlUiYPDkldAA2LICWkDFMhUQkuVL+WlUqvYodlbopBdD0AK2UNiu18mm73uarDsSdqRHReTnSB61hK7ndRFdRnd3WRAuT0Oawcf8uYA5N6XrawamCjcqlWUn38LNLqZ8D8NxgOpouWeWE+DVMhgFCw5xCQEY1VeJAKFANJAN4gmYACiKkMaCBNTQ0JVpZwEruOU4xAIqxeNaaeLmaPT7trEVU2afQzoGuvOc/Y3zFpuG8wpMGexau7jU/GVX3MjbuP40petrKYGUuV/E8CHAH5Ib/3cKxHGr0YcvxLGF4FaBTQAUMgZQJkkg1laTyr58AGSiakMqchcTgmsK2FQgESJhBnBGCAvRFsheDVZvAhLBwI1AsoLqYuI1o5Ru66jdROknE4d9TKjsZAc2VMNUi5hq+KRMFgBXL+J2zie1Tu0SwY00hUQcfhYwD0bEb/0kk8B+BQWnKXYy+xE6zNHFfQirGnzSy+30fiIyL9uw2v+ArUJ+MjFYFKjMYNsDxVNEdX6M6tEDwQ1l0Rhw6azpUykmcetaBz++wgA18/Nl+PSVnk8etzw5VPEn7xBOHFKwMaV/qEDdbF88EMXvge68BNm/kKNz7vTMhNSd8uk+c469ZnqPcywBz3EbywUUdvxjIs5ERA1PBTi+MJv+I+98Dvm9QpdyV+z4JWl/zHi6A3EI08bHrwtAvClH7h4nYqL/4mhfLVGF9xJS9a7yo1YFlrrOIJsB1GzavN1o2x22DiR/hr75SLMow1JhDeU7z/0uzh6PODELfFZ+gkTPDM/xXLrAwXuvGmMd229YqDN+4K2roleSoBVcgnm3mA2OxmnffnZFKoDwLpol6AnSb9BYIylrzy/iFtnf0Y/9vzb5xF/76unP/cewp03jXHrAwP8+PKnSfxzLF1FMgVCoKH+X4ttjguqZQ+tJwawTkSco2laOp5WfW+10LdHLR8q4njzY5J+GOsyXH9Kz/KP+DyTbEgAc/B9uGZ0+olPAniB+yiPtli7v4dsQ1DT2LK/yFM7udlGkA2n12NEsRoiwpcd5V/Cew89vJP07ycNQD2IcewYz72bTzr5gIarAOkwa8QQWbLNJlJvjUjYplLK9RgBjbXU01IAliRfpYYHQrThUxbK78R7Dz2MwyeLnYi//xgAIC0LIJbCownrTcrEaxK6CtBbhLdu3kiZPzkMqWGpYTLcSyxfXbgNP2PBvq3cOHQ/1k8WuGexiZn9x4ATyVUx+hptOnfDOt/TJH73V3wqrEcK0muNybBjhMHdHNLaC4pI/vYwDA6X68Pf3+2gHvcdAyBiHRyUT99vYel1vn3eZWZgmKB47mJQN6HfaAe3yr3s/NgNIZirRFguYigAC++Lb7B/iiMscfhkgXt2N6hn++6H1gAcGG7/mTAYvoa+DQRjLb3513jaBZP2EjAphc/s3TQgxwSTPAiOtauLOBg8guXBt8f3hHfjCFP74T27n5LcXwy4IU3ZjcG/YUtrS5CizDiBH06XKzmBm0T4pr2YGGFzjyxWzFcOmZv/QjxQvD6+i/8tTUmucxGDexmScc9xF5SM+FEdxPbW9yBuw3OhnmxMu0iN1TZSYm1Sk2EjEFYVXLlFwNeuDq74GQXeEd9lv9aYDY64hKVBin1kfA1AXPb4nWFp+Vq/cCYqWKhSBXXTNCdrr9U5uEZRXZz0twVXZLEa4tIAMvz8yjXhPee/l483ZoMv+ccU9w8DTh0TJPJHtm8FCVljSJKsG8iBRo2n2VpSpxYESm4CtHooROERLOOd8Qf5n89fJqnff15QzrWvfECvt63yo9reYpSq2dIaUTyvNz9p47JGBJw9HKFksVqoCHDi30bih3EHn8DhkwXeeLdjY0OXi/j7RwOOZv9/q7wNRWEasRRV1AVyAQ7PDYvsNF/ldT7hbm7UgQOFwx+2If5h/AH+egvr78FlT7MX+8L1vIVx5QN6CS6Wf03bI4gI9bQSmz+fyqnlHQmJLufwYHBzl+GnDrzc/tmZ7+LpidQfKa/U5Rf7w/UENIpvteXiKp2/EEVm42uNlv7cOKtGbcwRiRB0YDU48AdYCe+Mb+fdZ66w1O8jG5Brgj+HleXT5R8Gs+vieMuFVH1GvfZsnpJKU4WgSxSdyweCM25pwJ+Iy198H2578ebEw9n7Ahx/fDTgePqNs8Gm/ootFdfp4kUHc1U+B19pgrDh10dF2jD46lIQcfdwNdyx+bb848yX2cPZ/wyo+mzG8VYNg0TWrr7YmWqS3KKg1YPBDU9hiI3y7fjXJemJ8FcW6/cfBGXXc/BB/TmO4wMhenA52zORuSU1ekRYDj4IiIb/ODiIfzRKK10ZDq8b7tl4RqV+f2jA9chDJPGvDpZCga2yBFnUk+Ak4O6MpK+uheh4NCzjPXo7/90IAG59YIA7X1viHpbP5m0UX8HeT+ptK8uXcynEarY8R7yOUtJwNfhAUMC/8VUc87fxS/XQ9J03jZ8Lt1F8BeM/AaAYLv22Av62Us+pSyCKVfNlIDp+15b4nvj3+OFny8jubzdUIu5GCA/6B0D7PghDwOEFHtaSfRCve/DncdNN44ZrqecS8fdXRezHdT0cL0fAabwWD+EIt9IyYifDc03q99+jbxmA9ZPFTkvFfPVxuZlwXAFHFb5K+K8+Fn78f4eywyDh1HjXAAAAAElFTkSuQmCC" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
|
|
5
|
+
<div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" >Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" >Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" >Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" >Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" aria-current="page">Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" >Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
|
|
6
|
+
<main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Build and extend</div><article><h1 id="performance">Performance</h1>
|
|
7
|
+
<p>Use the diagnostic and benchmark commands below to identify the affected boundary. Compare the same workload and record variance before changing concurrency, caching or storage.</p>
|
|
8
|
+
<h2 id="measure-the-workload-first">Measure the workload first</h2>
|
|
9
|
+
<p>The backend remains Node/TypeScript and the UI remains Preact. Execution journals,
|
|
10
|
+
provider receipts and repository leases retain their existing authority. The changes
|
|
11
|
+
below reduce repeated work and bound presentation buffers without changing agent
|
|
12
|
+
permissions, verification requirements or retrying ambiguous remote executions.</p>
|
|
13
|
+
<h2 id="history-and-transcripts">History and transcripts</h2>
|
|
14
|
+
<p><code>RunIndex</code> maintains ordered run summaries, complete normalized search text and
|
|
15
|
+
repository/worktree membership. Ordinary updates replace the indexed record without
|
|
16
|
+
sorting every run again. Unfiltered history uses a binary cursor lookup; filtered
|
|
17
|
+
search still scans the in-memory search strings. Only the selected page is cloned.
|
|
18
|
+
Authorization filtering precedes totals and pagination.</p>
|
|
19
|
+
<p>Cold projections now include their full searchable text. Legacy cold indexes hydrate
|
|
20
|
+
once during asynchronous startup to obtain that text. Listing and searching no longer
|
|
21
|
+
read every cold detail file or synchronously validate every archived source. Opening
|
|
22
|
+
a detail or using it for an operation still validates the source and rebuilds stale
|
|
23
|
+
projections. HTTP detail hydration uses asynchronous I/O; synchronous compatibility
|
|
24
|
+
remains for existing internal mutation callers. Indexes grow with run count, and
|
|
25
|
+
live/resumable runs still retain their execution metadata. Legacy log compaction
|
|
26
|
+
hydrates one archive and invalidates its cold summary before replacing its source;
|
|
27
|
+
shutdown waits for the projection refresh to finish.</p>
|
|
28
|
+
<p>New UI subscriptions use <code>run-page:<id></code>. The initial frame contains the latest run
|
|
29
|
+
and step snapshots, a recent transcript page, and persistence status. A reconnect
|
|
30
|
+
reuses a sequence cursor if the missed events fit the page; otherwise it explicitly
|
|
31
|
+
resets to a recent page. The old <code>run:<id></code> topic and per-run events endpoint remain
|
|
32
|
+
available for older clients. Those legacy endpoints and full exports still load full
|
|
33
|
+
history; they are not the bounded UI path.</p>
|
|
34
|
+
<p><code>GET /api/runs/:id/transcript?step=:step&before=:cursor</code> reads backwards directly from
|
|
35
|
+
a file offset. The opaque cursor binds the offset to the run and file identity.
|
|
36
|
+
Appending does not invalidate older pages; replacing/compacting a log does, returning
|
|
37
|
+
409 so the viewer can reload Latest. There is no initial full scan or separate index
|
|
38
|
+
file to recover. Partial pages can be empty when a bounded scan crosses only metadata
|
|
39
|
+
or events from other steps; their continuation cursor still advances.</p>
|
|
40
|
+
<p>Default limits:</p>
|
|
41
|
+
<div class="table-scroll" tabindex="0"><table>
|
|
42
|
+
<thead>
|
|
43
|
+
<tr>
|
|
44
|
+
<th>Resource</th>
|
|
45
|
+
<th>Bound</th>
|
|
46
|
+
</tr>
|
|
47
|
+
</thead>
|
|
48
|
+
<tbody><tr>
|
|
49
|
+
<td>Transcript response</td>
|
|
50
|
+
<td>500 events and 1 MiB of event JSON</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr>
|
|
53
|
+
<td>Scan per page</td>
|
|
54
|
+
<td>16 MiB, plus the record crossing the boundary</td>
|
|
55
|
+
</tr>
|
|
56
|
+
<tr>
|
|
57
|
+
<td>Individual log record</td>
|
|
58
|
+
<td>64 MiB</td>
|
|
59
|
+
</tr>
|
|
60
|
+
<tr>
|
|
61
|
+
<td>Displayed event string</td>
|
|
62
|
+
<td>32 Ki UTF-16 units, with a visible omission notice</td>
|
|
63
|
+
</tr>
|
|
64
|
+
<tr>
|
|
65
|
+
<td>Browser transcript cache per run</td>
|
|
66
|
+
<td>8 MiB estimated serialized memory / 10,000 events</td>
|
|
67
|
+
</tr>
|
|
68
|
+
<tr>
|
|
69
|
+
<td>Idle browser run feeds</td>
|
|
70
|
+
<td>Six feeds, within a 32 MiB estimate</td>
|
|
71
|
+
</tr>
|
|
72
|
+
<tr>
|
|
73
|
+
<td>Initial transcript rows</td>
|
|
74
|
+
<td>200; older pages replace the step window</td>
|
|
75
|
+
</tr>
|
|
76
|
+
<tr>
|
|
77
|
+
<td>Global run replay ring</td>
|
|
78
|
+
<td>500 snapshots / 32 MiB serialized data</td>
|
|
79
|
+
</tr>
|
|
80
|
+
</tbody></table>
|
|
81
|
+
</div><p>Complete event text remains in the authoritative log and full export. Historical
|
|
82
|
+
step windows do not append live text into an older page; Latest returns to current
|
|
83
|
+
events. A tool result whose call is outside the page is still displayed explicitly.
|
|
84
|
+
The estimates bound retained payloads, not total JavaScript heap or DOM allocation.</p>
|
|
85
|
+
<h2 id="streaming-and-storage">Streaming and storage</h2>
|
|
86
|
+
<p>SSE stops writing when Node reports backpressure, resumes in order on <code>drain</code>, and
|
|
87
|
+
disconnects a client whose queued plus writable bytes exceed the budget. The default
|
|
88
|
+
is 8 MiB per connection (<code>CODEFLOW_SSE_BUFFER_BYTES</code>). The existing
|
|
89
|
+
<code>CODEFLOW_SSE_STALL_MS</code> timeout also applies. An individual oversized frame is refused
|
|
90
|
+
by the same bound. Slow consumers never block agent execution.</p>
|
|
91
|
+
<p>Disk writes are ordered by run ID, including that run's event log and execution
|
|
92
|
+
journal. Up to four unrelated runs can write concurrently. Ordinary contiguous
|
|
93
|
+
appends batch up to 128 records / 256 KiB. Synced writes, rewrites and deletion form
|
|
94
|
+
ordering boundaries. The append backlog has a 64 MiB byte budget: overflow is a
|
|
95
|
+
reported write failure, and strict journal callers fail closed.</p>
|
|
96
|
+
<p>Optional startup checkpoints use a separate single-writer queue with a 32 MiB
|
|
97
|
+
payload admission budget. Their captured source identity prevents a stale checkpoint
|
|
98
|
+
from describing newer events. Durability barriers can be scoped to a run; reading
|
|
99
|
+
transcripts waits for that run's appends without fsyncing every other run. Shutdown
|
|
100
|
+
still flushes writes. The run view reports saving and persistence failures separately
|
|
101
|
+
from workflow completion.</p>
|
|
102
|
+
<h2 id="ui-and-analysis">UI and analysis</h2>
|
|
103
|
+
<p>The UI build produces hashed ESM chunks and a hashed stylesheet. Settings, Terminal,
|
|
104
|
+
Browser and Changes load on demand. Both owner and teammate terminal renderers
|
|
105
|
+
use dynamic imports; a bundle test rejects xterm in the startup import graph. Assets have immutable caching, compression,
|
|
106
|
+
ETags and a bounded server cache. HTML remains revalidated. Old chunks remain on the
|
|
107
|
+
local build directory for already-open tabs; SSH release packages include only the
|
|
108
|
+
current manifest's files. Packaging checks that HTML and manifest belong together.</p>
|
|
109
|
+
<p>Code intelligence reuses at most two isolated TypeScript workers, each with the
|
|
110
|
+
existing 192 MiB heap limit. Every request still checks and reads the current allowed
|
|
111
|
+
saved sources. Only changed source text and removals are sent to the language service.
|
|
112
|
+
This preserves freshness and filesystem checks without rebuilding the service each
|
|
113
|
+
time. Workers expire after 60 seconds idle and are terminated on cancellation,
|
|
114
|
+
timeout, policy changes and server shutdown. Only one inspection runs at a time.</p>
|
|
115
|
+
<p>Approvals use snapshots on the shared SSE connection, with polling only for older
|
|
116
|
+
hosts that do not expose the topic. Inventory, statistics, automation, notification,
|
|
117
|
+
deferred-run and visible diff polling use the common scheduler. Shared polling waits for completion before scheduling another request, pauses in
|
|
118
|
+
hidden tabs and refreshes when visible. Background inventories explicitly opt in to
|
|
119
|
+
sharing concurrent identical GETs; selection-sensitive reads always issue fresh requests.
|
|
120
|
+
Mutations invalidate the request-sharing map. Writes are never automatically retried.</p>
|
|
121
|
+
<h2 id="measurement-and-verification">Measurement and verification</h2>
|
|
122
|
+
<p><code>/api/health</code> includes bounded HTTP timing samples, event-loop delay/utilization,
|
|
123
|
+
process memory, disk queue depth/bytes, slow-client disconnects, storage-cache counts
|
|
124
|
+
and language-worker reuse counts. Settings diagnostics include this snapshot and
|
|
125
|
+
browser shell-ready/long-task measurements. Metrics contain no request bodies or
|
|
126
|
+
query strings. These are local diagnostic counters, not exported telemetry.</p>
|
|
127
|
+
<p>Run:</p>
|
|
128
|
+
<pre><code class="language-sh">npm run build
|
|
129
|
+
npm run benchmark:performance
|
|
130
|
+
npx tsx --test test/performance-boundaries.test.ts test/transcript-pages.test.ts
|
|
131
|
+
npx tsx --test test/e2e/history-launch.e2e.ts
|
|
132
|
+
</code></pre>
|
|
133
|
+
<p>The benchmark uses a temporary synthetic home, 10,000 indexed runs and 100,000
|
|
134
|
+
transcript events. It reports timings, scanned/response bytes and built asset sizes;
|
|
135
|
+
it does not access the user's actual run history or invoke providers. Treat timings
|
|
136
|
+
as machine-dependent observations. The deterministic tests enforce ordering, buffer
|
|
137
|
+
bounds, cursor correctness and failure behavior instead of fragile timing thresholds.</p>
|
|
138
|
+
<p>Further optimization should follow real profiles. SQLite-backed search, Rust modules,
|
|
139
|
+
additional worker offloading and adaptive process limits remain architectural options,
|
|
140
|
+
not requirements for these bounded paths.</p>
|
|
141
|
+
<h2 id="beforeafter-and-native-comparison">Before/after and native comparison</h2>
|
|
142
|
+
<p>See the <a href="performance-results.html">measured results</a> and committed raw samples.</p>
|
|
143
|
+
<p><code>npm run benchmark:compare -- --baseline <commit> --trials 7</code> builds the baseline
|
|
144
|
+
from a Git archive, the current TypeScript app, and a temporary copy with the
|
|
145
|
+
experimental Rust transcript reader. It uses identical synthetic fixtures and real
|
|
146
|
+
HTTP servers plus Chrome. One browser warmup precedes repeated fresh browser
|
|
147
|
+
contexts, and variant order rotates. The OS filesystem cache remains warm. Default
|
|
148
|
+
fixtures have 1,000, 5,000 and 100,000 events. <code>--scenarios small,medium</code> selects a
|
|
149
|
+
subset. <code>--api-repeats 1</code> makes one API measurement per browser trial instead of
|
|
150
|
+
the default five. Raw samples, machine/tool versions, commit IDs and failures are saved to
|
|
151
|
+
<code>output/performance/comparison.json</code>; <code>--output</code> overrides that destination.</p>
|
|
152
|
+
<p>The UI measurement ends when the latest event is visible after opening Show work.
|
|
153
|
+
The old app transfers/replays all events; the new app transfers a bounded latest
|
|
154
|
+
page with Earlier navigation. API timing likewise compares full replay to the
|
|
155
|
+
latest page, not equal-size responses. Browser received bytes are decoded resource
|
|
156
|
+
bytes, not compressed wire bytes. Heap is JavaScript heap after forced GC, not
|
|
157
|
+
whole-process memory. Timeouts are failures, never silently replaced with a timing.
|
|
158
|
+
Agent execution and provider inference are excluded. See the Rust experiment's
|
|
159
|
+
<a href="https://github.com/midhunxavier/code-flow/blob/main/experiments/rust-transcript/README.md">README</a> for its scope and parity test.</p>
|
|
160
|
+
<hr>
|
|
161
|
+
<p><a href="index.html">Documentation library</a> · <a href="getting-started.html">Getting started</a> · <a href="help.html">Ask code-flow</a></p>
|
|
162
|
+
</article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/performance.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="accessibility.html"><small>← Previous</small>Accessibility acceptance</a><a href="run-storage.html"><small>Next →</small>Run storage</a></nav></main>
|
|
163
|
+
<aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#measure-the-workload-first">Measure the workload first</a><a class="depth-2" href="#history-and-transcripts">History and transcripts</a><a class="depth-2" href="#streaming-and-storage">Streaming and storage</a><a class="depth-2" href="#ui-and-analysis">UI and analysis</a><a class="depth-2" href="#measurement-and-verification">Measurement and verification</a><a class="depth-2" href="#beforeafter-and-native-comparison">Before/after and native comparison</a></aside>
|
|
164
|
+
<aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
|
|
165
|
+
<dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
|
|
166
|
+
</body></html>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Versioned project conventions — code-flow guides and reference"><title>Versioned project conventions · code-flow</title><link rel="icon" href="data:image/png;base64,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"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
|
|
3
|
+
<body data-page="project-conventions"><a class="skip-link" href="#content">Skip to content</a>
|
|
4
|
+
<header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,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" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
|
|
5
|
+
<div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" >Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" aria-current="page">Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" >Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" >Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" >Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" >Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
|
|
6
|
+
<main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Your workspace</div><article><h1 id="versioned-project-conventions">Versioned project conventions</h1>
|
|
7
|
+
<p>Save a private convention draft, inspect its version history, and preview publication to a project repository. Commit the staged conventions file if future runs should inherit it.</p>
|
|
8
|
+
<h2 id="keep-project-guidance-current">Keep project guidance current</h2>
|
|
9
|
+
<p>Settings → Projects & access keeps human-authored project guidance privately beneath <code>CODEFLOW_HOME/conventions/</code>. A saved draft does not change a repository and is never inserted into agent context automatically. External run content cannot author guidance through the team capability API.</p>
|
|
10
|
+
<p>Each save requires the exact observed revision. A concurrent edit returns HTTP 409 and preserves the editor draft. Compare the latest saved text, then deliberately keep your draft against that newer base or export it. Versions retain their original text, timestamp, hash, and note. The latest 32 revisions are retained; each holds at most 64 KiB of UTF-8 text. Line endings normalize to LF and nonempty guidance ends with a newline. History files use atomic durable replacement with private file permissions. Corrupt or inaccessible histories are left untouched, and a failed operation does not poison later writes.</p>
|
|
11
|
+
<p>Select a retained version and <strong>Preview saved revision</strong> before restoring. <strong>Restore as new revision</strong> requires both the current revision and the previewed version hash. It copies the old text into a new revision; it does not rewrite history or publish anything. Save or revert unsaved editor changes before restoring.</p>
|
|
12
|
+
<p>To activate guidance, select a repository belonging to this project and inspect its current file. <strong>Publish and stage file</strong> explicitly writes and stages <code>.codeflow/conventions.md</code>. The repository must be clean and idle. Publication checks the saved private revision, repository HEAD, and exact source file hash while holding the private revision lock and the repository lock. Non-project repositories, symbolic <code>.codeflow</code> components, symbolic files, symbolic <code>.git</code> markers, binary files, and oversized source files are refused. Code-flow stages this single guidance path even if it is ignored; it does not commit or push.</p>
|
|
13
|
+
<p>Review and commit the staged file yourself. Only <code>.codeflow/conventions.md</code> at a run's committed base ref is read into context, before existing vendor guidance files. The existing aggregate convention limit remains 6,000 characters; longer guidance is truncated with a prompt to read the repository file. Publishing a draft without committing it does not change conventions for future runs. Locked-down imported runs continue to inherit trusted parent/base guidance according to existing run creation rules.</p>
|
|
14
|
+
<p>Publication attempts restore the prior target file if staging fails and the source has not changed concurrently. If another tool changes HEAD or the target during publication, those changes are preserved and the UI requires a new inspection. Review any reported Git index error before retrying.</p>
|
|
15
|
+
<p>API contracts: <code>GET /api/projects/:id/conventions</code>, <code>PUT</code> with <code>{revision,text,note?}</code>, <code>POST /restore-preview</code> with <code>{version}</code>, and <code>POST /restore</code> with <code>{revision,version,hash}</code>. <code>GET /publication?repo=PATH</code> returns the observed <code>{sourceHash,head,clean,text,...}</code>. Explicit <code>POST /publish</code> requires <code>{repo,revision,sourceHash,head}</code>. Publication authorization is checked against the project's repository membership and current activity on the server; private drafts are not automatic execution instructions.</p>
|
|
16
|
+
<hr>
|
|
17
|
+
<p><a href="index.html">Documentation library</a> · <a href="getting-started.html">Getting started</a> · <a href="help.html">Ask code-flow</a></p>
|
|
18
|
+
</article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/project-conventions.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="context-inspection.html"><small>← Previous</small>Context and budgets</a><a href="checkpoint-review.html"><small>Next →</small>Checkpoints and reversions</a></nav></main>
|
|
19
|
+
<aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#keep-project-guidance-current">Keep project guidance current</a></aside>
|
|
20
|
+
<aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
|
|
21
|
+
<dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
|
|
22
|
+
</body></html>
|