Skip to content

Commit 7d58a1f

Browse files
committed
Sync to v0.0.161
1 parent 392c060 commit 7d58a1f

File tree

60 files changed

+4780
-3921
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+4780
-3921
lines changed

CHANGELOG.md

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,112 @@
1+
## v0.0.161 (2026-02-26)
2+
3+
### Feat
4+
5+
- implement PDD_GH_TOKEN_FILE push retry in agentic_e2e_fix_orchestrator (#629)
6+
- add PDD_GH_TOKEN_FILE push retry to e2e fix orchestrator prompt (#629)
7+
- Add position coordinates to various architectural components in `architecture.json`.
8+
- Implement and test node grouping with relative layout for sub-flow nodes in the DependencyViewer.
9+
- **architecture_sync**: auto-fix renamed step files and register untracked prompts
10+
- update Next.js API route handlers to await dynamic route parameters and refine pipeline configurations
11+
- verify all 116 checklist items and fix annotation refresh after batch resolve (TDD)
12+
- implement working Remotion/Claude environment (TDD)
13+
- Allow creation of drawing-only annotations via API and improve `FixPreviewPanel` robustness with null-safety checks for `filesModified` and `confidence`.
14+
15+
### Fix
16+
17+
- add namespace package fallback to import validation (#572)
18+
- validate Python imports after generation in agentic mode (#572)
19+
- address PR #631 review — URL-encode token and warn on restore failure
20+
- prevent token leakage and add missing protect_tests to prompt interface
21+
- correct misleading log message and outdated test docstrings (#573)
22+
- reject coverage=0.0 as pipeline success when tests pass (#573)
23+
- **test-batch-ann-1772149596067**: Subtitle font size 96px causes text to clip the ri
24+
- **test-batch-ann-1772145259285**: Subtitle font size 96px causes text to clip the ri
25+
- **test-batch-ann-1772144357396**: Subtitle font size 96px causes text to clip the ri
26+
- **test-batch-ann-1772144248964**: Subtitle font size 96px causes text to clip the ri
27+
- **test-batch-ann-1772138159325**: Subtitle font size 96px causes text to clip the ri
28+
- **test-batch-ann-1772138080231**: Subtitle font size 96px causes text to clip the ri
29+
- **test-batch-ann-1772137614567**: Subtitle font size 96px causes text to clip the ri
30+
- **test-batch-ann-1772137505532**: Subtitle font size 96px causes text to clip the ri
31+
- **test-batch-ann-1772137500794**: Subtitle font size 96px causes text to clip the ri
32+
- **test-batch-ann-1772133369466**: Subtitle font size 96px causes text to clip the ri
33+
- **test-batch-ann-1772132467714**: Subtitle font size 96px causes text to clip the ri
34+
- **test-batch-ann-1772132380789**: Subtitle font size 96px causes text to clip the ri
35+
- **test-batch-ann-1772129529612**: Subtitle font size 96px causes text to clip the ri
36+
- **test-batch-ann-1772129479688**: Subtitle font size 96px causes text to clip the ri
37+
- ensure Audit API `specPath` is consistently prefixed with `specs/` and Stage 10 Audit spec viewer correctly parses JSON responses.
38+
39+
### Refactor
40+
41+
- remove unused project_root param from _validate_python_imports
42+
- remove agentic architecture workflow LLM prompts from architecture.json.refactor: remove agentic architecture workflow LLM prompts from architecture.json.
43+
- update CLI core dump and output capture logic, add new TTS API prompt, and adjust video editor components and tests.
44+
- Update API route generation prompts to include explicit implementation details and dependency specifications for pipeline stages.
45+
46+
## v0.0.160 (2026-02-25)
47+
48+
### Feat
49+
50+
- **Module grouping in architecture view** — Modules can now be assigned to named groups that collapse into a single summary node. New `GroupNode` and `GroupEditModal` components; `ArchitectureModule` schema gains an optional `group` field. Groups auto-expand on first appearance and support edit-mode rename/reassignment via a batch update. Dagre layout uses virtual group→child edges for placement.
51+
- **Compact zoom mode for ModuleNode** — When the React Flow viewport zoom drops below 0.5, module nodes switch to a minimal single-line label using a `calc(14px / zoom)` font size that stays readable at any zoom level. New `VpZoomSync` component keeps the `--vp-zoom` CSS custom property in sync with all viewport changes (including programmatic `fitView`).
52+
- **Focus mode for dependency graph** — Clicking a module node dims all nodes outside its 1-hop neighborhood (direct dependencies and dependents). Focus auto-clears when the focused module's group is collapsed.
53+
- **API route coverage in architecture completeness check** — Step 10 completeness prompt now extracts every distinct URL pattern from the PRD and verifies a 1:1 corresponding route module exists. Step 5 design prompt reinforces one-module-per-distinct-URL-path. Prevents the LLM from collapsing multiple API endpoints under a single module.
54+
- **Header-only tag parsing in `architecture_sync`**`parse_prompt_tags()` now extracts PDD metadata tags only from the header section (content before the first `%` section marker), preventing example `<pdd-dependency>` tags inside code fences or prose from being treated as real metadata declarations.
55+
56+
### Fix
57+
58+
- **Replace `.format(**context)` with safe `str.replace()` in all agentic orchestrators** — All six orchestrators (architecture, bug, change, checkup, e2e-fix, test) now use iterative `str.replace()` for prompt template substitution instead of Python's `.format()`. This prevents `KeyError` crashes when LLM outputs contain JSON curly braces and eliminates the need to double-escape braces in context values. Context outputs are no longer pre-escaped with `{{`/`}}`.
59+
- **Support modern Codex CLI NDJSON format in agentic sync**`_run_with_provider()` now parses Codex CLI 0.104.0+ output, which splits agent text (`item.completed` with `agent_message` type) and usage stats (`session.end`) into separate NDJSON events. `_parse_provider_json()` extracts text from `data["item"]["text"]` for modern format.
60+
- **Resolve 'no changes to commit' on resume**`_commit_and_push()` in the e2e-fix orchestrator now falls back to `git diff` when the hash snapshot is tainted by a prior interrupted run, catching orphaned unstaged changes that the snapshot missed.
61+
- **`modify` command propagates `click.UsageError`** — Both `split` and `change` subcommands now re-raise `click.UsageError` instead of swallowing it in the generic exception handler, allowing Click to display proper usage messages.
62+
63+
### Refactor
64+
65+
- **Agentic orchestrator prompt templating** — Prompt substitution across all orchestrators unified to a three-step pattern: preprocess with `double_curly_brackets=True`, un-double template braces, then iterate `str.replace()` per context key. Removes all `try/except KeyError` formatting blocks and brace-escaping of step outputs.
66+
67+
### Test
68+
69+
- **E2E regression suites for issues #545, #549, #557, #566** — Four new E2E test modules covering: format double-escaping across all orchestrators (`test_e2e_issue_549_format_double_escaping.py`, `test_e2e_issue_549_other_orchestrators.py`), Codex NDJSON parsing (`test_e2e_issue_557_codex_ndjson.py`), code-fence tag extraction (`test_e2e_issue_566_code_fence_tags.py`), and no-changes-to-commit on resume (`test_e2e_issue_545_no_changes_to_commit.py`). Total: ~2,300 new test lines.
70+
- **Unit tests for `agentic_common` and `agentic_e2e_fix_orchestrator`** — New `test_agentic_common.py` (305 lines) covers NDJSON parsing, provider JSON extraction, and cost calculation. New `test_agentic_e2e_fix_orchestrator.py` (226 lines) covers commit-and-push fallback logic.
71+
- **Unit tests for `architecture_sync` header parsing** — New `test_architecture_sync.py` (272 lines) verifies that tags in code fences and body sections are ignored.
72+
- **Frontend tests for compact font and zoom sync** — Three new test files covering `getCompactFontPx()` math, compact render mode at low zoom, and `VpZoomSync` CSS property propagation.
73+
74+
## v0.0.159 (2026-02-24)
75+
76+
### Feat
77+
78+
- **13-step agentic architecture workflow** — Expanded from 11 to 13 steps by adding a dedicated Step 4 (Data Model Design) for entities, relationships, and storage decisions. All subsequent steps renumbered accordingly. New `_check_step4_output()` validates that the LLM produces data model content rather than module design.
79+
- **Context window validation in `llm_invoke`** — Prompt token count is now checked against the model's context limit before each LLM call. Prompts exceeding the limit skip to the next candidate model. Post-call `ContextWindowExceededError` is also caught as a safety net. Error messages include a hint to reduce prompt size or use a larger-context model.
80+
- **Cross-cutting concern detection and channel enumeration in agentic prompts** — Architecture prompts now detect shared concerns across modules and enumerate communication channels.
81+
- **Validate prompt token count against model context window**`token_counter.py` rewritten to use litellm's model-aware tokenizer and `get_model_info()` for context limits instead of hardcoded `MODEL_CONTEXT_LIMITS`. Falls back to tiktoken `cl100k_base` for unknown models. `get_context_limit()` returns `Optional[int]` (None for unknown models).
82+
- **Agentic bug orchestrator E2E skip support** — Step 9 now handles `E2E_SKIP:` markers for simple bugs that don't need E2E tests, treating them as successful completion. E2E file list is deduplicated with insertion-order preservation.
83+
- **Sanitize corrupted architecture dependencies** — New `_sanitize_architecture_dependencies()` in `agentic_change_orchestrator` removes dependency strings that contain newlines or are too long (LLM confusion between example `<pdd-dependency>` tags and real tags).
84+
- **Deep copy formatted_messages before LiteLLM calls** — Prevents Groq's structured output fallback from mutating the shared message list, which corrupted retries on other providers (upstream PR #598).
85+
86+
### Fix
87+
88+
- **`--quiet` flag does not suppress all output** — Pre-parse `--quiet` from `sys.argv` before importing `llm_invoke` to set `PDD_QUIET` env var early. New `set_quiet_logging()` raises logger levels to ERROR. `preprocess.py` Rich panels suppressed when `PDD_QUIET` is set. New E2E subprocess test and unit tests for quiet flag behavior.
89+
90+
### Refactor
91+
92+
- **Agentic architecture prompt renaming** — Steps 4-12 prompts renamed to steps 5-13 to accommodate the new data model step (e.g. `agentic_arch_step4_design_LLM.prompt``agentic_arch_step5_design_LLM.prompt`).
93+
194
## v0.0.158 (2026-02-23)
295

396
### Feat
497

5-
- Implement comprehensive API routes for the video pipeline and add a new E2E test for Stage 8 Composition Generation.
6-
- Add comprehensive Playwright E2E tests for all video editor stages and enhance the script API to support TTS script management.
7-
- add E2E test for non-recursive circular include detection and update project configuration defaults for video editor.
8-
- Update test durations and modify `test_llm_invoke_integration.py`.
98+
- **Include-aware sync fingerprints (Issue #522)**`sync_determine_operation` now stores `<include>` dependency paths and their SHA256 hashes in the fingerprint JSON. When an included file changes but the top-level `.prompt` file doesn't, sync correctly detects the change and regenerates code. New functions: `extract_include_deps()`, `calculate_prompt_hash()`, `_resolve_include_path()`. `_save_fingerprint_atomic()` and `save_fingerprint()` accept `include_deps_override` to capture deps before auto-deps strips `<include>` tags.
99+
- **Circular include detection for non-recursive preprocess (Issue #553)**`process_include_tags()` and `process_backtick_includes()` now enforce a `_MAX_INCLUDE_ITERATIONS` limit (50) on the convergence loop, raising `ValueError` instead of hanging forever on circular `<include>` references.
100+
- **E2E tests for include fingerprint and circular include detection** — Two new E2E test suites: `test_e2e_issue_522_include_fingerprint.py` (verifies sync detects included file changes) and `test_e2e_issue_553_circular_includes_non_recursive.py` (verifies `pdd preprocess` exits with error on circular includes).
9101

10102
### Fix
11103

104+
- **Vertex AI credential resolution**`_ensure_api_key()` now resolves missing `VERTEXAI_PROJECT` from `GOOGLE_CLOUD_PROJECT` and missing `VERTEXAI_LOCATION` from CSV location column, and passes `vertex_location` to litellm kwargs.
105+
- **Centralized cost/model extraction** — New `_extract_cost_from_result()` and `_extract_model_from_result()` in `sync_orchestration` correctly index into varying tuple formats per operation type (`crash`/`fix`/`verify`, `generate`, `example`/`test`/`auto-deps`). `operation_log` now uses these instead of hardcoded indices.
12106
- make sync regression cases 5 and 9 non-fatal on LLM failures
13107
- handle multi-language sync failure gracefully in case 4
14108
- increase timeouts and add --max-attempts to sync regression tests
15109

16-
### Refactor
17-
18-
- improve color readability assertion in review tab E2E test by using canvas for RGB extraction.
19-
- Split audit results API into a dedicated route, implement the Stage 10 Audit UI, and add comprehensive E2E tests including dark theme readability checks.
20-
- Restructure ProjectConfig schema for output resolution, TTS, audio sync, VEO, and render settings, updating relevant UI and tests.
21-
- Centralize cost and model extraction logic in Python and update video project configuration.
22-
- Update Stage1ProjectSetup for StagePanelProps compatibility, correct annotation fetching API parameter, and switch to 'server-only' directive for database utilities.
23-
24110
## v0.0.157 (2026-02-22)
25111

26112
### Feat

Makefile

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -769,13 +769,18 @@ publish-public:
769769
fi
770770
@echo "Committing and pushing updates in public repo"
771771
@if git -C "$(PUBLIC_PDD_REPO_DIR)" rev-parse --is-inside-work-tree >/dev/null 2>&1; then \
772-
cd "$(PUBLIC_PDD_REPO_DIR)" && git add . && git commit -m "Bump version" && git fetch origin && git rebase origin/main && \
773-
CURR_VER=$$(sed -n 's/^version[[:space:]]*=[[:space:]]*"\([0-9.]*\)"/\1/p' pyproject.toml | head -n1) && \
774-
(git tag -a "v$$CURR_VER" -m "Release v$$CURR_VER" 2>/dev/null || true) && \
775-
git push && git push --tags; \
772+
cd "$(PUBLIC_PDD_REPO_DIR)" && git fetch origin && git reset --hard origin/main && git add . && \
773+
if ! git diff --cached --quiet; then \
774+
git commit -m "Bump version" && \
775+
CURR_VER=$$(sed -n 's/^version[[:space:]]*=[[:space:]]*"\([0-9.]*\)"/\1/p' pyproject.toml | head -n1) && \
776+
(git tag -a "v$$CURR_VER" -m "Release v$$CURR_VER" 2>/dev/null || true) && \
777+
git push && git push --tags; \
776778
else \
777-
echo "Skip commit: $(PUBLIC_PDD_REPO_DIR) is not a Git repo. Set PUBLIC_PDD_REPO_DIR to a clone of $(PUBLIC_PDD_REMOTE)."; \
778-
fi
779+
echo "No changes to commit in public repo — skipping push"; \
780+
fi; \
781+
else \
782+
echo "Skip commit: $(PUBLIC_PDD_REPO_DIR) is not a Git repo. Set PUBLIC_PDD_REPO_DIR to a clone of $(PUBLIC_PDD_REMOTE)."; \
783+
fi
779784

780785
# Ensure the public repo clone exists at $(PUBLIC_PDD_REPO_DIR)
781786
public-ensure:
@@ -828,13 +833,18 @@ publish-public-cap:
828833
fi
829834
@echo "Committing and pushing updates in CAP public repo"
830835
@if git -C "$(PUBLIC_PDD_CAP_REPO_DIR)" rev-parse --is-inside-work-tree >/dev/null 2>&1; then \
831-
cd "$(PUBLIC_PDD_CAP_REPO_DIR)" && git add . && git commit -m "Bump version" && git fetch origin && git rebase origin/main && \
832-
CURR_VER=$$(sed -n 's/^version[[:space:]]*=[[:space:]]*"\([0-9.]*\)"/\1/p' pyproject.toml | head -n1) && \
833-
(git tag -a "v$$CURR_VER" -m "Release v$$CURR_VER" 2>/dev/null || true) && \
834-
git push && git push --tags; \
836+
cd "$(PUBLIC_PDD_CAP_REPO_DIR)" && git fetch origin && git reset --hard origin/main && git add . && \
837+
if ! git diff --cached --quiet; then \
838+
git commit -m "Bump version" && \
839+
CURR_VER=$$(sed -n 's/^version[[:space:]]*=[[:space:]]*"\([0-9.]*\)"/\1/p' pyproject.toml | head -n1) && \
840+
(git tag -a "v$$CURR_VER" -m "Release v$$CURR_VER" 2>/dev/null || true) && \
841+
git push && git push --tags; \
835842
else \
836-
echo "Skip commit: $(PUBLIC_PDD_CAP_REPO_DIR) is not a Git repo. Set PUBLIC_PDD_CAP_REPO_DIR to a clone of $(PUBLIC_PDD_CAP_REMOTE)."; \
837-
fi
843+
echo "No changes to commit in CAP public repo — skipping push"; \
844+
fi; \
845+
else \
846+
echo "Skip commit: $(PUBLIC_PDD_CAP_REPO_DIR) is not a Git repo. Set PUBLIC_PDD_CAP_REPO_DIR to a clone of $(PUBLIC_PDD_CAP_REMOTE)."; \
847+
fi
838848

839849
# Update the public repo clone to its default branch
840850
public-update: public-ensure

0 commit comments

Comments
 (0)