GG Forge runs Collaboration from source 8f348daf and has been carrying two local patches:
A bounded STRING custom field (maxLength set on the definition) accepted writes longer than its maximum. QQQ's default ValueTooLongBehavior is PASS_THROUGH, and CustomFieldsProvider set maxLength without a behavior, so the over-long value went through unchecked.
Help content stored in helpContent for a section created by publishing a custom-field definition (for example table:document;section:customFields) did not appear until restart: the runtime metadata overlay created the section after startup help loading had already run.
The fix
CustomFieldsProvider.field: a STRING field with a maxLength carries ValueTooLongBehavior.ERROR, so the write is rejected with a field error and the stored value is preserved.
FeatureSettingsCustomizer.refresh: after RuntimeMetaDataOverlay.refresh (immediately, or inside the after-commit callback of the originating transaction) call QInstanceHelpContentManager.reloadHelpContent(instance) so persisted help binds to the newly created sections and fields.
CHANGELOG entries under Unreleased / Fixed.
Both APIs exist in the pinned qqq-bom-pom 4.1.0-RC.15. Adaptation from the carried patch: inline fully-qualified names were replaced with imports; no logic changes.
Test evidence
Two regressions in CustomFieldsTest:
publishedStringRejectsValuesBeyondItsMaximumLength: a 5-character bound accepts valid, rejects too long with errors, and the persisted value is still valid.
publishedSectionReceivesStoredHelp: a helpContent row keyed to table:document;section:customFields is present on the section after publishing a definition.
./mvnw verify on this branch (Windows, JDK 21, no Docker needed by any suite): Checkstyle clean, Tests run: 164, Failures: 0, Errors: 0, Skipped: 0, JaCoCo All coverage checks have been met, BUILD SUCCESS. CustomFieldsTest ran 10 tests including both new ones.
Carried locally by GG Forge as collaboration-custom-fields.patch (supersedes collaboration-field-length.patch). Once released, Forge can drop the 0.1.0-forge.8f348daf324d-* development builds for this fix.
## What Forge observed
GG Forge runs Collaboration from source `8f348daf` and has been carrying two local patches:
1. A bounded STRING custom field (`maxLength` set on the definition) accepted writes longer than its maximum. QQQ's default `ValueTooLongBehavior` is `PASS_THROUGH`, and `CustomFieldsProvider` set `maxLength` without a behavior, so the over-long value went through unchecked.
2. Help content stored in `helpContent` for a section created by publishing a custom-field definition (for example `table:document;section:customFields`) did not appear until restart: the runtime metadata overlay created the section after startup help loading had already run.
## The fix
- `CustomFieldsProvider.field`: a STRING field with a `maxLength` carries `ValueTooLongBehavior.ERROR`, so the write is rejected with a field error and the stored value is preserved.
- `FeatureSettingsCustomizer.refresh`: after `RuntimeMetaDataOverlay.refresh` (immediately, or inside the after-commit callback of the originating transaction) call `QInstanceHelpContentManager.reloadHelpContent(instance)` so persisted help binds to the newly created sections and fields.
- CHANGELOG entries under Unreleased / Fixed.
Both APIs exist in the pinned `qqq-bom-pom 4.1.0-RC.15`. Adaptation from the carried patch: inline fully-qualified names were replaced with imports; no logic changes.
## Test evidence
Two regressions in `CustomFieldsTest`:
- `publishedStringRejectsValuesBeyondItsMaximumLength`: a 5-character bound accepts `valid`, rejects `too long` with errors, and the persisted value is still `valid`.
- `publishedSectionReceivesStoredHelp`: a `helpContent` row keyed to `table:document;section:customFields` is present on the section after publishing a definition.
`./mvnw verify` on this branch (Windows, JDK 21, no Docker needed by any suite): Checkstyle clean, `Tests run: 164, Failures: 0, Errors: 0, Skipped: 0`, JaCoCo `All coverage checks have been met`, BUILD SUCCESS. `CustomFieldsTest` ran 10 tests including both new ones.
Carried locally by GG Forge as `collaboration-custom-fields.patch` (supersedes `collaboration-field-length.patch`). Once released, Forge can drop the `0.1.0-forge.8f348daf324d-*` development builds for this fix.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Bounded STRING custom fields now carry QQQ's native ValueTooLongBehavior.ERROR,
so a write longer than maxLength is rejected with a field error and the stored
value is preserved. The QQQ default is PASS_THROUGH, which let over-long values
through unchecked.
After the runtime metadata overlay refreshes (immediately, or in the after-commit
callback of the originating transaction), persisted help content is reloaded so
sections and fields created by publishing a definition receive their stored
helpContent rows without a restart.
Two CustomFieldsTest regressions cover invalid-write preservation and stored
help on a newly published section. Carried locally by GG Forge as
collaboration-custom-fields.patch (supersedes collaboration-field-length.patch).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What Forge observed
GG Forge runs Collaboration from source
8f348dafand has been carrying two local patches:maxLengthset on the definition) accepted writes longer than its maximum. QQQ's defaultValueTooLongBehaviorisPASS_THROUGH, andCustomFieldsProvidersetmaxLengthwithout a behavior, so the over-long value went through unchecked.helpContentfor a section created by publishing a custom-field definition (for exampletable:document;section:customFields) did not appear until restart: the runtime metadata overlay created the section after startup help loading had already run.The fix
CustomFieldsProvider.field: a STRING field with amaxLengthcarriesValueTooLongBehavior.ERROR, so the write is rejected with a field error and the stored value is preserved.FeatureSettingsCustomizer.refresh: afterRuntimeMetaDataOverlay.refresh(immediately, or inside the after-commit callback of the originating transaction) callQInstanceHelpContentManager.reloadHelpContent(instance)so persisted help binds to the newly created sections and fields.Both APIs exist in the pinned
qqq-bom-pom 4.1.0-RC.15. Adaptation from the carried patch: inline fully-qualified names were replaced with imports; no logic changes.Test evidence
Two regressions in
CustomFieldsTest:publishedStringRejectsValuesBeyondItsMaximumLength: a 5-character bound acceptsvalid, rejectstoo longwith errors, and the persisted value is stillvalid.publishedSectionReceivesStoredHelp: ahelpContentrow keyed totable:document;section:customFieldsis present on the section after publishing a definition../mvnw verifyon this branch (Windows, JDK 21, no Docker needed by any suite): Checkstyle clean,Tests run: 164, Failures: 0, Errors: 0, Skipped: 0, JaCoCoAll coverage checks have been met, BUILD SUCCESS.CustomFieldsTestran 10 tests including both new ones.Carried locally by GG Forge as
collaboration-custom-fields.patch(supersedescollaboration-field-length.patch). Once released, Forge can drop the0.1.0-forge.8f348daf324d-*development builds for this fix.🤖 Generated with Claude Code