Skip to content

Release: merge development into beta - #1318

Open
github-actions[bot] wants to merge 272 commits into
betafrom
development
Open

github-actions[bot] wants to merge 272 commits into
betafrom
development

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

rubenvdlinde and others added 30 commits October 26, 2026 18:01
)

guzzlehttp/guzzle ^8.2 sat in require-dev, so every dev install put
Guzzle 8 in vendor/. When stackiq's autoloader registered first, the
server's IClientService got Guzzle 8's Client, which rejects the
CURLOPT_HTTP_VERSION option Nextcloud passes, and every outgoing HTTP
request on the instance failed.

Guzzle was only used by the KoppelingenGebruik integration test. Port
that test to symfony/http-client (already a runtime dependency) and drop
guzzlehttp/guzzle (and its psr7/promises) from the lock. Add a unit
guard that fails if composer.lock or the generated autoloader ever
contains guzzlehttp/* or GuzzleHttp\ again.

Assisted-by: ClaudeCode:claude-opus-5-5
#1335)

One requirement per property, each naming who provides it and how stackiq
inherits it. The lifecycle threshold and the Webhooks section drawn on
SkInstellingenUitwisseling get build tasks; both rows move to building.
…recatalogus (#1345)

* docs(openspec): bring over the registrations from the previous Softwarecatalogus

* docs(openspec): land-migrate-legacy no longer says spec none
121 screens.md files generated with spec-screens.py from the coverage
matrix's board column (design-system main). Supersedes #1282.
…registration-through-the-portal (#1349)

Both changes have every task ticked and their work on development. The
delta specs merge into specs/cmdb-export-import and the new
specs/organisation-registration; @SPEC citations in 8 code and test files
point at the merged spec or the archived change.
Exclude .claude/** (Claude Code skills and agent config, partly copied
from upstream) from the Sigrid analysis scope.

Assisted-by: ClaudeCode:claude-opus-5-5
…ns.md (#1352)

Assisted-by: ClaudeCode:claude-opus-5-5
print_report() took six values and printed the whole report. It now takes
a Comparison (both models, the results and the verdict) and the two paths,
and delegates to print_counts(), print_checks() and print_count_row().
print_json() takes the Comparison too. Output and exit codes are
unchanged: a golden run over 19 file pairs compares stdout, stderr and the
exit code byte for byte.

Assisted-by: ClaudeCode:claude-opus-5-5
…ort-steps

refactor(scripts): print the ArchiMate comparison report in small steps
Runs compare_archimate.py over ten fixture models in 28 argument sets,
each under three hash seeds, and compares exit code, stdout and stderr
with a recorded golden, case by case.

Assisted-by: ClaudeCode:claude-opus-5-5
parse_archimate() and compare() each did all sections in one body (62 and
123 lines, McCabe 20 and 16), and main() parsed, reported and exited in
32 lines. Parsing now reads each section through parse_section() and
parse_organizations(); compare() runs one check function per section
(model, elements, relationships, views, organizations, property
definitions) on shared helpers check(), count_check(), compare_ids() and
compare_distribution(). all_pass is derived from the results, which is
what the old flag tracked: it went false exactly when a FAIL was added.
main() loads each model through load_model(). Output and exit codes are
unchanged, golden-checked under three hash seeds.

Assisted-by: ClaudeCode:claude-opus-5-5
…ants

voorzieningenItems and amefItems built the same fixed lists of schema
rows inside the computed body on every evaluation (69 and 34 lines).
The lists are now VOORZIENINGEN_ITEMS and AMEF_ITEMS next to the
imports, and the computed properties return them.

Assisted-by: ClaudeCode:claude-opus-5-5
…steps

convertToUser() did the row lookup, the loading flag, the store call, the
row replacement, the refresh and the error handling in one 78-line body
(McCabe 11). It now calls claimContactRow(), createUserAccount() and
reportConversionError(), with contactRowFromApi() building the new row
and markLoading() setting the flag. Calls, toasts, log lines and the row
written are unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Seven utility modules each carried the same dataOf() (read the data bag of
an OR object envelope or plain data), complianceMatrix repeated
lifecyclePhase's resolveUuid(), and sbomVulnerabilityMatch repeated
vulnerabilityExposure's affectedModuleIds(). dataOf() is now exported from
lifecyclePhase next to resolveUuid() and imported everywhere;
complianceMatrix re-exports both, so its public API is unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
…ttings store

Twenty actions each fetched, threw `HTTP <status>: <statusText>` on a
non-ok answer and parsed the JSON in the same seven lines; they now call
fetchJson(url, options). The empty configuration and statistics were
written out in state(), initializeConfiguration() and reset(); they now
come from emptyConfiguration() and emptyStatistics(), fresh objects each
call. The user group and ArchiMate status writes that two actions each
repeated are applyUserGroups() and applyArchiMateStatus().

Assisted-by: ClaudeCode:claude-opus-5-5
rubenvdlinde and others added 30 commits November 3, 2026 18:24
fix(tests): keep the standalone Doctrine and Symfony stubs out of the CI bootstrap
…sync and creation

Nothing calls StackiqService::handleNewOrganization, handleOrganizationUpdate,
syncOrganizationWithOpenRegister or createOrganisationInOpenRegister: the
background job creates organisations through OrganisatieService, and no class
in lib/, src/ or appinfo/ references StackiqService at all. The 20 methods only
those reach (1,800 lines) go, and with them the never-read OrganizationHandler,
SymfonyEmailService, IUserSession, IUserManager and IGroupManager
dependencies.

That removes the creation path that called OpenRegister's createOrganisation()
without a slug check, which would have handed an existing organisation with the
same name to the caller, instead of fixing a path nothing uses. The golden test
for that path, its stub additions and the stale tests/OrganizationSyncTest.php
(outside every suite, against the old constructor) go too.

Assisted-by: ClaudeCode:claude-opus-5-5
…op the stale skipped test

Two golden cases from review, recorded on the old code: an Error from the
contact person service escapes handle() (catch (\Exception) does not catch it),
and an organisation update with schema id "01" matches schema 1.

StackiqEventListenerTest skipped all 12 of its cases in setUp(): they were
written against a constructor and service calls the listener no longer has.
The golden test covers the current dispatch, so the stale file goes.

Assisted-by: ClaudeCode:claude-opus-5-5
…ee sub-services

No class in lib/, src/ or appinfo/ uses StackiqService: it has no DI
registration in Application.php, no string service id, no route, background
job, repair step or occ command, and no other app in the workspace references
it. ApiClient, ConflictResolver and DataMapper under lib/Service/Stackiq/ were
extracted from it and are not referenced by anything either. All four go
(1,910 lines), with their tests (StackiqServiceDecompositionTest,
StackiqServiceOrganisationMapperTest, and the stale StackiqEventListenerTest that
skipped all of its cases), their phpstan and phpmd baseline entries, and a
parity evidence citation pointing at the deleted file.

REQ-DECOMP-004 now records the removal instead of the decomposition it asked
for.

Assisted-by: ClaudeCode:claude-opus-5-5
…e match

When an organisatie had no OpenRegister organisation yet, the sync looked one
up by the slug its name gives and, on a match, wrote the organisatie's uuid
onto that organisation: a registration named like an existing organisation
took it over. ContactPersonHandler did the same for a contact person's
organisation and then added the contact's user to it. The slug was also
computed without OpenRegister's 100-character cut, so a long name missed the
match and OpenRegister's own create overwrote the existing organisation.

Now a taken slug is refused on both paths: nothing is created or changed, a
neutral warning names the organisatie and the organisation holding the slug,
and the sync counts it under slugConflicts. OpenRegister's
OrganisationSlugConflictException (openregister#5462, a 409) is handled the
same way. OrganisationSlug computes the slug exactly as OpenRegister does.

`occ stackiq:organisation:link <organisatie> <organisation>` lets an
administrator link the two explicitly. It refuses an unknown organisatie or
organisation, an organisatie that already has one, and an organisation that
belongs to another organisatie.

Assisted-by: ClaudeCode:claude-opus-5-5
The sync checked the slug of the organisatie's own name and skipped an
empty or "Unknown" one, while OpenRegister receives "Organisation <first
8 characters of the id>" for an empty, "Unknown" or "0" name. That name
reached OpenRegister's create with no check. OrganisationSlug::nameFor()
now gives the name both the check and the create use.

A contact person whose organisation has no entity (refused slug, missing
object) no longer ends the event handler or the batch sync with an Error
on getActive(): both paths go through organisationIsActive().

occ stackiq:organisation:link refuses OpenRegister's default organisation,
names what keeps the old uuid, and links only after confirmation or
--yes. OrganisatieService drops two collaborators it never used.

Assisted-by: ClaudeCode:claude-opus-5-5
fix(archimate): link GEMMA standards, back-fill command, and split the SBOM import
…reation

refactor(organisations): delete StackiqService's unused organisation sync, fix the contact backup entity (REVIEW)
…-listener

refactor(listener): split the three object event handlers (REVIEW)
Each of the 101 CmdbExportImportService tests now also compares what it
left in the doubles (register, saves, archive states, transitions,
searches, log lines, address books, progress cache) with a recording made
on the current code. Run times, operation ids and generated uuids are
replaced by placeholders, so the recording is the same in every time zone.

Assisted-by: ClaudeCode:claude-opus-5-5
CmdbImportRun holds what every row of an import shares and CmdbImportRow
what one row found so far, so the row and reconciliation steps take one
or two arguments in place of up to seven. The behaviour is unchanged: the
golden recorded on the previous commit's code passes as it is.

Assisted-by: ClaudeCode:claude-opus-5-5
The wall clock can step back during a run, which logs a duration of -1.

Assisted-by: ClaudeCode:claude-opus-5-5
…llback-name-slug

# Conflicts:
#	appinfo/info.xml
#	tests/Unit/Service/OrganizationSyncEntityGoldenTest.php
Its constructor matched ReferencesAuditCommand's line for line, which gate
122 counts as a new clone.

Assisted-by: ClaudeCode:claude-opus-5-5
…slug

fix(organisations): check the slug of the name OpenRegister receives, link command safeguards (REVIEW)
…mport-context

refactor(cmdb): carry the import run and row in context objects (REVIEW)
…that is not its own

The sync links an organisatie to the OpenRegister organisation with its uuid. It
now does so only when that organisation is at least as new as the object, or when
an administrator linked the two, and counts the rest under organisationIdConflicts.
An anonymous organisation create carrying such a uuid is refused. The link command
refuses when OpenRegister cannot name its default organisation, records the link,
and can confirm a refused pair.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
… of the real code

Assisted-by: ClaudeCode:claude-opus-5-5
…e-unused-services

refactor(stackiq): delete the unreferenced StackiqService and its three sub-services
…arnings

test(cmdb): pin which mappings warn on an optional column
…uard

chore(quality): take the canonical coverage-guard
…d-binds-organisation

fix(organisations): check that an organisation belongs to the organisatie before linking (REVIEW)
…user-tests

test(contacts): replace the skipped contact and user tests with tests of the real code (REVIEW)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant