# Timescale: demote no-time types and add generator strict mode

## Summary
Models classified as hypertables but lacking a direct time/date field are now demoted to dimensions by default during XML Schema generation. A new `timescale_strict` flag can enforce a hard failure instead. This prevents ingestion-time `TimeseriesTimestampMissingError` for metadata/container types.

## Motivation
- Real-world schemas (e.g., MTConnect 1.7) can score as hypertables via naming/list growth but lack a timestamp field (e.g., `HeaderType`, `AgentType`).
- Previously, such models inherited a Timescale base and later failed at ingestion due to missing `time`.

## What changed
- Heuristics: after scoring, types without a direct time/date attribute/element are demoted to `dimension` even if they meet the threshold. Leaf time-bearing descendants are still promoted. Explicit overrides remain respected.
- Generator API: `XmlSchemaDjangoModelGenerator` now accepts `timescale_overrides`, `timescale_config`, and `timescale_strict`.
  - `timescale_strict=True` raises on any hypertable without a direct time/date field (fail-fast for misclassification).

## Affected code
- `src/pydantic2django/django/timescale/heuristics.py` — add `has_direct_time_feature` and safety demotion; respect overrides.
- `src/pydantic2django/xmlschema/generator.py` — expose overrides/config/strict; enforce strict-time check.

## Tests
- `tests/timescale/test_heuristics_scoring.py::test_no_children_no_time_is_demoted_despite_name_and_list_growth`
- `tests/timescale/test_generator_timescale.py::test_generator_strict_mode_raises_when_hypertable_has_no_time_fields`

## Compatibility
- Default behavior is safer demotion; strict mode is opt-in.
- Explicit `timescale_overrides` are honored (combine with `timescale_strict` to surface mistakes early).

## References
- Ingestion timestamp mapping and contract docs updated: `docs/how_it_works/timescale.md`, `docs/how_it_works/ingestor_strict_and_contract.md`.
