Accept Scattermind first-week build order handoffs
This commit is contained in:
@@ -51,7 +51,7 @@ Candidate items may include optional 1–10 `rankerHints` (`value`, `effort`, `c
|
|||||||
|
|
||||||
Candidate trace note: candidate-level `sourceItemId` / `traceId`, `sourceTitle` / `lensTitle`, and `sourceExcerpt` / `sourceQuote` are preserved in ranked items, `buildOrderDetails`, and `handoff.itemTrace`. Lens-only Build Order text is also split into deterministic `concept-map.lenses.channel#N` source IDs with the original labelled sentence carried as `sourceQuote`, so pasted paid Concept Maps remain traceable even without explicit candidate objects. String items in laned Build Order arrays now also receive deterministic section-local source IDs such as `concept-map.buildOrder.validateNext#1` and carry the original string as `sourceQuote`, so simple Scattermind exports stay addressable downstream instead of becoming anonymous `feature-1` rows. Ranker also accepts the current Scattermind storage-row shape with `referenceCode`, `ideaText`, `context`, and string-valued `fullReadingJson` / `full_reading_json`; it expands the saved paid Concept Map before ranking so operators do not have to hand-copy lenses out of Appwrite rows. It also accepts private reading/API envelopes with object-valued `reading` / `fullReading` and `glimpse`, preserving `referenceCode` and `initialPrompt` while treating `reading` as the paid Concept Map. Stringified bridge envelopes in fields such as `rankerInput`, `rankerBridge`, `rankReady`, `bridgePayload`, or `continuationPlan` are expanded the same way, so Appwrite/string-copy handoffs do not have to be manually unwrapped before ranking. If the row only has free Snapshot data (`glimpseJson` / `glimpse_json` / `snapshotJson`), Ranker expands that Snapshot into a minimal continuation order: one manual proof plus the first evidence question, with the Snapshot reference code/title preserved for provenance. The public paste form mirrors this: a prose-wrapped/fenced Appwrite row paste stays intact for the API instead of unwrapping the stringified reading into nonsense fields. The decision `brief.quickGlance.sourceTrace` now repeats the winning item's source section/id/title/quote, and both `brief.source.originalPromptExcerpt` / `handoff.source.originalPromptExcerpt` or, when the original prompt is unavailable, `sourceSummaryExcerpt` carry the source context into the bridge handoff.
|
Candidate trace note: candidate-level `sourceItemId` / `traceId`, `sourceTitle` / `lensTitle`, and `sourceExcerpt` / `sourceQuote` are preserved in ranked items, `buildOrderDetails`, and `handoff.itemTrace`. Lens-only Build Order text is also split into deterministic `concept-map.lenses.channel#N` source IDs with the original labelled sentence carried as `sourceQuote`, so pasted paid Concept Maps remain traceable even without explicit candidate objects. String items in laned Build Order arrays now also receive deterministic section-local source IDs such as `concept-map.buildOrder.validateNext#1` and carry the original string as `sourceQuote`, so simple Scattermind exports stay addressable downstream instead of becoming anonymous `feature-1` rows. Ranker also accepts the current Scattermind storage-row shape with `referenceCode`, `ideaText`, `context`, and string-valued `fullReadingJson` / `full_reading_json`; it expands the saved paid Concept Map before ranking so operators do not have to hand-copy lenses out of Appwrite rows. It also accepts private reading/API envelopes with object-valued `reading` / `fullReading` and `glimpse`, preserving `referenceCode` and `initialPrompt` while treating `reading` as the paid Concept Map. Stringified bridge envelopes in fields such as `rankerInput`, `rankerBridge`, `rankReady`, `bridgePayload`, or `continuationPlan` are expanded the same way, so Appwrite/string-copy handoffs do not have to be manually unwrapped before ranking. If the row only has free Snapshot data (`glimpseJson` / `glimpse_json` / `snapshotJson`), Ranker expands that Snapshot into a minimal continuation order: one manual proof plus the first evidence question, with the Snapshot reference code/title preserved for provenance. The public paste form mirrors this: a prose-wrapped/fenced Appwrite row paste stays intact for the API instead of unwrapping the stringified reading into nonsense fields. The decision `brief.quickGlance.sourceTrace` now repeats the winning item's source section/id/title/quote, and both `brief.source.originalPromptExcerpt` / `handoff.source.originalPromptExcerpt` or, when the original prompt is unavailable, `sourceSummaryExcerpt` carry the source context into the bridge handoff.
|
||||||
|
|
||||||
Soft Scattermind labels are accepted at the bridge boundary so Scattermind does not need to use harsh verdict copy in its own product surface. Lens text can say `Continue first`, `Make tangible`, `Try next`, `Evidence next`, `Validate manually`, `Manual proof`, `Hold for later`, or `Set aside`, with either colon or reader-friendly dash separators (`Continue first: …`, `Validate manually — …`, `Evidence next - …`). Build Order objects and direct bridge/envelope sections can use matching camel/snake-case keys such as `continueFirst`, `evidenceNext`, `validateManually`, `manualProof`, `holdForLater`, and `setAside`; whole-payload wrappers may use `rankPayload` / `rank_payload` or `scattermindPayload` / `scattermind_payload`, and already-laned objects may be named `rankReadyBuildOrder` / `rank_ready_build_order` as a more explicit Scattermind handoff alias. Those section values may be arrays, a single candidate object, or a reader-friendly string/newline list; Ranker splits scalar sections into candidate actions so Scattermind does not have to wrap every lane in arrays. Ranker maps those to `doFirst / validateNext / defer / park` while preserving the softer original label in `sourceQuote` or candidate source trace. Ranker also accepts softer continuation envelopes named `rankerBridge`, `continuation`, or `continuationPlan`, candidate arrays named `possibleNextMoves`, `suggestedNextMoves`, `recommendations`, or `opportunities`, laned `buildOrderPreview` / `build_order_preview` objects, first-48-hour action arrays (`next48Hours`, `next_48_hours`, `first48Hours`, `first_48_hours`, `nextTwoDays`, `next_two_days`), evidence-question fallback arrays (`evidenceQuestions` / `evidence_questions`, `proofQuestions` / `proof_questions`, `proofPlan` / `proof_plan`, `validationQuestions` / `validation_questions`, `validationPlan` / `validation_plan`, `decisionQuestions`, `questionsToAnswer`, `followupQuestions`), and assumption-test arrays (`assumptionTests` / `assumption_tests`, `riskiestAssumptions` / `riskiest_assumptions`, `risksToTest` / `risks_to_test`) that default into Validate next. Direct candidate objects may use reader-friendly prose keys like `text`, `content`, `summary`, `step`, `task`, `instruction`, `why_it_matters`, `evidence_to_collect`, `first_proof_step`, `green_flag`, and `red_flag`; Ranker normalizes those into title, value, evidence, next-step, success, and kill-signal fields so Scattermind does not have to rename paid Concept Map language into software-feature jargon. If a paid Concept Map has no labelled Build Order/action threads but does include `closing_note` / `closingNote` plus decision questions, Ranker treats the closing note as the active 48-hour Do first move and keeps the questions in Validate next. This lets Scattermind pass reader-friendly Concept Map copy without renaming everything into software-feature language.
|
Soft Scattermind labels are accepted at the bridge boundary so Scattermind does not need to use harsh verdict copy in its own product surface. Lens text can say `Continue first`, `Make tangible`, `Try next`, `Evidence next`, `Validate manually`, `Manual proof`, `Hold for later`, or `Set aside`, with either colon or reader-friendly dash separators (`Continue first: …`, `Validate manually — …`, `Evidence next - …`). Build Order objects and direct bridge/envelope sections can use matching camel/snake-case keys such as `continueFirst`, `evidenceNext`, `validateManually`, `manualProof`, `holdForLater`, and `setAside`; whole-payload wrappers may use `rankPayload` / `rank_payload` or `scattermindPayload` / `scattermind_payload`, and already-laned objects may be named `rankReadyBuildOrder` / `rank_ready_build_order` as a more explicit Scattermind handoff alias. Those section values may be arrays, a single candidate object, or a reader-friendly string/newline list; Ranker splits scalar sections into candidate actions so Scattermind does not have to wrap every lane in arrays. Ranker maps those to `doFirst / validateNext / defer / park` while preserving the softer original label in `sourceQuote` or candidate source trace. Ranker also accepts softer continuation envelopes named `rankerBridge`, `continuation`, or `continuationPlan`, candidate arrays named `possibleNextMoves`, `suggestedNextMoves`, `recommendations`, or `opportunities`, laned `buildOrderPreview` / `build_order_preview` objects, `firstWeekBuildOrder` / `first_week_build_order` objects from Scattermind's paid first-week Build Order language, first-48-hour action arrays (`next48Hours`, `next_48_hours`, `first48Hours`, `first_48_hours`, `nextTwoDays`, `next_two_days`), evidence-question fallback arrays (`evidenceQuestions` / `evidence_questions`, `proofQuestions` / `proof_questions`, `proofPlan` / `proof_plan`, `validationQuestions` / `validation_questions`, `validationPlan` / `validation_plan`, `decisionQuestions`, `questionsToAnswer`, `followupQuestions`), and assumption-test arrays (`assumptionTests` / `assumption_tests`, `riskiestAssumptions` / `riskiest_assumptions`, `risksToTest` / `risks_to_test`) that default into Validate next. Direct candidate objects may use reader-friendly prose keys like `text`, `content`, `summary`, `step`, `task`, `instruction`, `why_it_matters`, `evidence_to_collect`, `first_proof_step`, `green_flag`, and `red_flag`; Ranker normalizes those into title, value, evidence, next-step, success, and kill-signal fields so Scattermind does not have to rename paid Concept Map language into software-feature jargon. If a paid Concept Map has no labelled Build Order/action threads but does include `closing_note` / `closingNote` plus decision questions, Ranker treats the closing note as the active 48-hour Do first move and keeps the questions in Validate next. This lets Scattermind pass reader-friendly Concept Map copy without renaming everything into software-feature language.
|
||||||
|
|
||||||
Lane safety note: explicit Scattermind `defer` / `park` hints are hard rails, not mild suggestions. Source `nonGoals` / `avoid` guardrails are also hard enough to keep conflicting candidates out of Do first / Validate next even when their local scoring hints look attractive; soft guardrail language such as “this is not a dashboard” or “keep auth/billing/workspaces out until proof” is promoted into non-goals, not merely background context. Ranker now also infers a light `ideaRoute` from the Scattermind source text and carries it in `input.decisionContext` / `handoff.decisionContext`; for game concepts it automatically adds anti-SaaS non-goals so account/dashboard/workspace/subscription candidates cannot win a playable-prototype build order just because they were phrased loudly. The result will mark the lane source as `source-non-goal` so the handoff can explain that the candidate needs guardrail resolution before active work. Handoff `source.requiresSourceTrace` is true only when a real source artifact/title is present; plain idea-only ranking still warns about a missing artifact ID when it carries prompt provenance, but it does not spam source-section/evidence warnings meant for Scattermind artifacts. Handoff `readiness` now gives downstream bridge consumers a deterministic gate: `ready`, `usable-with-warnings`, `needs-source-context`, or `blocked`, with blockers and next checks for missing evidence, source trace, duplicate IDs, or active source-non-goal conflicts. Handoff `activeSlice` (`ranker-active-slice-v1`) is the compact machine-readable continuation unit: one active item, its proof/evidence/success/kill signals, source anchor, held-back items, readiness status, and the rule that only this slice is build-ready. For tired first-screen users, `brief.decisionReceipt` repeats the one active move, first proof step, evidence question, held-back items, source anchor, and the handoff rule that only Do first is active; use it as the compact result strip before showing the full lane board. For low-friction handoff, `/api/rank-feedback` also detects a raw Scattermind/Concept Map JSON object pasted into `idea`, `ideaText`, `optionsText`, or wrapper keys such as `payload`; it expands that object before ranking and reports `input.embeddedPayloadSource` so the public form can accept copy/paste exports without a custom import screen. Exact free Snapshot JSON (`working_name`, `restated_idea`, `lenses.shape`, `questions_to_sit_with`, `reference_code`) is rankable too: Ranker derives a manual proof active slice plus evidence questions, carrying the Snapshot reference code/title into provenance so a Snapshot-only handoff does not need a paid Concept Map before it can produce a useful build order. If a Concept Map only carries `questions_to_sit_with` / `questionsToSitWith` / `openQuestions` and no explicit build-order lanes or action threads, Ranker converts those questions into Validate-next evidence actions with source trace instead of pretending they are software features.
|
Lane safety note: explicit Scattermind `defer` / `park` hints are hard rails, not mild suggestions. Source `nonGoals` / `avoid` guardrails are also hard enough to keep conflicting candidates out of Do first / Validate next even when their local scoring hints look attractive; soft guardrail language such as “this is not a dashboard” or “keep auth/billing/workspaces out until proof” is promoted into non-goals, not merely background context. Ranker now also infers a light `ideaRoute` from the Scattermind source text and carries it in `input.decisionContext` / `handoff.decisionContext`; for game concepts it automatically adds anti-SaaS non-goals so account/dashboard/workspace/subscription candidates cannot win a playable-prototype build order just because they were phrased loudly. The result will mark the lane source as `source-non-goal` so the handoff can explain that the candidate needs guardrail resolution before active work. Handoff `source.requiresSourceTrace` is true only when a real source artifact/title is present; plain idea-only ranking still warns about a missing artifact ID when it carries prompt provenance, but it does not spam source-section/evidence warnings meant for Scattermind artifacts. Handoff `readiness` now gives downstream bridge consumers a deterministic gate: `ready`, `usable-with-warnings`, `needs-source-context`, or `blocked`, with blockers and next checks for missing evidence, source trace, duplicate IDs, or active source-non-goal conflicts. Handoff `activeSlice` (`ranker-active-slice-v1`) is the compact machine-readable continuation unit: one active item, its proof/evidence/success/kill signals, source anchor, held-back items, readiness status, and the rule that only this slice is build-ready. For tired first-screen users, `brief.decisionReceipt` repeats the one active move, first proof step, evidence question, held-back items, source anchor, and the handoff rule that only Do first is active; use it as the compact result strip before showing the full lane board. For low-friction handoff, `/api/rank-feedback` also detects a raw Scattermind/Concept Map JSON object pasted into `idea`, `ideaText`, `optionsText`, or wrapper keys such as `payload`; it expands that object before ranking and reports `input.embeddedPayloadSource` so the public form can accept copy/paste exports without a custom import screen. Exact free Snapshot JSON (`working_name`, `restated_idea`, `lenses.shape`, `questions_to_sit_with`, `reference_code`) is rankable too: Ranker derives a manual proof active slice plus evidence questions, carrying the Snapshot reference code/title into provenance so a Snapshot-only handoff does not need a paid Concept Map before it can produce a useful build order. If a Concept Map only carries `questions_to_sit_with` / `questionsToSitWith` / `openQuestions` and no explicit build-order lanes or action threads, Ranker converts those questions into Validate-next evidence actions with source trace instead of pretending they are software features.
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -62,10 +62,10 @@ function parsePastedJsonPayload(value) {
|
|||||||
const parsed = JSON.parse(jsonText);
|
const parsed = JSON.parse(jsonText);
|
||||||
const looksLikeBridgePayload = parsed && typeof parsed === 'object' && !Array.isArray(parsed) && (
|
const looksLikeBridgePayload = parsed && typeof parsed === 'object' && !Array.isArray(parsed) && (
|
||||||
parsed.schema || parsed.featureSet || parsed.feature_set || parsed.candidateSet || parsed.candidate_set || parsed.candidateFeatureSet || parsed.candidate_feature_set || parsed.rankReadyFeatureSet || parsed.rank_ready_feature_set
|
parsed.schema || parsed.featureSet || parsed.feature_set || parsed.candidateSet || parsed.candidate_set || parsed.candidateFeatureSet || parsed.candidate_feature_set || parsed.rankReadyFeatureSet || parsed.rank_ready_feature_set
|
||||||
|| parsed.snapshot || parsed.conceptMap || parsed.concept_map || parsed.buildOrder || parsed.build_order || parsed.rankedBuildOrder || parsed.ranked_build_order || parsed.rankReadyBuildOrder || parsed.rank_ready_build_order || parsed.lenses
|
|| parsed.snapshot || parsed.conceptMap || parsed.concept_map || parsed.buildOrder || parsed.build_order || parsed.firstWeekBuildOrder || parsed.first_week_build_order || parsed.rankedBuildOrder || parsed.ranked_build_order || parsed.rankReadyBuildOrder || parsed.rank_ready_build_order || parsed.lenses
|
||||||
|| parsed.payload || parsed.rankPayload || parsed.rank_payload || parsed.scattermindPayload || parsed.scattermind_payload || parsed.conceptMapJson || parsed.rankerInput || parsed.ranker_input || parsed.rankerHandoff || parsed.ranker_handoff || parsed.rankerBridge || parsed.ranker_bridge || parsed.rankReady || parsed.rank_ready || parsed.bridge || parsed.bridgePayload || parsed.bridge_payload || parsed.continuation || parsed.continuationPlan || parsed.continuation_plan
|
|| parsed.payload || parsed.rankPayload || parsed.rank_payload || parsed.scattermindPayload || parsed.scattermind_payload || parsed.conceptMapJson || parsed.rankerInput || parsed.ranker_input || parsed.rankerHandoff || parsed.ranker_handoff || parsed.rankerBridge || parsed.ranker_bridge || parsed.rankReady || parsed.rank_ready || parsed.bridge || parsed.bridgePayload || parsed.bridge_payload || parsed.continuation || parsed.continuationPlan || parsed.continuation_plan
|
||||||
|| parsed.concept_map_json || parsed.fullReadingJson || parsed.full_reading_json || parsed.fullReading || parsed.full_reading
|
|| parsed.concept_map_json || parsed.fullReadingJson || parsed.full_reading_json || parsed.fullReading || parsed.full_reading
|
||||||
|| parsed.glimpseJson || parsed.glimpse_json || parsed.snapshotJson || parsed.snapshot_json || parsed.buildOrderPreview || parsed.build_order_preview || parsed.rankedBuildOrder || parsed.ranked_build_order || parsed.rankReadyBuildOrder || parsed.rank_ready_build_order
|
|| parsed.glimpseJson || parsed.glimpse_json || parsed.snapshotJson || parsed.snapshot_json || parsed.buildOrderPreview || parsed.build_order_preview || parsed.firstWeekBuildOrder || parsed.first_week_build_order || parsed.rankedBuildOrder || parsed.ranked_build_order || parsed.rankReadyBuildOrder || parsed.rank_ready_build_order
|
||||||
|| parsed.reference_code || parsed.referenceCode || parsed.artifactId || parsed.sourceArtifactId || parsed.source_artifact_id
|
|| parsed.reference_code || parsed.referenceCode || parsed.artifactId || parsed.sourceArtifactId || parsed.source_artifact_id
|
||||||
|| parsed.ideaText || parsed.idea_text || parsed.originalPrompt || parsed.original_prompt || parsed.sourceSummary || parsed.source_summary || parsed.opening_reflection || parsed.restated_idea
|
|| parsed.ideaText || parsed.idea_text || parsed.originalPrompt || parsed.original_prompt || parsed.sourceSummary || parsed.source_summary || parsed.opening_reflection || parsed.restated_idea
|
||||||
|| Array.isArray(parsed.features) || Array.isArray(parsed.actions) || Array.isArray(parsed.candidates)
|
|| Array.isArray(parsed.features) || Array.isArray(parsed.actions) || Array.isArray(parsed.candidates)
|
||||||
|
|||||||
@@ -2520,6 +2520,37 @@ try {
|
|||||||
assert.equal(rankedBuildOrderAlias.handoff.readiness.status, 'ready');
|
assert.equal(rankedBuildOrderAlias.handoff.readiness.status, 'ready');
|
||||||
assert.deepEqual(rankedBuildOrderAlias.handoff.warnings, []);
|
assert.deepEqual(rankedBuildOrderAlias.handoff.warnings, []);
|
||||||
|
|
||||||
|
const firstWeekBuildOrderAliasResponse = await fetch(`${base}/api/rank-feedback`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
sourceName: 'Scattermind',
|
||||||
|
referenceCode: 'SM-FIRST-WEEK-BUILD-ORDER-1',
|
||||||
|
working_name: 'First week Build Order export',
|
||||||
|
ideaText: 'Scattermind exported the paid continuation as a first_week_build_order object because the prompt names a first-week build order.',
|
||||||
|
context: 'Solo builder. Manual proof first. Avoid account dashboards and saved workspaces until one user acts.',
|
||||||
|
mode: 'mvp',
|
||||||
|
conceptMap: {
|
||||||
|
first_week_build_order: {
|
||||||
|
build_first: [{ id: 'first-week-active', action: 'First-week manual proof slice', evidence_needed: 'Can the first_week_build_order alias still produce one active move?', source_item_id: 'first-week-1', source_title: 'First-week Build Order', ranker_hints: { value: 9, effort: 2, confidence: 8, urgency: 8, risk: 2 } }],
|
||||||
|
test_manually: [{ id: 'first-week-user-check', action: 'First-week user check', evidence_needed: 'Can one tired user explain the first step?', source_item_id: 'first-week-2', source_title: 'First-week Build Order' }],
|
||||||
|
defer: [{ id: 'first-week-export-polish', action: 'First-week export polish', evidence_needed: 'Useful after the proof works.', source_item_id: 'first-week-3', source_title: 'First-week Build Order' }],
|
||||||
|
probably_noise: [{ id: 'first-week-dashboard', action: 'First-week account dashboard', evidence_needed: 'Not before proof.', source_item_id: 'first-week-4', source_title: 'First-week Build Order' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
assert.equal(firstWeekBuildOrderAliasResponse.status, 200);
|
||||||
|
const firstWeekBuildOrderAlias = await firstWeekBuildOrderAliasResponse.json();
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.input.optionCount, 4, 'first_week_build_order should be accepted as a laned Build Order object');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.ranked[0].id, 'first-week-active');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.ranked[0].provenance.sourceSection, 'concept-map.firstWeekBuildOrder.doFirst');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.ranked.find(item => item.id === 'first-week-user-check').lane.id, 'test');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.ranked.find(item => item.id === 'first-week-export-polish').lane.id, 'defer');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.ranked.find(item => item.id === 'first-week-dashboard').lane.id, 'park');
|
||||||
|
assert.equal(firstWeekBuildOrderAlias.handoff.readiness.status, 'ready');
|
||||||
|
assert.deepEqual(firstWeekBuildOrderAlias.handoff.warnings, []);
|
||||||
|
|
||||||
|
|
||||||
const proofPlanAliasResponse = await fetch(`${base}/api/rank-feedback`, {
|
const proofPlanAliasResponse = await fetch(`${base}/api/rank-feedback`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
|||||||
@@ -563,6 +563,8 @@ function looksLikeRankPayload(value = {}) {
|
|||||||
|| value.glimpse
|
|| value.glimpse
|
||||||
|| value.buildOrder
|
|| value.buildOrder
|
||||||
|| value.build_order
|
|| value.build_order
|
||||||
|
|| value.firstWeekBuildOrder
|
||||||
|
|| value.first_week_build_order
|
||||||
|| value.rankedBuildOrder
|
|| value.rankedBuildOrder
|
||||||
|| value.ranked_build_order
|
|| value.ranked_build_order
|
||||||
|| value.lenses
|
|| value.lenses
|
||||||
@@ -589,6 +591,8 @@ function looksLikeRankPayload(value = {}) {
|
|||||||
|| value.concept_map_json
|
|| value.concept_map_json
|
||||||
|| value.buildOrderPreview
|
|| value.buildOrderPreview
|
||||||
|| value.build_order_preview
|
|| value.build_order_preview
|
||||||
|
|| value.firstWeekBuildOrder
|
||||||
|
|| value.first_week_build_order
|
||||||
|| value.rankedBuildOrder
|
|| value.rankedBuildOrder
|
||||||
|| value.ranked_build_order
|
|| value.ranked_build_order
|
||||||
|| value.rankReadyBuildOrder
|
|| value.rankReadyBuildOrder
|
||||||
@@ -1561,22 +1565,27 @@ function optionsFromBody(body = {}) {
|
|||||||
...conceptMapCandidateGroup,
|
...conceptMapCandidateGroup,
|
||||||
...buildOrderSectionGroup(body.buildOrder || body.build_order, 'buildOrder'),
|
...buildOrderSectionGroup(body.buildOrder || body.build_order, 'buildOrder'),
|
||||||
...buildOrderSectionGroup(body.buildOrderPreview || body.build_order_preview, 'buildOrderPreview'),
|
...buildOrderSectionGroup(body.buildOrderPreview || body.build_order_preview, 'buildOrderPreview'),
|
||||||
|
...buildOrderSectionGroup(body.firstWeekBuildOrder || body.first_week_build_order, 'firstWeekBuildOrder'),
|
||||||
...buildOrderSectionGroup(body.rankedBuildOrder || body.ranked_build_order, 'rankedBuildOrder'),
|
...buildOrderSectionGroup(body.rankedBuildOrder || body.ranked_build_order, 'rankedBuildOrder'),
|
||||||
...buildOrderSectionGroup(body.rankReadyBuildOrder || body.rank_ready_build_order, 'rankReadyBuildOrder'),
|
...buildOrderSectionGroup(body.rankReadyBuildOrder || body.rank_ready_build_order, 'rankReadyBuildOrder'),
|
||||||
...buildOrderSectionGroup(envelope.buildOrder || envelope.build_order, 'ranker-input.buildOrder'),
|
...buildOrderSectionGroup(envelope.buildOrder || envelope.build_order, 'ranker-input.buildOrder'),
|
||||||
...buildOrderSectionGroup(envelope.buildOrderPreview || envelope.build_order_preview, 'ranker-input.buildOrderPreview'),
|
...buildOrderSectionGroup(envelope.buildOrderPreview || envelope.build_order_preview, 'ranker-input.buildOrderPreview'),
|
||||||
|
...buildOrderSectionGroup(envelope.firstWeekBuildOrder || envelope.first_week_build_order, 'ranker-input.firstWeekBuildOrder'),
|
||||||
...buildOrderSectionGroup(envelope.rankedBuildOrder || envelope.ranked_build_order, 'ranker-input.rankedBuildOrder'),
|
...buildOrderSectionGroup(envelope.rankedBuildOrder || envelope.ranked_build_order, 'ranker-input.rankedBuildOrder'),
|
||||||
...buildOrderSectionGroup(envelope.rankReadyBuildOrder || envelope.rank_ready_build_order, 'ranker-input.rankReadyBuildOrder'),
|
...buildOrderSectionGroup(envelope.rankReadyBuildOrder || envelope.rank_ready_build_order, 'ranker-input.rankReadyBuildOrder'),
|
||||||
...buildOrderSectionGroup(featureSet.buildOrder || featureSet.build_order, 'feature-set.buildOrder'),
|
...buildOrderSectionGroup(featureSet.buildOrder || featureSet.build_order, 'feature-set.buildOrder'),
|
||||||
...buildOrderSectionGroup(featureSet.buildOrderPreview || featureSet.build_order_preview, 'feature-set.buildOrderPreview'),
|
...buildOrderSectionGroup(featureSet.buildOrderPreview || featureSet.build_order_preview, 'feature-set.buildOrderPreview'),
|
||||||
|
...buildOrderSectionGroup(featureSet.firstWeekBuildOrder || featureSet.first_week_build_order, 'feature-set.firstWeekBuildOrder'),
|
||||||
...buildOrderSectionGroup(featureSet.rankedBuildOrder || featureSet.ranked_build_order, 'feature-set.rankedBuildOrder'),
|
...buildOrderSectionGroup(featureSet.rankedBuildOrder || featureSet.ranked_build_order, 'feature-set.rankedBuildOrder'),
|
||||||
...buildOrderSectionGroup(featureSet.rankReadyBuildOrder || featureSet.rank_ready_build_order, 'feature-set.rankReadyBuildOrder'),
|
...buildOrderSectionGroup(featureSet.rankReadyBuildOrder || featureSet.rank_ready_build_order, 'feature-set.rankReadyBuildOrder'),
|
||||||
...buildOrderSectionGroup(snapshot.buildOrder || snapshot.build_order, 'snapshot.buildOrder'),
|
...buildOrderSectionGroup(snapshot.buildOrder || snapshot.build_order, 'snapshot.buildOrder'),
|
||||||
...buildOrderSectionGroup(snapshot.buildOrderPreview || snapshot.build_order_preview, 'snapshot.buildOrderPreview'),
|
...buildOrderSectionGroup(snapshot.buildOrderPreview || snapshot.build_order_preview, 'snapshot.buildOrderPreview'),
|
||||||
|
...buildOrderSectionGroup(snapshot.firstWeekBuildOrder || snapshot.first_week_build_order, 'snapshot.firstWeekBuildOrder'),
|
||||||
...buildOrderSectionGroup(snapshot.rankedBuildOrder || snapshot.ranked_build_order, 'snapshot.rankedBuildOrder'),
|
...buildOrderSectionGroup(snapshot.rankedBuildOrder || snapshot.ranked_build_order, 'snapshot.rankedBuildOrder'),
|
||||||
...buildOrderSectionGroup(snapshot.rankReadyBuildOrder || snapshot.rank_ready_build_order, 'snapshot.rankReadyBuildOrder'),
|
...buildOrderSectionGroup(snapshot.rankReadyBuildOrder || snapshot.rank_ready_build_order, 'snapshot.rankReadyBuildOrder'),
|
||||||
...buildOrderSectionGroup(conceptMap.buildOrder || conceptMap.build_order, 'concept-map.buildOrder'),
|
...buildOrderSectionGroup(conceptMap.buildOrder || conceptMap.build_order, 'concept-map.buildOrder'),
|
||||||
...buildOrderSectionGroup(conceptMap.buildOrderPreview || conceptMap.build_order_preview, 'concept-map.buildOrderPreview'),
|
...buildOrderSectionGroup(conceptMap.buildOrderPreview || conceptMap.build_order_preview, 'concept-map.buildOrderPreview'),
|
||||||
|
...buildOrderSectionGroup(conceptMap.firstWeekBuildOrder || conceptMap.first_week_build_order, 'concept-map.firstWeekBuildOrder'),
|
||||||
...buildOrderSectionGroup(conceptMap.rankedBuildOrder || conceptMap.ranked_build_order, 'concept-map.rankedBuildOrder'),
|
...buildOrderSectionGroup(conceptMap.rankedBuildOrder || conceptMap.ranked_build_order, 'concept-map.rankedBuildOrder'),
|
||||||
...buildOrderSectionGroup(conceptMap.rankReadyBuildOrder || conceptMap.rank_ready_build_order, 'concept-map.rankReadyBuildOrder'),
|
...buildOrderSectionGroup(conceptMap.rankReadyBuildOrder || conceptMap.rank_ready_build_order, 'concept-map.rankReadyBuildOrder'),
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user