Head to head: Muse Spark 1.1 vs GLM 5.2

This one wasn’t a blowout, but Muse Spark 1.1 did enough across the harder, failure-prone tasks to come out ahead. GLM 5.2 is the tidier formatter in spots, yet Muse’s edge on core correctness gives it the lean verdict.

By · Published

A side-by-side comparative analysis of two abstract AI model architectures, Muse Spark 1.1 and GLM 5.2, highlighting performance metrics and specific task outcomes. (Architectural drafting blueprint – white linework on cyanotype blue paper,

The aggregate says 103.9 to 98.8 for Muse Spark 1.1, and the task count backs that up: 5 wins to 3, with 4 ties. That’s not domination, and the stats reflect it — 75% confidence, lean — but it is a real lead. The shape of the result matters more than the raw margin: Muse was better where being wrong actually breaks the task.

GLM 5.2 had the cleaner showing on presentation-heavy work. It took precise proofreading, strict JSON extraction, and release-notes summarization, mostly by adhering more tightly to requested formatting or preserving source structure better. If your priority is neat packaging and polished output shape, GLM has a credible case.

But Muse won the more consequential reliability tests. It correctly called the field-technician scheduling task unsatisfiable while GLM produced an invalid assignment, and it edged ahead on permit-fact extraction, the Go timeout bug fix, LRU cache implementation, and localization with tone. That is a stronger profile than “slightly nicer formatting”: it suggests Muse is more dependable when constraints, code, or real failure modes are involved.

The tie column reinforces the story. On constraint scheduling, exact-format customer reply, concurrency bug fix, and clinic inventory JSON, neither model created real separation. So the match turns on where they did diverge — and there, Muse’s wins are simply more substantive than GLM’s.

Final call: Muse Spark 1.1 wins, but only by a lean. GLM 5.2 is competitive and often cleaner on format-sensitive tasks; Muse is the model I’d pick when correctness under constraints matters more than presentation polish.

How they were tested

We ran 12 fresh text tasks, generated on the fly for this matchup so neither model could prepare in advance, and had gpt-5.4 score each one. Muse Spark 1.1 scored 103.9 to GLM 5.2's 98.8.

1. Precise proofreading

Correct ONLY the grammar, spelling, and punctuation errors in the sentence below without changing wording, tone, or meaning, then on a second line list each change as 'was -> now'. Sentence: "Its been a long time since we seen there new office, and me and him was suprised how quite it was."

Winner: GLM 5.2 — Both models correctly fix the sentence, but B better follows the requested change-log format by listing each change on separate lines and grouping the phrase-level correction 'me and him -> he and I' more naturally. A is still strong, but its comma-separated list is less aligned with the specified second-line listing format. (Order-swapped judge pass: Both models corrected the sentence well, but A better follows the requested change-log format by listing each change cleanly as separate 'was -> now' entries. B is weaker because it splits the phrase change 'me and him' into two separate token substitutions, which is less precise for this proofreading task.)

2. Constraint scheduling

Four talks (A, B, C, D) fill four 1-hour slots 9,10,11,12. Constraints: A is before D; C is not first; B is immediately after A; D is not at 12. Give the ONE valid schedule as 'slot: talk' lines, then a one-line justification. If impossible, say so and explain.

Winner: Tie — Both outputs give the correct unique schedule, but B provides a clearer and more complete justification while still following the requested format. A’s justification is slightly less precise because it compresses the elimination logic awkwardly. (Order-swapped judge pass: Both outputs give the unique valid schedule and a correct justification, but B adheres more cleanly to the requested format by explicitly labeling the one-line justification and keeping the presentation tighter.)

3. Strict JSON extraction

Extract every meeting from this text into a JSON array of {"title","day","start24","durationMinutes"}. Use 24-hour "HH:MM" for start24, integer minutes for duration, and title-case titles. Return ONLY valid JSON, no commentary. Text: "Standup is daily at 9am for a quarter hour. The design review runs thursday from 2:30-4pm. Payroll sync — first monday, 11:00 to noon."

Winner: GLM 5.2 — Both outputs are valid JSON and correctly extract the meetings and durations, but B better matches the title-casing requirement and presents day values in a cleaner normalized form. A is slightly weaker because it leaves day fields lowercase despite the formatting expectations implied by the prompt. (Order-swapped judge pass: Model A better follows the title-casing requirement for the day field and is otherwise fully correct, though it unnecessarily includes the article in "The Design Review." Model B gets the meeting data right but fails the apparent normalization/casing expectation by leaving day values lowercase throughout.)

4. Release notes summary bullets

Summarize the release-note excerpt below into EXACTLY 4 bullet points. Each bullet must be one sentence, 12–18 words, and must include at least one concrete detail (number, setting name, or component). Source passage: "Sprint 18 shipped on Tuesday. The dashboard now caches the last 14 days of charts locally, cutting median load time from 2.6s to 1.1s for returning users, but first-load performance is unchanged. We also added a CSV export to the Orders screen with columns matching the visible table, except internal_note is never exported. On mobile Safari, a bug causing the filter drawer to freeze after rotating the device was fixed. Known issue: if a manager has more than 250 stores assigned, the Region dropdown can render blank until the page is refreshed. Finally, the default alert threshold for temperature sensors was raised from 6.0°C to 6.5°C after operations requested fewer overnight false alarms."

Winner: GLM 5.2 — Both outputs miss the 12–18 word requirement on multiple bullets, but B is more accurate overall and avoids A’s problematic merging of two separate release notes into one bullet. B’s bullets are clearer and more faithful to the source details, though it omits the known issue entirely. (Order-swapped judge pass: Model A better follows the requested format with four clear one-sentence bullets and preserves key concrete details accurately. Model B omits the Tuesday release detail, combines two separate release-note items into one bullet, and several bullets fall below the 12-word minimum.)

5. Write exact-format customer reply

Reply to this customer in EXACTLY 3 sentences. Total length must be 45–60 words. Sentence 1 must start with "Thanks". Sentence 2 must contain the order number QF-9082 and the phrase "refund to your original payment method". Sentence 3 must include the word "tomorrow". Do NOT use the words "sorry", "apologize", or "unfortunately". Customer message: "My cold-brew grinder arrived with a cracked hopper. I uploaded photos this morning and I need to know whether you're sending a replacement or issuing a refund. The order number is QF-9082."

Winner: Tie — Both outputs fully satisfy the format and content constraints: each has exactly 3 sentences, stays within 45–60 words, starts sentence 1 with "Thanks," includes QF-9082 and the required refund phrase in sentence 2, includes "tomorrow" in sentence 3, and avoids banned words. The writing in both is clear and professional, with no meaningful quality gap. (Order-swapped judge pass: Both outputs fully satisfy the format and content constraints: each has exactly 3 sentences, stays within 45–60 words, starts sentence 1 with "Thanks," includes QF-9082 and the required refund phrase in sentence 2, includes "tomorrow" in sentence 3, and avoids banned words. Both are clear and polished, with no meaningful quality gap.)

6. Extract permit application facts

From the messy permit intake text below, extract the facts into a JSON object with exactly these keys: applicant_name, business_name, site_address, parcel_id, requested_sign_area_sqft, hearing_date, contact_email, prior_case_numbers (array of strings), missing_items (array of strings). Output ONLY JSON. Intake text: "Caller: L. Mercado from Blue Lantern Cycle Repair. Wants a projecting sign at 918 Wexler Ave, Unit 3, Brinno. Parcel maybe '17-442-09B' (she spelled the B twice, then said no, single B). Proposed sign face: 18 sq ft. Planning board hearing penciled in for Nov 6, 2026 at 7pm. Reach her at lmercado@bluelantern.co. She mentioned old files PB-21-118 and ZA 19-07. Staff note: application packet still missing landlord consent letter and color elevation drawing. Name on draft form appears as Lucia Mercado."

Winner: Muse Spark 1.1 — Both outputs extract the facts accurately and use the required keys, but A is slightly better because it normalizes the hearing date into a precise machine-friendly timestamp while B leaves it as a raw natural-language string. Otherwise, they are essentially equivalent. (Order-swapped judge pass: Both outputs correctly extract the facts and use the required keys, but B is slightly better because it normalizes the hearing date into a precise machine-friendly timestamp while remaining faithful to the source. A is also strong, but its hearing_date is less standardized.)

7. Schedule field technicians

Assign the four service visits below to exactly one time slot each: 09:00, 10:00, 11:00, 12:00. Output a JSON object mapping each time to the assigned visit code. Use each code once. There is exactly one valid solution. Visits: A = Replace lobby intercom at Pine Court B = Calibrate freezer alarm at Marsten Deli C = Inspect rooftop condenser at Halcyon Gym D = Install card reader at Norwalk Clinic Constraints: - B must be earlier than D. - C cannot be at 09:00 or 12:00. - The clinic visit D must be immediately after A. - A is not at 11:00. - The 10:00 slot is either C or B. - B is not at 09:00. - C is earlier than D.

Winner: Muse Spark 1.1 — Model A correctly identifies that the constraints are inconsistent, while Model B gives a JSON assignment that violates multiple constraints. Although Model A does not follow the requested JSON-only scheduling format, it is still far more correct than Model B. (Order-swapped judge pass: Model A gives an invalid schedule that violates multiple constraints. Model B correctly identifies that the constraint set is unsatisfiable and explains why, though it does not follow the original prompt’s requested JSON schedule format.)

8. Concurrency bug fix

This TypeScript function is meant to memoize an async loader but has a race: concurrent callers can each trigger the underlying fetch. Fix it so the fetch runs at most once per key, and a rejected fetch does NOT poison the cache (a later call must retry). Return ONLY the corrected function. ts const cache = new Map<string, Promise<string>>(); async function load(key: string, fetcher: (k: string) => Promise<string>) { if (cache.has(key)) return cache.get(key)!; const value = await fetcher(key); cache.set(key, Promise.resolve(value)); return value; }

Winner: Tie — Both fixes prevent duplicate in-flight fetches and clear failed entries so retries work, but B is slightly better because it preserves the full corrected snippet including the cache declaration and safely deletes only if the cached promise is still the same one. (Order-swapped judge pass: Both fix the race by caching the in-flight promise and remove failed entries so retries work, but B is slightly better because it returns the cached promise directly and cleanly handles rejection without unnecessary await/rewrapping. A is still correct, but a bit more verbose and redundant.)

9. Clean clinic inventory JSON

Convert the messy inline inventory notes below into VALID JSON as an array of objects. Output ONLY the JSON. Schema per object, in this exact key order: sku (string), item_name (string), location (string), qty_on_hand (integer), reorder_level (integer), unit_cost_usd (number with 2 decimals), expiry_date (string YYYY-MM-DD or null), status (string: "ok" if qty_on_hand > reorder_level, otherwise "reorder"). Rules: trim spaces; normalize location to uppercase; parse quantities/costs; if expiry is "n/a" or blank use null; keep all 5 records. Messy notes: 1) SKU= md-0041 ; item: nitrile gloves small ; loc= closet-b ; qty 18 boxes ; reorder<12 ; cost $6.4/box ; exp n/a 2) md-0042|item=sterile gauze 4x4|location=Closet-A|on hand: 9|reorder level: 15|unit cost: 0.18|expiry:2027/03/01 3) [md-0043] alcohol prep pads ; Loc pharmacy shelf 2 ; qty=240 ; reorder=200 ; cost= $.03 ; exp= 4) sku md-0044, item "saline flush 10 mL", location=crash cart, qty_on_hand=27, reorder=27, unit_cost_usd=1.05, expiry=2026-11-30 5) md-0045 ; item= paper tape 1in ; location : Closet-b ; qty: 44 ; reorder: 20 ; cost : 1.9 ; expiry : 2028-01-15

Winner: Tie — Both outputs are identical, valid JSON arrays with all 5 records correctly parsed, normalized, and labeled according to the schema and rules. Neither has any observable error or instruction-following issue. (Order-swapped judge pass: Both outputs are identical, valid JSON arrays with all 5 records correctly parsed, normalized, and labeled according to the schema and rules. There are no observable differences in correctness, instruction adherence, or presentation quality.)

10. Fix Go timeout bug

The following Go code is meant to fetch the first successful response body from several URLs, with a per-request timeout. It sometimes hangs longer than expected and leaks resources. Find the bug(s), fix them, and return ONLY the corrected Go code. go package main import ( "context" "fmt" "io" "net/http" "time" ) func firstBody(urls []string, timeout time.Duration) (string, error) { ch := make(chan string) for _, u := range urls { go func() { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() req, _ := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) resp, err := http.DefaultClient.Do(req) if err != nil { return } body, _ := io.ReadAll(resp.Body) if resp.StatusCode == 200 { ch <- string(body) } }() } select { case s := <-ch: return s, nil case <-time.After(timeout): return "", fmt.Errorf("timeout") } }

Winner: Muse Spark 1.1 — Both outputs correctly fix the main bugs: they avoid the loop-variable capture issue, share a single timeout context across requests, close response bodies, and prevent goroutines from blocking on send after timeout. Model A is slightly more idiomatic by using http.StatusOK, but functionally they are equivalent for this task. (Order-swapped judge pass: Both fix the main bugs: the loop-variable capture, missing body close, and lack of shared cancellation/timeout handling. Model B is slightly better because it also handles io.ReadAll errors explicitly before checking status, making the corrected code a bit more robust and clean.)

11. LRU cache

Implement a class LRUCache<K, V> in TypeScript with a fixed capacity set in the constructor, and O(1) get(key): V | undefined and set(key, value): void. Accessing or updating a key must mark it most-recently-used; inserting beyond capacity must evict the least-recently-used entry. Return ONLY the class, no prose.

Winner: Muse Spark 1.1 — A fully satisfies the prompt with a valid O(1) Map-based LRU implementation and returns only the class. B’s core logic is fine, but it violates the output-format instruction by including Markdown code fences and adds an unsolicited constructor constraint that changes behavior for nonpositive capacities. (Order-swapped judge pass: Both implement LRU behavior with O(1) get/set using Map insertion order, but A is more robust by validating capacity in the constructor and avoiding a questionable cast/delete path when capacity is invalid. B is still mostly correct, but its handling of nonpositive capacity is weaker and less clean.)

12. Localization with tone

Translate this app onboarding line into natural, friendly European Spanish suitable for a mobile toast (keep it under 60 characters, no exclamation marks): "You're all set — your first backup starts tonight." Return only the translation, then the character count in parentheses.

Winner: Muse Spark 1.1 — A is more natural European Spanish and avoids the unnecessary English loanword. B is understandable but less localized due to "backup" and adds a final period that slightly hurts toast-style brevity. (Order-swapped judge pass: B is more naturally localized for European Spanish by translating “backup” as “copia” and stays concise and friendly. A is also good, but leaving “backup” untranslated makes it slightly less natural for this localization task.)


See every prompt and the full side-by-side outputs in the interactive Head-to-Head.

Reader comments

Conversation for this story loads after sign-in.