Skip to content

Commit 01366f9

Browse files
Add TraceFrame to portfolio site.
Feature the local-first data science evidence tracker on home, projects, and resume with sample audit reports and screenshots. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent faf1764 commit 01366f9

8 files changed

Lines changed: 753 additions & 0 deletions

File tree

89 KB
Loading
490 KB
Loading
87.7 KB
Loading
Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>TraceFrame Audit Report</title>
6+
<style>
7+
:root {
8+
color-scheme: light;
9+
--ink: #1d2733;
10+
--muted: #647184;
11+
--line: #d9e0e8;
12+
--soft: #f6f8fb;
13+
--panel: #ffffff;
14+
--accent: #1b7f7a;
15+
--warn: #a15c00;
16+
--bad: #b42318;
17+
}
18+
* { box-sizing: border-box; }
19+
body {
20+
background: #eef3f7;
21+
color: var(--ink);
22+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
23+
line-height: 1.5;
24+
margin: 0;
25+
}
26+
main { margin: 0 auto; max-width: 1120px; padding: 32px 20px 56px; }
27+
header { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 24px; }
28+
h1, h2, h3 { color: #111827; letter-spacing: 0; margin: 0; }
29+
h1 { font-size: 32px; }
30+
h2 { font-size: 21px; margin: 32px 0 12px; }
31+
h3 { font-size: 16px; margin: 18px 0 8px; }
32+
p { margin: 8px 0; }
33+
table { background: var(--panel); border: 1px solid var(--line); border-collapse: collapse; width: 100%; }
34+
th, td { border-bottom: 1px solid var(--line); padding: 9px 10px; text-align: left; vertical-align: top; }
35+
th { background: var(--soft); font-size: 13px; font-weight: 700; }
36+
code { background: #edf1f5; border-radius: 4px; padding: 2px 4px; word-break: break-word; }
37+
.muted { color: var(--muted); }
38+
.summary { display: grid; gap: 10px; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); margin-top: 18px; }
39+
.stat { background: var(--soft); border: 1px solid var(--line); border-radius: 8px; padding: 12px; }
40+
.stat strong { display: block; font-size: 24px; line-height: 1.1; }
41+
.status { border-radius: 999px; display: inline-block; font-size: 12px; font-weight: 700; padding: 2px 8px; }
42+
.ok { background: #e7f6ef; color: #067647; }
43+
.stale { background: #fff4df; color: var(--warn); }
44+
.missing { background: #fdecec; color: var(--bad); }
45+
.section-note { color: var(--muted); margin-bottom: 12px; }
46+
</style>
47+
</head>
48+
<body>
49+
<main>
50+
<header>
51+
<h1>TraceFrame Audit Report</h1>
52+
<p class="muted">Project: ecommerce_revenue_analysis · TraceFrame 0.1.0 · Generated 2026-06-25T06:43:16.439982+00:00</p>
53+
<div class="summary">
54+
<div class="stat"><strong>1</strong><span>Datasets</span></div>
55+
<div class="stat"><strong>2</strong><span>Transformations</span></div>
56+
<div class="stat"><strong>1</strong><span>Metrics</span></div>
57+
<div class="stat"><strong>1</strong><span>Charts</span></div>
58+
<div class="stat"><strong>1</strong><span>Claims</span></div>
59+
<div class="stat"><strong>0</strong><span>Failed checks</span></div>
60+
<div class="stat"><strong>0</strong><span>Assistant plans</span></div>
61+
<div class="stat"><strong>0</strong><span>Stale warnings</span></div>
62+
</div>
63+
</header>
64+
65+
<h2>Project Health</h2>
66+
<table>
67+
<tr><th>Status</th><th>Issues</th></tr>
68+
<tr><td><span class="status ok">ok</span></td><td>0</td></tr>
69+
</table>
70+
<table>
71+
<tr><th>Severity</th><th>Type</th><th>Message</th></tr>
72+
73+
<tr><td colspan="3">No issues found.</td></tr>
74+
75+
</table>
76+
77+
<h2>Run Context</h2>
78+
<table>
79+
<tr><th>Run ID</th><th>Started</th><th>Context</th><th>Notebook</th><th>Script</th></tr>
80+
81+
<tr>
82+
<td><code>run_ecommerce_revenue_analysis_31caa5f8</code></td>
83+
<td>2026-06-25T06:43:16.039316+00:00</td>
84+
<td>script</td>
85+
<td></td>
86+
<td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/analysis.py</code></td>
87+
</tr>
88+
89+
</table>
90+
91+
<h2>Stale Checks</h2>
92+
<p class="section-note">TraceFrame compares stored dataset hashes with the current local files when this report is generated.</p>
93+
<table>
94+
<tr><th>Dataset</th><th>Status</th><th>Path</th><th>Message</th></tr>
95+
96+
<tr>
97+
<td>orders</td>
98+
<td><span class="status ok">ok</span></td>
99+
<td><code>orders.csv</code></td>
100+
<td>Current file matches tracked hash.</td>
101+
</tr>
102+
103+
</table>
104+
105+
<h2>Dataset Manifest</h2>
106+
<table>
107+
<tr><th>Name</th><th>Rows</th><th>Columns</th><th>Run</th><th>Hash</th></tr>
108+
109+
<tr>
110+
<td>orders</td>
111+
<td>6</td>
112+
<td>4</td>
113+
<td><code>run_ecommerce_revenue_analysis_31caa5f8</code></td>
114+
<td><code>sha256:1c23c2d6719d2b454e846a703821842bf393aa33c0ef1a9fce23381b6cadad4a</code></td>
115+
</tr>
116+
117+
</table>
118+
119+
<h2>Data Quality Summary</h2>
120+
121+
<h3>orders</h3>
122+
<p>Duplicate rows: 1</p>
123+
<table>
124+
<tr><th>Column</th><th>Missing values</th><th>Type</th></tr>
125+
126+
<tr><td>order_date</td><td>0</td><td>str</td></tr>
127+
128+
<tr><td>order_id</td><td>0</td><td>int64</td></tr>
129+
130+
<tr><td>status</td><td>0</td><td>str</td></tr>
131+
132+
<tr><td>total_price</td><td>0</td><td>float64</td></tr>
133+
134+
</table>
135+
136+
137+
<h2>Lineage</h2>
138+
<p class="section-note">Use <code>traceframe lineage ARTIFACT</code> to inspect upstream and downstream dependencies for a single artifact.</p>
139+
<table>
140+
<tr><th>ID</th><th>Type</th><th>Name</th></tr>
141+
142+
<tr><td><code>ds_orders_7e1a331f</code></td><td>dataset</td><td>orders</td></tr>
143+
144+
<tr><td><code>tf_clean_orders_d885ddc7</code></td><td>transformation</td><td>clean_orders</td></tr>
145+
146+
<tr><td><code>tf_large_orders_b03740a2</code></td><td>transformation</td><td>large_orders</td></tr>
147+
148+
<tr><td><code>sql_monthly_revenue_9c0a56ab</code></td><td>sql_result</td><td>monthly_revenue</td></tr>
149+
150+
</table>
151+
<h3>Edges</h3>
152+
<table>
153+
<tr><th>From</th><th>To</th><th>Type</th></tr>
154+
155+
<tr>
156+
<td>orders <code>ds_orders_7e1a331f</code></td>
157+
<td>clean_orders <code>tf_clean_orders_d885ddc7</code></td>
158+
<td>derived_from</td>
159+
</tr>
160+
161+
<tr>
162+
<td>clean_orders <code>tf_clean_orders_d885ddc7</code></td>
163+
<td>large_orders <code>tf_large_orders_b03740a2</code></td>
164+
<td>derived_from</td>
165+
</tr>
166+
167+
<tr>
168+
<td>large_orders <code>tf_large_orders_b03740a2</code></td>
169+
<td>monthly_revenue <code>sql_monthly_revenue_9c0a56ab</code></td>
170+
<td>derived_from</td>
171+
</tr>
172+
173+
</table>
174+
175+
<h2>Metrics</h2>
176+
<table>
177+
<tr><th>Name</th><th>Formula</th><th>Source</th><th>Run</th><th>Description</th></tr>
178+
179+
<tr><td>revenue</td><td><code>SUM(total_price)</code></td><td>large_orders</td><td><code>run_ecommerce_revenue_analysis_31caa5f8</code></td><td>Total order revenue after duplicate order IDs are removed.</td></tr>
180+
181+
</table>
182+
183+
<h2>Chart Evidence</h2>
184+
<table>
185+
<tr><th>Name</th><th>Kind</th><th>X</th><th>Y</th><th>Run</th><th>Spec</th><th>Drilldown</th></tr>
186+
187+
<tr>
188+
<td>monthly_revenue_chart</td>
189+
<td>line</td>
190+
<td>month</td>
191+
<td>revenue</td>
192+
<td><code>run_ecommerce_revenue_analysis_31caa5f8</code></td>
193+
<td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/audit_logs/chart_monthly_revenue_chart_8f3d6958_vegalite.json</code></td>
194+
<td><code>chart_chart_monthly_revenue_chart_8f3d6958</code></td>
195+
</tr>
196+
197+
</table>
198+
199+
<h2>Source Rows</h2>
200+
<p class="section-note">Samples are stored locally and can be exported with <code>traceframe source-rows ARTIFACT</code>.</p>
201+
<table>
202+
<tr><th>Artifact</th><th>Type</th><th>Sample file</th></tr>
203+
204+
<tr><td>orders</td><td>dataset</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/ds_orders_7e1a331f_sample.json</code></td></tr>
205+
206+
<tr><td>clean_orders</td><td>transformation</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/tf_clean_orders_d885ddc7_sample.json</code></td></tr>
207+
208+
<tr><td>large_orders</td><td>transformation</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/tf_large_orders_b03740a2_sample.json</code></td></tr>
209+
210+
<tr><td>monthly_revenue</td><td>sql_result</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/sql_monthly_revenue_9c0a56ab_sample.json</code></td></tr>
211+
212+
<tr><td>monthly_revenue_chart</td><td>chart</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/chart_monthly_revenue_chart_8f3d6958_sample.json</code></td></tr>
213+
214+
</table>
215+
216+
<h2>Chart Drilldowns</h2>
217+
<table>
218+
<tr><th>Chart</th><th>DuckDB file</th><th>Table</th></tr>
219+
220+
<tr><td>monthly_revenue_chart</td><td><code>/Users/long_leg_maniac/Documents/github/traceframe/examples/ecommerce/.traceframe/source_rows/chart_drilldown.duckdb</code></td><td><code>chart_chart_monthly_revenue_chart_8f3d6958</code></td></tr>
221+
222+
</table>
223+
224+
<h2>Claims</h2>
225+
<table>
226+
<tr><th>Claim</th><th>Supports</th><th>Confidence</th><th>Run</th></tr>
227+
228+
<tr><td>Monthly revenue trend was calculated after removing duplicate order IDs.</td><td>monthly_revenue, monthly_revenue_chart</td><td>high</td><td><code>run_ecommerce_revenue_analysis_31caa5f8</code></td></tr>
229+
230+
</table>
231+
232+
<h2>Data Quality Checks</h2>
233+
<table>
234+
<tr><th>Name</th><th>Type</th><th>Status</th><th>Severity</th><th>Source</th><th>Details</th></tr>
235+
236+
<tr>
237+
<td>not_null_total_price</td>
238+
<td>not_null</td>
239+
<td><span class="status ok">pass</span></td>
240+
<td>error</td>
241+
<td>large_orders</td>
242+
<td><code>{'columns': ['total_price'], 'missing_values': {'total_price': 0}}</code></td>
243+
</tr>
244+
245+
<tr>
246+
<td>unique_order_id</td>
247+
<td>unique</td>
248+
<td><span class="status ok">pass</span></td>
249+
<td>error</td>
250+
<td>large_orders</td>
251+
<td><code>{'columns': ['order_id'], 'duplicate_count': 0}</code></td>
252+
</tr>
253+
254+
</table>
255+
256+
<h2>Notebook Cell Notes</h2>
257+
<table>
258+
<tr><th>Run</th><th>Cell ID</th><th>Execution</th><th>Source Hash</th><th>Tags</th></tr>
259+
260+
<tr><td colspan="5">No notebook cell notes recorded.</td></tr>
261+
262+
</table>
263+
264+
<h2>Assistant Plans</h2>
265+
<p class="section-note">TraceFrame assistant planning is local-first. No external API calls are made unless you explicitly run your own local command.</p>
266+
<table>
267+
<tr><th>ID</th><th>Mode</th><th>Request</th><th>Steps</th></tr>
268+
269+
<tr><td colspan="4">No assistant plans recorded.</td></tr>
270+
271+
</table>
272+
273+
<h2>Reproducibility</h2>
274+
<p>Run the analysis script or notebook from the project root, then regenerate this report with <code>traceframe report</code>. Use <code>traceframe stale</code> before relying on old evidence.</p>
275+
</main>
276+
</body>
277+
</html>

0 commit comments

Comments
 (0)