# Bone Flow #031 TimeBox DOC Integration Specification v1.0.14

## 1. Binding baseline

- UI: UI-031 / TimeBox
- Canonical #031 Runtime: BoneTimeBox v1.0.9
- Canonical component package name: `BoneFlow_031_TimeBox_v1.0.9.zip`
- Runtime SHA-256: not asserted by this DOC package; an older v1.0.8 hash must not be reused
- HTML Functional Class: `bf-timebox`
- DOC: DOC-0031 / TOC-0031
- DOC source: `content/DOC-0031/{lang}.md`
- Formal #026 package: `BoneFlow_026_TimePicker_DOC_Integration_v1.0.6.zip`
- Formal #026 Runtime: BoneTimePicker v1.0.17
- #026 boundary: TimePicker UI, candidate generation/display policy, candidate Validation and selected-time RETURN
- #031 retains input/value/Validation/commit/Security/OUT/WAIT/FIFO/BLOCKED/#002 Delivery/QA/Completion
- Shared DOC runtime files and INDEX are outside this package's change scope
- `bone-timebox.js` and `bone-timepicker.js` are not bundled or overwritten

## 2. HTML Functional Class

`data-step` is the Bone Flow minute-step attribute. Allowed values are 1 / 5 / 10 / 15 / 30. `data-step` has priority over a compatibility native `step` attribute.

The Functional Class creates the installed BoneTimeBox Runtime and reapplies supported options through official `BoneTimeBox.setOptions()` when that API exists. Unsupported Runtime properties are not fabricated.

`showOutOfRangeHours` is a #026-only Property. #031 does not add `data-show-out-of-range-hours`, does not duplicate that Property, and does not alter the #026 default.

The HTML anchor is not the picker. DOC Live Samples must not use browser-native `input[type=time]` as the time-selection UI.

## 3. Formal #026-only rule

DOC-0031 must not create, copy, imitate, or own a TimePicker.

A TimePicker may be audited only through:

`BoneTimeBox.getTimePicker(timeBoxRoot)`

The result must be a formal BoneTimePicker v1.0.17 instance. `BoneTimePicker.isInstance()` is required for this DOC audit. Candidate columns must be resolved through the formal `BoneTimePicker.getPanel(picker)` API because #026 owns a body-portal Panel outside the picker root. A version mismatch, component mismatch, missing `isInstance`, false `isInstance`, missing `getPanel`, missing picker, or missing formal Panel is FAIL/UNRESOLVED. There is no querySelector/document-global fallback that accepts a `.bone-timepicker` or Panel lookalike as the formal dependency.

DOC Integration is read-only toward the #026 candidate DOM. It must not set candidate `hidden`, `display`, `aria-hidden`, `disabled`, or otherwise add/remove/reorder/rewrite candidates. Candidate generation/display/disabled state is #026 Runtime responsibility.

If the installed canonical BoneTimeBox does not expose the required formal picker access path, the Guide reports that mismatch explicitly; DOC code must not hide it by generating or rewriting another picker.

## 4. Minute step

The formal #026 visible minute candidate contract is generated by minute step only:

- step=1: 00..59
- step=5: 00 / 05 / 10 / 15 / 20 / 25 / 30 / 35 / 40 / 45 / 50 / 55
- step=10: 00 / 10 / 20 / 30 / 40 / 50
- step=15: 00 / 15 / 30 / 45
- step=30: 00 / 30

min/max does not remove boundary minute rows from the minute column. At a boundary hour, #026 Validation disables minute candidates that cannot produce an in-range time.

A strict step sample is MATCH only when all are true:

1. the formal #026 v1.0.17 instance is resolved;
2. #031 and #026 step/min/max options agree when #026 options are readable;
3. the actual minute column is resolved;
4. the visible minute sequence exactly matches the step sequence.

UNRESOLVED is not MATCH.

## 5. min / max hour policy and seconds

#031 does not own `showOutOfRangeHours`. For #031 formal samples the expected #026 policy is the #026 default:

`showOutOfRangeHours=false`

For `min=08:00` and `max=18:00`, the formal #026 hour DOM is exactly:

`08 / 09 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18`

`00`-`07` and `19`-`23` are absent from the hour candidate DOM. If the #026 option reports `showOutOfRangeHours=true`, strict #031 range audit reports a policy mismatch rather than hiding those rows in DOC code.

When seconds are enabled, the second column remains `00` through `59`. minute step never becomes a second step. At a min/max second boundary, #026 Validation disables invalid seconds; DOC Integration does not remove them.

24 and 24:00 are not normal hour candidates.

## 6. Preview / Guide parity

Normal Live Samples are independent and start from their own explicit HTML Functional Class attributes. They MUST NOT require an existing page Preview. This applies to basic, seconds, min/max, all five step samples, required, disabled, readonly, theme, position, and #026 RETURN.

Only `previewLinked` reads the existing TimeBox Preview. Preview resolution uses successful Runtime `getOptions(element)` probing and may additionally use `isInstance(element)` when that API exists. A Runtime CSS class name is not an identity requirement.

`previewLinked` compares mapped value/options and also requires strict formal #026 minute/range auditing. Runtime option equality by itself is insufficient. If Preview cannot be resolved, only `previewLinked` reports `TIMEBOX_DOC_PREVIEW_NOT_FOUND`; independent samples continue to render.

An interaction inside a Guide Live Sample performs read-only Runtime/picker audit. The #026 Panel returned by `getPanel()` is treated as part of that owning Guide sample even though the Panel is under `document.body`. It must not immediately resynchronize the sample from Preview and overwrite the value selected by the user in the Guide.

## 7. Test evidence classification

Package Node tests may use explicit contract doubles to test DOC logic. Such doubles are not evidence that the user's installed #026/#031 browser Runtime works. The bundled browser harness is labelled `CONTRACT HARNESS ONLY` for the same reason and must verify that DOC audit does not mutate candidate DOM.

Only a real installed localhost run with canonical BoneTimeBox v1.0.9 and formal BoneTimePicker v1.0.17 can close the Browser Runtime gate.

## 8. Installer consistency

All package-version checks derive from `$IntegrationVersion = "1.0.14"`. Prior #031 Functional Class / DOC Integration script references are removed before current references are appended, leaving exactly one of each.

The Installer must not overwrite completed Runtime dependencies, modify Shared DOC, modify INDEX, generate backup folders, use fetch/eval Runtime replacement, or introduce a dependency-installation pre-check as a new requirement.

## 9. Rejected DOC Integration history

DOC Integration v1.0.0 through v1.0.13 are non-canonical / not Completed. They must not be used as a completed/frozen baseline for #031 DOC Integration. v1.0.11 mutated formal #026 candidate visibility from DOC code. v1.0.12 coupled every Live Sample to Preview discovery and also assumed a `.bone-timebox` Runtime root class. v1.0.13 removed the class-name assumption but kept the all-samples Preview dependency; the user's real localhost still showed `TIMEBOX_DOC_PREVIEW_NOT_FOUND`. v1.0.14 restores independent explicit-attribute Live Samples, confines Preview dependency to `previewLinked` only, and resolves actual #026 candidate columns through formal `BoneTimePicker.getPanel()` instead of incorrectly searching the picker root.
