В API генерации Task Pack добавь булево поле, показывающее, был ли refinement получен из кеша.
{
"name": "contextforge",
"projectRoot": "<local-project>",
"packageManager": "npm",
"detectedStack": [
"React",
"Svelte",
"TypeScript",
"Vite",
"Electron",
"Express",
"PostgreSQL",
"SQLite",
"Tailwind CSS",
"Framer Motion",
"Docker"
],
"scripts": {
"apps/desktop/renderer:dev": "vite --host 127.0.0.1 --port 5173 --strictPort",
"dev": "vite --host 127.0.0.1 --port 5173 --strictPort",
"apps/desktop/renderer:build": "tsc -b && vite build",
"build": "tsc -b && vite build",
"apps/desktop/renderer:preview": "vite preview",
"preview": "vite preview",
"root:dev": "concurrently -k -n SERVER,RENDERER,ELECTRON -c blue,green,magenta \"npm run dev:server\" \"npm run dev:renderer\" \"npm run dev:electron\"",
"dev:server": "npm run dev -w @contextforge/server",
"dev:renderer": "npm run dev -w @contextforge/renderer",
"dev:electron": "wait-on tcp:5173 tcp:4000 && cross-env ELECTRON_RENDERER_URL=http://localhost:5173 electron apps/desktop/electron/main.cjs",
"root:build": "npm run build -w @contextforge/renderer && npm run build -w @contextforge/server",
"test:selector": "npm run test:selector -w @contextforge/server",
"test:selector:rollout": "npm run test:selector:rollout -w @contextforge/server",
"test:selector:rollout-ui": "npm exec -w @contextforge/server -- tsx ../scripts/pipelineBadge.smoke.ts",
"benchmark:selector": "npm run benchmark:selector -w @contextforge/server",
"benchmark:selector:validation": "npm run benchmark:selector:validation -w @contextforge/server",
"benchmark:selector:snapshot": "npm run benchmark:selector:snapshot -w @contextforge/server",
"db:up": "docker compose up -d",
"db:down": "docker compose down",
"db:logs": "docker compose logs -f postgres",
"server:dev": "tsx watch src/index.ts",
"server:build": "tsc",
"server:test:selector": "tsx src/ollama/taskFileSelector.smoke.ts",
"server:test:selector:replay": "tsx src/ollama/taskFileSelector.replay.ts",
"test:selector:replay": "tsx src/ollama/taskFileSelector.replay.ts",
"server:test:selector:benchmark": "tsx src/selection/benchmark/benchmarkSmoke.ts",
"test:selector:benchmark": "tsx src/selection/benchmark/benchmarkSmoke.ts",
"server:test:selector:rollout": "tsx src/selection/pipelineRollout.smoke.ts",
"server:benchmark:selector": "tsx src/selection/benchmark/benchmarkRunner.ts",
"server:benchmark:selector:validation": "tsx src/selection/benchmark/benchmarkRunner.ts --split validation --external-only",
"server:benchmark:selector:snapshot": "tsx src/selection/benchmark/benchmarkSnapshot.ts",
"server:start": "node dist/index.js",
"start": "node dist/index.js"
},
"readinessScore": 86
}
These snippets are partial context only. Inspect full files before editing.
import { createHash } from "node:crypto";
import fs from "node:fs/promises";
import path from "node:path";
import { Router } from "express";
import { z } from "zod";
import { storage } from "../storage/index.js";
import {
appendSelectorDiagnostics,
getAppSettings,
} from "../settings/settingsService.js";
import {
buildTaskPackRulesTemplatePrompt,
RulesServiceError,
} from "../rules/rulesService.js";
import {
analyzeTaskIntent,
type TaskIntentAnalysis,
} from "../ollama/taskIntentAnalyzer.js";
import {
generateReliableTaskPack,
type TaskPackGenerationDiagnostics,
} from "../ollama/taskPackGenerationReliability.js";
import {
type TaskFileSelection,
type SelectedTaskFileUsage,
} from "../ollama/taskFileSelector.js";
import {
scanProjectInventory,
type ProjectInventory,
type ProjectInventoryFile,
type ProjectInventoryFileKind,
} from "../scanner/projectInventoryScanner.js";
import {
evaluateContextSelectionQuality,
type ContextSelectionQuality,
} from "../selection/contextQuality.js";
import { isSecretLikePath } from "../selection/safetyPolicy.js";
import type { FileSelectionEvidence } from "../selection/repositorySemanticIndex.js";
import { buildExportSafeProjectMetadata } from "../taskPacks/taskPackPrivacy.js";
import { resolveTaskUnderstandingInteraction } from "../taskPacks/taskUnderstandingInteraction.js";
import {
applySelectionEvidenceGate,
buildTaskExecutionContractFromIntent,
type TaskExecutionContract,
} from "../taskPacks/taskExecutionContract.js";
import {
applyTaskClarifications
<!-- Snippet truncated. Inspect the full file before editing. -->
import { z } from "zod";
import type { TaskExecutionContract } from "../taskPacks/taskExecutionContract.js";
import type { AiProviderId } from "../ai/providerService.js";
import type { FileSelectionEvidence } from "../selection/repositorySemanticIndex.js";
import { recordPerformanceCacheEvent } from "../performance/performanceTrace.js";
import { generateWithConfiguredAi } from "../ai/providerService.js";
import {
getAppSettings,
type AppSettings,
} from "../settings/settingsService.js";
import {
buildGenerationCacheKey,
getCachedGeneration,
setCachedGeneration,
} from "./generationCache.js";
import {
extractExplicitReplacementValue,
hasMissingReplacementValue,
} from "./taskValueGrounding.js";
export {
extractExplicitReplacementValue,
type ExplicitReplacementValue,
} from "./taskValueGrounding.js";
const MAX_PROMPT_CHARS = 24_000;
const MAX_REPAIR_RESPONSE_CHARS = 8_000;
const MAX_RETRY_PROMPT_CHARS = 28_000;
const MAX_ITEM_CHARS = 600;
const REFINEMENT_ARRAY_LIMITS = {
implementationGuidance: 10,
constraints: 8,
acceptanceCriteria: 10,
verificationSteps: 10,
finalResponseRequirements: 8,
} as const;
const POLICY_REFINEMENT_ARRAY_LIMITS = {
implementationGuidance: 7,
constraints: 5,
acceptanceCriteria: 6,
verificationSteps: 5,
finalResponseRequirements: 4,
} as const;
const boundedLineSchema = z
.string()
.trim()
.min(3)
.max(MAX_ITEM_CHARS)
.transform((value) => normalizeGuidanceLine(value));
export const taskPackRefinementSchema = z.object({
implementationGuidance: z
.array(boundedLineSchema)
.min(1)
.ma
<!-- Snippet truncated. Inspect the full file before editing. -->
-
Trigger: Existing implementation candidates require trace verification.
-
Seeds: server/src/routes/taskPacks.ts, server/src/contextComposer/contextComposerService.ts, server/src/ollama/taskPackGenerationReliability.ts, apps/desktop/renderer/src/api/client.ts, apps/desktop/renderer/src/App.backup.txt, apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx, apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx, apps/desktop/renderer/src/components/ui/Modal.tsx, apps/desktop/renderer/src/hooks/useDashboardController.ts, apps/desktop/renderer/src/i18n/index.ts, apps/desktop/renderer/src/pages/DashboardHomePage.tsx, apps/desktop/renderer/src/pages/DashboardPage.tsx
-
Inspected files: 16; edges followed: 64; hops: 1; duration: 506.6 ms; cache reused: no
-
Confirmed owner candidates: none
-
Probable owner candidates: server/src/routes/taskPacks.ts
-
Reference/display candidates: server/src/contextComposer/contextComposerService.ts, server/src/ollama/taskPackGenerationReliability.ts, apps/desktop/renderer/src/api/client.ts, apps/desktop/renderer/src/App.backup.txt, apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx, apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx, apps/desktop/renderer/src/components/ui/Modal.tsx, apps/desktop/renderer/src/hooks/useDashboardController.ts
-
Unresolved trace points: Trace stopped at file limit.
-
server/src/routes/taskPacks.ts: route-owner, probable; symbols=refinement, validation, taskpackgenerationreliability, boolean, generation, taskpack, taskpackgeneration, buildstabletaskpackrefinementcacheidentity, refinementcacheidentity, taskpackrefinement
-
server/src/contextComposer/contextComposerService.ts: reference, reference; symbols=validation, boolean
-
server/src/ollama/taskPackGenerationReliability.ts: reference, reference; symbols=refinement, validation, boolean, generation, taskpackrefinementpolicydiagnostics, refinementarraylimits, policyrefinementarraylimits, taskpackrefinementschema, taskpackrefinement, refinementitems, validationissuecodes, parsedrefinement
-
apps/desktop/renderer/src/api/client.ts: reference, reference; symbols=boolean, apirequesterror, getgithubintegrationstatus, startgithubdeviceauth, pollgithubdeviceauth, signoutgithub, getprojects, addproject, rescanproject, getprojectgithubrepositorylink, initializeprojectgitrepository, setprojectgithuboriginremote, linkprojectgithubrepository, getagentspreview, saveagentsfile, getstorageaudit
-
apps/desktop/renderer/src/App.backup.txt: consumer-display, reference; symbols=project, taskpack, getscorelabel, loadprojects, loadtaskpacks, handleselectproject, handlerescanproject, handlegenerateagentspreview, handlesaveagentsfile, handlecreatetaskpack, selectedpath, readinessscore, isexpanded, classname, onclick, disabled
-
apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx: consumer-display, reference; symbols=generatedtaskpackmodal, generatedtaskpackmodalprops, promptviewmode, formatduration, formatdate, gettaskpackbodylabel, gettaskpackbodydescription, infotile, handlecopyprompt, viewswitchtransition, markdownpreviewstyles, generatedprompt, bodylabel, bodydescription, classname, eyebrow
-
apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx: consumer-display, reference; symbols=globalsearchmodal, lucideicon, apppageid, globalsearchmodalprops, searchitem, normalize, getprojectstack, getresulticon, getresultkind, handlesubmitfirstresult, handlecopyworkspaceresult, inputref, normalizedquery, timeoutid, searchitems, visiblelocalresults
-
apps/desktop/renderer/src/components/ui/Modal.tsx: consumer-display, reference; symbols=boolean, reactnode, modalprops, requestclose, handlekeydown, modalexitms, maxwidth, scrollable, classname, onclick, isvisible, isclosing, timeout, eyebrow, children, onclose
-
apps/desktop/renderer/src/hooks/useDashboardController.ts: reference, reference; symbols=boolean, usedashboardcontroller, parsemultilinerules, getclarificationsignature, getblockedcontextmessage, settaskpackdraft, loadprojects, loadtaskpacks, refreshdashboard, handleselectproject, handlerescanproject, handlegenerateagentspreview, handleopenprojectcontextfile, handleregenerateagentspreview, handlesaveagentsfile, generatetaskpackfromdraft
-
apps/desktop/renderer/src/i18n/index.ts: reference, reference; symbols=applanguage, resolveapplanguage, applyapplanguage, preferences, language, resources, resolvedlanguage, checkspassed, tokengeneration, translation, addproject, scanning, refresh, refreshing, savechanges, unsaved
-
imports: server/src/routes/taskPacks.ts -> server/src/storage/index.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/settings/settingsService.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/rules/rulesService.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskIntentAnalyzer.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskPackGenerationReliability.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskFileSelector.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/selection/contextQuality.ts
-
imports: server/src/routes/taskPacks.ts -> server/src/selection/safetyPolicy.ts
-
imported_by: server/src/index.ts -> server/src/routes/taskPacks.ts
-
imported_by: server/src/ollama/taskPackGenerationReliability.smoke.ts -> server/src/routes/taskPacks.ts
Use a concise implementation plan, make focused edits, and keep the final response review-friendly.
Handle the task with the smallest practical set of changes. Avoid unrelated restructuring.
This section is generated and validated by ContextForge. Preserve it exactly.
ContextForge Task Pack
Task Pack: #21 — В API генерации Task Pack добавь булево поле, показывающее, был ли refinement...
Project: contextforge
Task type: general
Target: codex
Generated: 2026-07-16T16:36:33.446Z
GitHub issue draft created: 2026-07-16T16:40:44.384Z
Original Task
В API генерации Task Pack добавь булево поле, показывающее, был ли refinement получен из кеша.
Generated Task Pack
Open generated prompt
AI Task Pack
Target Tool
Codex
Task Type
general
Task
В API генерации Task Pack добавь булево поле, показывающее, был ли refinement получен из кеша.
Project Context
Project metadata:
{ "name": "contextforge", "projectRoot": "<local-project>", "packageManager": "npm", "detectedStack": [ "React", "Svelte", "TypeScript", "Vite", "Electron", "Express", "PostgreSQL", "SQLite", "Tailwind CSS", "Framer Motion", "Docker" ], "scripts": { "apps/desktop/renderer:dev": "vite --host 127.0.0.1 --port 5173 --strictPort", "dev": "vite --host 127.0.0.1 --port 5173 --strictPort", "apps/desktop/renderer:build": "tsc -b && vite build", "build": "tsc -b && vite build", "apps/desktop/renderer:preview": "vite preview", "preview": "vite preview", "root:dev": "concurrently -k -n SERVER,RENDERER,ELECTRON -c blue,green,magenta \"npm run dev:server\" \"npm run dev:renderer\" \"npm run dev:electron\"", "dev:server": "npm run dev -w @contextforge/server", "dev:renderer": "npm run dev -w @contextforge/renderer", "dev:electron": "wait-on tcp:5173 tcp:4000 && cross-env ELECTRON_RENDERER_URL=http://localhost:5173 electron apps/desktop/electron/main.cjs", "root:build": "npm run build -w @contextforge/renderer && npm run build -w @contextforge/server", "test:selector": "npm run test:selector -w @contextforge/server", "test:selector:rollout": "npm run test:selector:rollout -w @contextforge/server", "test:selector:rollout-ui": "npm exec -w @contextforge/server -- tsx ../scripts/pipelineBadge.smoke.ts", "benchmark:selector": "npm run benchmark:selector -w @contextforge/server", "benchmark:selector:validation": "npm run benchmark:selector:validation -w @contextforge/server", "benchmark:selector:snapshot": "npm run benchmark:selector:snapshot -w @contextforge/server", "db:up": "docker compose up -d", "db:down": "docker compose down", "db:logs": "docker compose logs -f postgres", "server:dev": "tsx watch src/index.ts", "server:build": "tsc", "server:test:selector": "tsx src/ollama/taskFileSelector.smoke.ts", "server:test:selector:replay": "tsx src/ollama/taskFileSelector.replay.ts", "test:selector:replay": "tsx src/ollama/taskFileSelector.replay.ts", "server:test:selector:benchmark": "tsx src/selection/benchmark/benchmarkSmoke.ts", "test:selector:benchmark": "tsx src/selection/benchmark/benchmarkSmoke.ts", "server:test:selector:rollout": "tsx src/selection/pipelineRollout.smoke.ts", "server:benchmark:selector": "tsx src/selection/benchmark/benchmarkRunner.ts", "server:benchmark:selector:validation": "tsx src/selection/benchmark/benchmarkRunner.ts --split validation --external-only", "server:benchmark:selector:snapshot": "tsx src/selection/benchmark/benchmarkSnapshot.ts", "server:start": "node dist/index.js", "start": "node dist/index.js" }, "readinessScore": 86 }Relevant File Candidates
Inspect these files before modifying code:
Code Context Snippets
These snippets are partial context only. Inspect full files before editing.
server/src/routes/taskPacks.ts
server/src/ollama/taskPackGenerationReliability.ts
apps/desktop/renderer/src/types/index.ts
ContextForge Assisted Notes
Task Intent Analysis
Execution Contract
AI File Selection
Project Inventory
Investigation Trace
Trigger: Existing implementation candidates require trace verification.
Seeds: server/src/routes/taskPacks.ts, server/src/contextComposer/contextComposerService.ts, server/src/ollama/taskPackGenerationReliability.ts, apps/desktop/renderer/src/api/client.ts, apps/desktop/renderer/src/App.backup.txt, apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx, apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx, apps/desktop/renderer/src/components/ui/Modal.tsx, apps/desktop/renderer/src/hooks/useDashboardController.ts, apps/desktop/renderer/src/i18n/index.ts, apps/desktop/renderer/src/pages/DashboardHomePage.tsx, apps/desktop/renderer/src/pages/DashboardPage.tsx
Inspected files: 16; edges followed: 64; hops: 1; duration: 506.6 ms; cache reused: no
Confirmed owner candidates: none
Probable owner candidates: server/src/routes/taskPacks.ts
Reference/display candidates: server/src/contextComposer/contextComposerService.ts, server/src/ollama/taskPackGenerationReliability.ts, apps/desktop/renderer/src/api/client.ts, apps/desktop/renderer/src/App.backup.txt, apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx, apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx, apps/desktop/renderer/src/components/ui/Modal.tsx, apps/desktop/renderer/src/hooks/useDashboardController.ts
Unresolved trace points: Trace stopped at file limit.
server/src/routes/taskPacks.ts: route-owner, probable; symbols=refinement, validation, taskpackgenerationreliability, boolean, generation, taskpack, taskpackgeneration, buildstabletaskpackrefinementcacheidentity, refinementcacheidentity, taskpackrefinement
server/src/contextComposer/contextComposerService.ts: reference, reference; symbols=validation, boolean
server/src/ollama/taskPackGenerationReliability.ts: reference, reference; symbols=refinement, validation, boolean, generation, taskpackrefinementpolicydiagnostics, refinementarraylimits, policyrefinementarraylimits, taskpackrefinementschema, taskpackrefinement, refinementitems, validationissuecodes, parsedrefinement
apps/desktop/renderer/src/api/client.ts: reference, reference; symbols=boolean, apirequesterror, getgithubintegrationstatus, startgithubdeviceauth, pollgithubdeviceauth, signoutgithub, getprojects, addproject, rescanproject, getprojectgithubrepositorylink, initializeprojectgitrepository, setprojectgithuboriginremote, linkprojectgithubrepository, getagentspreview, saveagentsfile, getstorageaudit
apps/desktop/renderer/src/App.backup.txt: consumer-display, reference; symbols=project, taskpack, getscorelabel, loadprojects, loadtaskpacks, handleselectproject, handlerescanproject, handlegenerateagentspreview, handlesaveagentsfile, handlecreatetaskpack, selectedpath, readinessscore, isexpanded, classname, onclick, disabled
apps/desktop/renderer/src/components/modals/GeneratedTaskPackModal.tsx: consumer-display, reference; symbols=generatedtaskpackmodal, generatedtaskpackmodalprops, promptviewmode, formatduration, formatdate, gettaskpackbodylabel, gettaskpackbodydescription, infotile, handlecopyprompt, viewswitchtransition, markdownpreviewstyles, generatedprompt, bodylabel, bodydescription, classname, eyebrow
apps/desktop/renderer/src/components/modals/GlobalSearchModal.tsx: consumer-display, reference; symbols=globalsearchmodal, lucideicon, apppageid, globalsearchmodalprops, searchitem, normalize, getprojectstack, getresulticon, getresultkind, handlesubmitfirstresult, handlecopyworkspaceresult, inputref, normalizedquery, timeoutid, searchitems, visiblelocalresults
apps/desktop/renderer/src/components/ui/Modal.tsx: consumer-display, reference; symbols=boolean, reactnode, modalprops, requestclose, handlekeydown, modalexitms, maxwidth, scrollable, classname, onclick, isvisible, isclosing, timeout, eyebrow, children, onclose
apps/desktop/renderer/src/hooks/useDashboardController.ts: reference, reference; symbols=boolean, usedashboardcontroller, parsemultilinerules, getclarificationsignature, getblockedcontextmessage, settaskpackdraft, loadprojects, loadtaskpacks, refreshdashboard, handleselectproject, handlerescanproject, handlegenerateagentspreview, handleopenprojectcontextfile, handleregenerateagentspreview, handlesaveagentsfile, generatetaskpackfromdraft
apps/desktop/renderer/src/i18n/index.ts: reference, reference; symbols=applanguage, resolveapplanguage, applyapplanguage, preferences, language, resources, resolvedlanguage, checkspassed, tokengeneration, translation, addproject, scanning, refresh, refreshing, savechanges, unsaved
imports: server/src/routes/taskPacks.ts -> server/src/storage/index.ts
imports: server/src/routes/taskPacks.ts -> server/src/settings/settingsService.ts
imports: server/src/routes/taskPacks.ts -> server/src/rules/rulesService.ts
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskIntentAnalyzer.ts
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskPackGenerationReliability.ts
imports: server/src/routes/taskPacks.ts -> server/src/ollama/taskFileSelector.ts
imports: server/src/routes/taskPacks.ts -> server/src/selection/contextQuality.ts
imports: server/src/routes/taskPacks.ts -> server/src/selection/safetyPolicy.ts
imported_by: server/src/index.ts -> server/src/routes/taskPacks.ts
imported_by: server/src/ollama/taskPackGenerationReliability.smoke.ts -> server/src/routes/taskPacks.ts
Notes
Agent Instructions
Use a concise implementation plan, make focused edits, and keep the final response review-friendly.
Handle the task with the smallest practical set of changes. Avoid unrelated restructuring.
Before editing:
AI-refined implementation guidance
server/src/routes/taskPacks.ts, modify the API handler that generates the Task Pack response to expose this newgenerationCachedboolean field in the public API contract.apps/desktop/renderer/src/types/index.tsis updated (if necessary, though it's marked inspect-only) to reflect the presence of thegenerationCachedfield for consumers.Constraints
Task-specific safeguards
server/src/ollama/taskPackGenerationReliability.ts.server/src/routes/taskPacks.ts) to expose the cached status, avoiding duplication of the source value.Known AI-Readiness Issues
Acceptance Criteria
Task-specific acceptance checks
server/src/ollama/taskPackGenerationReliability.tsmust include a boolean field indicating cache usage.server/src/routes/taskPacks.tsmust successfully return the newgenerationCachedboolean field when generating a Task Pack.apps/desktop/renderer/src/types/index.tsshould be able to access thegenerationCachedfield without type errors.Verification
Suggested verification
npm run buildand verify that the compilation succeeds after adding the new field.generationCached(both true and false cases).Expected Final Response
Return a concise final response with:
Additional response requirements
ContextForge Rules & Criteria
This section is generated and validated by ContextForge. Preserve it exactly.
Selected Template
Selected Rule Profile
Enabled Toggle Rules
Custom User Rules
Acceptance Criteria Preset
Final Acceptance Criteria
Created from ContextForge. Project source files stay local; this issue contains only the generated task brief.