{"record":{"id":"f9de264c90556b8f","repo":"hcengineering/platform","slug":"invalid-duration-format","errorCode":null,"errorMessage":"Invalid duration format","messagePattern":"Invalid duration format","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugins/card-resources/src/components/navigator-next/NavigatorCardsSection.svelte","lineNumber":52,"sourceCode":"  export let selectedCard: Ref<Card> | undefined = undefined\n\n  const cardsQuery = createQuery()\n  const notificationContextsQuery = createNotificationContextsQuery()\n\n  let cards: Card[] = []\n  let contextByCard = new Map<Ref<Card>, NotificationContext>()\n  let isLoading: boolean = true\n  let hasMore = false\n\n  let sort: 'alphabetical' | 'recent' | undefined\n  $: sort = config.specialSorting?.[type._id] ?? config.defaultSorting ?? 'alphabetical'\n\n  let limit = config.limit\n\n  $: ids = (config.labelFilter?.length ?? 0) > 0 ? labels.map((it) => it.cardId) : undefined\n\n  function parseLookbackDuration (input: string): Timestamp {\n    if (input.length < 2) throw new Error('Invalid duration format')\n\n    const unit = input.slice(-1)\n    const numberPart = input.slice(0, -1)\n    const value = Number(numberPart)\n\n    if (isNaN(value) || value <= 0) throw new Error('Invalid numeric value')\n\n    const multipliers: Record<string, number> = {\n      m: 60 * 1000,\n      h: 60 * 60 * 1000,\n      d: 24 * 60 * 60 * 1000,\n      w: 7 * 24 * 60 * 60 * 1000\n    }\n\n    const multiplier = multipliers[unit]\n\n    if (!multiplier) throw new Error(`Unsupported time unit: ${unit}`)\n","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/plugins/card-resources/src/components/navigator-next/NavigatorCardsSection.svelte#L34-L70","documentation":"parseLookbackDuration parses a user-supplied duration string (e.g. \"7d\") used to limit the navigator's card lookback window. It throws 'Invalid duration format' when the input is shorter than 2 characters, since it requires at least one numeric character plus a unit suffix. It is an input-format validation error.","triggerScenarios":"Configuring the navigator section with a lookback duration like \"\", \"d\", or \"7\" — a string with length < 2.","commonSituations":"Mistyped configuration values (empty field, unit only), config keys pasted incompletely, or locale-specific entries that drop the number part.","solutions":["Provide a full duration string with number and unit, e.g. \"7d\", \"24h\", \"30m\".","Trim whitespace and re-check the stored config for the lookback key.","Add UI validation that rejects duration strings shorter than 2 chars before saving."],"exampleFix":"// before\nconfig.lookback = 'd'\n// after\nconfig.lookback = '7d'","handlingStrategy":"validation","validationCode":"const DURATION_RE = /^\\d+[mhdw]$/\nif (!DURATION_RE.test(lookback)) { ui.notify('Use a duration like 7d, 24h, 30m'); return }","typeGuard":"function isDurationString(v: unknown): v is `${number}${'m'|'h'|'d'|'w'}` {\n  return typeof v === 'string' && /^\\d+[mhdw]$/.test(v)\n}","tryCatchPattern":"try {\n  const ts = parseLookbackDuration(config.lookback)\n} catch (e) {\n  if (e instanceof Error && e.message === 'Invalid duration format') {\n    config.lookback = '7d' // fall back to a safe default\n  } else throw e\n}","preventionTips":["Validate duration config fields with a regex before saving.","Use structured inputs (number + unit dropdown) instead of free-text duration strings.","Always store at least number+unit (length >= 2)."],"tags":["validation","configuration","parsing"],"backgroundTag":"invalid-duration-format","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}