@tekyzinc/gsd-t 5.22.10 → 5.24.10

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.
@@ -66,11 +66,20 @@ model=$(printf '%s' "$input" | jq -r '.model.id // ""')
66
66
  # Computed as input_tokens + cache_creation_input_tokens +
67
67
  # cache_read_input_tokens to capture the full window pressure. ---
68
68
  ctx_left=""
69
- if [ -n "$cwd" ]; then
69
+ # Claude Code passes this session's transcript path directly. Prefer it: the
70
+ # cwd-derived slug below misses whenever the session's working folder is a
71
+ # subfolder (or contains spaces), which silently dropped the ctx field.
72
+ transcript=$(printf '%s' "$input" | jq -r '.transcript_path // ""')
73
+ if [ -n "$transcript" ] && [ -f "$transcript" ]; then
74
+ sess_dir=$(dirname "$transcript")
75
+ elif [ -n "$cwd" ]; then
70
76
  proj_slug=$(printf '%s' "$cwd" | sed 's:/:-:g')
71
77
  sess_dir="$HOME/.claude/projects/$proj_slug"
78
+ fi
79
+ if [ -n "$sess_dir" ]; then
72
80
  if [ -d "$sess_dir" ]; then
73
- latest_jsonl=$(ls -t "$sess_dir"/*.jsonl 2>/dev/null | head -1)
81
+ latest_jsonl=$transcript
82
+ [ -f "$latest_jsonl" ] || latest_jsonl=$(ls -t "$sess_dir"/*.jsonl 2>/dev/null | head -1)
74
83
  if [ -n "$latest_jsonl" ]; then
75
84
  # Window size by model family. Haiku = 200k; everything else = 1M.
76
85
  case "$model" in
@@ -625,7 +625,7 @@ Add `**Also available:**` with `- /gsd-t-{alt} — {desc}` lines if alternatives
625
625
  | `setup` | `status` | |
626
626
  | `design-decompose` | `design-build` | `partition` (if domains needed first) |
627
627
 
628
- Commands with no successor (standalone): `quick`, `debug`, `brainstorm`, `status`, `help`, `resume`, `prompt`, `log`, `health`, `pause`, `estimate`, `stories`, backlog commands.
628
+ Commands with no successor (standalone): `quick`, `debug`, `brainstorm`, `status`, `help`, `resume`, `prompt`, `log`, `health`, `pause`, `estimate`, `estimate-rescale`, `stories`, backlog commands.
629
629
 
630
630
  Skip the hint if auto-advancing (Level 3 mid-wave) — only show when the user needs to manually invoke the next step.
631
631
 
@@ -10,8 +10,8 @@
10
10
  "sizeScale": { "XS": 0.1, "S": 0.25, "M": 0.5, "L": 1, "XL": 2, "XXL": 4 },
11
11
  "_sizeScale": "AI-assisted T-shirt scale, person-days (written into the sheet legend by `gsd-t estimate-sheet write`). A size = solo AI minutes x project multiplier + task switching; see estimate-sheet-spec.md section 1.4.",
12
12
 
13
- "projectMultiplier": { "greenfield-solo": 1, "greenfield-team": 5, "yellowfield-solo": 2, "yellowfield-team-isolated": 8, "yellowfield-team-wide": 12 },
14
- "_projectMultiplier": "Solo AI minutes are multiplied by this, by project type (isolated vs wide = code-graph blast radius). Internal to the estimator; never shown on the sheet.",
13
+ "projectMultiplier": { "greenfield-solo": 1, "greenfield-team": 3, "yellowfield-solo": 2, "yellowfield-team-isolated": 5, "yellowfield-team-wide": 7 },
14
+ "_projectMultiplier": "Solo AI minutes are multiplied by this, by project type (isolated vs wide = code-graph blast radius). Internal to the estimator; never shown on the sheet. Includes team overhead — set the sheet overhead factor accordingly (David, 2026-09-28).",
15
15
 
16
16
  "totalMF": 0.7,
17
17
  "_totalMF": "Overhead multiplier applied to raw Days. Tekyz default 0.7 = QA 0.3 + PM 0.1 + Analysis 0.05 + Deployment 0.05 + Buffer 0.2. Raise Buffer/QA when confidence is low.",
@@ -80,20 +80,20 @@ Column widths: `[150, 120, 300, 430, 122, 90, 90, 61, 53, 76, 81, 81]`.
80
80
 
81
81
  #### 1.4 How a size is chosen — the AI-assisted model (David, 2026-09-27)
82
82
 
83
- Nobody hand-writes code. A size is the **team hours** a task takes with AI-assisted development, and the multipliers that produce it live in the estimator — never on the sheet. Calibration: the Hilo Delivery Runway build (45 tasks, ~26 solo hours: 13 David + 13 Claude).
83
+ Nobody hand-writes code. A size is the **team hours** a task takes with AI-assisted development, and the multipliers that produce it live in the estimator — never on the sheet. Calibration: the Hilo Delivery Runway build (45 tasks, ~26 solo hours: 13 David + 13 Claude — solo minutes count both).
84
84
 
85
- 1. **Estimate the task in SOLO AI-assisted minutes** — one person directing Claude, greenfield. Runway rate: roughly 5 min for a trivial change, 20 min for a typical screen element or endpoint, 1–2¼ hrs for the heaviest pieces.
85
+ 1. **Estimate the task in SOLO AI-assisted minutes** — one person directing Claude, greenfield, counting **the person's time AND Claude's time** (David, 2026-09-29). Runway rate: roughly 10 min for a trivial change, 40 min for a typical screen element or endpoint, 2–4½ hrs for the heaviest pieces.
86
86
  2. **Multiply by the project type:**
87
87
 
88
88
  | Project | Multiplier |
89
89
  |---|---|
90
90
  | Greenfield, solo | × 1 |
91
- | Greenfield, team | × 5 |
91
+ | Greenfield, team | × 3 |
92
92
  | Yellow-field (existing app), solo | × 2 |
93
- | Yellow-field, team — isolated change | × 8 |
94
- | Yellow-field, team — big blast radius | × 12 |
93
+ | Yellow-field, team — isolated change | × 5 |
94
+ | Yellow-field, team — big blast radius | × 7 |
95
95
 
96
- Blast radius comes from the code graph (`gsd-t graph blast-radius`), not a guess.
96
+ The multipliers include team overhead (reviews, QA, coordination) — do not also charge it through the overhead factors (David, 2026-09-28). Blast radius comes from the code graph (`gsd-t graph blast-radius`), not a guess.
97
97
  3. **Add task switching AFTER the multiplier** — it is one person's pickup time and does not grow with team size: 5–10 min for small tasks (less when related tasks run back-to-back), ~15 min medium, up to 30 min large.
98
98
  4. **Pick the nearest size** on the §1.1 legend. `gsd-t estimate-sheet size --solo-min <n> --project <type> [--switch-min <n>]` does steps 2–4 and prints the size.
99
99
 
@@ -273,7 +273,8 @@ Everything in §1–§5 is executed by `bin/gsd-t-estimate-sheet.cjs`, not re-de
273
273
 
274
274
  ```
275
275
  gsd-t estimate-sheet plan-schema # the plan shape
276
- gsd-t estimate-sheet size --solo-min <n> --project <type> [--switch-min <n>] # §1.4: solo minutes → team hours → size (no sheet needed)
276
+ gsd-t estimate-sheet size --solo-min <n> --project <type> [--switch-min <n>] [--xxs] # §1.4: solo minutes → team hours → size (no sheet needed); --xxs for (Rescale) tabs
277
+ gsd-t estimate-sheet rescale --sheet <id|url> (--list | --plan <p.json> [--dry-run] [--replace] [--suffix <name>]) # §7: re-price into (Rescale) copies; originals untouched
277
278
  gsd-t estimate-sheet read --sheet <id|url> [--tab <name>] # read-before-write dump
278
279
  gsd-t estimate-sheet plan-check --sheet <id|url> --plan plan.json # validate + the roster it WOULD write (the Step 4 pause)
279
280
  gsd-t estimate-sheet write --sheet <id|url> --plan plan.json [--replace] # T-Shirt + Team Mix + Tech Stack, then audit
@@ -309,3 +310,22 @@ The plan (judgment only):
309
310
  - `tshirt.mode` `items` writes whole rows below the header (halts if rows exist unless `--replace`); `sizes` fills `E:L` on rows that already exist (a gap-analysis sheet), matched by the `(id)` suffix in column C — never by position.
310
311
  - `teamMix.fte` is per-discipline FTE (`backend` `frontend` `qa` `pm` `ba` `devops` `techlead` `design` `mobile`). The tool splits it into people (saturate then spill), computes months and the column count, ramps by discipline, writes the remainder formula, and refuses a roster that leaves a weighted MF factor unstaffed. It writes **one grid per phase with hours** (§2.6); `teamMix.phases: { "Phase 1": { "fte": {…} } }` overrides the mix for one phase.
311
312
  - The MF list, rate and high factor are READ from the sheet; the plan never carries them. The legend VALUES are written by the tool (the AI-assisted scale, §1.4) — in `sizes` mode it HALTS if a sized row on the tab is missing from the plan, because moving the legend would silently re-price that row.
313
+
314
+ ---
315
+
316
+ ## 7. Rescale — re-price an existing estimate into copied tabs (`/gsd-t-estimate-rescale`)
317
+
318
+ An estimate written on the old day scale is re-priced **without touching it**. `gsd-t estimate-sheet rescale` copies `T-Shirt Size Estimate` → **`T-Shirt Size Estimate (Rescale)`** and `Team Mix` → **`Team Mix (Rescale)`** (each placed next to its original) and re-sizes the copies only. The original tabs, the Overview tab and the estimates index are never written.
319
+
320
+ | Step | Rule |
321
+ |---|---|
322
+ | List | `rescale --list` prints every sized item row (row, text, phase, sizes), the size-column labels, legend and MF. |
323
+ | Plan | `{ "items": [ { "row", "functionality", "sizes": [...] } ] }` — every sized row exactly once, matched by row AND exact Functionality text (a moved row HALTS); sizes in size-column order. A missing row HALTS — its copy would silently re-price. |
324
+ | Legend | The copy gets the AI scale plus **XXS 0.0625 d (0.5 hr)** in the row directly under XXL (HALTS if that row is not empty). XXS exists on (Rescale) tabs only. |
325
+ | Formulas | With XXS present the copy's Days column uses an **exact** lookup — `SUMIF(legend, F{r}&" -*", values)` — because the template's `LEFT(F{r},2)&"*"` reads `XX*` as XXS + XXL. The audit expects the exact form whenever the legend carries XXS. |
326
+ | Team Mix | `Team Mix (Rescale)` keeps the original tab's roster (derived as `teammix` does) and staffs the copy's phase rollups (midpoint of Low/High, §2.2). |
327
+ | Formatting | The copy is re-wrapped (C/D) and top-aligned so it passes §5 on its own. |
328
+ | Overhead | The COPY's overhead factors are zeroed by default (the multipliers already include team overhead); `"noOverhead": false` in the plan keeps them. The original tab's factors are never written. |
329
+ | Re-run | Existing (Rescale) tabs HALT the run; `--replace` rebuilds them **in place** — the T-Shirt copy is cleared and re-copied from the original (values, formulas, formats, validation, widths) and the Team Mix copy is cleared and rewritten, so both tabs keep their identity. They are never deleted and re-created: other sheets import them by name (IMPORTRANGE), and a view that refreshes while a tab is missing caches `#REF!`. `--dry-run` prints old → new Low hours and writes nothing. |
330
+ | Audit | §5 T-Shirt + Team Mix checks run on the (Rescale) tabs by read-back; exit 4 on any ✗. |
331
+ | Second copy | `--suffix "AI v2"` writes `T-Shirt Size Estimate (AI v2)` + `Team Mix (AI v2)` instead, so a second re-estimate never overwrites the `(Rescale)` tabs other sheets import by name. Plain text only (no parentheses, quotes or `!`). |
@@ -51,8 +51,8 @@ For each finding, write a row (cols A–G; leave H–L formulas alone):
51
51
  `D` Low-Level Requirement · `E` Phase (MVP) · `F` Web Portal size · `G` Backend/API size.
52
52
 
53
53
  - Size **each column independently** (FE and BE), **AI-assisted** — nobody hand-writes code.
54
- Estimate SOLO AI minutes, then `gsd-t estimate-sheet size --solo-min <n> --project <type>`
55
- (greenfield solo ×1 · team ×5 · yellow-field solo ×2 · team ×8 isolated / ×12 wide, + task
54
+ Estimate SOLO AI minutes (human + Claude time; ~10 / 40 min / 2–4½ hr), then `gsd-t estimate-sheet size --solo-min <n> --project <type>`
55
+ (greenfield solo ×1 · team ×3 · yellow-field solo ×2 · team ×5 isolated / ×7 wide, + task
56
56
  switching after the multiplier) picks the size. Sizes: XS .1, S .25, M .5, L 1, XL 2, XXL 4
57
57
  (estimate-sheet-spec.md §1.4).
58
58
  - Sheet computes: `Days = F+G`, `MFactor = Days×MF`, `Total = Days+MFactor`,