Repository navigation
Release: merge development into beta - #1318
Open
github-actions[bot] wants to merge 272 commits into
Open
github-actions[bot] wants to merge 272 commits into
github-actions[bot] wants to merge 272 commits into
Conversation
) 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.
…n after the fact (#1336)
…ab from board SkFunctiesRoadmap (#1337)
…ons and explains GEMMA terms in place (#1338)
…tion shares with them (#1339)
…s claim of its products (#1342)
…recatalogus (#1345) * docs(openspec): bring over the registrations from the previous Softwarecatalogus * docs(openspec): land-migrate-legacy no longer says spec none
…ration-registry to built (#1346)
…s and Services pages (#1347)
121 screens.md files generated with spec-screens.py from the coverage matrix's board column (design-system main). Supersedes #1282.
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
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
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
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
…fuse-slug-adoption
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
…mdb-export-import-context
…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
…gistration-id-binds-organisation
Assisted-by: ClaudeCode:claude-opus-5-5
… of the real code Assisted-by: ClaudeCode:claude-opus-5-5
…tackiq-delete-unused-services
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.