Skip to content

fix(planner): keep continued answers whole and never save a partial or empty plan - #2589

Merged
integry merged 6 commits into
mainfrom
fix/plan-generation-integrity
Sep 28, 2026
Merged

integry merged 6 commits into
mainfrom
fix/plan-generation-integrity

Conversation

@integry

@integry integry commented Sep 28, 2026

Copy link
Copy Markdown
Owner

What happened

Plan 027d8f35 was regenerated with Opus 5.5 (granular) and saved as one empty task.

  • The model produced 129,562 output tokens, but the parser received 3,542 characters.
  • Claude Code's result line holds only the last assistant message. When a reply reaches the output-token limit, Claude Code has the model continue in a new message, so only the tail of the plan survived.
  • JSON repair then wrapped that fragment into one {content: …} item, and nothing checked that tasks were complete.

Changes

  • Continued answers: getClaudeAnalysisText joins every assistant text block after the last tool result when the result line is the tail of that combined answer. Ordinary results are unchanged, and a warning is logged when a continuation is used.
  • Fragments: a response that isn't a whole JSON array (it starts or ends mid-plan) now fails with a clear message instead of being "repaired" into a partial plan.
  • Agentic repair: a malformed but whole plan is repaired by the default coding agent in a throwaway workspace under the shared worktree root.
    • The workspace holds plan.json, original.txt and validate-plan.mjs.
    • The agent edits the broken spots in place and reruns the validator. The repair model no longer has to re-type the whole plan, which failed for large plans.
    • ProPR accepts the result only if its own copy of the validator passes on fresh copies. It checks for a JSON array, a non-empty title/body/implementation in every task, and no content reworded, dropped or invented compared with the original.
  • Completeness check: a generated plan with incomplete tasks is no longer saved; the check is shared with refinement (fix(planner): only save complete plans from refinement #2576).
  • Log attribution: agent tasks can be logged as plan work instead of implementation, through task metadata, in all five agents.
  • Turn limit: AgentTaskOptions.maxTurns is new. Plan agents get 200, because this host sets CLAUDE_MAX_TURNS=10.

The shared validator and workspace runner are also the base for #2588 (file-based plan generation, stacked on this PR).

Tests

  • test/planValidation.test.ts:
    • validator rules, including a syntax-only repair passing and dropped, reworded or invented content failing
    • fragment detection
    • the workspace runner with a fake agent: files provided, plan-work log attribution, turn limit, edited validator or original rejected, missing plan reported
  • test/claudeContinuedAnswer.test.ts: continued replies, repeated stream lines, tool-result boundaries, unchanged ordinary results.
  • test/planGenerationJsonRepair.test.ts, rewritten for the new flow: agentic repair wiring, fragment rejected, incomplete tasks rejected, repair failure propagated, valid plan untouched.
  • The related agent, logger, refinement and planner suites pass (363 tests). The only failure in the wider run, previewMediaProjection, also fails on main in this environment.

Not verified with a real agent run: the repair path uses fake agents in tests.

🤖 Generated with Claude Code

proprdev and others added 2 commits September 28, 2026 22:08
- planValidation.ts: one dependency-free validator script (JSON array,
  complete title/body/implementation, and, against an original, no
  reworded, dropped or invented content) that agents run in their
  workspace and ProPR re-runs on fresh copies; fragment detection.
- planFileAgent.ts: runs an agent task in a throwaway workspace under
  the shared worktree root and accepts only a plan.json that passes
  ProPR's own validation.
- Agent task logs can be attributed to plan work instead of
  implementation through task metadata (all five agents).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…r empty plan

Plan 027d8f35 was regenerated with Opus 5.5 (129,562 output tokens) and
saved as one empty task: Claude Code's result line carries only the last
assistant message, so a reply continued after the output-token limit
reached the parser as a 3,542-character tail. JSON repair then wrapped
that fragment into a single {content} item, which nothing validated.

- Claude analysis text joins every assistant message of the final answer
  when the result line is its continued tail, and logs a warning.
- A response that is not a whole JSON array is rejected, not repaired.
- Malformed but whole plans are repaired by the default coding agent in
  a scratch workspace: it edits plan.json until the validator passes,
  and ProPR accepts it only if its own copy of the validator confirms
  the plan is complete and keeps the original content.
- Generated plans with tasks lacking a title, body or implementation
  fail the generation instead of being saved.
- Agent tasks can raise the turn limit (plan agents get 200), since hosts
  may set CLAUDE_MAX_TURNS low.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@integry integry added the AI label Sep 28, 2026
@integry

integry commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

/review astra

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

🔍 AI Code Review — astra

Overall Evaluation

The PR addresses continued responses, incomplete tasks, and file-based JSON repair with useful focused tests. It needs changes before merge: fragment detection can still admit truncated plans, and the preservation validator both accepts content loss and rejects some unchanged content.

✅ Independent validation — ProPR validates fresh copies of the result and original, preventing edits to workspace validation files from bypassing its checks.

✅ Task completeness — Generation now rejects tasks missing a non-empty title, body, or implementation before enforcing granularity.

The supplied current-head checks report 24 passed and no failures. This review used static analysis only; no commands were run.

Merge blockers

Every finding below was introduced by this PR and must be resolved before merging.

F1: 🔴 Duplicated tasks can conceal dropped content

  • Required behavior: Syntax repair must preserve every task and field without dropping or inventing content.

  • Evidence: packages/core/src/services/taskPlanning/planValidation.ts, PLAN_VALIDATOR_SCRIPT preservation checks.

    1. A malformed original contains two distinct, equally sized tasks A and B, with a missing comma between their objects.
    2. The repair agent produces valid JSON containing A twice instead of A and B.
    3. Every repaired string passes source.includes(text) because A occurs in the original. Both task counts are two, and counting A's strings twice produces the same kept length as preserving A and B.
    4. The validator accepts the repair, and runPlanFileAgent returns a plan that has silently lost B and duplicated A.

    The substring checks do not consume source occurrences or associate content with its original task and field. The length allowance therefore cannot establish preservation. Existing tests remove a task or introduce novel strings; neither exercises replacement with existing content. Verification provenance — static trace: the equal-length A/B case satisfies every acceptance check in the supplied validator.

  • Minimum fix: Compare preserved content with its original occurrences, task order, and field associations. Reject replacement of B with another occurrence of A even when counts and lengths match; add that regression case.

F2: 🔴 Brackets inside strings admit truncated plans

  • Required behavior: Responses ending mid-plan must fail rather than be repaired into partial plans.

  • Evidence: packages/core/src/services/taskPlanning/planValidation.ts, extractWholeJsonArray; packages/core/src/services/taskPlanning/llmCalling.ts, repair branch.

    1. A malformed, truncated response reaches the repair branch, for example: [{"title":"A","body":"b" "implementation":"Use [x] safely"}, {"title":"B","body":"unfinished.
    2. extractWholeJsonArray takes the first [ and last ]. That last bracket belongs to A's implementation string, so the extracted “whole array” ends at Use [x].
    3. The caller supplies this shortened fragment as both plan.json and original.txt, discarding the remaining response—including B—before preservation validation.
    4. An agent can close the string, object, and array and fix the comma, producing [{"title":"A","body":"b","implementation":"Use [x]"}]. All fields are complete, their text occurs in the shortened original, its title count is one, and the character allowance passes.
    5. ProPR accepts a partial plan despite having received evidence of another task and additional implementation text.

    Fresh-copy validation cannot recover content discarded before the original is established. The existing fragment tests do not cover closing brackets inside strings. Verification provenance — static trace: following the extraction, file arguments, and validator predicates yields this acceptance sequence.

  • Minimum fix: Require evidence that the closing bracket terminates the outer array outside string content, and reject ambiguous or truncated boundaries. Do not silently discard trailing task content when constructing the repair original.

F3: 🔴 Literal Unicode escapes fail unchanged repairs

  • Required behavior: A syntax-only repair preserving all task text must pass validation.

  • Evidence: packages/core/src/services/taskPlanning/planValidation.ts, PLAN_VALIDATOR_SCRIPT’s decode function.

    1. A malformed plan contains the JSON-encoded body "Match \\u0041" and a missing comma before "implementation":"c".
    2. The agent inserts only the missing comma. The repaired body's parsed value correctly contains the literal characters \u0041.
    3. The original-side Unicode replacement matches the second backslash in \\u0041 and turns that portion into A. After normalization, the source contains MatchA.
    4. The repaired value normalizes to Matchu0041, which is absent from that source. Validation rejects the unchanged body, causing generation to fail.

    This affects plans containing literal Unicode escape examples, such as parser or regex implementation instructions. The current backslash test does not contain an escaped Unicode sequence. Verification provenance — static trace: the two replacement passes treat an escaped backslash as the beginning of a Unicode escape.

  • Minimum fix: Make original-side escape decoding distinguish an escaped backslash from a Unicode escape, and add a syntax-only repair test containing literal \\u0041.

Suggestions

These are optional follow-ups and are not sent to /fix.

S1: 🟢 Exercise a real repair agent

A follow-up integration test using an actual configured agent would validate the scratch repository, shared Docker path, file permissions, and validator invocation together. The fake-agent tests establish the runner's orchestration but bypass these integration boundaries; no concrete failure in those boundaries is established here, so this is optional.

Score

The implementation has useful safeguards and passing current checks, but demonstrated validation defects undermine the central guarantee that repairs preserve complete plans. These require correction before merge.

Score: 5/10


🤖 Review Details

  • Model: GPT-6 Astra
  • Time: 1m 14s
  • Tokens: 56,378 (54,113 in / 2,265 out)
  • Cost: $0.65

View Task


💡 Next step: Comment /fix to address every F# merge blocker, or name records explicitly, as in /fix F3 S5.
F# and S# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. S# suggestions stay optional: they are implemented only when you name them, and they never relax a merge blocker.

🤖 Review by ProPR

@integry

integry commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

/fix

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Applied the requested follow-up changes in commit 2566461

Addressed 1 AI review comment (IDs: 5878162607)

Addressed findings F1, F2, F3

Summary of Changes

Implemented F1–F3:

  • Validation preserves task occurrences, order, and field associations.
  • Boundary checks reject truncated plans before parsing or repair.
  • Escape decoding preserves literal \\u0041.

Added focused regressions. All 45 relevant tests and the core TypeScript check pass.

Separate discovery, left unchanged: the existing generic JSON parser strips embedded triple-backtick fences from task text.


🤖 Implementation Details

  • Model: GPT-6 Astra (high)
  • Requested By: @integry
  • Time: 6m 18s
  • Tokens: 411,554 (402,237 in / 9,317 out)
  • Cost: $1.29

Undo Changes • View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5878174096✓

Implemented F1–F3:

- Validation preserves task occurrences, order, and field associations.
- Boundary checks reject truncated plans before parsing or repair.
- Escape decoding preserves literal `\\u0041`.

Added focused regressions. All 45 relevant tests and the core TypeScript check pass.

Separate discovery, left unchanged: the existing generic JSON parser strips embedded triple-backtick fences from task text.

PR: #2589
Comment by: @integry (ID: 5878174096)
Model: gpt-6-astra
@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

CI failed: Validate Changes

Please investigate and fix this CI failure.

Failure evidence

.github:8
Process completed with exit code 1.

.github:360
Process completed with exit code 1.

.github:1
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see actions/runner-images#14748"

@github-actions

Copy link
Copy Markdown

Checks Failed

Validation failed during setup, tests, CLI packaging, linting, or build checks.

View Logs
Build check diagnostics for run 36482100869, attempt 1
Checkout outcome: success

--- GitHub Actions workflow lint ---
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667: Pulling from rhysd/actionlint
589002ba0eae: Pulling fs layer
c09af8888d6a: Pulling fs layer
4ccd7d76ca98: Pulling fs layer
b6b4b7b0e257: Pulling fs layer
b6b4b7b0e257: Waiting
c09af8888d6a: Verifying Checksum
c09af8888d6a: Download complete
4ccd7d76ca98: Verifying Checksum
4ccd7d76ca98: Download complete
589002ba0eae: Verifying Checksum
589002ba0eae: Download complete
589002ba0eae: Pull complete
b6b4b7b0e257: Verifying Checksum
b6b4b7b0e257: Download complete
c09af8888d6a: Pull complete
4ccd7d76ca98: Pull complete
b6b4b7b0e257: Pull complete
Digest: sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
Status: Downloaded newer image for rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667

--- Release shell script lint ---

--- Toolchain ---
v22.23.2
10.9.8

--- Dependency installation ---
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated gar@1.0.4: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me

added 1126 packages, and audited 1135 packages in 15s

322 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- CLI release package ---
Verifying propr-cli release package...

> propr@0.8.15 cli:pack
> node packages/cli/scripts/build-publish.mjs


> @propr/shared@0.8.15 build
> tsc


> @propr/local-setup@0.8.15 build
> tsc


> @propr/cli@0.8.15 build
> tsc && node scripts/copy-assets.mjs

copy-assets: copied 9 file(s) into the CLI package.

Staged propr-cli@0.8.15 at /home/runner/work/propr/propr/dist-publish/propr-cli
npm notice
npm notice 📦  propr-cli@0.8.15
npm notice Tarball Contents
npm notice 25.7kB README.md
npm notice 36.3kB dist/agentSkill.js
npm notice 754B dist/api/agentRuntime.js
npm notice 7.1kB dist/api/agents.js
npm notice 1.2kB dist/api/agentTank.js
npm notice 10.9kB dist/api/client.js
npm notice 4.7kB dist/api/errors.js
npm notice 5.4kB dist/api/implement.js
npm notice 2.0kB dist/api/index.js
npm notice 1.9kB dist/api/logs.js
npm notice 5.7kB dist/api/plans.js
npm notice 4.2kB dist/api/relay.js
npm notice 10.4kB dist/api/repos.js
npm notice 11.1kB dist/api/settings.js
npm notice 1.6kB dist/api/syntheticPools.js
npm notice 1.8kB dist/api/system.js
npm notice 5.8kB dist/api/tasks.js
npm notice 2.9kB dist/api/todos.js
npm notice 86B dist/api/types.js
npm notice 313B dist/api/visualPreviewAuth.js
npm notice 26.1kB dist/assets/env.example.txt
npm notice 5.7kB dist/auth/githubLogin.js
npm notice 19.5kB dist/commands/agentCommands.js
npm notice 4.2kB dist/commands/agentPoolCommands.js
npm notice 4.3kB dist/commands/agentSkillCommands.js
npm notice 28.7kB dist/commands/agentValidation.js
npm notice 65.2kB dist/commands/checkCommands.js
npm notice 8.9kB dist/commands/configCommands.js
npm notice 14.6kB dist/commands/connectCommand.js
npm notice 2.4kB dist/commands/imageCommands.js
npm notice 7.2kB dist/commands/implementCommands.js
npm notice 1.6kB dist/commands/index.js
npm notice 6.0kB dist/commands/initCommands.js
npm notice 14.1kB dist/commands/initStack.js
npm notice 6.1kB dist/commands/logCommands.js
npm notice 24.9kB dist/commands/planCommands.js
npm notice 8.4kB dist/commands/relayCommands.js
npm notice 30.1kB dist/commands/repoCommands.js
npm notice 7.5kB dist/commands/runtimeCommands.js
npm notice 16.1kB dist/commands/settingCommands.js
npm notice 4.1kB dist/commands/setup/agentHostActions.js
npm notice 123B dist/commands/setup/agents.js
npm notice 4.5kB dist/commands/setup/engine.js
npm notice 51B dist/commands/setup/github.js
npm notice 15.3kB dist/commands/setup/hostActions.js
npm notice 25.3kB dist/commands/setup/sequential.js
npm notice 51B dist/commands/setup/state.js
npm notice 51B dist/commands/setup/types.js
npm notice 10.7kB dist/commands/setupCommand.js
npm notice 4.4kB dist/commands/stackCommands.js
npm notice 1.4kB dist/commands/startCommand.js
npm notice 13.5kB dist/commands/systemCommands.js
npm notice 2.2kB dist/commands/tankCommands.js
npm notice 43.2kB dist/commands/taskCommands.js
npm notice 29.6kB dist/commands/todoCommands.js
npm notice 31.0kB dist/commands/tunnelCommand.js
npm notice 2.7kB dist/commands/uiDocsCommands.js
npm notice 8.3kB dist/completion.js
npm notice 20.0kB dist/config/ConfigManager.js
npm notice 276B dist/config/index.js
npm notice 989B dist/config/rootKey.js
npm notice 345B dist/config/types.js
npm notice 42.9kB dist/connectIdentity.js
npm notice 25.0kB dist/connectRootAuthority.js
npm notice 32.5kB dist/connectWindowsAuthority.js
npm notice 2.2kB dist/desktopDiscovery.js
npm notice 12.4kB dist/desktopLocalSetup.js
npm notice 16.3kB dist/index.js
npm notice 4.5kB dist/native/darwin-authority-broker.c
npm notice 8.9kB dist/native/directory-operations.c
npm notice 50.1kB dist/native/prebuilds/darwin-arm64/connect-authority-broker
npm notice 54.2kB dist/native/prebuilds/darwin-arm64/directory-operations.node
npm notice 17.1kB dist/native/prebuilds/darwin-x64/connect-authority-broker
npm notice 24.3kB dist/native/prebuilds/darwin-x64/directory-operations.node
npm notice 28.9kB dist/native/prebuilds/linux-arm64/directory-operations.node
npm notice 17.4kB dist/native/prebuilds/linux-x64/directory-operations.node
npm notice 1.2kB dist/native/README.md
npm notice 3.1kB dist/orchestrator/format.js
npm notice 13.4kB dist/orchestrator/index.js
npm notice 307B dist/orchestrator/manifest.json
npm notice 117.7kB dist/orchestrator/orchestrator.mjs
npm notice 408B dist/orchestrator/types.js
npm notice 237B dist/skill/propr/agents/openai.yaml
npm notice 6.1kB dist/skill/propr/SKILL.md
npm notice 4.5kB dist/tui/AgentTableApp.js
npm notice 4.5kB dist/tui/app.js
npm notice 11.6kB dist/tui/CheckApp.js
npm notice 5.1kB dist/tui/render.js
npm notice 29.9kB dist/tui/SetupApp.js
npm notice 12.6kB dist/tui/SetupApp.test.js
npm notice 8.2kB dist/tui/StartApp.js
npm notice 3.6kB dist/utils/apiErrorPresentation.js
npm notice 12.0kB dist/utils/directoryDescriptor.js
npm notice 739B dist/utils/dockerPort.js
npm notice 5.0kB dist/utils/envFile.js
npm notice 520B dist/utils/index.js
npm notice 5.7kB dist/utils/io.js
npm notice 1.5kB dist/utils/nativeArtifact.js
npm notice 544B dist/utils/parseState.js
npm notice 417B dist/utils/positiveInteger.js
npm notice 4.5kB dist/utils/privateFilesystem.js
npm notice 4.2kB dist/utils/resolveProject.js
npm notice 7.2kB dist/vendor/local-setup/agents.js
npm notice 62.7kB dist/vendor/local-setup/engine.js
npm notice 5.0kB dist/vendor/local-setup/envFile.js
npm notice 9.1kB dist/vendor/local-setup/github.js
npm notice 188B dist/vendor/local-setup/index.js
npm notice 25.1kB dist/vendor/local-setup/publicInstanceIdentity.js
npm notice 14.6kB dist/vendor/local-setup/state.js
npm notice 2.8kB dist/vendor/local-setup/types.js
npm notice 1.0kB dist/vendor/shared/accountStatusTimestamp.js
npm notice 7.6kB dist/vendor/shared/activityEvents.js
npm notice 3.4kB dist/vendor/shared/agentLogin.js
npm notice 5.1kB dist/vendor/shared/apiOrigin.js
npm notice 8.5kB dist/vendor/shared/connectDiscovery.js
npm notice 254B dist/vendor/shared/demoMode.js
npm notice 4.3kB dist/vendor/shared/desktopPairing.js
npm notice 481B dist/vendor/shared/desktopTokenRevocation.js
npm notice 8.9kB dist/vendor/shared/events.js
npm notice 1.6kB dist/vendor/shared/githubAuthMode.js
npm notice 2.0kB dist/vendor/shared/githubEventIntakeMode.js
npm notice 10.7kB dist/vendor/shared/index.js
npm notice 214B dist/vendor/shared/instanceAuthorization.js
npm notice 54B dist/vendor/shared/instanceCatalog.js
npm notice 4.0kB dist/vendor/shared/intakeModePrerequisites.js
npm notice 2.9kB dist/vendor/shared/labelUtils.js
npm notice 18.1kB dist/vendor/shared/modelDefinitions.js
npm notice 3.5kB dist/vendor/shared/notificationLinks.js
npm notice 51.3kB dist/vendor/shared/notifications.js
npm notice 866B dist/vendor/shared/projectSlug.js
npm notice 3.8kB dist/vendor/shared/proprCompatibility.js
npm notice 13.0kB dist/vendor/shared/proprServiceUrls.js
npm notice 2.2kB dist/vendor/shared/publishedVisualPreviews.js
npm notice 2.3kB dist/vendor/shared/reasoningLevels.js
npm notice 9.4kB dist/vendor/shared/reviewContextBudget.js
npm notice 5.3kB dist/vendor/shared/reviewFeedbackIds.js
npm notice 1.7kB dist/vendor/shared/reviewPrompt.js
npm notice 861B dist/vendor/shared/sessionSecret.js
npm notice 603B dist/vendor/shared/statusKeys.js
npm notice 7.5kB dist/vendor/shared/syntheticAgents.js
npm notice 2.2kB dist/vendor/shared/taskIdentifiers.js
npm notice 647B dist/vendor/shared/taskLifecycle.js
npm notice 3.7kB dist/vendor/shared/usageTips.js
npm notice 503B dist/vendor/shared/usageTypes.js
npm notice 1.1kB dist/vendor/shared/userWhitelist.js
npm notice 758B dist/vendor/shared/validateRelayUrl.js
npm notice 2.2kB dist/vendor/shared/validateRoutingUrl.js
npm notice 7.1kB dist/vendor/shared/visualPreviewCapacity.js
npm notice 9.3kB dist/vendor/shared/voice.js
npm notice 222B dist/vendor/shared/workEvidence.js
npm notice 623B package.json
npm notice Tarball Details
npm notice name: propr-cli
npm notice version: 0.8.15
npm notice filename: propr-cli-0.8.15.tgz
npm notice package size: 374.9 kB
npm notice unpacked size: 1.6 MB
npm notice shasum: ecd5814e883512b7257e1573574af6c6d8b4e611
npm notice integrity: sha512-sdxqVoWIiBnTR[...]6iMnR6sQZbWIg==
npm notice total files: 151
npm notice
propr-cli-0.8.15.tgz

Dry run only. Re-run with --publish to publish to npm.
✅ propr-cli release package verified
Starting changed-area validation process...
Reusing this job's @propr/shared build from CLI packaging.
Reusing this job's @propr/local-setup build from CLI packaging.

--- Core Service: Lint & Build ---
✅ Core Lint passed
✅ Core Source Build passed

--- Docs: Typecheck & Build ---
✅ Docs Typecheck passed
✅ Docs Build passed

--- Core Package: Build & Lint ---
✅ Core Package Build passed
❌ Core Package Lint FAILED

/home/runner/work/propr/propr/packages/core/src/services/taskPlanning/planValidation.ts
  71:15  error  Unnecessary escape character: \[  no-useless-escape

✖ 1 problem (1 error, 0 warnings)

--- API: Build & Lint ---
✅ API Build passed
✅ API Lint passed

--- Stage outcomes ---
Workflow lint: success
Release shell lint: success
Pre-setup gate: skipped
Node setup: success
Toolchain: success
Dependency install: success
Release metadata: success
CLI packaging: success
Change detection: success
Changed-area checks: failure

View Workflow

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Applied the requested follow-up changes in commit e18d99a

Summary of Changes

Fixed the CI failure by removing an unnecessary regex escape in planValidation.ts:71, preserving behavior.

Validation: ESLint passes, all 29 focused tests pass, and git diff --check passes.

The Ubuntu migration notice was unrelated. No visual changes or previews.


🤖 Implementation Details

  • Model: GPT-6 Astra (high)
  • Requested By: @propr-dev[bot]
  • Time: 2m 25s
  • Tokens: 351,230 (349,612 in / 1,618 out)
  • Cost: $0.76

Undo Changes • View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5878331682✓

…e in `planValidation.ts:71`, preserving behavior.

Fixed the CI failure by removing an unnecessary regex escape in `planValidation.ts:71`, preserving behavior.

Validation: ESLint passes, all 29 focused tests pass, and `git diff --check` passes.

The Ubuntu migration notice was unrelated. No visual changes or previews.

PR: #2589
Comment by: @propr-dev[bot] (ID: 5878331682)
Model: gpt-6-astra
@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

ℹ️ Analyzed the follow-up request by @github-actions[bot]

Analysis Summary

The reported lint issue is already fixed on this branch in planValidation.ts:71. No further changes were needed.

Verified:

  • Core package lint passes.
  • All 16 plan-validation tests pass.

No visual preview is needed for this regex-only fix.

No code changes were necessary based on the current state of the branch.


🤖 Analysis Details

  • Model: GPT-6 Astra (high)
  • Time: 1m 54s
  • Tokens: 198,576 (197,484 in / 1,092 out)
  • Cost: $0.44

View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5878332827✓

@integry

integry commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

/review astra

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

🔍 AI Code Review — astra

Overall Evaluation

The PR addresses lost continuation text and introduces file-based repair with independent validation. It needs changes before merge: the fragment detector rejects some complete, repairable plans, and OpenCode’s exception path loses plan attribution.

✅ Independent validation — ProPR validates fresh copies of the result and original with its own validator, preventing workspace edits from bypassing the checks.

✅ Incomplete-task rejection — Generation now rejects tasks without non-empty titles, bodies, and implementation sections before saving.

The supplied current-head status shows no failures and three pending checks. This review used static analysis only; no commands were run.

Merge blockers

Every finding below was introduced by this PR and must be resolved before merging.

F4: 🔴 Allow repairable quotes through fragment detection

  • Required behavior: Whole malformed plans must reach syntax-only repair, including repairs to unescaped quotes inside strings.

  • Evidence: packages/core/src/services/taskPlanning/planValidation.ts:extractWholeJsonArray, packages/core/src/services/taskPlanning/llmCalling.ts:callLLMForPlan

    1. Generation returns this complete plan with unescaped quotes in its body: [{"title":"A","body":"Use "]" here","implementation":"c"}].
    2. The new boundary scanner treats the quote before the inner ] as the end of the body string.
    3. It encounters that ] while expecting }, returns null, and causes callLLMForPlan to throw the incomplete-response error before invoking repair.
    4. The user loses an otherwise recoverable generation. Escaping those two inner quotes produces the complete intended plan without changing its content.

    The standalone validator’s tolerant string reader can preserve this exact body: neither inner quote qualifies as an object-value boundary. That protection cannot help because extraction rejects the response first. Existing extraction tests cover unescaped quotes around ordinary words, but not quotes containing structural delimiters.

    static trace: traced the example through the scanner, generation refusal, and validator string-boundary rules; no test was executed.

  • Minimum fix: Make boundary detection handle the unambiguous unescaped-quote cases supported by the repair validator, while retaining rejection of trailing tasks and genuine fragments. Add the example above as a regression covering extraction and repair invocation.

F5: 🔴 Preserve attribution on OpenCode exceptions

  • Required behavior: Agent tasks performing plan work must retain their plan execution type and work reference in execution logs, including failure logs.

  • Evidence: packages/core/src/agents/impl/OpenCodeAgent.ts:persistExecutionLog, packages/core/src/services/taskPlanning/planFileAgent.ts:runPlanFileAgent, packages/core/src/utils/llmLogger.ts:resolveTaskLogAttribution

    1. A plan repair selects OpenCode. runPlanFileAgent supplies the draft ID and plan attribution in task metadata.
    2. An operation inside OpenCodeAgent.executeTask, such as executeDockerCommand, throws an ordinary error.
    3. The catch block constructs a failure result and calls persistExecutionLogSafely without forwarding metadata.
    4. The changed persistence method resolves the missing attribution to executionType: 'implementation' and an implementation work reference. The plan repair failure is therefore recorded against the wrong kind of work instead of its plan reference.

    The normal execution path forwards metadata correctly, but it is bypassed by this exception. The workspace-runner tests use fake agents and do not exercise OpenCode’s failure logger.

    static trace: followed the supplied full OpenCode implementation from the exception handler into the changed attribution resolver.

  • Minimum fix: Forward metadata in OpenCode’s exception-path persistence call and verify that a thrown execution error retains the plan execution type and work reference.

Suggestions

These are optional follow-ups and are not sent to /fix.

S2: 🟢 Exercise a real repair workspace

A smoke test using a supported agent would complement the fake-agent tests by checking container mounts, workspace permissions, Git initialization, and validator execution together. This is optional integration coverage; the supplied code does not establish a separate defect in those paths.

Score

The independent validation and focused tests are strong, but two localized correctness gaps remain. Current checks report no failures; pending checks alone do not reduce the score.

Score: 6/10


🤖 Review Details

  • Model: GPT-6 Astra
  • Time: 1m 21s
  • Tokens: 62,971 (60,457 in / 2,514 out)
  • Cost: $0.67

View Task


💡 Next step: Comment /fix to address every F# merge blocker, or name records explicitly, as in /fix F3 S5.
F# and S# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. S# suggestions stay optional: they are implemented only when you name them, and they never relax a merge blocker.

🤖 Review by ProPR

@integry

integry commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

/ultrafix

@propr-dev propr-dev Bot added the ultrafix label Sep 28, 2026
@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

🔄 Ultrafix loop started (goal: 8/10, max cycles: 10)

First action: /fix

💡 Tip: Remove the ultrafix label from this PR to stop further ultrafix cycles.

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Applied the requested follow-up changes in commit 72fa562

Addressed 1 AI review comment (IDs: 5878573331)

Addressed findings F4, F5

Summary of Changes

Implemented F4 and F5 only.

  • Repairable quoted delimiters now reach syntax-only repair; fragment and trailing-task rejection remain covered.
  • OpenCode exception logs retain plan execution type, draft reference, and metadata.

Validation: 105 tests passed; core type checking passed. Five new regressions fail against the original code.

Separate observation, unchanged: other agents’ exception handlers omit LLM failure-log persistence entirely.

No visual changes; no previews generated.


🤖 Implementation Details

  • Model: GPT-6 Astra (high)
  • Requested By: @integry
  • Time: 6m 13s
  • Tokens: 1,393,091 (1,384,806 in / 8,285 out)
  • Cost: $2.49

Undo Changes • View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 5878711924✓

Implemented F4 and F5 only.

- Repairable quoted delimiters now reach syntax-only repair; fragment and trailing-task rejection remain covered.
- OpenCode exception logs retain plan execution type, draft reference, and metadata.

Validation: 105 tests passed; core type checking passed. Five new regressions fail against the original code.

Separate observation, unchanged: other agents’ exception handlers omit LLM failure-log persistence entirely.

No visual changes; no previews generated.

PR: #2589
Comment by: @integry (ID: 5878711924)
Model: gpt-6-astra
@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

CI failed: Validate Changes

Please investigate and fix this CI failure.

Failure evidence

.github:8
Process completed with exit code 1.

.github:360
Process completed with exit code 1.

.github:1
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see actions/runner-images#14748"

@github-actions

Copy link
Copy Markdown

Checks Failed

Validation failed during setup, tests, CLI packaging, linting, or build checks.

View Logs
Build check diagnostics for run 36485363444, attempt 1
Checkout outcome: success

--- GitHub Actions workflow lint ---
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667: Pulling from rhysd/actionlint
589002ba0eae: Pulling fs layer
c09af8888d6a: Pulling fs layer
4ccd7d76ca98: Pulling fs layer
b6b4b7b0e257: Pulling fs layer
b6b4b7b0e257: Waiting
c09af8888d6a: Verifying Checksum
c09af8888d6a: Download complete
589002ba0eae: Verifying Checksum
589002ba0eae: Download complete
4ccd7d76ca98: Verifying Checksum
4ccd7d76ca98: Download complete
589002ba0eae: Pull complete
c09af8888d6a: Pull complete
b6b4b7b0e257: Verifying Checksum
b6b4b7b0e257: Download complete
4ccd7d76ca98: Pull complete
b6b4b7b0e257: Pull complete
Digest: sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
Status: Downloaded newer image for rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667

--- Release shell script lint ---

--- Toolchain ---
v22.23.2
10.9.8

--- Dependency installation ---
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated gar@1.0.4: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me

added 1126 packages, and audited 1135 packages in 20s

322 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- CLI release package ---
Verifying propr-cli release package...

> propr@0.8.15 cli:pack
> node packages/cli/scripts/build-publish.mjs


> @propr/shared@0.8.15 build
> tsc


> @propr/local-setup@0.8.15 build
> tsc


> @propr/cli@0.8.15 build
> tsc && node scripts/copy-assets.mjs

copy-assets: copied 9 file(s) into the CLI package.

Staged propr-cli@0.8.15 at /home/runner/work/propr/propr/dist-publish/propr-cli
npm notice
npm notice 📦  propr-cli@0.8.15
npm notice Tarball Contents
npm notice 25.7kB README.md
npm notice 36.3kB dist/agentSkill.js
npm notice 754B dist/api/agentRuntime.js
npm notice 7.1kB dist/api/agents.js
npm notice 1.2kB dist/api/agentTank.js
npm notice 10.9kB dist/api/client.js
npm notice 4.7kB dist/api/errors.js
npm notice 5.4kB dist/api/implement.js
npm notice 2.0kB dist/api/index.js
npm notice 1.9kB dist/api/logs.js
npm notice 5.7kB dist/api/plans.js
npm notice 4.2kB dist/api/relay.js
npm notice 10.4kB dist/api/repos.js
npm notice 11.1kB dist/api/settings.js
npm notice 1.6kB dist/api/syntheticPools.js
npm notice 1.8kB dist/api/system.js
npm notice 5.8kB dist/api/tasks.js
npm notice 2.9kB dist/api/todos.js
npm notice 86B dist/api/types.js
npm notice 313B dist/api/visualPreviewAuth.js
npm notice 26.1kB dist/assets/env.example.txt
npm notice 5.7kB dist/auth/githubLogin.js
npm notice 19.5kB dist/commands/agentCommands.js
npm notice 4.2kB dist/commands/agentPoolCommands.js
npm notice 4.3kB dist/commands/agentSkillCommands.js
npm notice 28.7kB dist/commands/agentValidation.js
npm notice 65.2kB dist/commands/checkCommands.js
npm notice 8.9kB dist/commands/configCommands.js
npm notice 14.6kB dist/commands/connectCommand.js
npm notice 2.4kB dist/commands/imageCommands.js
npm notice 7.2kB dist/commands/implementCommands.js
npm notice 1.6kB dist/commands/index.js
npm notice 6.0kB dist/commands/initCommands.js
npm notice 14.1kB dist/commands/initStack.js
npm notice 6.1kB dist/commands/logCommands.js
npm notice 24.9kB dist/commands/planCommands.js
npm notice 8.4kB dist/commands/relayCommands.js
npm notice 30.1kB dist/commands/repoCommands.js
npm notice 7.5kB dist/commands/runtimeCommands.js
npm notice 16.1kB dist/commands/settingCommands.js
npm notice 4.1kB dist/commands/setup/agentHostActions.js
npm notice 123B dist/commands/setup/agents.js
npm notice 4.5kB dist/commands/setup/engine.js
npm notice 51B dist/commands/setup/github.js
npm notice 15.3kB dist/commands/setup/hostActions.js
npm notice 25.3kB dist/commands/setup/sequential.js
npm notice 51B dist/commands/setup/state.js
npm notice 51B dist/commands/setup/types.js
npm notice 10.7kB dist/commands/setupCommand.js
npm notice 4.4kB dist/commands/stackCommands.js
npm notice 1.4kB dist/commands/startCommand.js
npm notice 13.5kB dist/commands/systemCommands.js
npm notice 2.2kB dist/commands/tankCommands.js
npm notice 43.2kB dist/commands/taskCommands.js
npm notice 29.6kB dist/commands/todoCommands.js
npm notice 31.0kB dist/commands/tunnelCommand.js
npm notice 2.7kB dist/commands/uiDocsCommands.js
npm notice 8.3kB dist/completion.js
npm notice 20.0kB dist/config/ConfigManager.js
npm notice 276B dist/config/index.js
npm notice 989B dist/config/rootKey.js
npm notice 345B dist/config/types.js
npm notice 42.9kB dist/connectIdentity.js
npm notice 25.0kB dist/connectRootAuthority.js
npm notice 32.5kB dist/connectWindowsAuthority.js
npm notice 2.2kB dist/desktopDiscovery.js
npm notice 12.4kB dist/desktopLocalSetup.js
npm notice 16.3kB dist/index.js
npm notice 4.5kB dist/native/darwin-authority-broker.c
npm notice 8.9kB dist/native/directory-operations.c
npm notice 50.1kB dist/native/prebuilds/darwin-arm64/connect-authority-broker
npm notice 54.2kB dist/native/prebuilds/darwin-arm64/directory-operations.node
npm notice 17.1kB dist/native/prebuilds/darwin-x64/connect-authority-broker
npm notice 24.3kB dist/native/prebuilds/darwin-x64/directory-operations.node
npm notice 28.9kB dist/native/prebuilds/linux-arm64/directory-operations.node
npm notice 17.4kB dist/native/prebuilds/linux-x64/directory-operations.node
npm notice 1.2kB dist/native/README.md
npm notice 3.1kB dist/orchestrator/format.js
npm notice 13.4kB dist/orchestrator/index.js
npm notice 307B dist/orchestrator/manifest.json
npm notice 117.7kB dist/orchestrator/orchestrator.mjs
npm notice 408B dist/orchestrator/types.js
npm notice 237B dist/skill/propr/agents/openai.yaml
npm notice 6.1kB dist/skill/propr/SKILL.md
npm notice 4.5kB dist/tui/AgentTableApp.js
npm notice 4.5kB dist/tui/app.js
npm notice 11.6kB dist/tui/CheckApp.js
npm notice 5.1kB dist/tui/render.js
npm notice 29.9kB dist/tui/SetupApp.js
npm notice 12.6kB dist/tui/SetupApp.test.js
npm notice 8.2kB dist/tui/StartApp.js
npm notice 3.6kB dist/utils/apiErrorPresentation.js
npm notice 12.0kB dist/utils/directoryDescriptor.js
npm notice 739B dist/utils/dockerPort.js
npm notice 5.0kB dist/utils/envFile.js
npm notice 520B dist/utils/index.js
npm notice 5.7kB dist/utils/io.js
npm notice 1.5kB dist/utils/nativeArtifact.js
npm notice 544B dist/utils/parseState.js
npm notice 417B dist/utils/positiveInteger.js
npm notice 4.5kB dist/utils/privateFilesystem.js
npm notice 4.2kB dist/utils/resolveProject.js
npm notice 7.2kB dist/vendor/local-setup/agents.js
npm notice 62.7kB dist/vendor/local-setup/engine.js
npm notice 5.0kB dist/vendor/local-setup/envFile.js
npm notice 9.1kB dist/vendor/local-setup/github.js
npm notice 188B dist/vendor/local-setup/index.js
npm notice 25.1kB dist/vendor/local-setup/publicInstanceIdentity.js
npm notice 14.6kB dist/vendor/local-setup/state.js
npm notice 2.8kB dist/vendor/local-setup/types.js
npm notice 1.0kB dist/vendor/shared/accountStatusTimestamp.js
npm notice 7.6kB dist/vendor/shared/activityEvents.js
npm notice 3.4kB dist/vendor/shared/agentLogin.js
npm notice 5.1kB dist/vendor/shared/apiOrigin.js
npm notice 8.5kB dist/vendor/shared/connectDiscovery.js
npm notice 254B dist/vendor/shared/demoMode.js
npm notice 4.3kB dist/vendor/shared/desktopPairing.js
npm notice 481B dist/vendor/shared/desktopTokenRevocation.js
npm notice 8.9kB dist/vendor/shared/events.js
npm notice 1.6kB dist/vendor/shared/githubAuthMode.js
npm notice 2.0kB dist/vendor/shared/githubEventIntakeMode.js
npm notice 10.7kB dist/vendor/shared/index.js
npm notice 214B dist/vendor/shared/instanceAuthorization.js
npm notice 54B dist/vendor/shared/instanceCatalog.js
npm notice 4.0kB dist/vendor/shared/intakeModePrerequisites.js
npm notice 2.9kB dist/vendor/shared/labelUtils.js
npm notice 18.1kB dist/vendor/shared/modelDefinitions.js
npm notice 3.5kB dist/vendor/shared/notificationLinks.js
npm notice 51.3kB dist/vendor/shared/notifications.js
npm notice 866B dist/vendor/shared/projectSlug.js
npm notice 3.8kB dist/vendor/shared/proprCompatibility.js
npm notice 13.0kB dist/vendor/shared/proprServiceUrls.js
npm notice 2.2kB dist/vendor/shared/publishedVisualPreviews.js
npm notice 2.3kB dist/vendor/shared/reasoningLevels.js
npm notice 9.4kB dist/vendor/shared/reviewContextBudget.js
npm notice 5.3kB dist/vendor/shared/reviewFeedbackIds.js
npm notice 1.7kB dist/vendor/shared/reviewPrompt.js
npm notice 861B dist/vendor/shared/sessionSecret.js
npm notice 603B dist/vendor/shared/statusKeys.js
npm notice 7.5kB dist/vendor/shared/syntheticAgents.js
npm notice 2.2kB dist/vendor/shared/taskIdentifiers.js
npm notice 647B dist/vendor/shared/taskLifecycle.js
npm notice 3.7kB dist/vendor/shared/usageTips.js
npm notice 503B dist/vendor/shared/usageTypes.js
npm notice 1.1kB dist/vendor/shared/userWhitelist.js
npm notice 758B dist/vendor/shared/validateRelayUrl.js
npm notice 2.2kB dist/vendor/shared/validateRoutingUrl.js
npm notice 7.1kB dist/vendor/shared/visualPreviewCapacity.js
npm notice 9.3kB dist/vendor/shared/voice.js
npm notice 222B dist/vendor/shared/workEvidence.js
npm notice 623B package.json
npm notice Tarball Details
npm notice name: propr-cli
npm notice version: 0.8.15
npm notice filename: propr-cli-0.8.15.tgz
npm notice package size: 374.9 kB
npm notice unpacked size: 1.6 MB
npm notice shasum: a7c8b3a183a681c84c3df109c7117736d1d31d02
npm notice integrity: sha512-WIawbPTldDgvR[...]ddRSZjrC6XvGg==
npm notice total files: 151
npm notice
propr-cli-0.8.15.tgz

Dry run only. Re-run with --publish to publish to npm.
✅ propr-cli release package verified
Starting changed-area validation process...
Reusing this job's @propr/shared build from CLI packaging.
Reusing this job's @propr/local-setup build from CLI packaging.

--- Core Service: Lint & Build ---
✅ Core Lint passed
✅ Core Source Build passed

--- Docs: Typecheck & Build ---
✅ Docs Typecheck passed
✅ Docs Build passed

--- Core Package: Build & Lint ---
✅ Core Package Build passed
❌ Core Package Lint FAILED

/home/runner/work/propr/propr/packages/core/src/services/taskPlanning/planValidation.ts
  43:8  warning  Function 'extractWholeJsonArray' has a complexity of 23. Maximum allowed is 20  complexity

✖ 1 problem (0 errors, 1 warning)

ESLint found too many warnings (maximum: 0).

--- API: Build & Lint ---
✅ API Build passed
✅ API Lint passed

--- Stage outcomes ---
Workflow lint: success
Release shell lint: success
Pre-setup gate: skipped
Node setup: success
Toolchain: success
Dependency install: success
Release metadata: success
CLI packaging: success
Change detection: success
Changed-area checks: failure

View Workflow

@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Applied the requested follow-up changes in commit 5935d93

Processed 2 comments:

  • Comment 1 by @propr-dev[bot] (ID: 5878907133✓)
  • Comment 2 by @github-actions[bot] (ID: 5878907354✓)

Summary of Changes

Fixed the CI lint failure by extracting the delimiter scan from extractWholeJsonArray into a helper, preserving parsing behavior and meeting the complexity limit.

Verified locally:

  • Core lint passes with zero warnings.
  • Core build passes.
  • All 28 plan validation and JSON repair tests pass.

No visual preview needed; this is an internal refactor.


🤖 Implementation Details

  • Model: GPT-6 Astra (high)
  • Requested By: @propr-dev[bot], @github-actions[bot]
  • Time: 2m 24s
  • Tokens: 254,730 (252,831 in / 1,899 out)
  • Cost: $0.61
  • Subscription usage: Weekly +1%

Undo Changes • View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Implement fixes for issues found by /review /fix or /fix address the null check issue
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment IDs: 5878907133✓, 5878907354✓

…from `extractWholeJsonArray` into a helper, preserving parsing behavior and meeting the complexity limit.

Fixed the CI lint failure by extracting the delimiter scan from `extractWholeJsonArray` into a helper, preserving parsing behavior and meeting the complexity limit.

Verified locally:
- Core lint passes with zero warnings.
- Core build passes.
- All 28 plan validation and JSON repair tests pass.

No visual preview needed; this is an internal refactor.

PR: #2589
Comment by: @propr-dev[bot] (ID: 5878907133)
Comment by: @github-actions[bot] (ID: 5878907354)
Model: gpt-6-astra
@propr-dev

propr-dev Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ AI Code Review Complete requested by @propr-ultrafix

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

🔍 AI Code Review — codex:gpt-6-astra

Overall Evaluation

The PR addresses continued Claude responses, incomplete tasks, and file-based JSON repair with clear validation boundaries. It is merge-ready within the supplied scope; I found no verified merge blocker. This was a static review of the supplied code; no commands were run.

✅ Independent repair validation — ProPR validates fresh copies of the resulting plan and original text, so edits to the workspace validator or original cannot bypass acceptance checks.

✅ Task completeness checks — Generation rejects tasks missing a non-empty title, body, or implementation before granularity enforcement and persistence.

✅ Focused regression coverage — The supplied tests cover fragment rejection, content preservation, workspace cleanup, and repair-log attribution. Current head checks report 24 passed and no failures.

Merge blockers

No merge blockers.

Suggestions

These are optional follow-ups and are not sent to /fix.

S3: 🟢 Capture real continuation output

Add a sanitized Claude stream fixture when available. getFinalAnswerText deduplicates using message ID, block index, and text length; the current tests establish behavior for identical repeated blocks but do not establish how actual provider events represent multiple text blocks or updated messages. This would strengthen transport compatibility evidence without making an unverified event format a merge blocker.

S4: 🟢 Clarify supported syntax repairs

The repair prompt permits missing or extra commas, brackets, and braces, while the original-content parser deliberately supports narrower tolerances and rejects ambiguous input. Documenting those limits—or adding fixtures for additional unambiguous syntax errors—would make repair expectations clearer. The current refusal preserves content safety, so broader repair support is optional.

Score

The implementation provides meaningful safeguards and targeted tests, with all current checks passing. Real-agent repair and continuation fixtures would further strengthen confidence.

Score: 8/10


🤖 Review Details

  • Model: GPT-6 Astra
  • Time: 1m 8s
  • Tokens: 64,271 (62,291 in / 1,980 out)
  • Cost: $0.62

View Task


💡 Next step: Comment /fix to address every F# merge blocker, or name records explicitly, as in /fix F3 S5.
F# and S# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. S# suggestions stay optional: they are implemented only when you name them, and they never relax a merge blocker.

🤖 Review by ProPR

@propr-dev propr-dev Bot removed the ultrafix label Sep 28, 2026
@integry
integry merged commit ec8a248 into main Sep 28, 2026
45 checks passed
@integry
integry deleted the fix/plan-generation-integrity branch September 28, 2026 21:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants