planning-with-files 3.10.2 → 3.12.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/README.md +21 -11
- package/SKILL.md +25 -14
- package/extensions/planning-with-files/__tests__/plan-anchor.test.ts +228 -228
- package/extensions/planning-with-files/package.json +17 -17
- package/extensions/planning-with-files/runtime.ts +785 -785
- package/package.json +5 -2
- package/scripts/attest-plan.ps1 +484 -137
- package/scripts/attest-plan.sh +206 -206
- package/scripts/check-complete.ps1 +253 -253
- package/scripts/check-complete.sh +253 -253
- package/scripts/gate-stop.sh +32 -32
- package/scripts/init-session.sh +19 -0
- package/scripts/inject-plan.sh +692 -104
- package/scripts/ledger-append.ps1 +180 -180
- package/scripts/ledger-append.sh +337 -337
- package/scripts/ledger-summary.ps1 +128 -128
- package/scripts/phase-status.ps1 +237 -175
- package/scripts/phase-status.sh +202 -158
- package/scripts/resolve-plan-dir.ps1 +77 -7
- package/scripts/resolve-plan-dir.sh +6 -1
- package/scripts/session-catchup.py +983 -876
- package/scripts/set-active-plan.ps1 +51 -51
- package/scripts/set-active-plan.sh +50 -50
- package/scripts/verify-shell-line-endings.mjs +50 -0
- package/templates/analytics_findings.md +67 -85
- package/templates/analytics_task_plan.md +81 -106
- package/templates/findings.md +47 -95
- package/templates/progress.md +58 -114
- package/templates/task_plan.md +89 -140
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
# planning-with-files: set or display the active plan pointer (PowerShell).
|
|
2
|
-
#
|
|
3
|
-
# Usage:
|
|
4
|
-
# .\set-active-plan.ps1 <plan_id> - pin .planning\.active_plan to plan_id
|
|
5
|
-
# .\set-active-plan.ps1 - print the current active plan (if any)
|
|
6
|
-
|
|
7
|
-
param(
|
|
8
|
-
[string]$PlanId = ""
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
$PlanRoot = Join-Path (Get-Location) ".planning"
|
|
12
|
-
$ActiveFile = Join-Path $PlanRoot ".active_plan"
|
|
13
|
-
|
|
14
|
-
if ($PlanId -eq "") {
|
|
15
|
-
if (Test-Path $ActiveFile) {
|
|
16
|
-
$current = (Get-Content $ActiveFile -Raw -Encoding UTF8).Trim()
|
|
17
|
-
$planDir = Join-Path $PlanRoot $current
|
|
18
|
-
if ($current -ne "" -and (Test-Path $planDir)) {
|
|
19
|
-
Write-Output "Active plan: $current"
|
|
20
|
-
Write-Output "Path: $planDir"
|
|
21
|
-
} elseif ($current -ne "") {
|
|
22
|
-
Write-Output "Active plan pointer: $current (directory not found - stale pointer)"
|
|
23
|
-
} else {
|
|
24
|
-
Write-Output "No active plan set."
|
|
25
|
-
}
|
|
26
|
-
} else {
|
|
27
|
-
Write-Output "No active plan set."
|
|
28
|
-
}
|
|
29
|
-
exit 0
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
$PlanDir = Join-Path $PlanRoot $PlanId
|
|
33
|
-
|
|
34
|
-
if (-not (Test-Path $PlanDir)) {
|
|
35
|
-
Write-Error "Error: plan directory not found: $PlanDir"
|
|
36
|
-
Write-Error "Run: init-session.sh `"$PlanId`" to create it, or check .planning\ for available plans."
|
|
37
|
-
exit 1
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (-not (Test-Path $PlanRoot)) {
|
|
41
|
-
New-Item -ItemType Directory -Path $PlanRoot -Force | Out-Null
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
|
45
|
-
[System.IO.File]::WriteAllText($ActiveFile, $PlanId, $utf8NoBom)
|
|
46
|
-
|
|
47
|
-
Write-Output "Active plan set to: $PlanId"
|
|
48
|
-
Write-Output "Path: $PlanDir"
|
|
49
|
-
Write-Output ""
|
|
50
|
-
Write-Output "To pin this terminal session only:"
|
|
51
|
-
Write-Output "`$env:PLAN_ID = '$PlanId'"
|
|
1
|
+
# planning-with-files: set or display the active plan pointer (PowerShell).
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# .\set-active-plan.ps1 <plan_id> - pin .planning\.active_plan to plan_id
|
|
5
|
+
# .\set-active-plan.ps1 - print the current active plan (if any)
|
|
6
|
+
|
|
7
|
+
param(
|
|
8
|
+
[string]$PlanId = ""
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
$PlanRoot = Join-Path (Get-Location) ".planning"
|
|
12
|
+
$ActiveFile = Join-Path $PlanRoot ".active_plan"
|
|
13
|
+
|
|
14
|
+
if ($PlanId -eq "") {
|
|
15
|
+
if (Test-Path $ActiveFile) {
|
|
16
|
+
$current = (Get-Content $ActiveFile -Raw -Encoding UTF8).Trim()
|
|
17
|
+
$planDir = Join-Path $PlanRoot $current
|
|
18
|
+
if ($current -ne "" -and (Test-Path $planDir)) {
|
|
19
|
+
Write-Output "Active plan: $current"
|
|
20
|
+
Write-Output "Path: $planDir"
|
|
21
|
+
} elseif ($current -ne "") {
|
|
22
|
+
Write-Output "Active plan pointer: $current (directory not found - stale pointer)"
|
|
23
|
+
} else {
|
|
24
|
+
Write-Output "No active plan set."
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
Write-Output "No active plan set."
|
|
28
|
+
}
|
|
29
|
+
exit 0
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
$PlanDir = Join-Path $PlanRoot $PlanId
|
|
33
|
+
|
|
34
|
+
if (-not (Test-Path $PlanDir)) {
|
|
35
|
+
Write-Error "Error: plan directory not found: $PlanDir"
|
|
36
|
+
Write-Error "Run: init-session.sh `"$PlanId`" to create it, or check .planning\ for available plans."
|
|
37
|
+
exit 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (-not (Test-Path $PlanRoot)) {
|
|
41
|
+
New-Item -ItemType Directory -Path $PlanRoot -Force | Out-Null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
|
45
|
+
[System.IO.File]::WriteAllText($ActiveFile, $PlanId, $utf8NoBom)
|
|
46
|
+
|
|
47
|
+
Write-Output "Active plan set to: $PlanId"
|
|
48
|
+
Write-Output "Path: $PlanDir"
|
|
49
|
+
Write-Output ""
|
|
50
|
+
Write-Output "To pin this terminal session only:"
|
|
51
|
+
Write-Output "`$env:PLAN_ID = '$PlanId'"
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
# planning-with-files: set or display the active plan pointer.
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# set-active-plan.sh <plan_id> — pin .planning/.active_plan to plan_id
|
|
6
|
-
# set-active-plan.sh — print the current active plan (if any)
|
|
7
|
-
#
|
|
8
|
-
# The active plan is stored in .planning/.active_plan and is read by
|
|
9
|
-
# resolve-plan-dir.sh when no $PLAN_ID env var is set.
|
|
10
|
-
|
|
11
|
-
set -e
|
|
12
|
-
|
|
13
|
-
PLAN_ROOT="${PWD}/.planning"
|
|
14
|
-
ACTIVE_FILE="${PLAN_ROOT}/.active_plan"
|
|
15
|
-
|
|
16
|
-
# No args → show current active plan
|
|
17
|
-
if [ "${1:-}" = "" ]; then
|
|
18
|
-
if [ -f "${ACTIVE_FILE}" ]; then
|
|
19
|
-
plan_id="$(tr -d '\r\n' < "${ACTIVE_FILE}")"
|
|
20
|
-
if [ -n "${plan_id}" ] && [ -d "${PLAN_ROOT}/${plan_id}" ]; then
|
|
21
|
-
echo "Active plan: ${plan_id}"
|
|
22
|
-
echo "Path: ${PLAN_ROOT}/${plan_id}"
|
|
23
|
-
elif [ -n "${plan_id}" ]; then
|
|
24
|
-
echo "Active plan pointer: ${plan_id} (directory not found — stale pointer)"
|
|
25
|
-
else
|
|
26
|
-
echo "No active plan set."
|
|
27
|
-
fi
|
|
28
|
-
else
|
|
29
|
-
echo "No active plan set."
|
|
30
|
-
fi
|
|
31
|
-
exit 0
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
PLAN_ID="$1"
|
|
35
|
-
PLAN_DIR="${PLAN_ROOT}/${PLAN_ID}"
|
|
36
|
-
|
|
37
|
-
if [ ! -d "${PLAN_DIR}" ]; then
|
|
38
|
-
echo "Error: plan directory not found: ${PLAN_DIR}" >&2
|
|
39
|
-
echo "Run: init-session.sh \"${PLAN_ID}\" to create it, or check .planning/ for available plans." >&2
|
|
40
|
-
exit 1
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
mkdir -p "${PLAN_ROOT}"
|
|
44
|
-
printf "%s\n" "${PLAN_ID}" > "${ACTIVE_FILE}"
|
|
45
|
-
|
|
46
|
-
echo "Active plan set to: ${PLAN_ID}"
|
|
47
|
-
echo "Path: ${PLAN_DIR}"
|
|
48
|
-
echo ""
|
|
49
|
-
echo "To pin this terminal session only:"
|
|
50
|
-
echo " export PLAN_ID=${PLAN_ID}"
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# planning-with-files: set or display the active plan pointer.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# set-active-plan.sh <plan_id> — pin .planning/.active_plan to plan_id
|
|
6
|
+
# set-active-plan.sh — print the current active plan (if any)
|
|
7
|
+
#
|
|
8
|
+
# The active plan is stored in .planning/.active_plan and is read by
|
|
9
|
+
# resolve-plan-dir.sh when no $PLAN_ID env var is set.
|
|
10
|
+
|
|
11
|
+
set -e
|
|
12
|
+
|
|
13
|
+
PLAN_ROOT="${PWD}/.planning"
|
|
14
|
+
ACTIVE_FILE="${PLAN_ROOT}/.active_plan"
|
|
15
|
+
|
|
16
|
+
# No args → show current active plan
|
|
17
|
+
if [ "${1:-}" = "" ]; then
|
|
18
|
+
if [ -f "${ACTIVE_FILE}" ]; then
|
|
19
|
+
plan_id="$(tr -d '\r\n' < "${ACTIVE_FILE}")"
|
|
20
|
+
if [ -n "${plan_id}" ] && [ -d "${PLAN_ROOT}/${plan_id}" ]; then
|
|
21
|
+
echo "Active plan: ${plan_id}"
|
|
22
|
+
echo "Path: ${PLAN_ROOT}/${plan_id}"
|
|
23
|
+
elif [ -n "${plan_id}" ]; then
|
|
24
|
+
echo "Active plan pointer: ${plan_id} (directory not found — stale pointer)"
|
|
25
|
+
else
|
|
26
|
+
echo "No active plan set."
|
|
27
|
+
fi
|
|
28
|
+
else
|
|
29
|
+
echo "No active plan set."
|
|
30
|
+
fi
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
PLAN_ID="$1"
|
|
35
|
+
PLAN_DIR="${PLAN_ROOT}/${PLAN_ID}"
|
|
36
|
+
|
|
37
|
+
if [ ! -d "${PLAN_DIR}" ]; then
|
|
38
|
+
echo "Error: plan directory not found: ${PLAN_DIR}" >&2
|
|
39
|
+
echo "Run: init-session.sh \"${PLAN_ID}\" to create it, or check .planning/ for available plans." >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
mkdir -p "${PLAN_ROOT}"
|
|
44
|
+
printf "%s\n" "${PLAN_ID}" > "${ACTIVE_FILE}"
|
|
45
|
+
|
|
46
|
+
echo "Active plan set to: ${PLAN_ID}"
|
|
47
|
+
echo "Path: ${PLAN_DIR}"
|
|
48
|
+
echo ""
|
|
49
|
+
echo "To pin this terminal session only:"
|
|
50
|
+
echo " export PLAN_ID=${PLAN_ID}"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const defaultPackageRoot = resolve(
|
|
8
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
9
|
+
"..",
|
|
10
|
+
);
|
|
11
|
+
const packageRoot = process.argv[2]
|
|
12
|
+
? resolve(process.argv[2])
|
|
13
|
+
: defaultPackageRoot;
|
|
14
|
+
const scriptsRoot = resolve(packageRoot, "scripts");
|
|
15
|
+
|
|
16
|
+
async function verifyShellLineEndings() {
|
|
17
|
+
const entries = await readdir(scriptsRoot, { withFileTypes: true });
|
|
18
|
+
const shellScripts = entries
|
|
19
|
+
.filter((entry) => entry.name.endsWith(".sh"))
|
|
20
|
+
.map((entry) => entry.name)
|
|
21
|
+
.sort();
|
|
22
|
+
|
|
23
|
+
if (shellScripts.length === 0) {
|
|
24
|
+
throw new Error("No shell scripts found under scripts/*.sh");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const offenders = [];
|
|
28
|
+
for (const filename of shellScripts) {
|
|
29
|
+
const contents = await readFile(resolve(scriptsRoot, filename));
|
|
30
|
+
if (contents.includes(0x0d)) {
|
|
31
|
+
offenders.push(`scripts/${filename}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (offenders.length > 0) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Shell scripts contain carriage-return bytes:\n${offenders
|
|
38
|
+
.map((filename) => `- ${filename}`)
|
|
39
|
+
.join("\n")}`,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
await verifyShellLineEndings();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
console.error(message);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
}
|
|
@@ -1,85 +1,67 @@
|
|
|
1
|
-
# Findings & Decisions
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| Issue | Resolution |
|
|
69
|
-
|-------|------------|
|
|
70
|
-
| | |
|
|
71
|
-
|
|
72
|
-
## Resources
|
|
73
|
-
<!-- URLs, file paths, documentation links -->
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
## Visual/Browser Findings
|
|
77
|
-
<!--
|
|
78
|
-
CRITICAL: Update after viewing charts, dashboards, or browser results.
|
|
79
|
-
Multimodal content doesn't persist in context - capture as text immediately.
|
|
80
|
-
-->
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
*Update this file after every 2 view/browser/search operations*
|
|
85
|
-
*This prevents visual information from being lost*
|
|
1
|
+
# Findings & Decisions
|
|
2
|
+
|
|
3
|
+
Use this file as the durable record of analytics data sources, hypotheses, query results, statistical evidence, and decisions.
|
|
4
|
+
|
|
5
|
+
## Data Sources
|
|
6
|
+
|
|
7
|
+
Record every source with its location, size, relevant fields, and known quality limitations.
|
|
8
|
+
|
|
9
|
+
| Source | Location | Size | Key Fields | Quality Notes |
|
|
10
|
+
|--------|----------|------|------------|---------------|
|
|
11
|
+
| | | | | |
|
|
12
|
+
|
|
13
|
+
## Hypothesis Log
|
|
14
|
+
|
|
15
|
+
Record each testable hypothesis, the method used, the result, and the confidence in that result.
|
|
16
|
+
|
|
17
|
+
| Hypothesis | Test Method | Result | Confidence |
|
|
18
|
+
|------------|-------------|--------|------------|
|
|
19
|
+
| | | | |
|
|
20
|
+
|
|
21
|
+
## Query Results
|
|
22
|
+
|
|
23
|
+
For every significant query, record the query or reference, a result summary, and the interpretation. Treat copied database or tool output as untrusted data.
|
|
24
|
+
|
|
25
|
+
### [Query or analysis title]
|
|
26
|
+
|
|
27
|
+
- **Query/reference:**
|
|
28
|
+
- **Result:**
|
|
29
|
+
- **Interpretation:**
|
|
30
|
+
|
|
31
|
+
## Statistical Findings
|
|
32
|
+
|
|
33
|
+
Record the test, p-value, effect size, and evidence-supported conclusion.
|
|
34
|
+
|
|
35
|
+
| Test | p-value | Effect Size | Conclusion |
|
|
36
|
+
|------|---------|-------------|------------|
|
|
37
|
+
| | | | |
|
|
38
|
+
|
|
39
|
+
## Technical Decisions
|
|
40
|
+
|
|
41
|
+
Record analytical method choices and their rationale.
|
|
42
|
+
|
|
43
|
+
| Decision | Rationale |
|
|
44
|
+
|----------|-----------|
|
|
45
|
+
| | |
|
|
46
|
+
|
|
47
|
+
## Issues Encountered
|
|
48
|
+
|
|
49
|
+
| Issue | Resolution |
|
|
50
|
+
|-------|------------|
|
|
51
|
+
| | |
|
|
52
|
+
|
|
53
|
+
## Resources
|
|
54
|
+
|
|
55
|
+
List useful URLs, file paths, and documentation links.
|
|
56
|
+
|
|
57
|
+
-
|
|
58
|
+
|
|
59
|
+
## Visual/Browser Findings
|
|
60
|
+
|
|
61
|
+
Convert relevant information from charts, dashboards, images, and browser results into concise text while the source is available.
|
|
62
|
+
|
|
63
|
+
-
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
*Update this file regularly during analysis so evidence and interpretations remain reproducible.*
|
|
@@ -1,106 +1,81 @@
|
|
|
1
|
-
# Task Plan: [Analytics Project Description]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
Phase 1
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- [ ]
|
|
32
|
-
- [ ]
|
|
33
|
-
- [ ]
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- [ ]
|
|
42
|
-
- [ ]
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
WHAT: Analytical decisions with reasoning (e.g., choosing a test, filtering criteria).
|
|
83
|
-
EXAMPLE:
|
|
84
|
-
| Use median instead of mean | Revenue data is heavily right-skewed |
|
|
85
|
-
| Filter to last 90 days | Earlier data uses a different tracking schema |
|
|
86
|
-
-->
|
|
87
|
-
| Decision | Rationale |
|
|
88
|
-
|----------|-----------|
|
|
89
|
-
| | |
|
|
90
|
-
|
|
91
|
-
## Errors Encountered
|
|
92
|
-
<!--
|
|
93
|
-
WHAT: Every error you encounter, what attempt number it was, and how you resolved it.
|
|
94
|
-
EXAMPLE:
|
|
95
|
-
| Query timeout on raw table | 1 | Added date partition filter |
|
|
96
|
-
| Null join keys in user_events | 2 | Inner join instead of left join, documented data loss |
|
|
97
|
-
-->
|
|
98
|
-
| Error | Attempt | Resolution |
|
|
99
|
-
|-------|---------|------------|
|
|
100
|
-
| | 1 | |
|
|
101
|
-
|
|
102
|
-
## Notes
|
|
103
|
-
- Update phase status as you progress: pending -> in_progress -> complete
|
|
104
|
-
- Re-read this plan before major analytical decisions
|
|
105
|
-
- Log ALL errors - they help avoid repetition
|
|
106
|
-
- Write query results and visual findings to findings.md immediately
|
|
1
|
+
# Task Plan: [Analytics Project Description]
|
|
2
|
+
|
|
3
|
+
Use this file as the durable roadmap for a data analytics or exploration session. Keep phase status current as the analysis advances.
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
State the analytical question or intended deliverable in one clear sentence.
|
|
8
|
+
|
|
9
|
+
[One sentence describing the analytical objective]
|
|
10
|
+
|
|
11
|
+
## Current Phase
|
|
12
|
+
|
|
13
|
+
Name the phase currently being worked on.
|
|
14
|
+
|
|
15
|
+
Phase 1
|
|
16
|
+
|
|
17
|
+
## Phases
|
|
18
|
+
|
|
19
|
+
Use only `pending`, `in_progress`, or `complete` for each status.
|
|
20
|
+
|
|
21
|
+
### Phase 1: Data Discovery
|
|
22
|
+
|
|
23
|
+
- [ ] Identify and connect to data sources
|
|
24
|
+
- [ ] Document schemas and field descriptions in findings.md
|
|
25
|
+
- [ ] Assess data quality (nulls, duplicates, outliers, date ranges)
|
|
26
|
+
- [ ] Estimate dataset size and query performance
|
|
27
|
+
- **Status:** in_progress
|
|
28
|
+
|
|
29
|
+
### Phase 2: Exploratory Analysis
|
|
30
|
+
|
|
31
|
+
- [ ] Compute summary statistics for key variables
|
|
32
|
+
- [ ] Visualize distributions and relationships
|
|
33
|
+
- [ ] Identify outliers and anomalies
|
|
34
|
+
- [ ] Document initial patterns in findings.md
|
|
35
|
+
- **Status:** pending
|
|
36
|
+
|
|
37
|
+
### Phase 3: Hypothesis Testing
|
|
38
|
+
|
|
39
|
+
- [ ] Formalize hypotheses from exploratory phase
|
|
40
|
+
- [ ] Select appropriate statistical tests
|
|
41
|
+
- [ ] Run tests and record results in findings.md
|
|
42
|
+
- [ ] Validate findings against holdout data or alternative methods
|
|
43
|
+
- **Status:** pending
|
|
44
|
+
|
|
45
|
+
### Phase 4: Synthesis & Reporting
|
|
46
|
+
|
|
47
|
+
- [ ] Summarize key findings with supporting evidence
|
|
48
|
+
- [ ] Create final visualizations
|
|
49
|
+
- [ ] Document conclusions and recommendations
|
|
50
|
+
- [ ] Note limitations and areas for further investigation
|
|
51
|
+
- **Status:** pending
|
|
52
|
+
|
|
53
|
+
## Hypotheses
|
|
54
|
+
|
|
55
|
+
Record the questions under investigation as testable hypotheses.
|
|
56
|
+
|
|
57
|
+
1. [Hypothesis to test]
|
|
58
|
+
2. [Hypothesis to test]
|
|
59
|
+
|
|
60
|
+
## Decisions Made
|
|
61
|
+
|
|
62
|
+
Record analytical choices, including tests, filters, exclusions, and their rationale.
|
|
63
|
+
|
|
64
|
+
| Decision | Rationale |
|
|
65
|
+
|----------|-----------|
|
|
66
|
+
| | |
|
|
67
|
+
|
|
68
|
+
## Errors Encountered
|
|
69
|
+
|
|
70
|
+
Record each distinct error, the attempt number, and the resolution. Change the approach before retrying a failed action.
|
|
71
|
+
|
|
72
|
+
| Error | Attempt | Resolution |
|
|
73
|
+
|-------|---------|------------|
|
|
74
|
+
| | 1 | |
|
|
75
|
+
|
|
76
|
+
## Notes
|
|
77
|
+
|
|
78
|
+
- Update phase status as work progresses: `pending` to `in_progress` to `complete`.
|
|
79
|
+
- Re-read the goal and current phase before major analytical decisions.
|
|
80
|
+
- Log errors promptly so failed approaches are not repeated.
|
|
81
|
+
- Record query results and visual evidence in findings.md.
|