Skip to main content

Job galaxy — technical guide

This guide describes the legacy galaxy observed in PS Testing 2026 and the related code in the four local repositories. It is intended for implementation and support teams. The functional guide covers employee actions; configuration separates activation, source data, retained parameters and matching algorithms.

Architecture and responsibilities​

Verified in code: the standalone screen is served by Symfony/Twig in smartmobility-legacy. GoJS renders the map; legacy JavaScript handles title search, job details, route requests, skill/training panels, favorites and career plans.

ComponentResponsibility
GalaxyControllerPage bootstrap, route computation and job/persistence endpoints.
GalaxyServiceEligible job selection, family mapping, proximity groups/rings, AI candidates, score freshness and returned steps.
UserJobMatchingRepositoryReads the employee's saved job scores with visibility, locale and grade filters.
galaxy_canvas.html.twigSerializes map datasets, current-job context, route URLs and translated captions.
galaxy_search_job.js, galaxy_path.jsLocal search, route loading, browser response cache and panel rendering.
GalaxyProviderTenant validation selection, prompt construction, cache access and company LLM calls.
PathResponseProcessorProcesses AI output; invalid processing clears the corresponding path cache.
galaxy_career_planner.jsPlan selection, creation, horizon loading and target save UI.

Page load and map data​

The page action gates access with galaxy_module, gets the authenticated employee/current job, obtains map data and renders Default/galaxy.html.twig. The submenu separately disables Galaxy without an assigned job. The page action itself dereferences the current job, so a direct URL is not a substitute for meeting that prerequisite.

The repository reads user_job_matching joined to jobs, translations, status and skills. It requires the current user, matching locale, active jobs, is_hidden = 0 and visible status. It excludes the current job from the ordinary map query. With a non-zero grade it additionally selects positive grades between the current grade and current grade + 2; target preparation can add a target-grade ceiling. hide-job-grading clears the ordinary grade argument.

GalaxyService requires a company job field flagged job_family, applies family information, sorts by score and caps the resulting set at 400. High-proximity jobs are distributed into rings; medium/low jobs are grouped by family. The ring constants are radius 250, increment 150 and estimated label arc length 130 pixels. These are layout values, not matching probabilities.

The score classifier tests inclusive red bounds first, then inclusive orange bounds, otherwise green. Configured green bounds are loaded but not independently tested in this SQL CASE. Avoid overlapping intervals. Missing bounds default to 0–1, which can classify all ordinary scores as red because of evaluation order.

Title search runs in the browser against getAllJobs(), normalizes accents/case and performs a contains match. The script retains up to three clicked jobs in browser local storage under jobs_clicked_history. Clearing the field resets the panel/map; it does not delete favorites or plans.

Compute-path contract and lifecycle​

All paths below are relative to the internal-job mount /plateforme/internal-job. Use authenticated application requests; examples contain illustrative IDs only.

Method / suffixInput and outputFailure or side effect
GET /galaxyHTML, map bootstrap data, current-job context.Disabled module renders the forbidden template.
POST /galaxy/compute_pathForm field jid; JSON array of paths.401 unauthenticated; 400 missing current job or unresolved generated step; 404 unknown target or no path.
GET /galaxy/job_descriptionjid; JSON title, image, mission, family, bookmark and mentor data.400 no job found for an unknown job.
POST /galaxy/job_path_detailspath step array; JSON jobs ID/title mapping and plans job IDs found in the employee's plans.Empty input returns empty JSON; not independently exercised.
POST /galaxy/career_path_listuser; plan list and next plan type.Read for plan chooser.
POST /galaxy/create_new_pathuser, plan; empty JSON on success.Persists a new UserPlan; 400 for missing input or three-plan limit.
POST /galaxy/get_plan_targetsuser, plan; HTML choices.Excludes horizons already used by that plan.
POST /galaxy/add_job_career_pathuser, job, plan, target; empty JSON.Persists UserPlanJob; duplicate association is a no-op.
POST /galaxy/get_core_skillsjob; JSON coreSkills and maxrating.Related panel request.
POST /galaxy/get_skills_trainingsjob; JSON jobskills, sugestions, user, locale, maxsugestions, maxrating (spellings preserved).400 if job input missing.
POST /galaxy/check_sessionCurrent session; JSON galaxySession 0/1.Uses configured galaxy_timeout.

These are internal application contracts, not a complete supported public API. Retain the existing UI and inspect authorization before building another client.

POST /plateforme/internal-job/galaxy/compute_path
Content-Type: application/x-www-form-urlencoded

jid=12345

A simplified successful response shape, Verified in code, is:

[
{
"path_id": 0,
"slugs": ["openai_path", "shortest_path"],
"steps": [
{
"step_number": 0,
"job_source_id": 12300,
"job_target_id": 12345,
"job_source_title": "Current job",
"job_target_title": "Target job",
"step_score": 1,
"motivation_score": null,
"nb_skills_missing": 0,
"nb_level_skills_upgraded": -999,
"job_source_on_career_plan": 0,
"job_target_on_career_plan": 0,
"has_mobility": false
}
],
"mean_motivation_score": 0,
"mean_skills_learned": -999,
"explanation": "Generated explanation"
}
]

The fixed 1, 0, null and -999 fields are adapter defaults/sentinels in buildSteps and buildPaths; they are not measured skill gains or calibrated route quality. One returned AI route carries the shortest_path label without a demonstrated graph-optimality guarantee.

Candidate preparation uses jobs in the current or target job family, grading and target-proximity restrictions, sorted scores and a CSV limited to 400 jobs. If the target is not included, the CSV is empty and no provider result is requested. User skills for path context are filtered to source IS NULL and mastery below the company's maximum skill level. The provider then sends titled skills and mastery, rather than all raw user fields.

AI, validation and caching​

GalaxyProvider chooses a validation service by company: default validation returns true; a tenant-specific validator can impose additional rules. Prompt content includes company name, locale, job titles/families, candidate jobs and user skills. The company LLM provider is resolved through LLMProviderLocator; the code uses temperature 0.2 and a maximum output budget of 2000 tokens.

The provider hashes serialized messages and delegates caching to GalaxyCacheInterface, passing user, target, score and request type. checkForDataFreshness requests a path refresh when a current matching score exists and the stored cached score is absent/different. A null current score does not trigger refresh. This check alone does not establish that every profile/configuration change immediately invalidates all routes. The browser also keeps target responses in memory.

Returned path jobs are resolved by integer ID plus company, or title plus locale/company. The current job is skipped while steps are built. A job that cannot be resolved produces an error. PathProcessorException deletes the path cache; other provider failures return an empty result, which the controller maps to “No path found.” An LLM outage can therefore surface as a no-path response, rather than a distinct upstream error.

Persistence, permissions and privacy​

Favorites, plan creation and target attachment are explicit mutations, separate from route computation. The plan model caps plans at three. Plan creation and job attachment are not one atomic browser operation; an interruption can leave a plan without the intended job.

The reviewed controller methods accept identifiers from the client and return empty JSON in several no-op cases. A 200 response alone is not proof that a target was attached. Re-read the plan and verify the association. This documentation does not certify endpoint-wide tenant/ownership/CSRF enforcement: review the full firewall, voters, listeners and each mutation before reusing these internal routes outside their supplied UI.

The page includes a job-action CSRF form; the proximity-algorithm save uses and removes a dedicated CSRF token. Do not infer that these cover every galaxy endpoint. Keep authentication material, raw prompts, employee ratings and private job content out of customer-facing logs or troubleshooting captures. AI processing carries job/skill context to the configured provider; provider governance and retention need a separate deployment review.

Configuration, coexistence and runtime​

  • Legacy galaxy_module, grading visibility and proximity interval switches control page/data behavior. GalaxyApiParameters retains graph parameters, but the current compute action does not pass those parameters to the LLM provider.
  • The company settings template disables DS path computation and selects Live AI. A separate JOB_PROXIMITY_ALGORITHM configuration controls saved score computation; it must not be confused with path generation.
  • Nextgen back defines GALAXY_PATH_ALGORITHM and GalaxyAlgorithm (deprecated DS_API = 1, Live_AI = 2). No standalone galaxy route/component was found in the checked nextgen frontend, and the legacy compute action does not read that enum/key.
  • AIhub provides JPM user-score API adapters in src/matching/job_proximity/api/scores_router.py; its changelog records removal of an obsolete legacy Galaxy router. This is evidence of related scoring infrastructure, not proof of a live target-click call to AIhub.
  • Runtime dependencies include Symfony/Doctrine, job/family/translation and matching tables, company configuration, session handling, cache storage, GoJS and the company LLM provider. No new queue/event is dispatched by the reviewed compute action. Upstream score-refresh deployment and timings were not established.

Failure modes and observability​

SymptomInspect
Forbidden/disabled pageModule switch, assigned job, navigation and session timeout.
Configuration exceptionMissing job_family Smart Editor field.
Sparse map/searchSaved user scores, locale/status/grading filters, family links and cap.
HTTP 404 from computeTarget existence, candidate CSV, tenant validation, provider/cache/processing; “no path” can hide a provider exception.
HTTP 400 after AI outputStep ID/title resolution in the employee's company/locale.
Stale routeBrowser memory cache, saved proximity score and provider cache freshness.
Plan save appears successful but no targetRequired identifiers, plan ownership/availability, horizon choices, duplicate/no-op behavior; inspect persisted state.

GalaxyProvider logs company-provider chat failures; GalaxyController logs job-description retrieval at debug level; browser scripts log AJAX failures. These statements identify code paths, not a verified monitoring dashboard or service-level guarantee. Use sanitized diagnostics and request context without copying employee skills or credentials.

Full application window showing the legacy galaxy target and route

The selected target opens a job panel on the left and a highlighted route on the map. Read the target and route explanation, then open the job sheet if needed; the suggested route does not change your assigned job.

View full size

Evidence and limitations​

Observed in application: Chrome, PS Testing 2026, Jim Carter, 23 October 2026; successful target route and explanation, skill/training controls, plan chooser/new-plan form, empty title-search message and denied dedicated configuration access. No business mutations were submitted.

Verified in code: paths below are relative to each repository's root; they are source references, not deployed-version guarantees.

RepositoryInspected sources
smartmobility-legacysrc/Customer/InternalJobBundle/Controller/GalaxyController.php; Services/GalaxyService.php; Resources/config/routing.yml; Resources/views/Default/galaxy.html.twig; Resources/views/galaxy/galaxy_canvas.html.twig; Resources/public/js/galaxy/{galaxy_search_job,galaxy_path,galaxy_career_planner}.js (paths after the bundle share its prefix).
smartmobility-legacysrc/Repository/{UserJobMatchingRepository,GalaxyApiParametersRepository}.php; src/Entity/GalaxyApiParameters.php; src/Service/AI/Galaxy/GalaxyProvider.php; Validation/{ValidationProvider,DefaultValidation}.php; src/Main/ConfigBundle/Form/Type/GalaxyApiParametersType.php; src/Main/ConfigBundle/Entity/UserPlan.php.
smartmobility-legacysrc/Company/AccountBundle/Controller/SettingController.php; Resources/views/Setting/galaxy.html.twig and Resources/config/routing.yml under that bundle; config/routes.yaml; src/Main/SitemapBundle/{Enum/Customer/InternalJobTabsEnum,Service/Submenu/InternalJobSubmenuService}.php.
smartmobility-nextgen-backsrc/Domain/V1/Job/Enum/GalaxyAlgorithm.php; src/Domain/V2/Company/Enum/ConfigurationKey.php.
smartmobility-nextgen-frontSearch of src found no standalone galaxy implementation under the checked galaxy terminology. This is a search limitation, not proof no future replacement exists.
aihubsrc/matching/job_proximity/api/scores_router.py; docs/en/changelog.md (obsolete legacy Galaxy router removal).

Not verified: production/deployed commit equivalence, upstream score synchronization, actual tenant algorithm/threshold values, submitted persistence, complete authorization audit, mobile behavior or provider/network traces. Configuration access remained denied for the required account. No endpoint was called outside the observed application UI.

Functional-guide evidence​

These implementation and product references support the functional guide. Local source behavior does not establish which revision or optional features are deployed. Application observations remain distinct from code and documentary evidence.

Verified in code: legacy Customer/InternalJobBundle controllers, services, templates and galaxy scripts; Main/SitemapBundle submenu; Repository/UserJobMatchingRepository.php. See the technical source map.

Journey verification — 26 October 2026​

Observed in application: PS Testing 2026, Jim Carter. The live galaxy search returned no matches for Data or Manager and showed only the current-job node. No eligible target route or galaxy-origin save could be completed. This is a current-session result, not proof that the earlier route capture was invalid or the feature removed.

Last updated on 3 November 2026